首页 > 编程知识 正文

51单片机可调时钟程序,ds1302与单片机的连接

时间:2023-05-05 00:39:38 阅读:124946 作者:2508

DS1302是一种低功耗实时时钟芯片,能够计时年、月、日、周、时、分、秒,具有闰年补偿等多种功能。 主要特点是采用串行数据传输,为停电保护电源提供可编程充电功能,可以关闭充电功能。

一、基本原理1.引脚分析

2.时序分析

(1)写兼职

第一个字节是地址字节,第二个字节是数据字节。 必须提高RST信号。 否则,数据输入将无效。 换言之,RST信号控制数据|时间信号输入的开始和结束。 地址字节和数据字节读取时上升沿有效,且从LSB读取。

)2)读字节

读一个字节和写一个字节明显不同。 首先写地址字节,然后重读数据字节。 写地址字节时上升沿有效,读取数据字节时下降沿有效。 当然,前提是必须提高RST信号。 写入地址字节和读取数据字节从相同的最低有效位(即第0位)开始。

2 .驱动程序# includere g51.h # includeintrins.h # defineucharunsignedchar # defineuintunsignedintsbitio=P3 ^ 4; //数据输入输出线sbit RST=P3^5; //复位信号线sbit SCLK=P3^6; //时钟信号线uchar codewrite _ addr [ ]={0x 80、0x8c}、0x8c}、0x8c}、0x8c}、0x8c}、0x8c}; //写入的地址uchar code read _ addr [ ]={0x 81,0x 83,0x 85,0x 87,0x 89,0x8b,0x8d}; //要读的地址//---存储顺序为秒时分日月周年,存储格式为BCD码---/uchar time [7]={ 0,0,0x 12,0x 12,0x 12,0x 20,0x 15 }; //初始化时间为2015年12月12日12:00 1.初始化

void ds1302_init () { uchar k; 写入(0x00,0x00 ); //禁止写入,即数据写入为for(k=0; k7; (k ) /写入7字节时钟信号)分分秒时日月周年(write ) write_addr[k],time[k] ); }write(0x8e,0x80 ); //打开写保护} 2.写字节

voidwrite(ucharaddr,uchar dat ) { uchar i,j; SCLK=0; _nop_ (); RST=0; _nop_ (); RST=1; //调高,写地址准备写数据_nop_ (); _nop_ (); for(I=0; i8; 发送I//8位地址,在哪里{ SCLK=0; //为了实现上升沿_nop_ (),再次设为低; IO=addr0x01; //将最低位的addr=1先发送//右移位,将8位的数据依次写入SCLK=1; //数据启动,写入数据_nop_ (); (for ) j=0; j8; 写入j//8位数据{ SCLK=0; //为实现上升沿_nop_ ()而设为低; IO=dat0x01; //将最低位dat=1先发送//右移位,将8位数据依次写入SCLK=1; //数据启动,写入数据_nop_ (); } RST=0; //发行版_nop_ (); } 3.读字节

Ucharread(Ucharaddr ) { uchar i,dat=0; SCLK=0; _nop_ (); RST=0; _nop_ (); RST=1; //拉高,写地址准备读取数据_nop_ (); _nop_ (); for(I=0; i8; 传输I//8位地址,从何处开始{ SCLK=0; //为实现上升沿_nop_ ()而设为低; IO=addr0x01; //将最低位的addr=1先发送//右移位,将8位的数据依次写入SCLK=1; //数据启动,写入数据_nop_ (); } _nop_ (); for(I=0; i8; 读取I//8位数据{ SCLK=1; //为实现下降沿_nop_ ()而设为低; dat=1; //向右移位,将8位数据依次转换为if(io==1) dat=dat|0x80; SCLK=0; //读取数据时,下降沿有效_nop_ (); } RST=0; //复位_nop_ (); SCLK=1; _nop_ (); IO=0; _nop_ (); IO=1; _nop_ (); 返回日期; //返回已读取的数据} 4.读时间

void read_time () { uchar n; for(n=0; n7; n ) time[n]=read(read_addr[n]; //读一刻钟的岁月周年(} 注:在主函数里调用ds1302_init()函数进行初始化,然后一直调用read_time()即可获取实时的时间,并显示出来。

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