dso138程序_ds1307时钟模块

dso138程序_ds1307时钟模块DS1307 C语言程序 – ds1307怎么使用(ds1307引脚图及功能_c语言程序及典型应用电路)DS1307 C语言程序//

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

(0)
上一篇 2024年 9月 5日 上午11:39
下一篇 2024年 9月 5日 上午11:43

相关推荐

关注微信