1 / 32
文档名称:

万年历程序—C语言.doc

格式:doc   大小:289KB   页数:32页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

万年历程序—C语言.doc

上传人:非学无以广才 2020/2/10 文件大小:289 KB

下载得到文件列表

万年历程序—C语言.doc

文档介绍

文档介绍:万年历数字钟及可调时钟系统 一、   引言万年历数字钟是一种用万年历时钟芯片实现年、月、日、时、分、秒计时,并通过单片机处理后送给显示芯片显示的装置,与机械式时钟相比具有更高的准确性和直观性,且具有更长的使用寿命。本系统还可以扩展为可调的自动开关,对家电对用电设备进行控制,、   原理图设计1. 单片机及其外围电路设计复位采用X25045芯片,复位电路如图1所示。图1复位电路设计 单片机采用贴片封装的AT89S51,。~,电路如图2所示。图2单片机89S51外围电路设计 2. 时钟芯片电路设计时钟芯片采用PCF8563,,电容使用15pf。PCF8563是PHILIPS公司推出的一款工业级内含I2C总线接口功能的具有极低功耗的多功能时钟/日历芯片。内部时钟电路、内部振荡电路、内部低电压检测电路()以及两线制I2C总线通讯方式,不但使外围电路及其简洁,而且也增加了芯片的可靠性。同时每次读写数据后,内嵌的字地址寄存器会自动产生增量。电路如图3所示。图3时钟芯片电路设计 3. 显示芯片电路设计显示芯片采用ZLG7289,晶振为12MHz。ZLG7289A是广州周立功单片机发展有限公司自行设计的,具有SPI串行接口功能的可同时驱动8位共阴式数码管(或64只独立LED)的智能显示驱动芯片,该芯片同时还可连接多达64键的键盘矩阵,单片即可完成LED显示﹑键盘接口的全部功能。电路如图4所示。图4显示芯片电路设计4. 双电源电路设计系统采用双电源,平时使用V1=10V的外接电源,停电时使用电池,由V2输入。电池有6节,其电压为9V。当电池电压低于6V时,LED亮,说明电池电量不足。电路如图5所示。图5双电源电路设计三、   程序设计程序开始时先对系统初始化,并设置好各种中断。下步操作主要是对时钟芯片进行操作,首先要给时钟芯片设置初值,时钟芯片便自行计数。此时检测是否有按键按下,按键是为了调整时钟。有按键按下则执行按键中断程序,没有按键按下则执行下一步的操作,即取时钟芯片中的时钟值,然后送显示。程序流程图如下。图6总体流程图 四、         源程序#include <>#include <>#include <> #defineucharunsignedchar/*宏定义*/#defineuintunsignedintucharclose_date,open_date;voidRESWDI(void);voidWREN(void);voidWRDI(void);voidWRSR(void);unsignedcharRSDR(void);voidWIPCHK(void);voidOUTByte(unsignedcharByte);unsignedcharINPUTByte(void);unsignedcharReadByte(unsignedcharADD);voidWriteByte(unsignedcharByte,ADD);#define_Nop()_nop_()/*定义空指令*/   sbit zlg7289_cs =P1^1;sbit zlg7289_clk =P2^6;sbit zlg7289_dio =P2^7;sbit zlg7289_key =P3^2;sbitp07=P0^7;sbitp06=P0^6;sbitCS=P2^4;sbitSCK=P2^2;sbitSO=P2^5;sbitSI=P2^3;sbitp10=P1^0; sbit SDA=P1^2;/*模拟I2C数据传送位*/sbit SCL=P1^3;/*模拟I2C时钟控制位*/ uchar buf[9]={0x00,0x00,0x30,0x23,0x15,0x1,0x05,0x04,0x05};ucharbufdata,bb,date;uchar SLA=0xA2,SUBA=0x00;uchar *p; /*接收指针*/ ucharkeychange=0;ucharkey=0; /*键盘值*/bitkeyint=0; /*按键中断标志*/bitkeyok=1; /*数据是否修改好*/ucharnum=0; /*移位键移到哪个LED*/   /****延时函数****************************************/voiddelay(uchari){ while(i--);} //********************TIMER1interruptprocess***************************//timer0(void)interrupt1using1{TH0=0x3c;TL0=0xb0; RESWDI(); }  voidRESWDI(void)////复位看门狗(