收藏 分享(赏)

时钟芯片DS12C887使用说明.doc

上传人:yjrm16270 文档编号:6323450 上传时间:2019-04-07 格式:DOC 页数:11 大小:152KB
下载 相关 举报
时钟芯片DS12C887使用说明.doc_第1页
第1页 / 共11页
时钟芯片DS12C887使用说明.doc_第2页
第2页 / 共11页
时钟芯片DS12C887使用说明.doc_第3页
第3页 / 共11页
时钟芯片DS12C887使用说明.doc_第4页
第4页 / 共11页
时钟芯片DS12C887使用说明.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

1、汇编程序:ORG 0000HAJMP STARTSTART:ACALL SETTIME ;设置初始时间LOOP: ACALL GETTIME ;循环读取当前时间AJMP LOOP;SETTIME: MOV DPTR,#7D0AH ;DS12C887 的 A 寄存器MOV A,#20HMOVX DPTR,A ;打开 DS12C887 的内部晶振并使 RTC(实时时钟)记录时间INC DPTR ;DS12C887 的 B 寄存器MOV A,#08HMOVX DPTR,A ;设十进制 BCD 码,24 小时制,不定时MOV DPTR,#7D0DH ;DS12C887 的 D 寄存器MOVX A,DP

2、TR ;如果 D 寄存器的第 7 位为 0,表示电池耗尽JNB ACC.7,ERRORMOV DPTR,#7D00H ;DS12C887 的秒单元MOV A,#00HMOVX DPTR,A ;写入秒MOV DPTR,#7D02H ;DS12C887 分单元MOV A,#21HMOVX DPTR,A ;写入分MOV DPTR,#7D04H ;DS12C887 时单元MOV A,#03HMOVX DPTR,A ;写入时MOV DPTR,#7D06H ;DS12C887 星期单元MOV A,#03HMOVX DPTR,A ;写入星期MOV DPTR,#7D07H ;DS12C887 日单元MOV A

3、,#20HMOVX DPTR,A ;写入日MOV DPTR,#7D08H ;DS12C887 月单元MOV A,#07HMOVX DPTR,A ;写入月MOV DPTR,#7D09H ;DS12C887 年单元MOV A,#05HMOVX DPTR,A ;写入年时间ERROR: RETGETTIME:MOV DPTR,#7D0AHMOVX A,DPTRJB ACC.7,GETTIME ;REGISTER A 的 UIP 位=0 时才可以读数据 MOV DPTR,#7D00HMOVX A,DPTRMOV R2,A ;SECONDSACALL DISPLAYMOV DPTR,#7D02HMOVX

4、A,DPTRMOV R1,AACALL DISPLAY ;MINUTESMOV DPTR,#7D04H MOVX A,DPTRMOV R0,A ;HOURSACALL DISPLAYACALL DELAYRETDISPLAY:MOV DPTR,#TABMOV SCON,#00HMOV R3,AANL A,#0FHMOVC A,A+DPTRMOV SBUF,AJNB TI,$CLR TIMOV A,R3SWAP AANL A,#0FHMOVC A,A+DPTRMOV SBUF,AJNB TI,$CLR TIRETDELAY:MOV R4,#0FHDE1:MOV R5,#0FFHDJNZ R5,$

5、DJNZ R4,DE1RET TAB: DB 03H,9FH,25H,0DH,99H,49H,41H,1FH,01H,09H,11H,0C1H,63H,85H,61H,71HENDC 语言源程序:#include “reg52.h“#include “absacc.h“#define DSA XBYTE0x7F0A /12c887 寄存器 A 地址#define DSB XBYTE0x7F0B /B 地址#define DSD XBYTE0x7F0D /D 地址#define DS_H XBYTE0x7F04 /时地址#define DS_M XBYTE0x7F02 /分地址#define D

6、S_S XBYTE0x7F00 /秒地址#define DS_W XBYTE0x7F06 /星期地址#define DS_D XBYTE0x7F07 /日地址#define DS_Mo XBYTE0x7F08 /月地址#define DS_Y XBYTE0x7F09 /年地址code unsigned char LED_code_tab= /* 显示段笔划 abcdefgh; 0=亮 */0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f, /* 0,1,2,3,4,5,6,7 */0x01,0x09,0x11,0xc1,0x63,0x85,0x61,0x71,0x

7、ff /* 8,9,A,b,C,d,E,F,全灭 */;sbit Set=P10; /设置时间标志位sbit Set_h=P11; /设置小时sbit Set_m=P12; /设置分钟sbit Set_s=P13; /设置秒钟code struct timeint Year; /当前时间 年int Month; /当前时间 月int Day; /当前时间 日int Week; /当前时间 星期int Hour; /当前时间 时int Minutes; /当前时间 分int Seconds; /当前时间 秒int a_Hour; /报警时间 时int a_Minutes; /报警时间 分int

8、a_Seconds; /报警时间 秒;struct time time_n; /保存当前时间的结构体struct time time_t; /保存上次调用显示时的时间的结构体void Init(); /程序初始化函数void Init12c887(); /初始化 12c887 的函数void GetTime(); /获取当前时间的函数void ShowTime(); /显示当前时间(设置) 的函数void Display(int temp); /显示传入参数的函数void SetTime(); /用户设置时间函数void UpDateTime(); /更新 12c887 中时间的函数 (供用户

9、设置时间函数调用)void Init() /程序初始化函数time_n.Seconds=0;time_n.Minutes=0;time_n.Hour=0;time_n.Week=0;time_n.Day=0;time_n.Month=0;time_n.Year=0;time_t=time_n;Set=1;Set_h=1;Set_m=1;Set_s=1;void Init12c887() /初始化 12c887 控制寄存器DSA=0x20; /打开 DS12C887 的内部晶振并使 RTC(实时时钟)记录时间DSB=0x0E; /设二进制计数(汇编语言可用十进制 BCD 计数),不定时void

10、GetTime() /获得当前时间函数char temp2;temp2=0x00;temp2=DSA;if(temp2 time_n.Seconds=DS_S; /读取当前时间time_n.Minutes=DS_M;time_n.Hour=DS_H;time_n.Week=DS_W;time_n.Day=DS_D;time_n.Month=DS_Mo;time_n.Year=DS_Y;void UpDateTime() /更新时间的函数char temp;temp=DSB;temp=temp | 0x80;DSB=temp; /暂停走时,为接下来的时间更新作准备DS_S=time_n.Seco

11、nds;DS_M=time_n.Minutes;DS_H=time_n.Hour;DS_W=time_n.Week;DS_D=time_n.Day;DS_Mo=time_n.Month;DS_Y=time_n.Year;temp=DSB;temp=temp DSB=temp; /恢复到正常的走时状态void ShowTime() /显示时间函数Display(time_n.Seconds); /显示秒Display(time_n.Minutes); /分Display(time_n.Hour); /时void Display(int temp3) /显示传入参数的函数 (串口)int temp

12、4;temp4=temp3;temp4=temp3%10;temp3=temp3/10;SBUF=LED_code_tabtemp4;while(!TI)TI=0;temp4=temp3%10;SBUF=LED_code_tabtemp4;while(!TI)TI=0;void SetTime() /用户设置当前时间的函数int set_st,set_mt,set_ht;set_st=set_mt=set_ht=0;while(Set=0)if(Set_h=0) /按键按下时,置标志为 1set_ht=1;else if(Set_h=1 if(Set_m=0)set_mt=1;else if(

13、Set_m=1 if(Set_s=0)set_st=1;else if(Set_s=1 if(Set_h=0)set_ht=1;else if(Set_h=1 if(set_st=2) /当标志为 2,即按键完成一次按下动作后,将当前时间的秒钟加 1,以下雷同time_n.Seconds+;if(time_n.Seconds=60)time_n.Seconds=0;if(set_mt=2)time_n.Minutes+;if(time_n.Minutes=60)time_n.Minutes=0;if(set_ht=2)time_n.Hour+;if(time_n.Hour=24)time_n.

14、Hour=0;if(set_ht=2 | set_mt=2 | set_st=2)UpDateTime(); /先更新时间,接下来获取当前最新时间后显示GetTime();ShowTime();set_ht=0;set_mt=0;set_st=0;void main()Init12c887(); /初始化 12c887Init(); /初始化程序ShowTime();while(1)if(Set=0)SetTime();GetTime();if(time_n.Seconds!=time_t.Seconds | time_n.Minutes!=time_t.Minutes | time_n.Hour!=time_t.Hour) /只有在两次的时间不一致时才调用显示函数time_t=time_n;ShowTime();以上汇编和 C 程序由 第 7 组 完成,如有疑问,请前来咨询 !

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 说明文书

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报