找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5163|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)oled DS1302時(shí)鐘顯示只能顯示TTTT等亂碼怎么解決?

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
用oled和ds1302搞了個(gè)半成品時(shí)鐘(只能夠看時(shí)間和溫度不能調(diào)時(shí)間),然后我在我的STC89c52的單片機(jī)開(kāi)發(fā)板上實(shí)驗(yàn)成功了,結(jié)果換到STC15W408AS上就出現(xiàn)了時(shí)間顯示亂碼和TT
補(bǔ)充:我把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}; //秒分時(shí)日月周年 最低位讀寫(xiě)位 讀+1;寫(xiě)不加
  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];//時(shí)鐘寄存器(時(shí)分秒)
  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};//秒分時(shí)日月周年08-05-15 12:00:00
  15. unsigned int temper;
  16. unsigned char Bits;//修改時(shí)間標(biāo)志位
  17. unsigned char Bist[2];

  18. void SetRTC()  /*設(shè)置時(shí)間*/
  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()  /*讀時(shí)鐘*/
  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();                //設(shè)備復(fù)位
  85.     DS18B20_WriteByte(0xCC);        //跳過(guò)ROM命令
  86.     DS18B20_WriteByte(0x44);        //開(kāi)始轉(zhuǎn)換命令
  87.    // while (!DQ);                    //等待轉(zhuǎn)換完成
  88. }

  89. unsigned int Tempread()
  90. {
  91.         unsigned char TPH,TPL;         //存放溫度值的高字節(jié)
  92. unsigned int temp;
  93.         float tt;
  94.     DS18B20_Reset();                //設(shè)備復(fù)位
  95.     DS18B20_WriteByte(0xCC);        //跳過(guò)ROM命令
  96.     DS18B20_WriteByte(0xBE);        //讀暫存存儲(chǔ)器命令
  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. }

復(fù)制代碼

omega.zip

5.75 KB, 下載次數(shù): 40

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

板凳
ID:466381 發(fā)表于 2019-1-26 08:20 | 只看該作者
ahshmj 發(fā)表于 2019-1-26 01:43
讀DS1302的時(shí)序不對(duì),沒(méi)有讀出正確的時(shí)間?梢赃m當(dāng)增加讀的延時(shí)試試。

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表