完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
#include"reg52.h"
#include"DS1302.h" /****************************/ /* 地址定义 */ void DS1302_delay(unsigned char x) { unsigned char i,j; for(i=x;i>0;i--) for(j=12;j>0;j--) ; } /****************************/ /* 驱动函数 */ /****************************/ /* DS1302写一个字节 */ /* dat:写进DS1302的数据 */ void DS1302_WRITE(unsigned char dat) { char i; RST=0; SCLK=0; RST=1; for(i=0;i<8;i++) { if(dat&0x01) IO=1; else IO=0; dat>>=1; SCLK=0; SCLK=1; } DS1302_delay(5); RST=0; } /* DS1302读一个字节 */ /* dat:读回的数据 */ char DS1302_READ() { char i,dat,temp,dat2; RST=0; SCLK=0; RST=1; for(i=0;i<8;i++) { SCLK=1; DS1302_delay(5); SCLK=0; if(IO) temp|=0x80; else temp|=0x00; dat>>=1; } DS1302_delay(5); RST=0; dat2=temp/16; dat=temp%16; temp=dat+dat2*10; return(temp); } /*DS1302写寄存器驱动函数*/ /*reg:目标寄存器,dat:写进寄存器的数据*/ void DS1302_WRITE_REG(char reg,char dat) { char i; EA=0; RST=0; SCLK=1; RST=1; for(i=0;i<8;i++) { SCLK=0; IO=reg&0x01; reg>>=1; DS1302_delay(5); SCLK=1; } for(i=0;i<0;i++) { SCLK=0; IO=dat&0x01; dat>>=1; DS1302_delay(5); SCLK=1; } DS1302_delay(5); RST=0; IO=1; SCLK=1; EA=1; } /*DS1302寄存器读驱动函数*/ /*reg:读目标函数,dat:读回的数据*/ char DS1302_READ_REG(char reg) { char i,dat1,dat2,temp=0; EA=0; RST=0; SCLK=1; RST=1; for(i=0;i<8;i++) { SCLK=0; IO=reg&0x01; reg>>=1; DS1302_delay(5); SCLK=1; } for(i=0;i<8;i++) { temp>>=1; SCLK=0; if(IO) temp|=0x80; else temp|=0x00; SCLK=1; } DS1302_delay(5); RST=0; IO=1; SCLK=1; dat1=temp/16; dat2=temp%16; temp=dat2+dat1*10; EA=1; return(temp); } #include"reg52.h" #include"DS1302.h" #include"absacc.h" sfr AUXR = 0x8E; uchar code table[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xFF}; //最后一个为熄灭 uchar dspbuf[]={10,10,10,10,10,10,10,10}; uchar dspcom; uchar intr; bit flag_DS1302; void display(); void init_DS1302(); void init_T0(); void cls_beep(); void main() { uchar second,minute,hour; init_DS1302(); init_T0(); cls_beep(); while(1) { if(flag_DS1302) { flag_DS1302=0; hour =DS1302_READ_REG(READ_HOUR); minute =DS1302_READ_REG(READ_MINUTE); second =DS1302_READ_REG(READ_SECOND); dspbuf[0]=hour/10; dspbuf[1]=hour%10; dspbuf[2]=minute/10; dspbuf[3]=minute%10; dspbuf[4]=second/10; dspbuf[5]=second%10; } } } void init_T0() { TMOD&=0XF0; TMOD|=0X01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; ET0=1; TR0=1; EA=1; } void init_DS1302() { DS1302_WRITE_REG(WRITE_PROTECT,0X00); DS1302_WRITE_REG(WRITE_SECOND,0X56); DS1302_WRITE_REG(WRITE_MINUTE,0X15); DS1302_WRITE_REG(WRITE_HOUR,0X15); DS1302_WRITE_REG(WRITE_PROTECT,0X80); } void display() { P0 = 0xff; P2 = ((P2&0x1f)|0xE0); P2 &= 0x1f; P0 = 1< P2 &= 0x1f; P0 = table[dspbuf[dspcom]]; P2 = ((P2&0x1f)|0xE0); P2 &= 0x1f; if(++dspcom == 8){ dspcom = 0; } } void inter_T0() interrupt 1 { TH0=(65536-1000)/256; TL0=(65536-1000)%256; intr++; display(); if(intr==20) { intr=0; flag_DS1302=1; } } void cls_beep() { P2=((P2&0x1f)|0xa0); P0=0x00; P2&=0x1f; } |
|
相关推荐
13个回答
|
|
标题party
|
|
|
|
|
|
|
|
我想问下,我那个DS1302时序已经调好了,但是我的秒数码管在从59调变到00时,却显示不出来,等到1分钟过去之后才会出现,请问您有了解过着类的问题吗/ |
|
|
|
LZ可以参考下我针对CT107D的固件库
|
|
|
|
继续主演 发表于 2017-3-13 21:01 你把1302读出来的数据通过串口打印在调试助手里看一下秒是如何变化的,尤其是从59->00的时候,数据抓到了要显示就是很简单的事情了。 |
|
|
|
多谢,我尝试一下 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
我UC已经满了
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
298 浏览 1 评论
《DNESP32S3使用指南-IDF版_V1.6》第二十六章 INFRARED_RECEPTION实验
309 浏览 0 评论
826 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1911 浏览 2 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
1427 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12032 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 11:46 , Processed in 0.862961 second(s), Total 95, Slave 79 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号