DS1307 C语言程序 – ds1307怎么使用(ds1307引脚图及功能_c语言程序及典型应用电路) 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口 }
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/46141.html