时钟芯片DS12C887使用说明.doc_第1页
时钟芯片DS12C887使用说明.doc_第2页
时钟芯片DS12C887使用说明.doc_第3页
时钟芯片DS12C887使用说明.doc_第4页
时钟芯片DS12C887使用说明.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

汇编程序: ORG 0000H AJMP 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,DPTR;如果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,#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,#7D0AH MOVX A,DPTR JB ACC.7,GETTIME ;REGISTER A的UIP位=0时才可以读数据 MOV DPTR,#7D00H MOVX A,DPTR MOV R2,A ;SECONDS ACALL DISPLAY MOV DPTR,#7D02H MOVX A,DPTR MOV R1,A ACALL DISPLAY ;MINUTES MOV DPTR,#7D04H MOVX A,DPTR MOV R0,A ;HOURS ACALL DISPLAY ACALL DELAY RETDISPLAY: MOV DPTR,#TAB MOV SCON,#00H MOV R3,A ANL A,#0FH MOVC A,A+DPTR MOV SBUF,A JNB TI,$ CLR TI MOV A,R3 SWAP A ANL A,#0FH MOVC A,A+DPTR MOV SBUF,A JNB TI,$ CLR TI RETDELAY: MOV R4,#0FH DE1:MOV R5,#0FFH DJNZ R5,$ DJNZ R4,DE1 RET TAB: DB 03H,9FH,25H,0DH,99H,49H,41H,1FH,01H,09H,11H,0C1H,63H,85H,61H,71H ENDC语言源程序:#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 DS_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,0xff /* 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 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中时间的函数(供用户设置时间函数调用)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 GetTime()/获得当前时间函数char temp2;temp2=0x00;temp2=DSA;if(temp2 & 0x80)!=0x00)/判断寄存器12c887控制寄存器A的最高位是否位0(即是否可以读数)return;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.Seconds;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 & 0x7f;DSB=temp;/恢复到正常的走时状态void ShowTime()/显示时间函数Display(time_n.Seconds);/显示秒Display(time_n.Minutes);/分Display(time_n.Hour);/时void Display(int temp3)/显示传入参数的函数(串口)int temp4;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 & set_ht=1)/按键松开且此前按键曾按下,置标志为2set_ht=2;if(Set_m=0)set_mt=1;else if(Set_m=1 & set_mt=1)set_mt=2;if(Set_s=0)set_st=1;else if(Set_s=1 & set_st=1)set_st=2;if(Set_h=0)set_ht=1;else if(Set_h=1 & set_ht=1)set_ht=2;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.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();/初始

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论