- #include "intrins.h"
- #ifndef _DS1302_H_
- #define _DS1302_H_
- sbit clk = P2^2; //ds1302时钟线定义
- sbit io = P2^1; //数据线
- sbit rst = P2^0; //复位线
- //秒 分 时 日 月 年 星期
- uchar code write_add[]={0x80,0x82,0x84,0x86,0x88,0x8c,0x8a}; //写地址
- uchar code read_add[] ={0x81,0x83,0x85,0x87,0x89,0x8d,0x8b}; //读地址
- uchar code init_ds[] ={0x58,0x29,0x07,0x05,0x10,0x14,0x1};
- extern uchar miao,fen,shi,ri,yue,week,nian;
- extern uchar i;
- void delaynus(unsigned char n)
- {
- unsigned char i;
- for(i=0;i<n;i++);
- }
- //向1302写一个字节数据
- void Write1302(unsigned char dat)
- {
- unsigned char i;
- clk=0; //拉低CLK,为脉冲上升沿写入数据做准备
- delaynus(2); //稍微等待,使硬件做好准备
- for(i=0;i<8;i++) //连续写8个二进制数据
- {
- io=dat&0x01; //取出dat的第0位数据写入1302
- delaynus(2); //稍微等待,使硬件做好准备
- clk=1; //上升沿写入数据
- delaynus(2); //稍微等待,使硬件做好准备
- clk=0; //重新拉低SCLK,形成脉冲
- dat>>=1; //将dat的各数据位右移1位,准备下入下一位数据位
- }
- }
- /*************根据命令,向1302写一个数据到对应的地址里***************/
- void write_ds1302(uchar add,uchar dat)
- {
- rst=0; //禁止数据传递
- clk=0; //确保写数据前CLK被拉低
- rst=1; //启动数据传输
- delaynus(2); //稍微等待,为硬件做好准备
- Write1302(add); //写入命令字
- Write1302(dat); //写数据
- clk=1; //将始终电平置于已知状态
- rst=0; //禁止数据传递
- }
- /*****************************************************
- 从1302读一个字节数据
- ***************************************************/
- unsigned char Read1302(void)
- {
- unsigned char i,dat;
- delaynus(2); //稍微等待,为硬件做好准备
- for(i=0;i<8;i++) //连续读8个二进制位数据
- {
- dat>>=1; //将dat的各数据位右移1位,因为先读出来的是字节的最低位
- if(io==1) //如果读出来的是1
- dat|=0x80; //将1取出,写在dat的最高位
- clk=1; //将clk置于高电平,为下降沿读出
- delaynus(2); //稍微等待
- clk=0; //拉低clk,形成脉冲下降沿
- delaynus(2); //稍微等待
- }
- return dat; //将读出来的数据返回
- }
- /*************根据命令,从1302对应的地址读一个数据出来***************/
- uchar read_ds1302(uchar add)
- {
- unsigned char dat;
- rst=0; //拉低RST
- clk=0; //确保写数据前CLK被拉低
- rst=1; //启动数据传输
- Write1302(add); //写入命令字
- dat=Read1302(); //读出数据
- clk=1; //将时钟电平置于已知状态
- rst=0; //禁止数据传递
- return dat; //将读出的数据返回
- }
- /*************把要的时间 年月日 都读出来***************/
- void read_time()
- {
- miao = read_ds1302(read_add[0]); //读秒
- fen = read_ds1302(read_add[1]); //读分
- shi = read_ds1302(read_add[2]); //读时
- ri = read_ds1302(read_add[3]); //读日
- yue = read_ds1302(read_add[4]); //读月
- nian = read_ds1302(read_add[5]); //读年
- week = read_ds1302(read_add[6]); //读星期
- }
- /*************把要写的时间 年月日 都写入ds1302里***************/
- void write_time()
- {
- write_ds1302(0x8e,0x00); //关闭写保护
- write_ds1302(write_add[0],miao); //写秒
- write_ds1302(write_add[1],fen); //写分
- write_ds1302(write_add[2],shi); //写时
- write_ds1302(write_add[3],ri); //写日
- write_ds1302(write_add[4],yue); //写月
- write_ds1302(write_add[5],nian); //写年
- write_ds1302(write_add[6],week); //写星期
- write_ds1302(0x8e,0x80); //打开写保护
- }
- /*************把数据保存到ds1302 RAM中**0-31*************/
- void write_ds1302ram(uchar add,uchar dat)
- {
- add <<= 1; //地址是从第二位开始的
- add &= 0xfe; //把最低位清零 是写的命令
- add |= 0xc0; //地址最高两位为 1
- write_ds1302(0x8e,0x00);
- write_ds1302(add,dat);
- write_ds1302(0x8e,0x80);
- }
- /**********************设置ds1302时间函数**********************/
- void set_ds1302time(uchar num,uchar *shi,uchar dat) //调时
- {
- if(num == 1)
- {
- *shi+=0x01;
- if((*shi & 0x0f) >= 0x0a)
- *shi = (*shi & 0xf0) + 0x10;
- if(*shi >= dat)
- *shi = 0;
- }
- else
- {
- if(*shi == 0x00)
- *shi = dat;
- if((*shi & 0x0f) == 0x00)
- *shi = (*shi | 0x0a) - 0x10;
- *shi -=0x01 ;
- }
- }
- /*************把数据从ds1302 RAM读出来**0-31*************/
- uchar read_ds1302ram(uchar add)
- {
- add <<= 1; //地址是从第二位开始的
- add |= 0x01; //把最高位置1 是读命令
- add |= 0xc0; //地址最高两位为 1
- return(read_ds1302(add));
- }
- /*************初始化ds1302时间***************/
- void init_ds1302()
- {
- uchar i;
- rst = 0; //第一次读写数据时要把I O口拉低
- clk = 0;
- io = 0;
- i = read_ds1302ram(30);
- if(i != 3)
- {
- i = 3;
- write_ds1302ram(30,i); //4050 4100 3080
- write_ds1302(0x8e,0x00); //关闭写保护
- for(i=0;i<7;i++)
- write_ds1302(write_add[i],init_ds[i]); //把最高位值0 允许ds1302工作
- write_ds1302(0x8e,0x80); //打开保护
- }
- read_time(); //读时间
- if(miao >= 0x60)
- {
- write_ds1302(0x8e,0x00); //关闭写保护
- write_ds1302(write_add[0],0x01); //把最高位值0 允许ds1302工作
- write_ds1302(0x8e,0x80); //打开保护
-
- }
- }
- #endif
复制代码 |