下载下来直接用
单片机源程序如下:
- #ifndef __DS1307_H__
- #define __DS1307_H__
- #include <STC89C5xRC.h>
- #include "intrins.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit sda=P2^0;//;模拟I2C 数据传送位
- sbit scl=P2^1;//;模拟I2C 时钟控制状态标志
- uchar Hours,Minutes,Seconds,Year,Month,Date,Weeks;
- uchar Decimal_to_BCD(uchar temp)//十进制转换成BCD码
- {
- uchar a,b,c;
- a=temp;
- b=0;
- while(a>=10)
- {
- a=a-10;
- b=b+16;
- c=a+b;
- temp=c;
- }
- return temp;
- }
- uchar BCD_to_Decimal(uchar temp)//BCD码转换成十进制
- {
- uchar a,b,c;
- a=temp;
- b=0;
- while(a>=16)
- {
- a=a-16;
- b=b+10;
- c=a+b;
- temp=c;
- }
- return temp;
- }
- void delay_5us()//5us延时
- {
- _nop_();
- _nop_();
- _nop_();
- }
- void star_1307()//开始
- {
- sda=1;
- delay_5us();//5us延时
- scl=1;
- delay_5us();//5us延时
- sda=0;
- delay_5us();//5us延时
- }
- void stop_1307()//停止
- {
- sda=0;
- delay_5us();//5us延时
- scl=1;
- delay_5us();//5us延时
- sda=1;
- delay_5us();//5us延时
- }
- void ack_1307()//应答
- {
- uchar z=0;
- while((sda==1)&&(z<50))z++;//条件判断, sda=1,则没有应答。如果没有应答则延时:z<50,z++;后返回
- scl=0;
- delay_5us();//5us延时
- }
- void write_1307(uchar slave_write_address,uchar byte_address,uchar data_data)//写一个数据
- {
- uchar temp,temp1,i,ii;
- star_1307(); //开始
- for(ii=0;ii<3;ii++)//根据 24CXX文档资料,和时序图,按顺序送:器件写地址,字节地址,数据
- {
- if(ii==0)
- {
- temp=slave_write_address;//送 器件写地址
- temp1=slave_write_address;
- }
- else if(ii==1)
- {
- temp=byte_address;//送 字节地址
- temp1=byte_address;
- }
- else if(ii==2)
- {
- temp=data_data;//送 数据
- temp1=data_data;
- }
- for(i=0;i<8;i++)
- {
- scl=0;
- delay_5us();//5us延时
- temp=temp1;
- temp=temp&0x80;//相 与 后,把不相关的位清零
- if(temp==0x80)//根据前面 相 与 后,判断 temp是否等于0x80,是则该位为 1
- sda=1;
- else
- sda=0;
-
- delay_5us();//5us延时
- scl=1;
- delay_5us();//5us延时
- scl=0;
- delay_5us();//5us延时
- temp1=temp1<<1;//向左移出1位
-
- }
- sda=1;
- delay_5us();//5us延时
- scl=1;
- delay_5us();//5us延时
- ack_1307();
- }
- stop_1307();//停止
- }
- uchar read_1307(uchar slave_write_address,uchar byte_address,uchar slave_read_address)//读一个数据
- {
- uchar temp,temp1,i,ii,x,data_data;
- star_1307();//开始
- for(ii=0;ii<3;ii++)//根据 24CXX文档资料,和时序图,按顺序送:器件写地址,字节地址,器件读地址
- {
- if(ii==0)
- {
- temp=slave_write_address;//送 器件写地址
- temp1=slave_write_address;
- }
- else if(ii==1)
- {
- temp=byte_address;//送 字节地址
- temp1=byte_address;
- }
- else if(ii==2)
- {
- star_1307();//开始
- temp=slave_read_address;//送 器件读地址
- temp1=slave_read_address;
- }
- for(i=0;i<8;i++)//开始读数据
- {
- scl=0;
- delay_5us();//5us延时
- temp=temp1;
- temp=temp&0x80;// 相 与 后,把不相关的位清零
- if(temp==0x80)//根据前面 相 与 后,判断 temp是否等于0x80,是则该位为 1
-
- sda=1;
- else
- sda=0;
-
- delay_5us();//5us延时
- scl=1;
- delay_5us();//5us延时
- scl=0;
- delay_5us();//5us延时
- temp1=temp1<<1;//向左移出1位
- }
- sda=1;
- delay_5us();//5us延时
- scl=1;
- delay_5us();//5us延时
- ack_1307();//应答
- }
- for(x=0;x<8;x++)
- {
- data_data=data_data<<1;//向左移入1位
- sda=1;
- delay_5us();//5us延时
- scl=0;
- delay_5us();//5us延时
- scl=1;
- delay_5us();//5us延时
- if(sda==1)//判断 数据线是否是高电平
- data_data|=0x01;//把读到的数据 或 0X01
- }
- ack_1307();//应答
- stop_1307();//停止
- return data_data;//返回读到的数据
- }
- void init_1307()//初始化
- {
- Hours=23;
- Minutes=14;
- Seconds=11;
- Year=17;
- Month=11;
- Date=24;
- Weeks=5;
- Seconds=Decimal_to_BCD(Seconds);//十进制转换成BCD码
- Minutes=Decimal_to_BCD(Minutes);//十进制转换成BCD码
- Hours=Decimal_to_BCD(Hours);//十进制转换成BCD码
- Date=Decimal_to_BCD(Date);//十进制转换成BCD码
- Year=Decimal_to_BCD(Year);//十进制转换成BCD码
- Month=Decimal_to_BCD(Month);//十进制转换成BCD码
- write_1307(0xd0,0x00,Seconds);//写入秒
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
DS1307万年历程序.rar
(30.02 KB, 下载次数: 62)
|