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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機(jī)+DS12887實現(xiàn)的萬年歷程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:731890 發(fā)表于 2024-1-3 14:15 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本工程采用STC89C52RC讀取DS12887時鐘芯片的數(shù)據(jù)實現(xiàn)的,因為DS12887本身具有后備電池,所以即使設(shè)備掉電,時鐘芯片依然通過使用后備電池運行,當(dāng)設(shè)備上電后,讀取的時鐘依然是準(zhǔn)確的。因此不用擔(dān)心掉電后時鐘運行不準(zhǔn)確

DS12887簡介
DS12887是DALLAS公司的實時時鐘芯片RTC(Real Time Clock),它功能豐富,應(yīng)用廣泛,PC機(jī)內(nèi)的時鐘信號就是由D512887提供的。DS12887內(nèi)部自帶晶體振蕩器及鋰電池,可計算到2100年前的秒、分、小時、星期、日、月、年七種日歷信息并帶閏年補償,斷電后能運行10年之久不丟失數(shù)據(jù)。可選用夏令時,具有24小時或12小時兩種制式。它在工業(yè)控制及儀器儀表中有廣泛用途。DS12887上電時,當(dāng)Vcc高于4.25V  200mS后,芯片可以被外部程序操作。當(dāng)Vcc低于4.25V時,芯片處于寫保護(hù)狀態(tài)(所有的輸入均無效),同時所有輸出呈高阻狀態(tài)。當(dāng)Vcc低于3V時,芯片將自動把供電方式切換為由內(nèi)部電池供電。

DS12887內(nèi)部寄存器說明
DS12887有128個RAM單元。其中4個單元用作控制寄存器,10個單元用作存放時鐘字節(jié),114字節(jié)為通用RAM。其主要寄存器如下:

DS12887內(nèi)部寄存器A:
  
UIP
  
DV2
DV1
DV0
RS3
RS2
RS1
RS0
UIP=l:更新已到,不能讀/寫DSl2887;UIP=0:更新末到,能讀/寫DS12887。
DV2,DV1,DV0應(yīng)設(shè)置為010,表示打開晶振,允許計時。
RS3,RS2,RS1,RS0為方波頻率選擇位,產(chǎn)生方波周期中斷。

DS12887內(nèi)部寄存器B:
  
SET
  
PIE
AIE
UIE
SQWE
DM
24/12
DSE
SET=0:時間更新正常進(jìn)行,每秒計數(shù)1次;SET=1:禁止更新,程序可初始化時間和日歷。
PIE=l:允許周期中斷;PIE=0:禁止周期中斷。
AIE=1:允許報警中斷;AIE=0:禁止報警中斷。
UIE=1:允許更新結(jié)束中斷;UIE=0:禁止更新結(jié)束中斷。
SQWE為方波允許位。SQWE=1:將RS3,RS2,RS1,RS0選定的方波輸出。
DM=1:BCD碼;DM=0:二進(jìn)制。該位不受復(fù)位信號影響
24/12:1表示24[小]時制;0表示12[小]時制。
DSE為夏時制允許位。DSE=l:采用夏時制;DSE=0:不采用夏時制。

DS12887內(nèi)部寄存器C:
  
IRQF
  
PF
AF
UF
0
0
0
0
IRQF為中斷申請標(biāo)志。
PF為方波周期中斷標(biāo)志。PF=1:方波周期結(jié)束,申請中斷。
AF為鬧鈴中斷標(biāo)志。AF=1:當(dāng)前時間與鬧鈴時間匹配時即刻申請中斷。
UF為更新周期結(jié)束中斷標(biāo)志。UF二I:更新周期結(jié)束時申請中斷。

DS12887內(nèi)部寄存器D:
  
VRT
  
0
0
0
0
0
0
0
VRT為內(nèi)部鋰電池狀態(tài)。VRT=1:鋰電池正常;VRT=0:鋰電池耗盡。

D512887內(nèi)部存儲器功能如附表所示。
  
地址
  
功能
取值范圍(十進(jìn)制數(shù))
取值范圍(二進(jìn)制數(shù))
取值范圍(BCD碼)
0
0~59
00~3B
00~59
1
秒鬧鈴
0~59
00~3B
00~59
2
0~59
00~3B
00~59
3
分鬧鈴
0~59
00~3B
00~59
4
12[小]時模式
0~12
01~0C   AM
  
81~8C   PM
01~12   AM
  
81~92   PM
24[小]時模式
0~23
00~17
00~23
5
時鬧鈴,12[小]時制
1~12
01~0C   AM
  
81~8C   PM
01~12   AM
  
81~92   PM
時鬧鈴,24[小]時制
0~23
00~17
00~23
6
星期(星期天=1)
1~7
01~07
01~07
7
1~31
01~1F
01~31
8
1~12
01~0C
01~12
9
0~99
00~63
00~99
10
控制寄存器A






11
控制寄存器B






12
控制寄存器C






13
控制寄存器D






50
世紀(jì)
0~99
NA
19,20

以下是部分代碼:

  1. #include <REG51.H>
  2. #include <ABSACC.H>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. //============================
  6. #define C8155 XBYTE[0x7000]
  7. #define PA XBYTE[0x7001]
  8. #define PB XBYTE[0x7002]
  9. #define PC XBYTE[0x7003]
  10. //============================
  11. #define sec XBYTE[0x8000]
  12. #define min XBYTE[0x8002]
  13. #define hou XBYTE[0x8004]
  14. #define week XBYTE[0x8006]
  15. #define day XBYTE[0x8007]
  16. #define mon XBYTE[0x8008]
  17. #define year XBYTE[0x8009]
  18. #define cent XBYTE[0x8032]
  19. #define DS12887A XBYTE[0x800a]
  20. #define DS12887B XBYTE[0x800b]
  21. #define DS12887C XBYTE[0x800c]
  22. //===============================
  23. sbit set_inc=P1^0;
  24. sbit set_dec=P1^1;
  25. sbit inc=P1^2;
  26. sbit dec=P1^3;
  27. uchar disbit;
  28. bit flag;
  29. uchar SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,
  30.                 0x6d,0x7d,0x07,0x7f,0x6f};
  31. uchar code act_PB[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  32. uchar code act_PC[5]={0xfe,0xfd,0xfb,0xf7,0xef};
  33. char ms=0;
  34. char data ram_year,ram_mon,ram_day,ram_week,ram_hou,ram_min,ram_sec;
  35. void scan_key(void);
  36. void delay(uint k);
  37. void wr_time(void);
  38. void rd_time(void);
  39. /******************************/
  40. void init_timer0(void)
  41. {
  42. TH0=-(2000/256);
  43. TL0=-(2000%256);
  44. TR0=1;
  45. }

  46. //***********************
  47. void init(void)
  48. {        init_timer0();         
  49.         EA=1;ET0=1;
  50.         C8155=0x0f;
  51.         DS12887A=0x20;
  52. }


  53. /**********************************/
  54. void time_dis(uchar disbit)
  55. {uchar y_week;
  56. switch(disbit)
  57. {
  58. case 0:{PA=SEG7[ram_sec%10];}break;
  59. case 1:{PA=SEG7[ram_sec/10];}break;
  60. case 2:{PA=SEG7[ram_min%10];}break;
  61. case 3:{PA=SEG7[ram_min/10];}break;
  62. case 4:{PA=SEG7[ram_hou%10];}break;
  63. case 5:{PA=SEG7[ram_hou/10];}break;
  64. case 6:{if(ram_week==1)y_week=9;
  65.                 else y_week=ram_week;PA=SEG7[y_week-1];}break;
  66. case 7:{PA=SEG7[ram_day%10];}break;
  67. case 8:{PA=SEG7[ram_day/10];}break;
  68. case 9:{PA=SEG7[ram_mon%10];}break;
  69. case 10:{PA=SEG7[ram_mon/10];}break;
  70. case 11:{PA=SEG7[ram_year%10];}break;
  71. case 12:{PA=SEG7[ram_year/10];}break;
  72. default:break;
  73. }
  74. }
  75. /****************************************/
  76. void min_dis(uchar disbit)
  77. {uchar y_week;
  78. switch(disbit)
  79. {
  80. case 0:{PA=SEG7[ram_sec%10];}break;
  81. case 1:{PA=SEG7[ram_sec/10];}break;
  82. case 2:{PA=SEG7[ram_min%10]&0x7f;}break;
  83. case 3:{PA=SEG7[ram_min/10]&0x7f;}break;
  84. case 4:{PA=SEG7[ram_hou%10];}break;
  85. case 5:{PA=SEG7[ram_hou/10];}break;
  86. case 6:{if(ram_week==1)y_week=9;
  87.                 else y_week=ram_week;PA=SEG7[y_week-1];}break;
  88. case 7:{PA=SEG7[ram_day%10];}break;
  89. case 8:{PA=SEG7[ram_day/10];}break;
  90. case 9:{PA=SEG7[ram_mon%10];}break;
  91. case 10:{PA=SEG7[ram_mon/10];}break;
  92. case 11:{PA=SEG7[ram_year%10];}break;
  93. case 12:{PA=SEG7[ram_year/10];}break;
  94. default:break;
  95. }
  96. }
  97. /***************************************/
  98. void hou_dis(uchar disbit)
  99. {uchar y_week;
  100. switch(disbit)
  101. {
  102. case 0:{PA=SEG7[ram_sec%10];}break;
  103. case 1:{PA=SEG7[ram_sec/10];}break;
  104. case 2:{PA=SEG7[ram_min%10];}break;
  105. case 3:{PA=SEG7[ram_min/10];}break;
  106. case 4:{PA=SEG7[ram_hou%10]&0x7f;}break;
  107. case 5:{PA=SEG7[ram_hou/10]&0x7f;}break;
  108. case 6:{if(ram_week==1)y_week=9;
  109.                 else y_week=ram_week;PA=SEG7[y_week-1];}break;
  110. case 7:{PA=SEG7[ram_day%10];}break;
  111. case 8:{PA=SEG7[ram_day/10];}break;
  112. case 9:{PA=SEG7[ram_mon%10];}break;
  113. case 10:{PA=SEG7[ram_mon/10];}break;
  114. case 11:{PA=SEG7[ram_year%10];}break;
  115. case 12:{PA=SEG7[ram_year/10];}break;
  116. default:break;
  117. }
  118. }
  119. /***************************************/
  120. void week_dis(uchar disbit)
  121. {uchar y_week;
  122. switch(disbit)
  123. {
  124. case 0:{PA=SEG7[ram_sec%10];}break;
  125. case 1:{PA=SEG7[ram_sec/10];}break;
  126. case 2:{PA=SEG7[ram_min%10];}break;
  127. case 3:{PA=SEG7[ram_min/10];}break;
  128. case 4:{PA=SEG7[ram_hou%10];}break;
  129. case 5:{PA=SEG7[ram_hou/10];}break;
  130. case 6:{if(ram_week==1)y_week=9;
  131.                 else y_week=ram_week;PA=SEG7[y_week-1]&0x7f;}break;
  132. case 7:{PA=SEG7[ram_day%10];}break;
  133. case 8:{PA=SEG7[ram_day/10];}break;
  134. case 9:{PA=SEG7[ram_mon%10];}break;
  135. case 10:{PA=SEG7[ram_mon/10];}break;
  136. case 11:{PA=SEG7[ram_year%10];}break;
  137. case 12:{PA=SEG7[ram_year/10];}break;
  138. default:break;
  139. }
  140. }
  141. /**************************************/
  142. void day_dis(uchar disbit)
  143. {uchar y_week;
  144. switch(disbit)
  145. {
  146. case 0:{PA=SEG7[ram_sec%10];}break;
  147. case 1:{PA=SEG7[ram_sec/10];}break;
  148. case 2:{PA=SEG7[ram_min%10];}break;
  149. case 3:{PA=SEG7[ram_min/10];}break;
  150. case 4:{PA=SEG7[ram_hou%10];}break;
  151. case 5:{PA=SEG7[ram_hou/10];}break;
  152. case 6:{if(ram_week==1)y_week=9;
  153.                 else y_week=ram_week;PA=SEG7[y_week-1];}break;
  154. case 7:{PA=SEG7[ram_day%10]&0x7f;}break;
  155. case 8:{PA=SEG7[ram_day/10]&0x7f;}break;
  156. case 9:{PA=SEG7[ram_mon%10];}break;
  157. case 10:{PA=SEG7[ram_mon/10];}break;
  158. case 11:{PA=SEG7[ram_year%10];}break;
  159. case 12:{PA=SEG7[ram_year/10];}break;
  160. default:break;
  161. }
  162. }
  163. /********************************************/
  164. void mon_dis(uchar disbit)
  165. {uchar y_week;
  166. switch(disbit)
  167. {
  168. case 0:{PA=SEG7[ram_sec%10];}break;
  169. case 1:{PA=SEG7[ram_sec/10];}break;
  170. case 2:{PA=SEG7[ram_min%10];}break;
  171. case 3:{PA=SEG7[ram_min/10];}break;
  172. case 4:{PA=SEG7[ram_hou%10];}break;
  173. case 5:{PA=SEG7[ram_hou/10];}break;
  174. case 6:{if(ram_week==1)y_week=9;
  175.                 else y_week=ram_week;PA=SEG7[y_week-1];}break;
  176. case 7:{PA=SEG7[ram_day%10];}break;
  177. case 8:{PA=SEG7[ram_day/10];}break;
  178. case 9:{PA=SEG7[ram_mon%10]&0x7f;}break;
  179. case 10:{PA=SEG7[ram_mon/10]&0x7f;}break;
  180. case 11:{PA=SEG7[ram_year%10];}break;
  181. case 12:{PA=SEG7[ram_year/10];}break;
  182. default:break;
  183. }
  184. }
  185. /****************************************/
  186. void year_dis(uchar disbit)
  187. {uchar y_week;
  188. switch(disbit)
  189. {
  190. case 0:{PA=SEG7[ram_sec%10];}break;
  191. case 1:{PA=SEG7[ram_sec/10];}break;
  192. case 2:{PA=SEG7[ram_min%10];}break;
  193. case 3:{PA=SEG7[ram_min/10];}break;
  194. case 4:{PA=SEG7[ram_hou%10];}break;
  195. case 5:{PA=SEG7[ram_hou/10];}break;
  196. case 6:{if(ram_week==1)y_week=9;
  197.                 else y_week=ram_week;PA=SEG7[y_week-1];}break;
  198. case 7:{PA=SEG7[ram_day%10];}break;
  199. case 8:{PA=SEG7[ram_day/10];}break;
  200. case 9:{PA=SEG7[ram_mon%10];}break;
  201. case 10:{PA=SEG7[ram_mon/10];}break;
  202. case 11:{PA=SEG7[ram_year%10]&0x7f;}break;
  203. case 12:{PA=SEG7[ram_year/10]&0x7f;}break;
  204. default:break;
  205. }
  206. }
  207. /****************************************/
  208. void time0(void) interrupt 1 using 1
  209. {static uchar disbit;
  210.         TH0=-(2000/256);
  211.         TL0=-(2000%256);
  212.         PB=0xff;PC=0xff;
  213. switch(ms)
  214. {
  215. case 0:{time_dis(disbit);}break;
  216. case 1:{min_dis(disbit);}break;
  217. case 2:{hou_dis(disbit);}break;
  218. case 3:{week_dis(disbit);}break;
  219. case 4:{day_dis(disbit);}break;
  220. case 5:{mon_dis(disbit);}break;
  221. case 6:{year_dis(disbit);}break;
  222. default:break;
  223. }
  224. disbit++;
  225. if(disbit>12)disbit=0;
  226. if(disbit<8){PB=act_PB[disbit];PC=0xff;}
  227. else {PB=0xff;PC=act_PC[disbit-8];}
  228. }
  229. /***********************************/
  230. void main(void)
  231. {
  232. init();
  233. rd_time();
  234. while(1)
  235. {
  236. scan_key();
  237. if(ms==0){
  238.                 if(flag){wr_time();flag=0;}
  239.                 else rd_time();
  240.                 }
  241. }
  242. }
  243. /*****************************************/
  244. void wr_time(void)
  245. {
  246.         DS12887B=0x86;
  247.         year=ram_year;mon=ram_mon;day=ram_day;
  248.         week=ram_week;hou=ram_hou;min=ram_min;
  249.         DS12887B=0x06;
  250. }
  251. /*******************************************/
  252. void rd_time(void)
  253. {
  254. uchar data temp,x;
  255. do{temp=DS12887A;x=temp|0x7f;}while(x==0xff);
  256.         ram_year=year;ram_mon=mon;ram_day=day;
  257.         ram_week=week;ram_hou=hou;ram_min=min;ram_sec=sec;
  258. }
  259. /*****************************************/
  260. void scan_key(void)
  261. {
  262. if(!set_inc){ms++;delay(200);if(ms>6)ms=0;}
  263. if(!set_dec){ms--;delay(200);if(ms<0)ms=6;}
  264. if(ms==1){flag=1;if(!inc){ram_min++;if(ram_min>59)ram_min=59;delay(200);}
  265.                 if(!dec){ram_min--;if(ram_min<1)ram_min=1;delay(200);}        }
  266. if(ms==2){        if(!inc){ram_hou++;if(ram_hou>23)ram_hou=23;delay(200);}
  267.                 if(!dec){ram_hou--;if(ram_hou<0)ram_hou=0;delay(200);}        }
  268. if(ms==3){        if(!inc){ram_week++;if(ram_week>7)ram_week=7;delay(200);}
  269.                 if(!dec){ram_week--;if(ram_week<1)ram_week=1;delay(200);} }
  270. if(ms==4){        if(!inc){ram_day++;if(ram_day>31)ram_day=31;delay(200);}
  271.                 if(!dec){ram_day--;if(ram_day<1)ram_day=1;delay(200);}        }
  272. if(ms==5){        if(!inc){ram_mon++;if(ram_mon>12)ram_mon=12;delay(200);}
  273.                 if(!dec){ram_mon--;if(ram_mon<1)ram_mon=1;delay(200);}        }
  274. if(ms==6){flag=1;if(!inc){ram_year++;if(ram_year>99)ram_year=99;delay(200);}
  275.                 if(!dec){ram_year--;if(ram_year<0)ram_day=0;delay(200);} }
  276. }
  277. /********************************************************/
  278. void delay(uint k)
  279. {
  280. uint i,j;
  281. for(i=0;i<k;i++){
  282. for(j=0;j<60;j++)
  283. {;}}
  284. }
  285. /*****************end********************/

復(fù)制代碼
原理圖: 無
仿真: 無
代碼: ds12887.7z (13.82 KB, 下載次數(shù): 9)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50

查看全部評分

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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: av黄色在线 | 国产美女久久 | 午夜欧美一区二区三区在线播放 | a级黄色毛片免费播放视频 国产精品视频在线观看 | 亚洲影视在线 | 欧美精品福利视频 | 久久伊人影院 | 精品免费 | 免费在线成人网 | 免费在线观看成人 | 国产成人99av超碰超爽 | 奇米超碰在线 | 成av在线| 中文字幕av免费 | 九九九久久国产免费 | 亚洲国产一区在线 | 欧洲一区二区视频 | 在线欧美视频 | 久久色视频 | 免费激情网站 | 97精品国产97久久久久久免费 | 国产高清在线精品 | 亚洲欧美精品在线观看 | 瑞克和莫蒂第五季在线观看 | 亚洲一区二区三区视频 | 一区二区电影 | 精品自拍视频 | 久久综合九色综合欧美狠狠 | 白浆在线 | 人人干人人草 | 一区二区三区视频在线观看 | www.国产一区 | 一级做a| 色综合久久88色综合天天 | 国产一区二区欧美 | 亚洲精品一区二区三区中文字幕 | 日本精品一区二区 | 蜜桃av鲁一鲁一鲁一鲁 | 福利精品 | 国产乱一区二区三区视频 | 97久久精品午夜一区二区 |