完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
`我用proteus仿真的ds1302,用数码管显示,本身应该每60秒一清零,但是却变成了99秒一清零,分钟也不对,不只是哪里的问题,请大侠们帮小弟看看,在这里先谢过了。 #include #include "ds1302.h" #define uchar unsigned char #define uint unsigned int uchar code duanma[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //0~9段码,共阴极 ***it S1=P3^0; //小时调整按键 ***it S2=P3^1; //分钟调整按键 ***it S3=P3^2; //秒钟调整按键 uchar hour; //小时计数变量 uchar minute; //分钟计数变量 uchar second; //秒钟计数变量 uchar isr_time; //50中断次数计数器 /************************************ 初始化子函数 入口参数:无 出口参数:无 ************************************/ void init(void) { //hour=12; //初始化时的时间是12点整 //minute=0; //second=0; P3=0xff; P2=0x00; //TMOD=0x01; //使用定时器0的模式1 //TH0=0x3c; //定时50ms //TL0=0xb0; //ET0=1; //TR0=1; //EA=1; } /************************************ 5ms*x定时子函数 入口参数:无 出口参数:无 ************************************/ void delay_5ms(uchar m) { uchar i,j,l; for(j=m;j>0;j--) { for(i=10;i>0;i--) { for(l=247;l>0;l--) ; } } } /************************************ 1ms*x定时子函数 入口参数:无 出口参数:无 ************************************/ void delay_1ms(uchar m) { uchar i,j,l; for(j=m;j>0;j--) { for(i=2;i>0;i--) { for(l=247;l>0;l--) ; } } } /************************************ 显示小时子函数 入口参数:h 出口参数:无 ************************************/ void display_xiaoshi(uchar h) { P2=0x00; //显示小时的十位 P0=duanma[h/10]; delay_1ms(1); P2=0x01; //显示小时的个位 P0=duanma[h%10]; delay_1ms(1); P2=0x02; //显示- P0=0x40; delay_1ms(1); P2=0x0f; //关闭所有数码管 } /************************************ 显示分钟子函数 入口参数:m 出口参数:无 ************************************/ void display_fenzhong(uchar m) { P2=0x03; //显示分钟的十位 P0=duanma[m/10]; delay_1ms(1); P2=0x04; //显示个的个位 P0=duanma[m%10]; delay_1ms(1); P2=0x05; //显示- P0=0x40; delay_1ms(1); P2=0x0f; //关闭所有数码管 } /************************************ 显示秒钟子函数 入口参数:s 出口参数:无 ************************************/ void display_miaozhong(uchar s) { P2=0x06; //显示秒钟的十位 P0=duanma[s/10]; delay_1ms(1); P2=0x07; //显示秒的个位 P0=duanma[s%10]; delay_1ms(1); P2=0x0f; //关闭所有数码管 } void main(void) { init(); while(1) { second=DS1302Read( 0x81 ); minute=DS1302Read( 0x83 ); hour=DS1302Read( 0x85 ); second &= 0x7f; minute &= 0x7f; hour &=0x1f ; display_xiaoshi( hour ); display_fenzhong(minute ); display_miaozhong(second ); } } ` |
|
相关推荐
5个回答
|
|
你这程序不透明,对ds1302操作的部分你都打包在头文件里了,谁知道问题出在哪呢?ds1302的时序对了才有可能读到数据,'才谈得上显示时间。
|
|
|
|
谢谢in2004,我把对ds1302的操作部分给传上来,这个是从网上下载的。
#include #define uchar unsigned char #define uint unsigned int ***it RST=P1^0; ***it SCLK=P1^1; ***it SDA=P1^2; /************************************************ *名称:DS1302WriteByte *说明:无 *功能:写入8bit数据 *调用:delayus() *输入:dat:要写入的数据 *输出:无 *************************************************/ void DS1302WriteByte(uchar dat) { uchar i; SCLK=0;//初始时钟线置为0 //delay_us(2); for(i=0;i<8;i++)//开始传输8个字节的数据 { SDA=dat&0x01;//取最低位,注意DS1302的数据和地址都是从最低位开始传输的 //delay_us(2); SCLK=1;//时钟线拉高,制造上升沿,SDA的数据被传输 //delay_us(2); SCLK=0;//时钟线拉低,为下一个上升沿做准备 dat>>=1;//数据右移一位,准备传输下一位数据 } } /************************************************ *名称:DS1302ReadByteDS1302ReadByte()() *说明:无 *功能:读取8bit的数据 *调用:delayus() *输入:无 *输出:dat:读取的数据 *************************************************/ uchar DS1302ReadByte() { uchar i,dat; //delay_us(2); for(i=0;i<8;i++) { dat>>=1;//要返回的数据左移一位 if(SDA==1)//当数据线为高时,证明该位数据为1 dat|=0x80;//要传输数据的当前值置为1,若不是,则为0 SCLK=1;//拉高时钟线 //delay_us(2); SCLK=0;//制造下降沿 //delay_us(2); } return dat;//返回读取出的数据 } /************************************************ *名称:ucharDS1302Read() *说明:先写地址,后读数据 *功能:从cmd相应地址中读取一个字节的数据 *调用:DS1302WriteByte(),DS1302ReadByte() *输入:cmd:要写入的控制字节 *输出:dat:读取的数据 *************************************************/ uchar DS1302Read(uchar cmd) { uchar dat; RST=0;//初始CE线置为0 SCLK=0;//初始时钟线置为0 RST=1;//初始CE置为1,传输开始 DS1302WriteByte(cmd);//传输命令字,要读取的时间/日历地址 dat=DS1302ReadByte();//读取要得到的时间/日期 SCLK=1;//时钟线拉高 RST=0;//读取结束,CE置为0,结束数据的传输 return dat;//返回得到的时间/日期 } /************************************************ *名称:DS1302Write *说明:先写地址,后写数据 *功能:向cmd相应地址中写一个字节的数据 *调用:DS1302WriteByte() *输入:cmd:要写入的控制字,dat:要写入的数据 *输出:无 *************************************************/ void DS1302Write(uchar cmd,uchar dat) { RST=0;//初始CE线置为0 SCLK=0;//初始时钟线置为0 RST=1;//初始CE置为1,传输开始 DS1302WriteByte(cmd);//传输命令字,要写入的时间/日历地址 DS1302WriteByte(dat);//写入要修改的时间/日期 SCLK=1;//时钟线拉高 RST=0;//读取结束,CE置为0,结束数据的传输 } |
|
|
|
我也就是来学学的,也是这个问题
|
|
|
|
我后来调整程序发现是ds1302操作时出的问题,但是就不知道怎么才能正常。
|
|
|
|
原来程序也没问题,而是读取的数没有进行转换,所以才出现错误。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
《DNESP32S3使用指南-IDF版_V1.6》第三十五章 摄像头实验
846 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第三十章 DHT11数字温湿度传感器
820 浏览 0 评论
910 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
1693 浏览 0 评论
1307 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12076 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-30 21:44 , Processed in 0.518931 second(s), Total 48, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号