首页 > 编程知识 正文

ds1302时钟电路图,时钟电路DS1302

时间:2023-05-05 04:21:17 阅读:125009 作者:4998

不懂就别写

Attention :

在上升沿前书写,在下降沿后阅读。

“读”“写”命令的操作必须复位。

“读”命令在读完后必须加上IO=0。

操作1302,必须前往灯光保护。

电路接口

配置文件: DS1302作为编码方式是BCD码,是压缩BCD码,8位是0-99整数(Year=99 ),7位是0-79整数) Sec,Min=60 ),6位是0-49整数,Hour=24

时序逻辑无厘头: DS1302是变种SPI,通过I/O与SCLK相互协作,收发信息。 SCLK在上升边缘之前,主机通过I/O端口发送数据,而DS1302在上升边缘接收数据; 在SCLK变为下降沿之后,DS1302通过I/O端口发送数据并由主机接收。

寄存器结构

0号寄存器:秒(BCD码,高位4位为10位,低位4位为1位(1号寄存器) ) BCD码,高位4位为10位,低位4位为10位(2号寄存器)时) MSB最高位为24/12位高位4位为10位低位4位为1位) 5号寄存器(周) BSD码、低位3位(6号寄存器)年) BCD码、高位4位为10位、低位4位为1位(7号寄存器)控制字) MSD码

链路层:发送和接收复位DS1302的定时诀窍是在上升沿之前写入,并在下降沿之后读取

发送:因为上升沿从站接收数据,所以上升沿前的主机发送数据,并保持到上升沿后;

接收:由于下降沿从站发送数据,所以在下降沿之后,主机读取数据直到下一个下降沿之前。 每次读写由写入寄存器地址的几个读取数据/写入数据构成,每次读写时复位DS1302的定时。 即,SCLK=0 //DS1302上升沿的开头数据voidtransmit_byte(u8dat ) { u8 mask; for (掩码=0x 01; 马克!=0; 掩码=1(if ) dat掩码) DS1302_IO=1; else DS1302_IO=0; //Transmit bit DS1302_SCLK=0; DS1302_SCLK=1; //raising edge }} //DS1302在下降沿输入数据u8receive_byte({u8mask,dat=0; for (掩码=0x 01; 马克!=0; mask=1(ds1302_sclk=1; DS1302_SCLK=0; //fallingedgeif(ds1302_io ) dat |=mask;//接收位}返回日期; //中间层操作需要重置void Reset_CE () { DS1302_CE=0; DS1302_SCLK=0; )网络层)单发单发速收Read读取操作需要主动降低IO端口。 即,DS1302_IO=0。 或者施加10K上拉电阻。 以寄存器(1-7)为参数,向左移动1位或上升到0x80/0x81即可构成地址。 奇读偶书

写入(addr1(|0x80

簧片(addr1)|0x 81 void ds 1302 _ singlewrite (u8 addr,u8 dat ) { Reset_CE ); transmit_byte((addr1)|0x80 ); transmit_byte(dat; }u8ds1302_singleread(u8addr ) { u8 dat=0; Reset_CE (; transmit_byte((addr1)|0x81 ); dat=Receive_Byte (; DS1302_IO=0; //pay attention for it return dat; }voidds1302_burstwrite(U8*dat ) U8I; Reset_CE (; transmit_byte(0xbe; for(I=0; i8; I ) {transmit_byte(*dat ); }voidds1302_burstread(U8*dat ) U8I; Reset_CE (; transmit_byte(0xbf; for(I=0; i8; I ) { dat[i]=Receive_Byte (; } DS1302_IO=0; //pay attention for it}传输层:设置/读取时间(结构)还支持结构,寄存器顺序(逆序),可以构建结构数组,便于管理。 //ds 1302.h//externstructstime { u8 year; u8 Week; u8 Month; u8天; u8 Hour; u8 Minute; u8第二次会议; (; voidset _ real time (structs time * time ) { u8 buf[8]; buf[7]=0; buf[6]=Time-Year; buf[5]=Time-Week; buf[4]=Time-Month; buf [3]=时间日; buf[2]=Time-Hour; buf[1]=Time-Minute; buf[0]=Time-Second; ds1302_burstwrite(buf; } void get _ real time (structs time * time ) { u8 buf[8]; ds1302_burstread(buf; 时间-年=buf [6]; 时间- week=buf [5]; 时间- month=buf [4]; 时间日=buf [3]; Time-Hour=buf[2]; Time-Minute=buf[1]; Time-Second=buf[0]; } APP应用层:初始化显示在DP DS1302的初始化中,为了解除写保护,必须向寄存器编号7的MSB中写入0。 void init _ ds 1302 ((structstimeinittime () )0x 18,0x 03,0x 12,0x 31,0x 23,0x//yearweekmondatehourminsecds 1302 set _ real time (初始时间; } void DP _ ds 1302 _ date (结构时间*时间) ) seg_buff(7)=seg_code[time-year4]; seg _ buff [6]=seg _ code [ time-year0x 0f ]; SEG_buff[5]=SEG_code[10]; seg _ buff [4]=seg _ code [ time-month4]; seg _ buff [3]=seg _ code [ time-month0x 0f ]; SEG_buff[2]=SEG_code[10]; seg _ buff [1]=seg _ code [时间-日期4 ]; seg _ buff [0]=seg _ code [ time-day0x 0f ]; } void DP _ ds 1302 _ time (结构时间*时间) seg_buff(7)=seg_code[time-hour4]; seg _ buff [6]=seg _ code [ time-hour0x 0f ]; SEG_buff[5]=SEG_code[10]; seg _ buff [4]=seg _ code [ time-minute4]; seg _ buff [3]=seg _ code [ time-minute0x 0f ]; SEG_buff[2]=SEG_code[10]; seg _ buff [1]=seg _ code [ time-second4]; seg _ buff [0]=seg _ code [ time-second0x 0f ]; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。