首页 > 编程知识 正文

51单片机ds1302时钟程序,ds1302代码

时间:2023-05-06 16:46:41 阅读:125016 作者:3147

DS1302介绍高性能、低功耗的日历计时器

DS1302是串行接口的实时时钟,内部有可编程的日历计时器和31字节的静态RAM,能够自动进行闰年补偿

工作电压范围(2.5V~5.5V )宽,还具有对备用电池进行涓流充电功能,能够有效地延长备用电池的寿命

DS1302用于数据记录,可以同时记录数据和该数据出现的时间,因此应用广泛

DS1302引脚介绍

VCC1主电源VCC2备用电源在VCC2大于VCC1 0.2V情况下,从VCC2向DS1302供给电力,否则,从VCC1向DS1302供给SCLK串行时钟输入端子,从数据输入输出I/O双向输入线RST的

读写寄存器的数据为BCD码(8421型BCD码)秒寄存器(81H、80H)

bit7被定义为时钟暂停标志(CH )

当该位置为1时,时钟振荡器停止,DS1302成为低功耗状态

该位置为0时,时钟为小时寄存器(85H、84H)

bit7用于定义DS1302是以12小时模式运行还是以24小时模式运行。

在1的情况下,现在是12小时模式,此情况下,bit5为AM/PM位置

对于24小时模式,该位表示时间数据位控制寄存器(8FH、8EH)

bit7是写保护位(WP ),其他7位都是0,

WP位必须为0,才能读写时钟或RAM。 WP位为1时,无法写入时钟日历寄存器和RAM。

向DS1302添加31字节静态RAM的地址

DS1302突发模式配置寄存器突发模式是指一次传送多个字节的时钟信号或RAM数据

DS1302通信定时数据的传输从最低有效位开始(BIT0)。 以位为单位依次写入或读取数据,在读字节数据操作中在SCLK的上升沿执行写入数据,在下降沿执行数据读一字节时序

RST侧(图中的CE )允许从低到高的一个上升沿读出数据,降低RST侧则禁止数据的读写。

的8个SCLK循环、写入命令字节和数据的下8个SCLK循环读取数据。写一字节时序

RST侧(图中的CE )从低到高的上升沿允许数据写入,降低RST侧则禁止数据的读写。

的8个循环开始,写入命令字节,数据的下一个8个循环写入数据

#includereg52.hsbit TSCLK=P1^0; //串行时钟输入端子sbit TIO=P1^1; //双向输入线(数据线) sbit TRST=P1^2; //有效侧# defineucharsignedcharvoidwrite _ ds 1302 (uchar cmd,uchar dat )//1字节({uchar i; TRST=0; //降低使能端子TSCLK=0降低数据总线TRST=1使能端上升沿for(I=0; i 8; I//写入指令{TSCLK=0; TIO=cmd0x01; //最低位优先于TSCLK=1; //数据总线产生上升沿,并且在DS1302中将数据读出到cmd=1; //向右移位1位(for ) I=0; i 8; I//写入数据{TSCLK=0; TIO=dat0x01; //最低位优先于TSCLK=1; //数据总线上产生上升沿,并且在DS1302中将数据读出到dat=1; //向右移动一位(}TRST=0; //降低使能端子,关闭读写功能(ucharread_ds1302 ) ucharcmd ) /读取数据) {uchar i,dat; TRST=0; //降低使能端子TSCLK=0降低数据总线TRST=1使能端上升沿for(I=0; i 8; 传递I//指令{TSCLK=0; TIO=cmd0x01; //最低位优先于TSCLK=1; //数据总线产生上升沿,并且在DS1302中将数据读出到cmd=1; //向右移位1位(for ) I=0; i 8; I//读取数据{TSCLK=0; //降低数据总线dat=1的if(TiO ) {dat |=0x80; }TSCLK=1; //数据总线发生上升,将数据读取到DS1302中}TRST=0; //降低使能引脚,关闭读写功能返回dat; }uchardat_to_BCD(uchardat ) /数据传输BCD码) {uchar dat1,dat2; dat1=dat/10; dat2=dat % 10; dat2=dat2 dat1 * 16; 返回日期2; }ucharBDD_to_dat(uchardat )//BCD代码转换数据) {uchar dat1,dat2; dat1=dat /16; dat2=dat % 16; dat2=dat2 dat1 * 10; 返回日期2; }void main () {uchar i; uchar sec,min,hour; write_ds1302(0x8e,0 ); //禁止写入write_ds1302(0x80,dat_to_BCD ) 30 ); //30秒write_ds1302(0x82,dat_to_BCD ) 15 ); //15分钟write_ds1302(0x84,dat_to_BCD ); //19点write_ds1302(0x8e,0x80 ); //写保护while(1) write_ds1302 )0x8e,0 ); //取消写保护sec=BDD_to_dat(read_ds1302 )0x81 ); //秒读取寄存器(进行BCD码转换) min=BDD_to_dat ) read_ds1302(0x83 ); //读部分寄存器hour=BDD_to_dat(read_ds1302 )0x85 ); //读取时寄存器write_ds1302(0x8e,0x80 ); //写保护for(I=0; i 50; I//循环显示时钟{display(sec,min,hour ); //相应的显示函数(正文中未定义) }

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