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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5090|回復: 0
收起左側

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

[復制鏈接]
ID:317377 發表于 2018-4-27 10:56 | 顯示全部樓層 |閱讀模式
110857vrrdxzjv9rldim0r.png
單片機源程序如下:
  1. /*
  2. *******************************************************************************
  3. *                     《手把手教你學51單片機(C語言版)》
  4. *                    配套 KST-51 單片機開發板 示例源代碼
  5. *
  6. * 文件名:main.c
  7. * 描  述:第16章 作業題4 帶溫度顯示的電子鐘
  8. * 版本號:v1.0.0
  9. * 備  注:在lesson15_3基礎上添加溫度,溫度顯示在第二行右端,原時間位置相應左移
  10. *******************************************************************************
  11. */

  12. #include <reg52.h>

  13. struct sTime {  //日期時間結構體定義
  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定時標志
  23. bit flag200ms = 1;  //200ms定時標志
  24. struct sTime bufTime;  //日期時間緩沖區
  25. unsigned char setIndex = 0;  //時間設置索引
  26. unsigned char T0RH = 0;  //T0重載值的高字節
  27. unsigned char T0RL = 0;  //T0重載值的低字節

  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;  //秒備份,初值AA確保首次讀取時間后會刷新顯示

  46.     EA = 1;           //開總中斷
  47.     ConfigTimer0(1);  //T0定時1ms
  48.     Start18B20();     //啟動DS18B20
  49.     InitDS1302();     //初始化實時時鐘
  50.     InitLcd1602();    //初始化液晶
  51.    
  52.     //初始化屏幕上固定不變的內容
  53.     LcdShowStr(3, 0, "20  -  -  ");
  54.     LcdShowStr(1, 1, "  :  :    --`C");
  55.    
  56.     while (1)
  57.     {
  58.         KeyDriver();  //調用按鍵驅動
  59.         if (flag200ms && (setIndex == 0))
  60.         {                             //每隔200ms且未處于設置狀態時,
  61.             flag200ms = 0;
  62.             GetRealTime(&bufTime);    //獲取當前時間
  63.             if (psec != bufTime.sec)  //檢測到時間有變化時刷新顯示
  64.             {
  65.                 RefreshTimeShow();
  66.                 psec = bufTime.sec;   //用當前值更新上次秒數
  67.             }
  68.         }
  69.         if (flag1s && (setIndex == 0))  //每隔1s讀取并顯示溫度
  70.         {
  71.             flag1s = 0;
  72.             GetShowTemp();
  73.         }
  74.     }
  75. }
  76. /* 將一個BCD碼字節顯示到屏幕上,(x,y)-屏幕起始坐標,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))  //讀取當前溫度并判斷是否成功
  93.     {   //讀取成功時,刷新當前溫度顯示
  94.         temp >>= 4;  //右移4位以舍棄小數位
  95.         str[0] = temp/10 + '0';  //顯示為兩位十進制數字
  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();  //重新啟動下一次轉換
  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. /* 刷新當前設置位的光標指示 */
  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. /* 遞增時間當前設置位的值 */
  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. /* 遞減時間當前設置位的值 */
  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. /* 右移時間設置位 */
  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. /* 左移時間設置位 */
  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. /* 進入時間設置狀態 */
  245. void EnterTimeSet()
  246. {
  247.     setIndex = 2;       //把設置索引設置為2,即可進入設置狀態
  248.     LeftShiftTimeSet(); //再利用現成的左移操作移到位置1并完成顯示刷新
  249.     LcdOpenCursor();    //打開光標閃爍效果
  250. }
  251. /* 退出時間設置狀態,save-是否保存當前設置的時間值 */
  252. void ExitTimeSet(bit save)
  253. {
  254.     setIndex = 0;     //把設置索引設置為0,即可退出設置狀態
  255.     if (save)         //需保存時即把當前設置時間寫入DS1302
  256.     {
  257.         SetRealTime(&bufTime);
  258.     }
  259.     LcdCloseCursor(); //關閉光標顯示
  260. }
  261. /* 按鍵動作函數,根據鍵碼執行相應的操作,keycode-按鍵鍵碼 */
  262. void KeyAction(unsigned char keycode)
  263. {
  264.     if  ((keycode>='0') && (keycode<='9'))  //本例中不響應字符鍵
  265.     {
  266.     }
  267.     else if (keycode == 0x26)  //向上鍵,遞增當前設置位的值
  268.     {
  269.         IncSetTime();
  270.     }
  271.     else if (keycode == 0x28)  //向下鍵,遞減當前設置位的值
  272.     {
  273.         DecSetTime();
  274.     }
  275.     else if (keycode == 0x25)  //向左鍵,向左切換設置位
  276.     {
  277.         LeftShiftTimeSet();
  278.     }
  279.     else if (keycode == 0x27)  //向右鍵,向右切換設置位
  280.     {
  281.         RightShiftTimeSet();
  282.     }
  283.     else if (keycode == 0x0D)  //回車鍵,進入設置模式/啟用當前設置值
  284.     {
  285.         if (setIndex == 0)  //不處于設置狀態時,進入設置狀態
  286.         {
  287.             EnterTimeSet();
  288.         }
  289.         else                //已處于設置狀態時,保存時間并退出設置狀態
  290.         {
  291.             ExitTimeSet(1);
  292.         }
  293.     }
  294.     else if (keycode == 0x1B)  //Esc鍵,取消當前設置
  295.     {
  296.         ExitTimeSet(0);
  297.     }
  298. }
  299. /* 配置并啟動T0,ms-T0定時時間 */
  300. void ConfigTimer0(unsigned int ms)
  301. {
  302. ……………………

  303. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
0.jpg
所有資料51hei提供下載:
溫度檢測.rar (41.24 KB, 下載次數: 72)

評分

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

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产综合久久婷婷香蕉 | 精品日韩一区二区 | 一区二区三区国产 | 北条麻妃一区二区三区在线观看 | 亚洲另类视频 | 久久精品亚洲 | 91精品久久久久 | 日韩视频在线观看一区二区 | 亚洲黄色一区二区三区 | 国产黄色大片在线观看 | 国产精品一区二区三 | 国产精品久久久久久婷婷天堂 | 在线亚洲电影 | 久久精品一二三影院 | 视频在线观看一区二区 | 亚洲一区免费 | 日韩靠逼| 久产久精国产品 | 国产精品久久av | 91亚洲精华国产 | 成人二区 | 欧美在线成人影院 | 日本精品一区 | 久久影院一区 | 久久欧美精品 | 亚洲欧美视频 | 亚州精品天堂中文字幕 | 午夜色婷婷 | 国产精品视频500部 a久久 | 国产精品69毛片高清亚洲 | 亚洲免费观看 | 成人小视频在线观看 | 成人网在线观看 | 国产精品a久久久久 | 精品久久久久一区 | 亚洲综合无码一区二区 | 免费黄色在线 | 亚洲天天 | 日韩久久综合网 | 97久久精品午夜一区二区 | 日韩午夜激情 |