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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于單片機(jī)的帶溫度顯示的電子鐘源碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:317377 發(fā)表于 2018-4-27 10:56 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式

單片機(jī)源程序如下:
  1. /*
  2. *******************************************************************************
  3. *                     《手把手教你學(xué)51單片機(jī)(C語言版)》
  4. *                    配套 KST-51 單片機(jī)開發(fā)板 示例源代碼
  5. *
  6. * 文件名:main.c
  7. * 描  述:第16章 作業(yè)題4 帶溫度顯示的電子鐘
  8. * 版本號:v1.0.0
  9. * 備  注:在lesson15_3基礎(chǔ)上添加溫度,溫度顯示在第二行右端,原時間位置相應(yīng)左移
  10. *******************************************************************************
  11. */

  12. #include <reg52.h>

  13. struct sTime {  //日期時間結(jié)構(gòu)體定義
  14.     unsigned int  year;
  15.     unsigned char mon;
  16.     unsigned char day;
  17.     unsigned char hour;
  18.     unsigned char min;
  19.     unsigned char sec;
  20.     unsigned char week;
  21. };

  22. bit flag1s = 0;  //1s定時標(biāo)志
  23. bit flag200ms = 1;  //200ms定時標(biāo)志
  24. struct sTime bufTime;  //日期時間緩沖區(qū)
  25. unsigned char setIndex = 0;  //時間設(shè)置索引
  26. unsigned char T0RH = 0;  //T0重載值的高字節(jié)
  27. unsigned char T0RL = 0;  //T0重載值的低字節(jié)

  28. void ConfigTimer0(unsigned int ms);
  29. void RefreshTimeShow();
  30. void GetShowTemp();
  31. extern void InitDS1302();
  32. extern void GetRealTime(struct sTime *time);
  33. extern void SetRealTime(struct sTime *time);
  34. extern void KeyScan();
  35. extern void KeyDriver();
  36. extern void InitLcd1602();
  37. extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
  38. extern void LcdSetCursor(unsigned char x, unsigned char y);
  39. extern void LcdOpenCursor();
  40. extern void LcdCloseCursor();
  41. extern bit Start18B20();
  42. extern bit Get18B20Temp(int *temp);

  43. void main()
  44. {
  45.     unsigned char psec=0xAA;  //秒備份,初值A(chǔ)A確保首次讀取時間后會刷新顯示

  46.     EA = 1;           //開總中斷
  47.     ConfigTimer0(1);  //T0定時1ms
  48.     Start18B20();     //啟動DS18B20
  49.     InitDS1302();     //初始化實時時鐘
  50.     InitLcd1602();    //初始化液晶
  51.    
  52.     //初始化屏幕上固定不變的內(nèi)容
  53.     LcdShowStr(3, 0, "20  -  -  ");
  54.     LcdShowStr(1, 1, "  :  :    --`C");
  55.    
  56.     while (1)
  57.     {
  58.         KeyDriver();  //調(diào)用按鍵驅(qū)動
  59.         if (flag200ms && (setIndex == 0))
  60.         {                             //每隔200ms且未處于設(shè)置狀態(tài)時,
  61.             flag200ms = 0;
  62.             GetRealTime(&bufTime);    //獲取當(dāng)前時間
  63.             if (psec != bufTime.sec)  //檢測到時間有變化時刷新顯示
  64.             {
  65.                 RefreshTimeShow();
  66.                 psec = bufTime.sec;   //用當(dāng)前值更新上次秒數(shù)
  67.             }
  68.         }
  69.         if (flag1s && (setIndex == 0))  //每隔1s讀取并顯示溫度
  70.         {
  71.             flag1s = 0;
  72.             GetShowTemp();
  73.         }
  74.     }
  75. }
  76. /* 將一個BCD碼字節(jié)顯示到屏幕上,(x,y)-屏幕起始坐標(biāo),bcd-待顯示BCD碼 */
  77. void ShowBcdByte(unsigned char x, unsigned char y, unsigned char bcd)
  78. {
  79.     unsigned char str[4];
  80.    
  81.     str[0] = (bcd >> 4) + '0';
  82.     str[1] = (bcd&0x0F) + '0';
  83.     str[2] = '\0';
  84.     LcdShowStr(x, y, str);
  85. }
  86. /* 獲取并顯示溫度 */
  87. void GetShowTemp()
  88. {
  89.     int temp;
  90.     unsigned char str[4];
  91.    
  92.     if (Get18B20Temp(&temp))  //讀取當(dāng)前溫度并判斷是否成功
  93.     {   //讀取成功時,刷新當(dāng)前溫度顯示
  94.         temp >>= 4;  //右移4位以舍棄小數(shù)位
  95.         str[0] = temp/10 + '0';  //顯示為兩位十進(jìn)制數(shù)字
  96.         str[1] = temp%10 + '0';
  97.         str[2] = '\0';
  98.         LcdShowStr(11, 1, str);
  99.     }
  100.     else
  101.     {   //讀取失敗時,提示錯誤信息
  102.         LcdShowStr(11, 1, "--");
  103.     }
  104.     Start18B20();  //重新啟動下一次轉(zhuǎn)換
  105. }
  106. /* 刷新日期時間的顯示 */
  107. void RefreshTimeShow()
  108. {
  109.     ShowBcdByte(5,  0, bufTime.year);
  110.     ShowBcdByte(8,  0, bufTime.mon);
  111.     ShowBcdByte(11, 0, bufTime.day);
  112.     ShowBcdByte(1,  1, bufTime.hour);
  113.     ShowBcdByte(4,  1, bufTime.min);
  114.     ShowBcdByte(7,  1, bufTime.sec);
  115. }
  116. /* 刷新當(dāng)前設(shè)置位的光標(biāo)指示 */
  117. void RefreshSetShow()
  118. {
  119.     switch (setIndex)
  120.     {
  121.         case 1:  LcdSetCursor(5,  0); break;
  122.         case 2:  LcdSetCursor(6,  0); break;
  123.         case 3:  LcdSetCursor(8,  0); break;
  124.         case 4:  LcdSetCursor(9,  0); break;
  125.         case 5:  LcdSetCursor(11, 0); break;
  126.         case 6:  LcdSetCursor(12, 0); break;
  127.         case 7:  LcdSetCursor(1,  1); break;
  128.         case 8:  LcdSetCursor(2,  1); break;
  129.         case 9:  LcdSetCursor(4,  1); break;
  130.         case 10: LcdSetCursor(5,  1); break;
  131.         case 11: LcdSetCursor(7,  1); break;
  132.         case 12: LcdSetCursor(8,  1); break;
  133.         default:  break;
  134.     }
  135. }
  136. /* 遞增一個BCD碼的高位 */
  137. unsigned char IncBcdHigh(unsigned char bcd)
  138. {
  139.     if ((bcd&0xF0) < 0x90)
  140.         bcd += 0x10;
  141.     else
  142.         bcd &= 0x0F;
  143.    
  144.     return bcd;
  145. }
  146. /* 遞增一個BCD碼的低位 */
  147. unsigned char IncBcdLow(unsigned char bcd)
  148. {
  149.     if ((bcd&0x0F) < 0x09)
  150.         bcd += 0x01;
  151.     else
  152.         bcd &= 0xF0;
  153.    
  154.     return bcd;
  155. }
  156. /* 遞減一個BCD碼的高位 */
  157. unsigned char DecBcdHigh(unsigned char bcd)
  158. {
  159.     if ((bcd&0xF0) > 0x00)
  160.         bcd -= 0x10;
  161.     else
  162.         bcd |= 0x90;
  163.    
  164.     return bcd;
  165. }
  166. /* 遞減一個BCD碼的低位 */
  167. unsigned char DecBcdLow(unsigned char bcd)
  168. {
  169.     if ((bcd&0x0F) > 0x00)
  170.         bcd -= 0x01;
  171.     else
  172.         bcd |= 0x09;
  173.    
  174.     return bcd;
  175. }
  176. /* 遞增時間當(dāng)前設(shè)置位的值 */
  177. void IncSetTime()
  178. {
  179.     switch (setIndex)
  180.     {
  181.         case 1:  bufTime.year = IncBcdHigh(bufTime.year); break;
  182.         case 2:  bufTime.year = IncBcdLow(bufTime.year);  break;
  183.         case 3:  bufTime.mon  = IncBcdHigh(bufTime.mon);  break;
  184.         case 4:  bufTime.mon  = IncBcdLow(bufTime.mon);   break;
  185.         case 5:  bufTime.day  = IncBcdHigh(bufTime.day);  break;
  186.         case 6:  bufTime.day  = IncBcdLow(bufTime.day);   break;
  187.         case 7:  bufTime.hour = IncBcdHigh(bufTime.hour); break;
  188.         case 8:  bufTime.hour = IncBcdLow(bufTime.hour);  break;
  189.         case 9:  bufTime.min  = IncBcdHigh(bufTime.min);  break;
  190.         case 10: bufTime.min  = IncBcdLow(bufTime.min);   break;
  191.         case 11: bufTime.sec  = IncBcdHigh(bufTime.sec);  break;
  192.         case 12: bufTime.sec  = IncBcdLow(bufTime.sec);   break;
  193.         default:  break;
  194.     }
  195.     RefreshTimeShow();
  196.     RefreshSetShow();
  197. }
  198. /* 遞減時間當(dāng)前設(shè)置位的值 */
  199. void DecSetTime()
  200. {
  201.     switch (setIndex)
  202.     {
  203.         case 1:  bufTime.year = DecBcdHigh(bufTime.year); break;
  204.         case 2:  bufTime.year = DecBcdLow(bufTime.year);  break;
  205.         case 3:  bufTime.mon  = DecBcdHigh(bufTime.mon);  break;
  206.         case 4:  bufTime.mon  = DecBcdLow(bufTime.mon);   break;
  207.         case 5:  bufTime.day  = DecBcdHigh(bufTime.day);  break;
  208.         case 6:  bufTime.day  = DecBcdLow(bufTime.day);   break;
  209.         case 7:  bufTime.hour = DecBcdHigh(bufTime.hour); break;
  210.         case 8:  bufTime.hour = DecBcdLow(bufTime.hour);  break;
  211.         case 9:  bufTime.min  = DecBcdHigh(bufTime.min);  break;
  212.         case 10: bufTime.min  = DecBcdLow(bufTime.min);   break;
  213.         case 11: bufTime.sec  = DecBcdHigh(bufTime.sec);  break;
  214.         case 12: bufTime.sec  = DecBcdLow(bufTime.sec);   break;
  215.         default:  break;
  216.     }
  217.     RefreshTimeShow();
  218.     RefreshSetShow();
  219. }
  220. /* 右移時間設(shè)置位 */
  221. void RightShiftTimeSet()
  222. {
  223.     if (setIndex != 0)
  224.     {
  225.         if (setIndex < 12)
  226.             setIndex++;
  227.         else
  228.             setIndex = 1;
  229.         RefreshSetShow();
  230.     }
  231. }
  232. /* 左移時間設(shè)置位 */
  233. void LeftShiftTimeSet()
  234. {
  235.     if (setIndex != 0)
  236.     {
  237.         if (setIndex > 1)
  238.             setIndex--;
  239.         else
  240.             setIndex = 12;
  241.         RefreshSetShow();
  242.     }
  243. }
  244. /* 進(jìn)入時間設(shè)置狀態(tài) */
  245. void EnterTimeSet()
  246. {
  247.     setIndex = 2;       //把設(shè)置索引設(shè)置為2,即可進(jìn)入設(shè)置狀態(tài)
  248.     LeftShiftTimeSet(); //再利用現(xiàn)成的左移操作移到位置1并完成顯示刷新
  249.     LcdOpenCursor();    //打開光標(biāo)閃爍效果
  250. }
  251. /* 退出時間設(shè)置狀態(tài),save-是否保存當(dāng)前設(shè)置的時間值 */
  252. void ExitTimeSet(bit save)
  253. {
  254.     setIndex = 0;     //把設(shè)置索引設(shè)置為0,即可退出設(shè)置狀態(tài)
  255.     if (save)         //需保存時即把當(dāng)前設(shè)置時間寫入DS1302
  256.     {
  257.         SetRealTime(&bufTime);
  258.     }
  259.     LcdCloseCursor(); //關(guān)閉光標(biāo)顯示
  260. }
  261. /* 按鍵動作函數(shù),根據(jù)鍵碼執(zhí)行相應(yīng)的操作,keycode-按鍵鍵碼 */
  262. void KeyAction(unsigned char keycode)
  263. {
  264.     if  ((keycode>='0') && (keycode<='9'))  //本例中不響應(yīng)字符鍵
  265.     {
  266.     }
  267.     else if (keycode == 0x26)  //向上鍵,遞增當(dāng)前設(shè)置位的值
  268.     {
  269.         IncSetTime();
  270.     }
  271.     else if (keycode == 0x28)  //向下鍵,遞減當(dāng)前設(shè)置位的值
  272.     {
  273.         DecSetTime();
  274.     }
  275.     else if (keycode == 0x25)  //向左鍵,向左切換設(shè)置位
  276.     {
  277.         LeftShiftTimeSet();
  278.     }
  279.     else if (keycode == 0x27)  //向右鍵,向右切換設(shè)置位
  280.     {
  281.         RightShiftTimeSet();
  282.     }
  283.     else if (keycode == 0x0D)  //回車鍵,進(jìn)入設(shè)置模式/啟用當(dāng)前設(shè)置值
  284.     {
  285.         if (setIndex == 0)  //不處于設(shè)置狀態(tài)時,進(jìn)入設(shè)置狀態(tài)
  286.         {
  287.             EnterTimeSet();
  288.         }
  289.         else                //已處于設(shè)置狀態(tài)時,保存時間并退出設(shè)置狀態(tài)
  290.         {
  291.             ExitTimeSet(1);
  292.         }
  293.     }
  294.     else if (keycode == 0x1B)  //Esc鍵,取消當(dāng)前設(shè)置
  295.     {
  296.         ExitTimeSet(0);
  297.     }
  298. }
  299. /* 配置并啟動T0,ms-T0定時時間 */
  300. void ConfigTimer0(unsigned int ms)
  301. {
  302. ……………………

  303. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
溫度檢測.rar (41.24 KB, 下載次數(shù): 72)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美黄色小视频 | 动漫www.被爆羞羞av44 | 激情91 | 国产精品久久久免费 | 操操操av| 羞羞羞视频| 91偷拍精品一区二区三区 | 亚洲免费视频在线观看 | 国产一区二区在线免费观看 | 国户精品久久久久久久久久久不卡 | 91精品国产综合久久婷婷香蕉 | 亚洲成人一区二区 | 久草新在线 | 777zyz色资源站在线观看 | 欧美精品一区二区三 | 国产免费一区二区三区网站免费 | 亚洲国产免费 | 91在线精品视频 | 81精品国产乱码久久久久久 | 精品久久影院 | 在线观看免费国产 | 在线一区| 欧美日韩一区精品 | 免费久久视频 | 国产草草视频 | 亚洲男人网 | 国产一级视频免费播放 | 国产精品成人在线播放 | 国产午夜精品视频 | 国产精品日韩欧美一区二区三区 | 久久久久久久久久久久久9999 | 午夜理伦三级理论三级在线观看 | 成人精品国产免费网站 | 日日天天 | 欧美精品一区在线 | 亚洲精品视频在线 | 日韩电影免费在线观看中文字幕 | 欧美三级久久久 | 欧美猛交| 91看片免费版 | 亚洲一区二区三区四区五区中文 |