DS1302驱动程序.doc
DS1302是课程设计和毕业设计经常用到的时钟芯片,还在愁怎么对DS1302操作吗?那么看完DS1302驱动程序,一切变得那么简单。DS1302驱动程序:/=DS1302.H=#ifndef _DS1302_H_#define _DS1302_H_/DS1302管脚定义sbit T_IO=P26; /位定义1302芯片的接口,数据输出端定义在P2.5引脚sbit T_RST=P27; /位定义1302芯片的接口,复位端口定义在P2.6引脚sbit T_CLK=P25; /位定义1302芯片的接口,时钟输出端口定义在P2.4引脚/变量定义声明unsigned char TableDs13027=55,59,23,4,3,5,11; /初始化时时间日期设置 /秒 分 时 日月 星期 年/函数定义声明void Write1302(unsigned char );/向1302写一个字节数据void WriteSet1302(unsigned char ,unsigned char );/根据命令字,向1302写一个字节数据unsigned char Read1302(void);/从1302读一个字节数据unsigned char ReadSet1302(unsigned char Cmd);/根据命令字从1302读取一个字节数据void InitDS1302(void);/初始化1302void GetTime(void);/获取1302的时间/*函数功能:向1302写一个字节数据入口参数:x*/ void Write1302(unsigned char dat) unsigned char i; T_CLK=0; /拉低T_CLK,为脉冲上升沿写入数据做好准备 Delay1Us(2); /稍微等待,使硬件做好准备 for(i=0;i<8;i+) /连续写8个二进制位数据 T_IO=dat&0x01; /取出dat的第0位数据写入1302Delay1Us(2); /稍微等待,使硬件做好准备T_CLK=1; /上升沿写入数据Delay1Us(2); /稍微等待,使硬件做好准备T_CLK=0; /重新拉低T_CLK,形成脉冲dat>>=1; /将dat的各数据位右移1位,准备写入下一个数据位 /*函数功能:根据命令字,向1302写一个字节数据入口参数:Cmd,储存命令字;dat,储存待写的数据,为十进制数*/ void WriteSet1302(unsigned char Cmd,unsigned char dat)T_RST=0; /禁止数据传递 T_CLK=0; /确保写数居前T_CLK被拉低T_RST=1; /启动数据传输Delay1Us(2); /稍微等待,使硬件做好准备Write1302(Cmd); /写入命令字Write1302(dat/10<<4)|(dat%10); /写数据T_CLK=1; /将时钟电平置于已知状态T_RST=0; /禁止数据传递/*函数功能:从1302读一个字节数据入口参数:x*/ unsigned char Read1302(void) unsigned char i,dat;Delay1Us(2); /稍微等待,使硬件做好准备for(i=0;i<8;i+) /连续读8个二进制位数据dat>>=1; /将dat的各数据位右移1位,因为先读出的是字节的最低位if(T_IO=1) /如果读出的数据是1dat|=0x80; /将1取出,写在dat的最高位 T_CLK=1; /将T_CLK置于高电平,为下降沿读出Delay1Us(2); /稍微等待T_CLK=0; /拉低T_CLK,形成脉冲下降沿Delay1Us(2); /稍微等待 return dat; /将读出的数据返回 /*函数功能:根据命令字,从1302读取一个字节数据入口参数:Cmd*/ unsigned char ReadSet1302(unsigned char Cmd)unsigned char temp,dat1,dat2; T_RST=0; /拉低T_RST T_CLK=0; /确保写数居前T_CLK被拉低 T_RST=1; /启动数据传输 Write1302(Cmd); /写入命令字 temp=Read1302(); /读出数据 T_CLK=1; /将时钟电平置于已知状态 T_RST=0; /禁止数据传递dat1=temp/16; /16进制转成BCDdat2=temp%16;temp=dat1*10+dat2; /转换成10进制数字 return (temp); /将读出的数据返回/*函数功能: 1302进行初始化设置*/ void InitDS1302(void)unsigned char i,add;add=0x80;WriteSet1302(0x8e,0x00); /允许写入for(i=0;i<7;i+)WriteSet1302(add,TableDs1302i); add+=2; WriteSet1302(0x90,0xa6); /写充电控制寄存器.WriteSet1302(0x8e,0x80); /禁止写入/*程序功能:获取DS1302时间*/void GetTime()unsigned char i,add=0x81;WriteSet1302(0x8e,0x00); /允许向DS1302写入数据for(i=0;i<7;i+) TableDs1302i=ReadSet1302(add); /获得的数据已转换为十进制 add+=2;WriteSet1302(0x8e,0x80); /获取完一次时间,禁止向DS1302写入数据,提高可靠endif