日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

51单片机lcd1602显示时间日期

發(fā)布時間:2023/12/10 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 51单片机lcd1602显示时间日期 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

實驗內(nèi)容:
?? ???使用51單片機控制LCD1602液晶顯示屏顯示 時間/日期/星期/溫度 信息,并可通過按鍵設(shè)置值。

仿真效果展示:

proteus仿真圖:

硬件測試圖:

說明:
硬件測試按鍵使用左側(cè)的四個獨立按鍵
key1-設(shè)置鍵(選設(shè)置位)
key2:加一
key3:減一
key4:切換到日期/時間


主要硬件:

  • AT89C51主控芯片
  • LM016L/LCD1602 液晶顯示模塊
  • RESPACK-8 排阻
  • DS18B20 溫度傳感器
  • BUTTON 按鍵
  • 注:LM016L和LCD1602 原理是一樣的,用法也相同。只是protues中l(wèi)m0161沒有顯示調(diào)節(jié)亮度的那兩個端口


    對比

    此次代碼采用模塊化的方式,硬件初始化和相關(guān)代碼單獨封裝在一個文件中,使用時將其包含就好。


    項目結(jié)構(gòu)如圖:



    列出幾個比較重要的函數(shù):
    主函數(shù):

    #include <reg52.h> #include "LM016L.h" #include "Timer.h" #include "Data.h" #include "Button.h" #include "temp.h"/******************************************************************************* * 函 數(shù) 名 : main * 函數(shù)功能 : 主函數(shù) 程序入口 * 參數(shù) :無 *******************************************************************************/ void main() {LcdInitiate(); //液晶屏初始化TimerInit(); //定時器初始化 // Ds18b20Init(); //溫度傳感器不在這里初始化,在每次溫度轉(zhuǎn)化時和讀取溫度時都要初始化while(1){KeyScan(); //按鍵檢測button_setting(); //按鍵 設(shè)置處理button_up_down(); //按鍵 加一/減一 處理ButtonSwitchDT(); //按鍵 切換時間/日期 處理//想顯示哪個就顯示哪個,不想要的可以注釋掉TimerShow(); //時間顯示 星期顯示在時間里DataShow(); //日期顯示Lcd_Tem_Display(Ds18b20ReadTemp()); //溫度顯示} }

    定時器中斷函數(shù):

    /******************************************************************************* * 函 數(shù) 名 : Timer0() * 函數(shù)功能 : 定時器0中斷函數(shù) * 參數(shù) :無 *******************************************************************************/ void Timer0() interrupt 1 {TH0=0x4C;TL0=0x00;i++;//使得setting_flag 0.2秒轉(zhuǎn)換一次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(); //一天過去年月日相應(yīng)變化}} }} }/******************************************************************************* * 函 數(shù) 名 : DataDeal1 * 函數(shù)功能 : 日期處理函數(shù),計算日期的當(dāng)前的日期值 * 參數(shù) :無 *******************************************************************************/ void DataDeal1() {if(day>=30) //默認(rèn)一個月30天{month++;day=1;if(month>=13){month = 1;year2++;if(year2>=100){year2 = 0; //由于年數(shù)太大后int型變量無法存儲,使用兩個變量存儲高兩位和低兩位year1++;if(year1>=100){year1=0;}}} } }

    按鍵處理函數(shù):

    /*********************************************************** *函數(shù)名 :KeyScan *功能 : 按鍵掃描,返回按下的按鍵對應(yīng)的位,并防止連按 *返回值 :返回按鍵按下的位置 *參數(shù) :無 ************************************************************/ char KeyScan() {static unsigned char klast = 0; //記錄上一次的按鍵值unsigned char trg = 0,key = 0; //trg:得到的返回值,返回值中8位只有一位為1,為1的位代表按下的位,其余位為零key = P2 & 0xF0; //將按下的位轉(zhuǎn)換為0 沒按下的位依然為1key ^= 0xF0; //異或之后沒按下的位轉(zhuǎn)換為1,按下的位轉(zhuǎn)換為0trg = key & (key ^ klast); //這句是最關(guān)鍵的一句,需要自己理解klast = key;button_flag = trg;return trg; //最終返回值是按下哪個按鍵,返回值對應(yīng)就是1,沒按對應(yīng)的就是0 eg:按下button3 則返回0x01 0000 0100 }

    溫度傳感器初始化函數(shù):

    /******************************************************************************* * 函數(shù)名 : Ds18b20Init * 函數(shù)功能 : 初始化 * 輸入 : 無 * 輸出 : 初始化成功返回1,失敗返回0 *******************************************************************************/ unsigned char Ds18b20Init() {unsigned int i;DSPORT=0; //將總線拉低480us~960usi=70; while(i--);//延時642usDSPORT=1; //然后拉高總線,如果DS18B20做出反應(yīng)會將在15us~60us后總線拉低i=0;while(DSPORT) //等待DS18B20拉低總線{i++;if(i>5000)//等待>5MSreturn 0;//初始化失敗 }return 1;//初始化成功 }

    這里需要注意的一點是,溫度傳感器并不需要一直轉(zhuǎn)換溫度,讀取溫度。而是在需要溫度的時候再去初始化一下(轉(zhuǎn)化和讀取時),如果只在最開始初始化,轉(zhuǎn)化時沒有初始化則無法讀取溫度值。具體請看項目源碼。

    完整項目下載地址:
    [仿真版源碼] (https://github.com/Little-Water-Bottle/LCD1602ShowDataAndTime)
    (補充鏈接:仿真版源碼 密碼:7jdc)

    51普中開發(fā)板源碼 密碼:aeg3

    proteus文件下載 密碼:guqw

    參考資料下載(!):
    LCD和DS18B20參考資料 密碼:64l7

    排版真的是垃圾,算了記錄一下就行了。。

    總結(jié)

    以上是生活随笔為你收集整理的51单片机lcd1602显示时间日期的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。