找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5163|回復: 8
打印 上一主題 下一主題
收起左側

單片機oled DS1302時鐘顯示只能顯示TTTT等亂碼怎么解決?

  [復制鏈接]
跳轉到指定樓層
樓主
ID:466381 發(fā)表于 2019-1-26 01:16 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
用oled和ds1302搞了個半成品時鐘(只能夠看時間和溫度不能調(diào)時間),然后我在我的STC89c52的單片機開發(fā)板上實驗成功了,結果換到STC15W408AS上就出現(xiàn)了時間顯示亂碼和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;         //存放溫度值的高字節(jié)
  92. unsigned int temp;
  93.         float tt;
  94.     DS18B20_Reset();                //設備復位
  95.     DS18B20_WriteByte(0xCC);        //跳過ROM命令
  96.     DS18B20_WriteByte(0xBE);        //讀暫存存儲器命令
  97.     TPL = DS18B20_ReadByte();       //讀溫度低字節(jié)
  98.     TPH = DS18B20_ReadByte();       //讀溫度高字節(jié)
  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, 下載次數(shù): 40

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:7485 發(fā)表于 2019-1-26 01:43 | 只看該作者
讀DS1302的時序不對,沒有讀出正確的時間?梢赃m當增加讀的延時試試。
回復

使用道具 舉報

板凳
ID:466381 發(fā)表于 2019-1-26 08:20 | 只看該作者
ahshmj 發(fā)表于 2019-1-26 01:43
讀DS1302的時序不對,沒有讀出正確的時間。可以適當增加讀的延時試試。

我剛剛拿以前89c52的程序然后把-nop-()全變成了12個-nop-(),試了一下,結果只是從TT變成7T了。。。。。。
回復

使用道具 舉報

地板
ID:123289 發(fā)表于 2019-1-26 08:23 | 只看該作者
不懂顯示原理,靠蒙?不如花時間讀讀各器件的手冊。
回復

使用道具 舉報

5#
ID:209065 發(fā)表于 2019-1-26 10:59 | 只看該作者
不用想了,傳感器沒問題,你程序錯了,和二樓所說的一樣,所以導致讀到的數(shù)據(jù)變成字符T了,建議I2C通信時序再認真看看;
回復

使用道具 舉報

6#
ID:466381 發(fā)表于 2019-1-26 16:35 來自觸屏版 | 只看該作者
鄒強斌 發(fā)表于 2019-1-26 10:59
不用想了,傳感器沒問題,你程序錯了,和二樓所說的一樣,所以導致讀到的數(shù)據(jù)變成字符T了,建議I2C通信時序 ...

我知道是那個ds1302的程序有問題,但好像怎么改都不行。。。。(以前用12T的時候有多少個nop轉移過來就把nop的數(shù)量翻12倍,然后再在每一個指令中間加個1us的延時)
回復

使用道具 舉報

7#
ID:466381 發(fā)表于 2019-2-3 18:33 來自觸屏版 | 只看該作者
補充:搞定了,是模塊那里那個32k晶振壞掉了,然后換掉就沒問題了
回復

使用道具 舉報

8#
ID:472242 發(fā)表于 2019-2-4 15:12 | 只看該作者
功夫不負有心人,支持!

評分

參與人數(shù) 7黑幣 +162 收起 理由
areyouok + 35
Sawardeakar + 35
#include51.h + 15
jinsheng7533967 + 35 很給力!
站著說話不腰疼 + 12
yoxi + 15
Trump1438 + 15

查看全部評分

回復

使用道具 舉報

9#
ID:424598 發(fā)表于 2019-3-22 19:54 | 只看該作者
文件不全也放上來................................................
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表