51单片机lcd1602显示时间日期
實驗內容:
?? ???使用51單片機控制LCD1602液晶顯示屏顯示 時間/日期/星期/溫度 信息,并可通過按鍵設置值。
仿真效果展示:
proteus仿真圖:
硬件測試圖:
說明:
硬件測試按鍵使用左側的四個獨立按鍵
key1-設置鍵(選設置位)
key2:加一
key3:減一
key4:切換到日期/時間
主要硬件:
注:LM016L和LCD1602 原理是一樣的,用法也相同。只是protues中lm0161沒有顯示調節亮度的那兩個端口
對比
此次代碼采用模塊化的方式,硬件初始化和相關代碼單獨封裝在一個文件中,使用時將其包含就好。
項目結構如圖:
列出幾個比較重要的函數:
主函數:
定時器中斷函數:
/******************************************************************************* * 函 數 名 : Timer0() * 函數功能 : 定時器0中斷函數 * 參數 :無 *******************************************************************************/ void Timer0() interrupt 1 {TH0=0x4C;TL0=0x00;i++;//使得setting_flag 0.2秒轉換一次if(i%10<5){blink_flag = 0;}if(i%10>=5){blink_flag = 1;}if(i==20)//20個50毫秒即一秒{i=0;if(button_num1==0){num1++;}if(num1==60){num1=0;num2++;if(num2==60)//定時一小時自動清零{num2=0;num3++;if(num3==24){num3=0;day++; //一天過去星期加一 weekday++;if(weekday==8){weekday=1;}//日期處理DataDeal1(); //一天過去年月日相應變化}} }} }/******************************************************************************* * 函 數 名 : DataDeal1 * 函數功能 : 日期處理函數,計算日期的當前的日期值 * 參數 :無 *******************************************************************************/ void DataDeal1() {if(day>=30) //默認一個月30天{month++;day=1;if(month>=13){month = 1;year2++;if(year2>=100){year2 = 0; //由于年數太大后int型變量無法存儲,使用兩個變量存儲高兩位和低兩位year1++;if(year1>=100){year1=0;}}} } }按鍵處理函數:
/*********************************************************** *函數名 :KeyScan *功能 : 按鍵掃描,返回按下的按鍵對應的位,并防止連按 *返回值 :返回按鍵按下的位置 *參數 :無 ************************************************************/ char KeyScan() {static unsigned char klast = 0; //記錄上一次的按鍵值unsigned char trg = 0,key = 0; //trg:得到的返回值,返回值中8位只有一位為1,為1的位代表按下的位,其余位為零key = P2 & 0xF0; //將按下的位轉換為0 沒按下的位依然為1key ^= 0xF0; //異或之后沒按下的位轉換為1,按下的位轉換為0trg = key & (key ^ klast); //這句是最關鍵的一句,需要自己理解klast = key;button_flag = trg;return trg; //最終返回值是按下哪個按鍵,返回值對應就是1,沒按對應的就是0 eg:按下button3 則返回0x01 0000 0100 }溫度傳感器初始化函數:
/******************************************************************************* * 函數名 : Ds18b20Init * 函數功能 : 初始化 * 輸入 : 無 * 輸出 : 初始化成功返回1,失敗返回0 *******************************************************************************/ unsigned char Ds18b20Init() {unsigned int i;DSPORT=0; //將總線拉低480us~960usi=70; while(i--);//延時642usDSPORT=1; //然后拉高總線,如果DS18B20做出反應會將在15us~60us后總線拉低i=0;while(DSPORT) //等待DS18B20拉低總線{i++;if(i>5000)//等待>5MSreturn 0;//初始化失敗 }return 1;//初始化成功 }這里需要注意的一點是,溫度傳感器并不需要一直轉換溫度,讀取溫度。而是在需要溫度的時候再去初始化一下(轉化和讀取時),如果只在最開始初始化,轉化時沒有初始化則無法讀取溫度值。具體請看項目源碼。
完整項目下載地址:
[仿真版源碼] (https://github.com/Little-Water-Bottle/LCD1602ShowDataAndTime)
(補充鏈接:仿真版源碼 密碼:7jdc)
51普中開發板源碼 密碼:aeg3
proteus文件下載 密碼:guqw
參考資料下載(!):
LCD和DS18B20參考資料 密碼:64l7
排版真的是垃圾,算了記錄一下就行了。。
總結
以上是生活随笔為你收集整理的51单片机lcd1602显示时间日期的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑知识:分享实用的电脑维护小常识
- 下一篇: fibonacci数列前20项_高考数学