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

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

QQ登錄

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

搜索
查看: 2852|回復(fù): 0
收起左側(cè)

單片機(jī)萬(wàn)年歷時(shí)鐘制作參考代碼仿真(LCD12864+ds1302)

[復(fù)制鏈接]
ID:849979 發(fā)表于 2021-9-24 16:51 | 顯示全部樓層 |閱讀模式
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png 51hei.png
單片機(jī)源程序如下:
  1. /*
  2. * 萬(wàn)年歷
  3. */

  4. #include "main.h"                         //包含頭文件main.h
  5. #include "LCD.h"                        //包含頭文件LCD.h
  6. #include "DS1302.h"                        //包含頭文件DS1302.h
  7. #include "word.h"                        //包含頭文件word.h
  8. #include "lunar_calendar.h" //包含頭文件lunar_calendar.h
  9. #include "buzz.h"                        //包含頭文件buzz.h

  10. #include "eeprom52.h"
  11. TIME time, tmp_time;        //時(shí)間變量
  12. ALARM alarm;                                //時(shí)間變量
  13. char a_a;
  14. bit Alarm_flag=0;                        //時(shí)間變量
  15. bit Clock_flag=0;                        //時(shí)間變量
  16. bit flag=0;                                        //時(shí)間變量

  17. sbit DQ=P3^7;   //DS18B20 pin 溫度傳感器引腳

  18. /******************把數(shù)據(jù)保存到單片機(jī)內(nèi)部eeprom中******************/
  19. void write_eeprom()
  20. {


  21.         SectorErase(0x2c00);                          //清空
  22.         SectorErase(0x2e00);
  23.         byte_write(0x2c01,Alarm_flag);
  24.            byte_write(0x2c02,Clock_flag);
  25.         byte_write(0x2c03,alarm.hour);
  26.         byte_write(0x2c04,alarm.min);
  27.             
  28.         byte_write(0x2060,a_a);       

  29. }

  30. /******************把數(shù)據(jù)從單片機(jī)內(nèi)部eeprom中讀出來(lái)*****************/
  31. void read_eeprom()
  32. {
  33.         Alarm_flag=        byte_read(0x2c01);
  34.            Clock_flag=byte_read(0x2c02);
  35.         alarm.hour=byte_read(0x2c03);
  36.         alarm.min=byte_read(0x2c04);

  37.         a_a = byte_read(0x2060);

  38. }

  39. /**************開(kāi)機(jī)自檢eeprom初始化*****************/
  40. void init_eeprom()
  41. {
  42.         a_a = byte_read(0x2060);
  43.         if(a_a != 1)                //新的單片機(jī)初始單片機(jī)內(nèi)問(wèn)eeprom
  44.         {
  45.        
  46.                 a_a = 1;
  47.                 write_eeprom();           //保存數(shù)據(jù)
  48.         }       
  49. }


  50. //-----------------18B20-----------------------
  51. unsigned char L_18B20,H_18B20,zhengshu,shangwen,xiawen;  //溫度用變量
  52. unsigned int fg=0,xiaoshu_a;                                                        //溫度用變量
  53. //-----------------18B20----------------------


  54. void delay(uint16 n)//延時(shí)us級(jí)
  55. {
  56.         while (n--);
  57. }
  58. //************************************************************************/
  59. // 函數(shù): LCD_Delay()
  60. // 描述: 延時(shí)t ms函數(shù)
  61. // 參數(shù): t
  62. // 返回: 無(wú)
  63. // 備注: 11.0592MHZ       t=1延時(shí)時(shí)間約1ms
  64. // 版本:  2015/01/01      First version
  65. //************************************************************************/
  66. void Delay_nms(unsigned int t)
  67. {
  68.         unsigned int i,j;
  69.         for(i=0;i<t;i++)             //循環(huán)t次
  70.         for(j=0;j<113;j++)                 //循環(huán)113次 每次約3us
  71.         ;
  72. }
  73. /////////////////////////////////////////////////
  74. //-----------播放音樂(lè)----------------------------

  75. /////////////////////////////////////////////////
  76. /*------DS18B20------*/
  77. void delay_18B20(unsigned int i)
  78. {
  79.         while(i--);
  80. }
  81. /*DS18B20的復(fù)位脈沖 主機(jī)通過(guò)拉低單總線至少480us以產(chǎn)生復(fù)位脈沖
  82.   然后主機(jī)釋放單總線并進(jìn)入接收模式 此時(shí)單總線電平被拉高
  83.   DS18B20檢測(cè)到上升沿后 延時(shí)15~60us,拉低總線60~240us產(chǎn)生應(yīng)答脈沖  */                                               
  84. void Init_DS18B20(void)
  85. {
  86.          unsigned char x=0;
  87.          DQ = 1;          //DQ復(fù)位
  88.          delay_18B20(8);  //稍做延時(shí)
  89.          DQ = 0;          //單片機(jī)將DQ拉低
  90.          delay_18B20(80); //精確延時(shí) 大于 480us
  91.          DQ = 1;          //拉高總線
  92.          delay_18B20(14); //延時(shí)
  93.          x=DQ;            //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
  94.          delay_18B20(20); //延時(shí)
  95. }

  96. /*寫(xiě)時(shí)隙 主機(jī)在寫(xiě)1時(shí)隙向DS18B20寫(xiě)入1,在寫(xiě)0時(shí)隙向DS18B20寫(xiě)入0
  97.   所有寫(xiě)時(shí)隙至少需要60us,且在兩次寫(xiě)時(shí)隙之間至少需要1us的恢復(fù)時(shí)間
  98.   兩種寫(xiě)時(shí)隙均以主機(jī)拉低總線開(kāi)始
  99.   產(chǎn)生寫(xiě)1時(shí)隙:主機(jī)拉低總線后,必須在15us內(nèi)釋放總線,由上拉電阻拉回至高電平
  100.   產(chǎn)生寫(xiě)0時(shí)隙:主機(jī)拉低總線后,必須整個(gè)時(shí)隙保持低電平 */
  101. void WriteOneChar(unsigned char dat)
  102. {
  103.         unsigned char i=0;
  104.         for (i=8; i>0; i--)//循環(huán)8次
  105.         {
  106.                   DQ = 0;                        //DQ輸出0
  107.                 DQ = dat&0x01;
  108.             delay_18B20(5); //延時(shí)
  109.                 DQ = 1;         //DQ輸出1
  110.             dat>>=1;        //右移位
  111. }
  112. }
  113.   
  114. /*所有讀時(shí)隙至少60us 且兩次獨(dú)立的讀時(shí)隙之間至少需要1us的恢復(fù)時(shí)間
  115.   每次讀時(shí)隙由主機(jī)發(fā)起,拉低總線至少1us。
  116.   若傳1,則保持總線高電平;若發(fā)送0,則拉低總線
  117.   傳0時(shí)DS18B20在該時(shí)隙結(jié)束時(shí)釋放總線,再拉回高電平狀態(tài),主機(jī)必須在讀時(shí)隙開(kāi)始后的15us內(nèi)釋放總線,并保持采樣總線狀態(tài) */
  118. unsigned char ReadOneChar(void)
  119. {
  120.         unsigned char i=0;
  121.         unsigned char dat = 0;
  122.         for (i=8;i>0;i--)
  123.          {
  124.                   DQ = 0;                 // 給脈沖信號(hào)
  125.                   dat>>=1;      //移位
  126.                   DQ = 1;                 // 給脈沖信號(hào)
  127.                   if(DQ)       //如果DQ=1,執(zhí)行下面的語(yǔ)句   
  128.                   dat|=0x80;
  129.                   delay_18B20(4);//延時(shí)
  130.          }
  131.         return(dat);                //返回?cái)?shù)據(jù)
  132. }
  133.                  

  134. void read_18B20(void)
  135. {

  136.         Init_DS18B20();
  137.         WriteOneChar(0xCC);            // 跳過(guò)讀序號(hào)列號(hào)的操作
  138.         WriteOneChar(0x44);         // 啟動(dòng)溫度轉(zhuǎn)換

  139.         delay_18B20(100);       // this message is wery important

  140.         Init_DS18B20();                        //初始化DS18B20
  141.         WriteOneChar(0xCC);         //跳過(guò)讀序號(hào)列號(hào)的操作
  142.         WriteOneChar(0xBE);         //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度

  143.         delay_18B20(100);                //延時(shí)

  144.         L_18B20=ReadOneChar();        //讀取低八位數(shù)據(jù)
  145.         H_18B20=ReadOneChar();        //讀取高八位數(shù)據(jù)

  146.         zhengshu=L_18B20/16+H_18B20*16; //整數(shù)部分
  147.         xiaoshu_a=(L_18B20&0x0f)*10/16; //小數(shù)第一位
  148. }
  149. //------------------DS18B20---------------------
  150. /////////////////////////////////////////////////
  151. /*
  152. * 按鍵掃描
  153. */
  154. int8 scan_key(void)
  155. {
  156.         int8 val=-1;                  //初始化鍵值為-1

  157.         if (KeyIn1 == 0)                 //判斷=0?有無(wú)按鍵按鍵
  158.         {
  159.                 val = 1;                         //鍵值=1
  160.                 while (KeyIn1 == 0); //等待按鍵釋放
  161.         }
  162.         else if (KeyIn2 == 0)         //判斷=0?有無(wú)按鍵按鍵
  163.         {
  164.                 val = 2;                        //鍵值=2
  165.                 while (KeyIn2 == 0);//等待按鍵釋放
  166.         }
  167.         else if (KeyIn3 == 0)        //判斷=0?有無(wú)按鍵按鍵
  168.         {
  169.                 val = 3;                        //鍵值=3
  170.                 while (KeyIn3 == 0);//等待按鍵釋放
  171.         }

  172.         //if (val > 0)
  173.                 //buzzer_sound();

  174.         return val;                                //返回鍵值
  175. }

  176. /*
  177. * 主界面框架
  178. */
  179. void main_frame(void)
  180. {
  181.         play32(80, 2, 10); //顯示數(shù)
  182.         play32(32, 2, 10); //顯示數(shù)
  183.         play8(16, 0, S_xie);//顯示斜線
  184.         play8(40, 0, S_xie);//顯示斜線
  185. //        play8(96, 0, RH);
  186. //        play8(120, 0, S_percent);
  187.         play8(120, 6, S_du);//顯示度
  188. }

  189. /*
  190. * 主界面
  191. */
  192. void main_show(bit refresh)
  193. {
  194.     uint8  lunar[2];
  195.         if (refresh)
  196.                 read_time((uint8 *)&time);// 讀時(shí)間函數(shù)// 時(shí)間                                                                                          
  197.         if (refresh || (time.sec != tmp_time.sec)) // 秒更新
  198.         {
  199.                 tmp_time.sec = time.sec;                                  //讀取秒數(shù)據(jù)
  200.             play8_num(104, 6,zhengshu);                           //溫度顯示
  201.                 play32_num(96, 2, time.sec);                        //顯示秒


  202.         }
  203.         if (refresh)
  204.                 main_frame();//刷新界面
  205.         if (refresh || (time.min != tmp_time.min)) // 分更新
  206.         {
  207.                 if (!refresh)
  208.                         flag = 0;
  209.                 tmp_time.min = time.min;//讀取分
  210.                 play32_num(48, 2, time.min); //顯示分
  211.         }
  212.         if (refresh || (time.hour != tmp_time.hour)) // 時(shí)更新
  213.         {
  214.                 if ((!refresh)&&(Clock_flag))
  215.                         alarm_sound();
  216.                 tmp_time.hour = time.hour;                                 //讀取時(shí)
  217.                 play32_num(0, 2, time.hour);                        //顯示時(shí)
  218.         }
  219.         if (refresh || (time.day != tmp_time.day))  //日更新
  220.         {
  221.                 tmp_time.day = time.day;                                //讀取日
  222.                 play8_num(48, 0, time.day);                                //顯示日
  223.                 // 農(nóng)歷       
  224.                 turn_lunar_calendar(&time, lunar);
  225.                 play_lunar_calendar(0, 6, lunar[0], lunar[1]);
  226.         }
  227.         if (refresh || (time.week != tmp_time.week)) // 周更新
  228.         {
  229.                 tmp_time.week = time.week;                                //讀取周
  230.                 play_week(68, 0, time.week);                        //顯示周
  231.         }
  232.         if (refresh || (time.mon != tmp_time.mon))  // 月更新
  233.         {
  234.                 tmp_time.mon = time.mon;                                //讀取月
  235.                 play8_num(24, 0, time.mon);                                //顯示月
  236.                 // 農(nóng)歷       
  237.                 turn_lunar_calendar(&time, lunar);                                //轉(zhuǎn)換農(nóng)歷月
  238.                 play_lunar_calendar(0, 6, lunar[0], lunar[1]);        //顯示農(nóng)歷月
  239.         }

  240.         if (refresh || (time.year != tmp_time.year)) // 年更新
  241.         {
  242.                 tmp_time.year = time.year;                                        //讀取年數(shù)據(jù)
  243.                 play8_num(0, 0, time.year);                                        //顯示年
  244.                 // 農(nóng)歷       
  245.                 turn_lunar_calendar(&time, lunar);                                //轉(zhuǎn)換農(nóng)歷年
  246.                 play_lunar_calendar(0, 6, lunar[0], lunar[1]);        //顯示農(nóng)歷年
  247.         }
  248.        
  249. }
  250. /*
  251. * 主機(jī)界面設(shè)置
  252. */
  253. void main_set(void)
  254. {
  255.         int8 key_val, state=1;                                 //變量
  256.         play32_num(96, 2|0x80, time.sec);        //顯示秒


  257.         while (1)
  258.         {        key_val = scan_key();//鍵盤(pán)掃描
  259.                 if (key_val == 1) // 設(shè)置
  260.                 {
  261.                         if (state >= 7)
  262.                                 state = 0;
  263.                         else
  264.                                 state++;                                //位置狀態(tài)加1
  265.                         set_time((uint8 *)&time);        //設(shè)置時(shí)間
  266.                         main_show(1);                                //顯示主界面

  267.                         switch (state)
  268.                         {        case 0:        set_time((uint8 *)&time); break;//設(shè)置時(shí)間
  269.                                 case 1:        play32_num(96, 2|0x80, time.sec); break;//顯示秒
  270.                                 case 2:        play32_num(48, 2|0x80, time.min); break;//顯示分
  271.                                 case 3:        play32_num(0, 2|0x80, time.hour); break;//顯示時(shí)
  272.                                 case 4:        play_week(68, 0|0x80, time.week); break;//顯示周
  273.                                 case 5:        play8_num(48, 0|0x80, time.day); break; //顯示日
  274.                                 case 6:        play8_num(24, 0|0x80, time.mon); break; //顯示月
  275.                                 case 7:        play8_num(0, 0|0x80, time.year); break; //顯示年
  276.                
  277.                                 default: break;                //退出循環(huán)                                                  
  278.                         }
  279.                 }
  280.                 else if (key_val > 1)//按鍵值大于1
  281.                 {
  282.                         if (state == 1)//位置1設(shè)置秒
  283.                         {
  284.                                 if (key_val == 3)//加按下?
  285.                                         time.sec++;//秒加1
  286.                                 else
  287.                                         time.sec--; //秒減1
  288.                                 if (time.sec >= 60)
  289.                                         time.sec = 0;
  290.                                 else if (time.sec < 0)
  291.                                         time.sec = 59;      
  292.                                 play32_num(96, 2|0x80, time.sec);//顯示秒
  293.                         }
  294.                         else if (state == 2)                                //位置2設(shè)置分
  295.                         {
  296.                                 if (key_val == 3)                                //加按下?
  297.                                         time.min++;                                        //加1
  298.                                 else
  299.                                         time.min--;                                        //減1
  300.                                 if (time.min >= 60)
  301.                                         time.min = 0;
  302.                                 else if (time.min < 0)
  303.                                         time.min = 59;
  304.                                 play32_num(48, 2|0x80, time.min);//顯示分
  305.                         }
  306.                         else if (state == 3)                                //位置3設(shè)置時(shí)
  307.                         {                if (key_val == 3)                                //加按下?
  308.                                         time.hour++;                                //加1
  309.                                 else
  310.                                         time.hour--;                                //減1
  311.                                 if (time.hour >= 24)
  312.                                         time.hour = 0;
  313.                                 else if (time.hour < 0)
  314.                                         time.hour = 23;
  315.                                 play32_num(0, 2|0x80, time.hour);//顯示時(shí)
  316.                         }
  317.                         else if (state == 4)                                //位置4設(shè)置周
  318.                         {                if (key_val == 3)                        //加按下?
  319.                                         time.week++;                                //加1
  320.                                 else
  321.                                         time.week--;                                //減1
  322.                                 if (time.week >= 8)
  323.                                         time.week = 1;
  324.                                 else if (time.week < 1)
  325.                                         time.week = 7;
  326.                                 play_week(68, 0|0x80, time.week);//顯示周
  327.                         }
  328.                         else if (state == 5)//位置5設(shè)置日
  329.                         {
  330.                                 if (key_val == 3)                                //加按下?
  331.                                         time.day++;                                        //加1
  332.                                 else
  333.                                         time.day--;                                        //減1
  334.                                 if (time.day >= 32)
  335.                                         time.day = 1;
  336.                                 else if (time.day < 1)
  337.                                         time.day = 31;
  338.                                 play8_num(48, 0|0x80, time.day);//顯示日
  339.                         }
  340.                         else if (state == 6)                                //位置6設(shè)置月
  341.                         {
  342.                                 if (key_val == 3)                                //加按下?
  343.                                         time.mon++;                                        //加1
  344.                                 else
  345.                                         time.mon--;                                        //減1
  346.                                 if (time.mon >= 13)
  347.                                         time.mon = 1;
  348.                                 else if (time.mon < 1)
  349.                                         time.mon = 12;
  350.                                 play8_num(24, 0|0x80, time.mon);//顯示月
  351.                         }
  352.                         else if (state == 7)                                //位置7設(shè)置年
  353.                         {
  354.                                 if (key_val == 3)                                //加按下?
  355.                                         time.year++;                                //加1
  356.                                 else
  357.                                         time.year--;                                //減1
  358.                                 if (time.year >= 100)
  359.                                         time.year = 0;                                //0年
  360.                                 else if (time.year < 0)
  361.                                         time.year = 99;                                //99年
  362.                                 play8_num(0, 0|0x80, time.year);//顯示年
  363.                         }
  364.                        
  365.                         else
  366.                         {
  367.                                 break;                //退出循環(huán)
  368.                         }
  369.                 }
  370.                 if (state == 0)
  371.                         break;                //退出循環(huán)
  372.         }
  373. }

  374. /*
  375. * 鬧鐘界面顯示
  376. */
  377. void alarm_show(void)
  378. {
  379.         int8 key_val, state=1;
  380.         uint32 t=0;

  381.         play16(0, 0, nao);                        //顯示 鬧
  382.         play16(16, 0, zhong);                //鐘
  383.         play16(32, 0, maohao);                //冒號(hào):
  384.         if (Alarm_flag)
  385.                 play16(48, 0, kai);                //開(kāi)
  386.         else
  387.                 play16(48, 0, guan);//關(guān)
  388.         play32_num(32, 2, alarm.hour);        //時(shí)
  389.         play32(64, 2, 10);                                //冒號(hào)
  390.         play32_num(80, 2, alarm.min);        //分
  391.         play16(0, 6, zheng);                        //顯示 整
  392.         play16(16, 6, dian);                        //顯示 點(diǎn)
  393.         play16(32, 6, bao);                                //顯示 報(bào)
  394.         play16(48, 6, shi);                                //顯示 時(shí)
  395.         play16(64, 6, maohao);                        //顯示 冒號(hào)
  396.         if (Clock_flag)
  397.                 play16(80, 6, kai);                        //顯示 開(kāi)
  398.         else
  399.                 play16(80, 6, guan);                //顯示 關(guān)       
  400.         for (t=0; t<30000; t++)
  401.         {        key_val = scan_key();                //鍵盤(pán)掃描 獲取鍵值
  402.                 if (key_val > 1)                        //判斷數(shù)據(jù)
  403.                         break;
  404.                 else if (key_val == 1)                //判斷數(shù)據(jù)
  405.                 {
  406.                         if (Alarm_flag)
  407.                                 play16(48, 0|0x80, kai);//顯示 開(kāi)
  408.                         else
  409.                                 play16(48, 0|0x80, guan);//關(guān)                       
  410. ……………………

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

仿真與代碼51hei附件下載:
智能時(shí)鐘.zip (447.09 KB, 下載次數(shù): 115)

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 美日韩免费视频 | 亚洲国产精品一区二区第一页 | 在线一区| 日本aa毛片a级毛片免费观看 | 久久久精品一区 | 中文字幕在线视频观看 | 国产激情免费视频 | 欧美理论 | 欧美成人精品激情在线观看 | 国产精品视频播放 | 天天插日日操 | 久久久精品国产 | av在线一区二区三区 | 亚洲电影在线播放 | 国产96色在线 | 亚洲国产精品久久久久秋霞不卡 | 亚洲国产高清免费 | a欧美 | 成人av免费在线观看 | 久久久精| 99国内精品久久久久久久 | 国产目拍亚洲精品99久久精品 | 9久久精品| 黄色网络在线观看 | 欧美精品综合在线 | 国产精品五区 | 欧美日韩一区二区在线播放 | 欧洲一区二区视频 | 一区二区中文字幕 | 国产高清一区二区 | 国产一区 | 亚洲三区在线观看 | 97视频精品 | 曰韩三级| 久久99精品国产 | 麻豆久久久9性大片 | 欧美中文字幕 | 国产在线观看一区二区三区 | 欧美高清一级片 | 国产xxxx在线 | 精品久久久久久久久久久院品网 |