找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 589|回复: 9
打印 上一主题 下一主题
收起左侧

DS1302读取时间问题

[复制链接]
跳转到指定楼层
楼主
用51单片机写了一个DS1302的驱动,之后显示到数码管上,可是读出的一直都是 “8808”,问一下各位我的代码有什么问题

8.jpg (98.56 KB, 下载次数: 47)

8.jpg

DS1302 四位数码管.rar

22.85 KB, 下载次数: 12

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2023-11-20 06:50 | 只看该作者
这种段码屏属定制屏,必须了解外部引脚与内部LED连接关系才能写出正确的驱动码。
回复

使用道具 举报

板凳
ID:996773 发表于 2023-11-20 09:28 | 只看该作者
这问题问的一头雾水,楼主读取的1302的秒数据还是分钟数据,还是小时数据?

有没有进行bcd到十进制转换?没代码没线路图也就算了,问个问题也得精准一些嘛
回复

使用道具 举报

地板
ID:1091661 发表于 2023-11-20 21:06 | 只看该作者
hi等你 发表于 2023-11-20 09:28
这问题问的一头雾水,楼主读取的1302的秒数据还是分钟数据,还是小时数据?

有没有进行bcd到十进制转换 ...

读取小时和分钟,已经做转换了
回复

使用道具 举报

5#
ID:1091661 发表于 2023-11-20 21:07 | 只看该作者
wulin 发表于 2023-11-20 06:50
这种段码屏属定制屏,必须了解外部引脚与内部LED连接关系才能写出正确的驱动码。

就是常见的共阳8字数码管,带定制图标的
回复

使用道具 举报

6#
ID:517466 发表于 2023-11-20 22:45 | 只看该作者
给你提个建议:
1、测试显示屏输出显示数据有没有问题
     这个治安们用你的函数去测试,与DS1302的处理没有一点关系。确认没毛病后再进行第二步
2、测试读写DS1302是否正常。
     就是说你通过内部程序前脚设置DS1302内容,比如时分秒、年月日数据,然后再读出来,看是否一致。也许秒数据会发生辩护啊,当年月日以及其他和时间无关的数据,设置完,再读出来,应该是一样的。否则程序是有问题的。
3、1和2都正常了,再去进行读取时间并显示的操作。
回复

使用道具 举报

7#
ID:517466 发表于 2023-11-20 22:49 | 只看该作者
顺便发给你一个用STC89C52测试过没问题的工程,你可以参考代码看看,和你做的有没有出入。我的程序用的是12M晶振 DS1302.zip (42.95 KB, 下载次数: 6)


回复

使用道具 举报

8#
ID:1091661 发表于 2023-11-22 20:57 | 只看该作者
suncat0504 发表于 2023-11-20 22:49
顺便发给你一个用STC89C52测试过没问题的工程,你可以参考代码看看,和你做的有没有出入。我的程序用的是12 ...

好的,谢大佬
回复

使用道具 举报

9#
ID:213173 发表于 2023-11-23 13:47 | 只看该作者
BAAABBB 发表于 2023-11-20 21:07
就是常见的共阳8字数码管,带定制图标的


  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. uchar displaydata[4];
  6. uchar code smgduan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳数码管编码
  7. uchar code read_rtc_addr[7] ={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//DS1302读取地址
  8. uchar code write_rtc_addr[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//DS1302写地址
  9. //顺序:秒分时日月周年,存储格式为十进制
  10. uchar time[7]={30,31,11,23,11,4,23};//时间
  11. bit flicker;//闪烁
  12. //=======================DS1302引脚===========================
  13. sbit SCLK=P0^6;
  14. sbit IO  =P0^4;
  15. sbit RST =P0^5;
  16. //=======================数码管引脚===========================
  17. sbit d0=P1^1;//d0~d3  “8”字数码管
  18. sbit d1=P1^2;
  19. sbit d2=P1^3;
  20. sbit d3=P1^4;

  21. //ACC累加器
  22. sbit ACC0=ACC^0;
  23. sbit ACC7=ACC^7;
  24. /***************DS1302有关子函数********************/
  25. void write_byte(uchar dat)//写一个字节
  26. {
  27.         uchar i;
  28.         ACC=dat;
  29.         RST=1;
  30.         for(i=8;i>0;i--)
  31.         {
  32.                 IO=ACC0;
  33.                 SCLK=0;
  34.                 SCLK=1;
  35.                 ACC>>=1;
  36.         }
  37. }

  38. uchar read_byte()//读一个字节
  39. {
  40.         uchar i;
  41.         RST=1;
  42.         for(i=8;i>0;i--)
  43.         {
  44.                 ACC7=IO;
  45.                 SCLK=1;
  46.                 SCLK=0;
  47.                 ACC>>=1;
  48.         }
  49.         return ACC;
  50. }

  51. void write_1302(uchar add,uchar dat)//向1302芯片指定地址写入数据
  52. {
  53.         RST=0;
  54.         SCLK=0;
  55.         RST=1;
  56.         write_byte(add);
  57.         write_byte(dat);
  58.         SCLK=1;
  59.         RST=0;
  60. }

  61. uchar read_1302(uchar add)//从1302指定地址读取数据
  62. {
  63.         uchar temp;
  64.         RST=0;
  65.         SCLK=0;
  66.         RST=1;
  67.         write_byte(add);
  68.         temp=read_byte();
  69.         SCLK=1;
  70.         RST=0;
  71.         return(temp);
  72. }

  73. uchar BCD_D(uchar bcd)//BCD码转十进制函数
  74. {
  75.         return ((bcd>>4)*10)+(bcd & 0x0f);
  76. }

  77. uchar D_BCD(uchar Dec)//十进制转BCD码函数
  78. {
  79.         return (Dec/10*16+Dec%10);
  80. }

  81. void rtc_init()//初始化1302
  82. {
  83.         uchar i,
  84.         RST=0;
  85.         SCLK=0;
  86.         write_1302(0x8e,0x00); //允许写,禁止写保护
  87.         for(i=0;i<7;i++)
  88.                 write_1302(write_rtc_addr[i],D_BCD(time[i]));//写1302时钟数据
  89.         write_1302(0x8e,0x80); //打开写保护
  90. }

  91. void read_time()//读1302时钟数据
  92. {
  93.         uchar i;
  94.         write_1302(0x8e,0x00);
  95.         for(i=0;i<7;i++)
  96.         {
  97.                 time[i]=BCD_D(read_1302(read_rtc_addr[i]));
  98.         }
  99.         write_1302(0x8e,0x80);
  100. }

  101. void data_display()
  102. {
  103.         static uchar temp;
  104.         static uchar i;
  105.         read_time();
  106.         if(temp!=time[0])
  107.         {
  108.                 temp=time[0];
  109.                 flicker=1;
  110.         }
  111.         displaydata[0]=smgduan[time[1]%10];
  112.         displaydata[1]=smgduan[time[1]/10];
  113.         if(flicker)
  114.         {       
  115.                 if(++i>=200)
  116.                 {
  117.                         i=0;
  118.                         flicker=0;
  119.                 }
  120.                 displaydata[2]=smgduan[time[2]%10]&0x7f;//秒闪点
  121.         }
  122.         else displaydata[2]=smgduan[time[2]%10];       
  123.         displaydata[3]=smgduan[time[2]/10];

  124. }
  125. void display()
  126. {
  127.         static uchar i;
  128.         P1&=0xe1;//清位码、消隐
  129.         P2=displaydata[i];//送段码
  130.         P1|=0x02<<i;//送位码
  131.         i=++i%4;//循环计数
  132. }

  133. void delay(uint r)
  134. {
  135.         while(r--);
  136. }

  137. void main()
  138. {
  139.         rtc_init();
  140.         while(1)
  141.         {
  142.                 data_display();
  143.                 display();
  144.                 delay(100);
  145.         }
  146. }
复制代码



回复

使用道具 举报

10#
ID:1091661 发表于 2023-11-24 22:13 | 只看该作者

不知道为什么读出的是4545,你的仿真有能运行吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表