您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>电子元器件>芯片引脚图>

DS1307 C语言程序 - ds1307怎么使用(ds1307引脚图及功能_c语言程序及典型应用电路)

2018年01月26日 10:52 网络整理 作者: 用户评论(0

DS1307 C语言程序

//********************************************************************

//***************************DS1307调试 *****************************

//********************************************************************

//**DS1307实时时钟芯片地址0xD0 读0xD1 写0xD0 *********************

//********************************************************************

#include《reg51.h》 //单片机80C51

sbit SCL=P1^1; //串口时钟信号

sbit SDA=P1^0; //串口数据信号

sbit clock=P1^2; //调试用脉冲输出信号**************

unsigned char error; //通讯正常error=0x10;超时error=0x11

void delay(int i); //延时子函数

void TimeInitial(); //时钟初始化子函数

void Start_I2C(); //打开串口子函数

void Stop_I2C (); //关闭串口子函数

void Ack_I2C(); //接受应答信号并判断是否正常子函数

void SendAck(); //发送应答信号子函数

void SendNotAck(); //发送非应答信号子函数

void Send_I2C (int ch); //向总线上发送一个字节

unsigned int Receive_I2C(); //在总线上接受一个字节

int read_time(int address); //从芯片D1307读出10为字节 地址1:秒 2:分 3:时 4:星期 5:号 6:月7:年 8 控制字

void write_time(int address,int date); //向芯片D1307 之中地址为address的寄存器写入数据date 仅为八位字节

void main() //主程序************************************************************

{

TimeInitial(); //时钟初始化

write_time(0x07,0x10); //向芯片D1307写入控制字(芯片地址0X07)0x10 控制字:1晶振使能(0有效)4:SOUT方波输出 7、8:方波频率编码

while(1)

{

}

}

void TimeInitial() //时钟初始化

{

TMOD=0x10; //时钟选择方式2 T1时钟

TH1=0x15;

TL1=0xA0; //定时60ms

EA=1; //中断准许

ET1=1; //时钟T1 溢出中断准许

TR1=1; //启动时钟T1

}

//**********************************延时

void delay(int i)

{

int j,h;

for(j=1;j《99;j++)

{

for(h=0;h《i;h++)

;

}

}

//**********************************传送启动

void Start_I2C()

{

EA=0; //关闭中断

SCL=0; //总线放空,以便更改总线数据

delay(1); //延时

SDA=1; //发送I2C总线起始条件的数据信号1以便总线使能时产生下降沿

delay(1); //延时

SCL=1; //发送I2C总线起始条件的时钟信号

delay(1); //延时

SDA=0; //产生下降沿 总线传输开始

delay(1); //延时

SCL=0; //时钟线从高到低一次跳变,总线放空 准备传输数据

}

//**********************************传送关闭

void Stop_I2C ()

{

SCL=0; //发送I2C总线时钟信号放空

SDA=0; //发送I2C总线停止条件的数据信号0以便产生上升沿

delay(1); //延时

SCL=1; //时钟线从低到高一次跳变 总线 使能

delay(1); //延时

SDA=1; //发送I2C总线数据信号产生上升沿 终止传送

delay(1); //延时

SCL=0; //发送I2C总线时钟信号放空

delay(1);

SDA=0; //发送I2C总线放空 准备下次动作

EA=1; //传输结束开启中断

}

//**********************************传送响应

void Ack_I2C()

{

unsigned char errtime=255; //因故障接收方无ACK,超时值为255。

SDA=1; //数据线升高,以便捕捉相应信号,(相应信号:拉低数据线)

SCL=1; // 主机放出一脉冲,等待捕捉相应信号

error=0x10; //通讯正常(即:接受到了相应信号)为0X10;

while(SDA) //等待捕捉相应信号,信号没有到来前一直保持循环,信号到来后迅速跳出循环

{

errtime--; //每循环一次,倒计时减一

if(!errtime) //判断倒计时是否减到了0,即循环了255次,如果减到了0,判定此次通讯未接受到响应信号,传送失败

{

Stop_I2C (); //传送失败,停止传送

error=0x11; //传送结果未传送失败0x11

return; //跳出循环

}

}

SCL=0; //无论传送是否正确,都需放空总线,以备后用

}

//**********************************向总线传送响应

void SendAck()

{

SDA=0; //数据线保持拉低,时钟线发生一次从高低的跳变 发送一个应答信号

delay(1);

SCL=1;

delay(1);

SCL=0;

}

//**********************************向总线传送非响应

void SendNotAck()

{

SDA=1; //数据线保持高,时钟线发生一次从高低的跳变 没有应答

delay(1);

SCL=1;

delay(1);

SCL=0;

}

//**********************************向总线传送字节

void Send_I2C (int ch)

{

int i;

for (i=1;i《=8;i++) //发送八位

{

SCL=0; //总线放空

delay(1); //延时

SDA=(ch&0x80); //根据给定数据,又高位到低位逐步提出字节位,发送到总线上

ch《《=1; //左循环以便输出下一位

delay(1); //延时

SCL=1; //总线使能,发送总线数据

delay(1); //延时

}

SCL=0; //总线8位传送完成,总线放空

}

//**********************************向总线读入字节

unsigned int Receive_I2C()

{

unsigned char i,a;

SDA=1; //不知道为啥,1的时候读入正确 0的时候读入全部为0;

for (i=1;i《=8;i++) //读入八个位

{

a《《=1; // 读入数据左循环

SCL=0; //总线放空

delay(1);

SCL=1; //时钟做一次从低到高的跳变 可以接收一位数据

delay(1);

a|=SDA; // 将数据编入变量a

}

SCL=0; //总线放空

return a; //反馈接收到的信息

}

//**********************************向芯片D1307 之中地址为address的寄存器写入数据date 仅为八位字节

void write_time(int address,int date)

{

Start_I2C(); //启动总线

Send_I2C (0xD0); //呼叫芯片D1307,并定义为 写 动作

Ack_I2C(); //等待响应信号

Send_I2C (address); //发送地址

Ack_I2C(); //等待响应信号

Send_I2C (date); //发送数据

Ack_I2C(); //等待响应信号

Stop_I2C (); //停止总线

}

//****************从芯片D1307读出10为字节 地址1:秒 2:分 3:时 4:星期 5:号 6:月7:年 8 控制字

int read_time(int address)

{

int a[10]; //定义一个数组以便接受数据

int i=1;

Start_I2C(); //启动传送

Send_I2C (0xD0); //呼叫芯片D1307,并定义为 写 动作

Ack_I2C(); //等待响应信号

Send_I2C (0x00); //发送起始地址

Ack_I2C(); //等待响应信号

Stop_I2C (); //关闭总线

Start_I2C(); //启动总线

Send_I2C (0xD1); //呼叫芯片D1307,并定义为 读 动作

SendAck(); //发送应答就位,准备接受数据

for(i;i《10;i++)

{

a[i]=Receive_I2C(); //接受自初始地址开始的10个字节 地址1:秒 2:分 3:时 4:星期 5:号 6:月7:年 8 控制字

SendAck(); //每成功接受一位发送一个响应信号 以便接受下一位

}

Stop_I2C (); //接受完成停止

return a[address]; //反馈所需数据

}

void t1(void) interrupt 3 using 0 //T1溢出中断

{

TH1=0x15;

TL1=0xa0; //重新载入60ms

clock=~clock; //调试用脉冲

P0=read_time(1); //将实时时钟 秒 送入P0口

}

非常好我支持^.^

(8) 72.7%

不好我反对

(3) 27.3%

( 发表人:李倩 )

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!