久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2030|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

STC89C52單片機(jī)eeprom開(kāi)機(jī)次數(shù)檢測(cè)+DS18B20數(shù)碼管顯示+DS1302的LCD1602時(shí)間顯示程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
基于STC89C52的eeprom開(kāi)機(jī)次數(shù)檢測(cè)+DS18B20數(shù)碼管顯示+DS1302的LCD1602時(shí)間顯示

一、設(shè)計(jì)的技術(shù)要求:


單片機(jī)源程序如下:
  1. /***********************************************************************************
  2. ;功能說(shuō)明:STC89C52開(kāi)機(jī)次數(shù)+數(shù)碼管溫度報(bào)警+1602時(shí)間
  3. ;文件名稱:main.c     
  4. ;版本號(hào):v1.0.0  
  5. ;微處理器:STC89C52
  6. ;編譯環(huán)境:Keil uVision V4.10
  7. ;作    者:Cui Xinghai
  8. ;創(chuàng)建日期:2022.4.9   
  9. ;***********************************************************************************/

  10. #define  _MAIN_C
  11. #include <REG52.H>

  12. #include "config.h"
  13. #include "LCD1602.h"
  14. #include "LedBuzzer.h"
  15. #include "I2C.h"
  16. #include "eeprom.h"
  17. #include "keyboard.h"
  18. #include "DS18B20.h"
  19. #include "DS1302.h"
  20. #include "main.h"

  21. #include <reg52.h>

  22. bit         flag100ms         = 0;          //100ms定時(shí)標(biāo)志
  23. uint8         T0RH                 = 0;    //T0重載值的高字節(jié)
  24. uint8         T0RL                  = 0;    //T0重載值的低字節(jié)
  25. int         tempalarm          = 26;         //溫度蜂鳴器報(bào)警初始值
  26. uint8        dat;

  27. extern struct sLedBuff ledBuff; //LED顯示緩沖區(qū),默認(rèn)初值全0,正好達(dá)到上電全亮的效果
  28. extern unsigned char code LedChar[]; //數(shù)碼管顯示字符轉(zhuǎn)換表

  29. void main()
  30. {
  31.          uint8 tmr1s = 10;
  32.          uint8 delay = 1;

  33.     EA = 1;       //使能總中斷
  34.         ConfigTimer0(1);  //配置T0定時(shí)1ms
  35.     ENLED = 0;    //使能U3,選擇控制數(shù)碼管
  36.     ADDR3 = 1;    //因?yàn)樾枰獎(jiǎng)討B(tài)改變ADDR0-2的值,所以不需要再初始化了

  37.         dat =E2ReadByte(0x02);    //讀取指定地址上的一個(gè)字節(jié)
  38.         LedNumber();
  39.         if (dat>98) dat =0;
  40.         else ++dat;
  41.         E2WriteByte(0x02, dat);    //再寫(xiě)回到對(duì)應(yīng)的地址上
  42.        
  43.     InitLcd1602();    //初始化液晶模塊
  44.         Start18B20();     //啟動(dòng)首次溫度轉(zhuǎn)換
  45.         BuzzBeep();       //蜂鳴器提示

  46.     while (1)
  47.         {
  48.                  KeyDriver();      //執(zhí)行按鍵驅(qū)動(dòng)
  49.                 if (flag100ms)    //每隔100ms執(zhí)行以下分支
  50.         {
  51.             flag100ms = 0;
  52.                         if (delay > 0)
  53.             {
  54.                 delay--;
  55.                 if (delay == 0)
  56.                 {   //本段代碼僅在上電延時(shí)后執(zhí)行一次
  57.                     InitDS1302();  //初始化實(shí)時(shí)時(shí)鐘模塊
  58.                 }
  59.                 continue;
  60.             }
  61.             ShowRealTime();  //時(shí)間顯示刷新
  62.             tmr1s++;         //每隔1s執(zhí)行以下分支                                
  63.                         if (tmr1s >= 10)
  64.                         {
  65.                                 tmr1s = 0;
  66.                                 RefreshTemp();         //溫度刷新顯示                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
  67.                         }       
  68.                 }
  69.         }
  70. }
  71. /* 開(kāi)機(jī)次數(shù)數(shù)碼管顯示 */
  72. void LedNumber()
  73. {                       
  74.     //以下代碼將sec按十進(jìn)制位從低到高依次提取并轉(zhuǎn)為數(shù)碼管顯示字符
  75.     ledBuff.number[3] = LedChar[16];
  76.     ledBuff.number[4] = LedChar[dat%10];
  77.     ledBuff.number[5] = LedChar[dat/10%10];
  78. }
  79. /* 溫度刷新函數(shù),讀取當(dāng)前溫度并根據(jù)需要刷新液晶顯示 */
  80. void RefreshTemp()
  81. {
  82.     int16 temp;
  83.     int intT, decT;  //溫度值的整數(shù)和小數(shù)部分

  84.     static int16 backup = 32767;  //保證首次執(zhí)行時(shí)必定刷新
  85.    
  86.     Get18B20Temp(&temp); //獲取當(dāng)前溫度值
  87.     Start18B20();        //啟動(dòng)下一次轉(zhuǎn)換

  88.     intT = temp >> 4;             //分離出溫度值整數(shù)部分
  89.     decT = temp & 0xF;            //0x0000 0000 0000 1111分離出溫度值小數(shù)部分
  90.     temp_alarm(&intT);

  91.         if (backup != temp)  //溫度變化時(shí)刷新液晶顯示
  92.     {
  93.         ledBuff.number[2] = LedChar[intT/10] ;  //十位轉(zhuǎn)為ASCII碼
  94.         ledBuff.number[1] = LedChar[intT%10] & 0x7f ;  //個(gè)位轉(zhuǎn)為ASCII碼
  95.         ledBuff.number[0] = LedChar[(decT*10) / 16];            
  96.         backup = temp;             //刷新上次溫度值
  97.         }
  98. }
  99. /*溫度蜂鳴器報(bào)警指示*/
  100. void temp_alarm( int *TEMP)
  101. {  
  102.           if(*TEMP >= tempalarm)
  103.           {
  104.             BuzzBeep();
  105.           }
  106.           else
  107.           {
  108.             BUZZER = 1;        //蜂鳴器靜音
  109.           }
  110. }                  
  111. /* 將一個(gè)字節(jié)按十六進(jìn)制格式顯示到屏幕上,(x,y)-屏幕起始坐標(biāo),byt-待顯示字節(jié) */
  112. void ShowHexByte(uint8 x, uint8 y, uint8 byt)
  113. {
  114.     uint8 tmp;
  115.     uint8 str[4];
  116.    
  117.     //高四位轉(zhuǎn)為十六進(jìn)制字符
  118.     tmp = byt >> 4;
  119.     if (tmp <= 9)
  120.         str[0] = tmp + '0';
  121.     else
  122.         str[0] = tmp - 10 + 'A';
  123.     //低四位轉(zhuǎn)為十六進(jìn)制字符
  124.     tmp = byt & 0x0F;
  125.     if (tmp <= 9)
  126.         str[1] = tmp + '0';
  127.     else
  128.         str[1] = tmp - 10 + 'A';
  129.     //添加結(jié)束符并顯示到液晶
  130.     str[2] = '\0';
  131.     LcdShowStr(x, y, str);
  132. }
  133. /* 讀取DS1302時(shí)間,顯示在液晶屏上 */
  134. void ShowRealTime()
  135. {
  136.     struct sTime buf;
  137.     static struct sTime pdata bkp = {0xAA,0xAA,0xAA,0xAA,0xAA,0xAA};

  138.     GetRealTime(&buf);
  139.         if (bkp.year != buf.year)  //年變化時(shí)刷新顯示
  140.     {
  141.         ShowHexByte(3, 0, buf.year);
  142.         bkp.year = buf.year;
  143.     }
  144.         if (bkp.mon != buf.mon)  //月變化時(shí)刷新顯示
  145.     {
  146.         ShowHexByte(0, 1, buf.mon);
  147.         bkp.mon = buf.mon;
  148.     }
  149.         if (bkp.day != buf.day)  //月變化時(shí)刷新顯示
  150.     {
  151.         ShowHexByte(3, 1, buf.day);
  152.         bkp.day = buf.day;
  153.     }
  154.     if (bkp.hour != buf.hour)  //小時(shí)變化時(shí)刷新顯示
  155.     {
  156.         ShowHexByte(8, 1, buf.hour);
  157.         bkp.hour = buf.hour;
  158.     }
  159.     if (bkp.min != buf.min)  //分鐘變化時(shí)刷新顯示
  160.     {
  161.         ShowHexByte(11, 1, buf.min);
  162.         bkp.min = buf.min;
  163.     }
  164.     if (bkp.sec != buf.sec)  //秒變化時(shí)刷新顯示
  165.     {
  166.         ShowHexByte(14, 1, buf.sec);
  167.         bkp.sec = buf.sec;
  168.     }
  169. }
  170. /* 配置并啟動(dòng)T0,ms-T0定時(shí)時(shí)間 */
  171. void ConfigTimer0(uint16 ms)
  172. {
  173.     uint32 tmp;
  174.    
  175.     tmp = (SYS_MCLK*ms)/1000; //計(jì)算所需的計(jì)數(shù)值
  176.     tmp = 65536 - tmp;        //計(jì)算定時(shí)器重載值
  177.     tmp = tmp + 33;           //補(bǔ)償中斷響應(yīng)延時(shí)造成的誤差   
  178.     T0RH = (uint8)(tmp>>8);   //定時(shí)器重載值拆分為高低字節(jié)
  179.     T0RL = (uint8)tmp;
  180.     TMOD &= 0xF0;   //清零T0的控制位
  181.     TMOD |= 0x01;   //配置T0為模式1
  182.     TH0 = T0RH;     //加載T0重載值
  183.     TL0 = T0RL;
  184.     ET0 = 1;        //使能T0中斷
  185.     TR0 = 1;        //啟動(dòng)T0
  186. }
  187. /* T0中斷服務(wù)函數(shù),實(shí)現(xiàn)系統(tǒng)定時(shí)和按鍵掃描 */
  188. void InterruptTimer0() interrupt 1
  189. {
  190.     static uint8 tmr100ms = 0;
  191.    
  192.     TH0 = T0RH;  //重新加載重載值
  193.     TL0 = T0RL;

  194.     BuzzCtrl();  //蜂鳴器發(fā)聲控制
  195.     LedScan();   //執(zhí)行LED掃描
  196. //    KeyScan();   //執(zhí)行按鍵掃描

  197.     tmr100ms++;  //定時(shí)100ms
  198.     if (tmr100ms >= 100)
  199.     {
  200.         tmr100ms = 0;
  201.         flag100ms = 1;
  202.     }
  203. }
復(fù)制代碼

二、附件內(nèi)容


三、文件附件
Keil代碼下載:
STC89C52-BOOT.zip (833.77 KB, 下載次數(shù): 35)

下載2:https://github.com/cuixh11/STC89C52-BOOT


評(píng)分

參與人數(shù) 1黑幣 +40 收起 理由
admin + 40 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲成av人片在线观看 | 国产高潮好爽受不了了夜色 | 91精品国产一区二区三区 | 成人网在线观看 | 精品久久久久久久久久 | 国产免费一区二区三区最新6 | 亚洲国产欧美精品 | 成人激情视频网 | 日韩欧美中文字幕在线观看 | 播放一级黄色片 | 亚洲精品中文字幕av | 久久国产精品网 | 一级免费毛片 | 99精品在线 | 国产成人免费网站 | 精品伊人久久 | www.日本在线播放 | 亚洲精品视频免费 | 国产精品亚洲成在人线 | 成人在线一区二区 | 国产成人精品999在线观看 | 久99久视频 | 中文在线a在线 | 久久久精品网站 | 日韩av中文| 欧美精品在线播放 | 成人二区 | 久久久亚洲综合 | www.99精品 | 日韩精品在线一区 | 在线观看成人av | 国产高清视频 | 在线精品一区二区 | 国产一区 | 国产成人在线一区二区 | 久久久免费毛片 | 午夜欧美一区二区三区在线播放 | 亚洲码欧美码一区二区三区 | 国产美女久久 | 91亚洲国产 | 久草视频在线播放 |