找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机oled DS1302时钟显示只能显示TTTT等乱码怎么解决?

  [复制链接]
跳转到指定楼层
楼主
用oled和ds1302搞了个半成品时钟(只能够看时间和温度不能调时间),然后我在我的STC89c52的单片机开发板上实验成功了,结果换到STC15W408AS上就出现了时间显示乱码和TT
补充:我把ds18b20和ds1302的程序全换成1T的了,不知道是不是改了以后ds1302的程序有bug。。。。。。



  1. #include "stc15f2k60s2.h"
  2. #include "intrins.h"
  3. #include "codetab.h"
  4. #include "LQ12864.h"
  5. #include "ds1302.h"
  6. #include "ds18b20.h"



  7. unsigned char code Address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年 最低位读写位 读+1;写不加
  8. unsigned char code Table[12]="0123456789:-";
  9. unsigned char code Week[7][3]={"MON","TUE","WED","THU","FRI","SAT","SUN"};
  10. unsigned char database[9];//时钟寄存器(时分秒)
  11. unsigned char Date[11];//日期寄存器(年月日)
  12. unsigned char Weekend[4];//星期寄存器
  13. unsigned char Temperature[7];//温度寄存器
  14. unsigned char l[7]={00,39,13,23,1,3,19};//秒分时日月周年08-05-15 12:00:00
  15. unsigned int temper;
  16. unsigned char Bits;//修改时间标志位
  17. unsigned char Bist[2];

  18. void SetRTC()  /*设置时间*/
  19. {

  20. unsigned char i,tmp,*p;
  21. for(i=0;i<7;i++)
  22. {
  23. tmp=l[i]/10;
  24. l[i]=l[i]%10;
  25. l[i]=l[i]+tmp*16;
  26. }
  27. WriteData(0x8e,0x00);

  28. p=Address;
  29. for(i=0;i<7;i++)
  30. {
  31. WriteData(*p,l[i]);
  32. p++;
  33. }
  34. WriteData(0x8e,0x80);
  35. }

  36. void ReadRTC()  /*读时钟*/
  37. {
  38. unsigned char i,*p;
  39. p=Address;
  40. for(i=0;i<7;i++)
  41. {
  42. l[i]=ReadData(*p+1);
  43. p++;
  44. }
  45. }

  46. void DisplayRTC()
  47. {
  48. database[0]=Table[l[2]/16];
  49. database[1]=Table[l[2]&0x0f];
  50. database[2]=Table[10];
  51. database[3]=Table[l[1]/16];
  52. database[4]=Table[l[1]&0x0f];
  53. database[5]=Table[10];
  54. database[6]=Table[l[0]/16];
  55. database[7]=Table[l[0]&0x0f];
  56. Date[0]=Table[2];
  57. Date[1]=Table[0];
  58. Date[2]=Table[l[6]/16];
  59. Date[3]=Table[l[6]&0x0f];
  60. Date[4]=Table[11];
  61. Date[5]=Table[l[4]/16];
  62. Date[6]=Table[l[4]&0x0f];
  63. Date[7]=Table[11];
  64. Date[8]=Table[l[3]/16];
  65. Date[9]=Table[l[3]&0x0f];
  66. Weekend[0]=Week[l[5]-1][0];
  67. Weekend[1]=Week[l[5]-1][1];
  68. Weekend[2]=Week[l[5]-1][2];
  69. Temperature[0]=Table[temper/100];
  70. Temperature[1]=Table[temper%100/10];
  71. Temperature[2]='.';
  72. Temperature[3]=Table[temper%10];
  73. Temperature[4]='^';
  74. Temperature[5]='C';
  75. Bist[0]=Table[Bits];
  76. OLED_P8x16Str(32,2,database);
  77. OLED_P8x16Str(16,4,Date);
  78. OLED_P8x16Str(8,6,Weekend);
  79. OLED_P8x16Str(64,6,Temperature);
  80. OLED_P6x8Str(112,4,Bist);
  81. }

  82. void Tempchange()
  83. {

  84.     DS18B20_Reset();                //设备复位
  85.     DS18B20_WriteByte(0xCC);        //跳过ROM命令
  86.     DS18B20_WriteByte(0x44);        //开始转换命令
  87.    // while (!DQ);                    //等待转换完成
  88. }

  89. unsigned int Tempread()
  90. {
  91.         unsigned char TPH,TPL;         //存放温度值的高字节
  92. unsigned int temp;
  93.         float tt;
  94.     DS18B20_Reset();                //设备复位
  95.     DS18B20_WriteByte(0xCC);        //跳过ROM命令
  96.     DS18B20_WriteByte(0xBE);        //读暂存存储器命令
  97.     TPL = DS18B20_ReadByte();       //读温度低字节
  98.     TPH = DS18B20_ReadByte();       //读温度高字节
  99.     temp=TPH;
  100.     temp<<=8;
  101.     temp=temp|TPL;        
  102.           tt=temp*0.0625;
  103.     temp=tt*10+0.5;
  104.           return(temp);
  105. }

  106. void main()
  107. {
  108. unsigned char i;
  109. database[8]='\0';
  110. Date[10]='\0';
  111. Weekend[3]='\0';
  112. Temperature[6]='\0';
  113. Bist[1]='\0';
  114. OLED_Init();
  115. //SetRTC();
  116. for(i=0;i<8;i++)
  117. {
  118. OLED_P16x16Ch(i*16,0,i);
  119. }

  120. while(1)
  121. {
  122. unsigned char k;
  123. Tempchange();
  124. for(k=0;k<25;k++)
  125. {
  126. ReadRTC();
  127. DisplayRTC();
  128. }
  129. temper=Tempread();
  130. }
  131. }

复制代码

omega.zip

5.75 KB, 下载次数: 38

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

使用道具 举报

沙发
ID:7485 发表于 2019-1-26 01:43 | 只看该作者
读DS1302的时序不对,没有读出正确的时间。可以适当增加读的延时试试。
回复

使用道具 举报

板凳
ID:466381 发表于 2019-1-26 08:20 | 只看该作者
ahshmj 发表于 2019-1-26 01:43
读DS1302的时序不对,没有读出正确的时间。可以适当增加读的延时试试。

我刚刚拿以前89c52的程序然后把-nop-()全变成了12个-nop-(),试了一下,结果只是从TT变成7T了。。。。。。
回复

使用道具 举报

地板
ID:123289 发表于 2019-1-26 08:23 | 只看该作者
不懂显示原理,靠蒙?不如花时间读读各器件的手册。
回复

使用道具 举报

5#
ID:209065 发表于 2019-1-26 10:59 | 只看该作者
不用想了,传感器没问题,你程序错了,和二楼所说的一样,所以导致读到的数据变成字符T了,建议I2C通信时序再认真看看;
回复

使用道具 举报

6#
ID:466381 发表于 2019-1-26 16:35 来自手机 | 只看该作者
邹强斌 发表于 2019-1-26 10:59
不用想了,传感器没问题,你程序错了,和二楼所说的一样,所以导致读到的数据变成字符T了,建议I2C通信时序 ...

我知道是那个ds1302的程序有问题,但好像怎么改都不行。。。。(以前用12T的时候有多少个nop转移过来就把nop的数量翻12倍,然后再在每一个指令中间加个1us的延时)
回复

使用道具 举报

7#
ID:466381 发表于 2019-2-3 18:33 来自手机 | 只看该作者
补充:搞定了,是模块那里那个32k晶振坏掉了,然后换掉就没问题了
回复

使用道具 举报

8#
ID:472242 发表于 2019-2-4 15:12 | 只看该作者
功夫不负有心人,支持!

评分

参与人数 7黑币 +162 收起 理由
areyouok + 35
Sawardeakar + 35
#include51.h + 15
jinsheng7533967 + 35 很给力!
站着说话不腰疼 + 12
yoxi + 15
Trump1438 + 15

查看全部评分

回复

使用道具 举报

9#
ID:424598 发表于 2019-3-22 19:54 | 只看该作者
文件不全也放上来................................................
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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