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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13379|回復: 33
打印 上一主題 下一主題
收起左側

分享51電子時鐘,LCD1602顯示,DS1302,DS18B20

  [復制鏈接]
跳轉到指定樓層
樓主
ID:101749 發表于 2016-1-27 16:11 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
單片機:STC89C52RC            時鐘芯片:DS1302
測溫元件:DS18B20            顯示元件:LCD1602
信息保持:STC單片機內部EEPROM
作者:BrightBell             時間:2016年1月初
郵箱:brightbell@qq.com

備注:
1.DS1302沒有第二電源,掉電不走時,誤差 < 1s/5天
2.時間、背光開關時間、蜂鳴器整點報時時間、LCD背光亮度、
  按鍵音皆可設置
3.長按KEY0馬上開/關LCD背光,長按KEY1進入系統設置界面,
  長按KEY2進入時間設置界面
4.每3秒讀取一次DS18B20溫度
5.每一小時更新一次EEPROM中的時間信息,重新設置時間后馬
  上更新
6.進行一次系統設置后,馬上更新EEPROM中的系統設置信息,
  下次啟動時會先加載




視頻:


部分源文件預覽:(完整版可從附件下載)
  1. #ifndef _DS1302_H_
  2. #define _DS1302_H_


  3. void DS1302ByteWrite(unsigned char dat)  //向DS1302寫入一個字節
  4. {
  5.   unsigned char mask;       
  6.         for(mask=0x01; mask!=0; mask<<=1)  //低位在先
  7.         {
  8.           if((mask&dat) != 0)
  9.                         DS1302IO = 1;
  10.                 else
  11.                         DS1302IO = 0;
  12.                 DS1302CK = 1;
  13.           DS1302CK = 0;
  14.         }
  15.         DS1302IO = 1;
  16. }

  17. unsigned char DS1302ByteRead(void)  //從DS1302讀取一個字節
  18. {
  19.   unsigned char mask;
  20.         unsigned char dat = 0;
  21.         for(mask=0x01; mask!=0; mask<<=1)
  22.         {
  23.           if(DS1302IO != 0)
  24.                         dat |= mask;
  25.                 DS1302CK = 1;
  26.                 DS1302CK = 0;
  27.         }
  28.         return dat;
  29. }

  30. void DS1302SingleWrite(unsigned char reg, unsigned char dat)  //寫入DS1302的某一寄存器
  31. {
  32.   DS1302CE = 1;
  33.         DS1302ByteWrite((reg<<1)|0x80);
  34.         DS1302ByteWrite(dat);
  35.         DS1302CE = 0;
  36. }

  37. unsigned char DS1302SingleRead(unsigned char reg)   //讀取DS1302的某一寄存器
  38. {
  39.   unsigned char dat;
  40.         DS1302CE = 1;
  41.         DS1302ByteWrite((reg<<1)|0x81);
  42.         dat = DS1302ByteRead();
  43.         DS1302CE = 0;
  44.         return dat;
  45. }

  46. void DS1302BurstWrite(unsigned char *dat) //Brust模式寫入時間信息
  47. {
  48.   unsigned char i;
  49.         DS1302CE = 1;
  50.         DS1302ByteWrite(0xBE);
  51.         for(i=0; i<8; i++)
  52.         {
  53.           DS1302ByteWrite(dat[i]);
  54.         }
  55.         DS1302CE = 0;
  56. }

  57. void DS1302BurstRead(unsigned char *dat)    //Brust模式讀出時間信息
  58. {
  59.   unsigned char i;
  60.         DS1302CE = 1;
  61.         DS1302ByteWrite(0xBF);
  62.         for(i=0; i<8; i++)
  63.         {
  64.           dat[i] = DS1302ByteRead();
  65.         }
  66.         DS1302CE = 0;
  67. }

  68. //欲寫入的是十進制的時間信息,不是BCD碼,已進行轉換
  69. struct TIME Bcd1302ToDec(struct TIME *time)
  70. {
  71.   struct TIME dectime;
  72.   dectime.year = (time->year >> 4) * 10;
  73.         dectime.year = (time->year & 0x0F) + dectime.year;
  74.         dectime.mon = (time->mon >> 4) * 10;
  75.         dectime.mon = (time->mon & 0x0F) + dectime.mon;
  76.         dectime.day = (time->day >> 4) * 10;
  77.         dectime.day = (time->day & 0x0F) + dectime.day;
  78.   dectime.hour = (time->hour >> 4) * 10;
  79.         dectime.hour = (time->hour & 0x0F) + dectime.hour;
  80.         dectime.min = (time->min >> 4) * 10;
  81.         dectime.min = (time->min & 0x0F) + dectime.min;
  82.         dectime.sec = (time->sec >> 4) * 10;
  83.         dectime.sec = (time->sec & 0x0F) + dectime.sec;
  84.        
  85.         dectime.week = time->week & 0x0F;
  86.        
  87.         return dectime;
  88. }

  89. //獲取到的是十進制的時間信息,不是BCD碼,獲取后已進行轉換
  90. void GetRealTime(struct TIME *time)  //獲取時間信息,并保存在時間結構體中
  91. {
  92.   unsigned char buf[8];
  93.         struct TIME temp;
  94.         DS1302BurstRead(buf);
  95.         temp.year = buf[6];
  96.         temp.mon = buf[4];
  97.         temp.day = buf[3];
  98.         temp.hour = buf[2];
  99.         temp.min = buf[1];
  100.         temp.sec = buf[0];
  101.         temp.week = buf[5];
  102.        
  103.         *time = Bcd1302ToDec(&temp);  //將BCD碼轉為十進制
  104. }

  105. struct TIME DecToBcd1302(struct TIME *time)
  106. {
  107.   struct TIME bcdtime;
  108.   bcdtime.year = (time->year / 10 % 10) * 16;
  109.         bcdtime.year = (time->year % 10) + bcdtime.year;
  110.         bcdtime.mon = (time->mon / 10 % 10) * 16;
  111.         bcdtime.mon = (time->mon % 10) + bcdtime.mon;
  112.         bcdtime.day = (time->day / 10 % 10) * 16;
  113.         bcdtime.day = (time->day % 10) + bcdtime.day;
  114.   bcdtime.hour = (time->hour / 10 % 10) * 16;
  115.         bcdtime.hour = (time->hour % 10) + bcdtime.hour;
  116.         bcdtime.min = (time->min / 10 % 10) * 16;
  117.         bcdtime.min = (time->min % 10) + bcdtime.min;
  118.         bcdtime.sec = (time->sec / 10 % 10) * 16;
  119.         bcdtime.sec = (time->sec % 10) + bcdtime.sec;
  120.        
  121.         bcdtime.week = time->week % 10;
  122.        
  123.         return bcdtime;
  124. }

  125. void SetRealTime(struct TIME *time)  //通過時間結構體設置時間
  126. {
  127.   unsigned char buf[8];
  128.         struct TIME temp;
  129.         temp = DecToBcd1302(time);
  130.         buf[7] = 0;
  131.         buf[6] = temp.year;
  132.         buf[5] = temp.week;
  133.         buf[4] = temp.mon;
  134.         buf[3] = temp.day;
  135.         buf[2] = temp.hour;
  136.         buf[1] = temp.min;
  137.         buf[0] = temp.sec;
  138.         DS1302BurstWrite(buf);
  139. }

  140. void InitDS1302(void)  //初始化DS1302
  141. {
  142.   unsigned char dat;
  143.         struct TIME eepromtime;
  144.         DS1302CE = 0;
  145.         DS1302CK = 0;
  146.         dat = DS1302SingleRead(0);
  147.         if((dat & 0x80) != 0)  //檢測時間在掉電時是否停止過,停1走0,如果停過就從新寫入初始化時間
  148.         {
  149.           GetE2promTime(&eepromtime);  //停止過,獲取EEPROM里的時間
  150.                 DS1302SingleWrite(7, 0x00);  //撤銷保護
  151.                 SetRealTime(&eepromtime);
  152.         }
  153.        
  154.         lcdShowStr(0, 0, "20  -  -");
  155.         lcdShowStr(3, 1, ":  :");
  156. }

  157. void lcdShowWeek(unsigned char x, unsigned char y, unsigned char week)
  158. {
  159.   unsigned char str[5];
  160.         lcdShowStr(x-4, y, "week");
  161.         str[0] = week % 10 + '0';
  162.         str[1] = '\0';
  163.         lcdShowStr(x, y, str);
  164. }

  165. void RefreshTime(struct TIME *time)
  166. {
  167.         static unsigned char dayBF = 88;
  168.         if(dayBF != time->day)  //日期發生變化,更新年月日周
  169.         {
  170.                 lcdShowNum(2, 0, time->year);
  171.                 lcdShowNum(5, 0, time->mon);
  172.                 lcdShowNum(8, 0, time->day);
  173.                 lcdShowWeek(15,0, time->week);
  174.                 dayBF = time->day;
  175.         }
  176.         lcdShowNum(1, 1, time->hour);
  177.         lcdShowNum(4, 1, time->min);
  178.         lcdShowNum(7, 1, time->sec);
  179. }

  180. void HourlyWork(struct TIME *time)  //小時事件
  181. {
  182.   static char hourBF = 88;
  183.         static char lightlevelBF = 3;
  184.   if(time->hour != hourBF)    //時有變
  185.   {               
  186.                 if(time->hour==lcdlighton)  //判斷是否有背光開關
  187.                 {
  188.                   lcdlight = 0;
  189.                         if(lightlevelBF != 0)
  190.                     lcdlightlevel = lightlevelBF;
  191.                         else
  192.                                 lcdlightlevel = 4;
  193.                 }
  194.                 else if(time->hour==lcdlightoff)  //判斷是否有背光開關
  195.                 {
  196.                   lcdlight = 1;
  197.                   lightlevelBF = lcdlightlevel;
  198.                         lcdlightlevel = 0;
  199.                 }
  200.                
  201.                 if((time->hour>=ZDBSbegin)&&(time->hour<=ZDBSend))
  202.                 {
  203.                         if(hourlybuzz != 0)  //整點報時開
  204.                           flagZD = 1;
  205.                 }
  206.                
  207.                 SaveTimeToE2prom(time);  //每小時更新EEPROM里的時間信息
  208.                
  209.                 hourBF = time->hour;  //更新備份值
  210.         }
  211. }

  212. void LedWaterShow()    //流水燈效果
  213. {
  214.   static unsigned char ledshow = 0x01;
  215.         static bit dir = 0;
  216.         ledDB = ledshow;
  217.         if(dir == 0)
  218.         {
  219.           ledshow = ledshow << 1;
  220.                 if(ledshow == 0x00)
  221.                 {
  222.                         dir = 1;
  223.                         ledshow = 0x40;
  224.                 }
  225.         }
  226.         else
  227.         {
  228.           ledshow = ledshow >> 1;
  229.                 if(ledshow == 0x00)
  230.                 {
  231.                   dir = 0;
  232.                         ledshow = 0x02;
  233.                 }
  234.         }
  235. }

  236. /*******************************************************************************
  237.         補償值計算方法:當X秒后時間慢Y秒,則:實減=X/當前值;應減=實減-Y; 補償值=X/應減
  238. ********************************************************************************/
  239. void TimeBuChang(struct TIME *time)
  240. {
  241.         static char flagBC = 0;
  242.         static unsigned int BCcnt = 0;
  243.         static struct TIME BCtime;
  244.         if(flagBC != 0)
  245.         {
  246.           flagBC = 0;
  247.                 SetRealTime(&BCtime);  //寫入上一秒時間,相當于減一秒
  248.         }
  249.        
  250.         BCcnt++;
  251.         if(BCcnt > secBuChang)   //每X秒減1秒  
  252.         {
  253.                 timemenu = 88;   //禁止時間更新
  254.           BCcnt = 0;
  255.                 BCtime = *time;  //備份上一秒時間
  256.                 flagBC = 1;
  257.                 timemenu = 0;   //開時間更新
  258.         }
  259. }

  260. void UpdateTime()
  261. {
  262.   static unsigned char secBF = 88;
  263.         static unsigned int ds18b20cnt = 0;
  264.   struct TIME buftime;   //從DS1302中讀取出來的值
  265.         GetRealTime(&buftime);
  266.         if(buftime.sec != secBF)
  267.         {
  268.                 RefreshTime(&buftime);
  269.                 secBF = buftime.sec;
  270.           
  271.                 ds18b20cnt++;
  272.                 if(ds18b20cnt > GetTempSpace)
  273.                 {
  274.                   ds18b20cnt = 0;
  275.                         RefreshTemp();
  276.                 }
  277.                
  278.                 HourlyWork(&buftime);
  279.                 LedWaterShow();
  280.                
  281.                 TimeBuChang(&buftime);   //時間補償
  282.         }
  283. }

  284. void RefreshTimeNow()
  285. {
  286.   struct TIME buftime;
  287.         GetRealTime(&buftime);
  288.         lcdShowStr(0, 0, "20  -  -");
  289.         lcdShowStr(3, 1, ":  :");
  290.         lcdShowNum(2, 0, buftime.year);
  291.         lcdShowNum(5, 0, buftime.mon);
  292.         lcdShowNum(8, 0, buftime.day);
  293.         lcdShowNum(1, 1, buftime.hour);
  294.         lcdShowNum(4, 1, buftime.min);
  295.         lcdShowNum(7, 1, buftime.sec);
  296.         lcdShowWeek(15,0, buftime.week);
  297.         if(hourlybuzz != 0)
  298.                 lcdShowImage(0, 1, image0, 0);
  299.         else
  300.                 lcdShowStr(0, 1, " ");
  301.         lcdShowImage(15, 1, image1, 1);
  302. }

  303. #endif
復制代碼
網盤下載:
游客,本帖隱藏的內容需要積分高于 1 才可瀏覽,您當前積分為 0



【BrightBell】基于51單片機的電子時鐘.rar

969.98 KB, 下載次數: 326, 下載積分: 黑幣 -5

評分

參與人數 3黑幣 +60 收起 理由
鄭港華 + 5 很給力!
月光 + 5 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:23303 發表于 2016-3-7 10:11 | 只看該作者
下來學習一下,謝謝!
回復

使用道具 舉報

板凳
ID:109342 發表于 2016-4-12 12:45 | 只看該作者
看不過來了都
回復

使用道具 舉報

地板
ID:109342 發表于 2016-4-12 12:46 | 只看該作者
電子時鐘帶有鬧鈴功能嗎?
回復

使用道具 舉報

5#
ID:114669 發表于 2016-5-21 19:12 | 只看該作者
謝謝分享。。。。。。。。。。。。。。。。。。。。
回復

使用道具 舉報

6#
ID:101749 發表于 2016-5-22 12:39 | 只看該作者
故國神游1 發表于 2016-4-12 12:46
電子時鐘帶有鬧鈴功能嗎?

沒有呢,不打算加進去了,用手機
回復

使用道具 舉報

7#
ID:122542 發表于 2016-5-22 12:44 | 只看該作者
學習學習
回復

使用道具 舉報

8#
ID:122542 發表于 2016-5-22 12:45 | 只看該作者
謝謝分享
回復

使用道具 舉報

9#
ID:124675 發表于 2016-6-3 16:39 | 只看該作者

謝謝分享。。。。。。。。。
回復

使用道具 舉報

10#
ID:137004 發表于 2016-8-17 22:23 | 只看該作者
為什么我在5110上不能同時顯示
回復

使用道具 舉報

11#
ID:127122 發表于 2016-8-18 00:16 | 只看該作者
支持一下               .
回復

使用道具 舉報

12#
ID:99938 發表于 2016-8-28 14:07 | 只看該作者
不管用
回復

使用道具 舉報

13#
ID:140922 發表于 2016-9-29 23:16 來自手機 | 只看該作者
厲害了…
回復

使用道具 舉報

14#
ID:106598 發表于 2016-10-31 22:11 | 只看該作者
為什么按鍵不能調節呢
回復

使用道具 舉報

15#
ID:146145 發表于 2016-11-26 17:16 | 只看該作者
這個是全部的程序么?
回復

使用道具 舉報

16#
ID:146145 發表于 2016-11-30 18:41 | 只看該作者

RE: 分享51電子時鐘,LCD1602顯示,DS1302,DS18B20

樓主  ds18b02的這個程序 仿真的時候可以用嗎  在proteus中不顯示啊
回復

使用道具 舉報

17#
ID:155617 發表于 2016-12-23 23:54 | 只看該作者
lz這個不錯,另外加上自動亮度控制更好
回復

使用道具 舉報

18#
ID:155617 發表于 2017-1-7 08:50 來自手機 | 只看該作者
嘟嘟嘟 發表于 2016-11-30 18:41
樓主  ds18b02的這個程序 仿真的時候可以用嗎  在proteus中不顯示啊

我去仿真試一下
回復

使用道具 舉報

19#
ID:153685 發表于 2017-1-10 22:34 | 只看該作者
謝謝分享
回復

使用道具 舉報

20#
ID:89286 發表于 2017-1-21 11:30 | 只看該作者
thanks for sharing
回復

使用道具 舉報

21#
ID:153681 發表于 2017-4-4 13:17 | 只看該作者
兄弟,逗我呢,資料里就那么點程序
回復

使用道具 舉報

22#
ID:187675 發表于 2017-6-27 08:44 | 只看該作者
百度分享的東東失效

本貼分享的附件,無法通過仿真

樓主能提供完整的資料學習一下嗎?


謝謝


zg@jslskj.com

回復

使用道具 舉報

23#
ID:167272 發表于 2017-8-11 10:14 | 只看該作者
下載的附件,程序不全。。。
回復

使用道具 舉報

24#
ID:101749 發表于 2017-8-21 10:54 | 只看該作者
MyClock_V2.0F EEPROM.zip (102.89 KB, 下載次數: 45) 上面分享的文件已失效,這是最終的程序,現在也已經畢業了,再分享一下,這號少登了,謝謝
回復

使用道具 舉報

25#
ID:242098 發表于 2017-10-23 19:52 來自手機 | 只看該作者
分享取消了
回復

使用道具 舉報

26#
ID:197331 發表于 2017-11-23 21:17 | 只看該作者
不錯,值得學習。
回復

使用道具 舉報

27#
ID:170645 發表于 2018-4-22 14:48 | 只看該作者
收藏學習
回復

使用道具 舉報

28#
ID:360792 發表于 2018-6-28 15:24 | 只看該作者
樓主有能網盤分享一下嗎
回復

使用道具 舉報

29#
ID:89134 發表于 2018-12-12 18:41 | 只看該作者
基于51單片機的電子時鐘Ok
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 神马九九 | 国产四区 | 中文字幕视频一区二区 | 伊人成人免费视频 | 欧美一级久久久猛烈a大片 日韩av免费在线观看 | 一区二区三区精品视频 | 日韩一区在线观看视频 | 成人av片在线观看 | 欧美一级在线观看 | 欧美片网站免费 | 久久看精品 | 午夜寂寞影院在线观看 | 亚洲综合视频 | 男女啪啪高潮无遮挡免费动态 | 久久人人网 | 日韩成人在线一区 | 欧美久久久网站 | 国产精品久久久久无码av | 欧美亚洲国产日韩 | 国产日产精品一区二区三区四区 | 国产91在线 | 亚洲 | 久亚州在线播放 | 久久久久久久久久久高潮一区二区 | 91九色婷婷 | 婷婷桃色网 | 成人超碰在线 | aaa大片免费观看 | 国产激情偷乱视频一区二区三区 | 成人三级视频 | 国产成人福利 | 欧美精品一区二区三区在线播放 | 久久久久久久久99 | 综合久久一区 | 欧美日韩一区二区三区在线观看 | 国产精品2 | 欧美视频 亚洲视频 | 日韩精品一区二区三区视频播放 | 亚洲欧美一区二区三区国产精品 | 日本超碰| 亚洲二区视频 | 国产成人久久av免费高清密臂 |