久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7085|回復: 14
收起左側

新手求助單片機ds18b20仿真問題,仿真顯示亂碼

[復制鏈接]
ID:207108 發表于 2017-6-3 14:51 | 顯示全部樓層 |閱讀模式
仿真圖.png

  1. #include<reg52.h> // 晶振為 11.0592MHz
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. sbit DQ=P2^5;// 接溫度傳感器
  5. sbit duan=P2^6;// 數碼管段選
  6. sbit wei=P2^7; // 數碼管位選
  7. uchar code numw[]={0x01,0x02,0x04,0x08,0x10,// 數碼管位選
  8. 0x20,0x40,0x80,0x00};
  9. uchar code numd[]={0x3f,0x06,0x5b,0x4f,0x66,// 數碼管段選顯示( 0—9)
  10. 0x6d,0x7d,0x07,0x7f,0x6f};
  11. uchar code numdg[]={0xbf,0x86,0xdb,0xcf,0xe6,// 數碼管“個”位段選顯示因為保留一位小數,
  12. 0xed,0xfd,0x87,0xff,0xef};// 所以各位后要顯示小數點,所以需要重新編碼( 0— 9)
  13. uchar code numfh[]={0x40,0x00}; // 溫度 + — 符號位
  14. /******************1ms 延時函數 ****************/
  15. void delay0(uint z)
  16. {
  17. uchar x,y;
  18. for(x=z;x>0;x--)
  19. for(y=110;y>0;y--);
  20. }
  21. /******************15us 延時函數 ****************/
  22. void delay(uint z)
  23. {
  24. while(z--);
  25. }
  26. /****************** 初始化 DS18B20函數 ****************/
  27. void reset_ds18b20()
  28. {
  29. uchar stat=0;
  30. DQ=1;
  31. delay(8);
  32. DQ=0;
  33. delay(80); //600us/12mhz
  34. DQ=1;
  35. delay(8);
  36. stat=DQ; // 高電平為存在,低電平為不存在( stat 應該為 0)
  37. delay(4);
  38. // while(!DQ);/* 等待 DQ 變為高電平
  39. // 因為存在脈沖檢測結束后自動拉高 */
  40. //return stat;
  41. }
  42. /****************** 寫一個字節函數 ****************/
  43. void write_byte(uchar dat)
  44. {
  45. uchar i;
  46. DQ=1; // 先拉高電平,為寫作準備
  47. for(i=0;i<8;i++)
  48. {DQ=0;
  49. DQ=dat&0x01;
  50. delay(4);//DS18B20 采樣單片機寫給 DQ 線上的數據( 45us) ***************
  51. DQ=1;
  52. dat>>=1;
  53. }
  54. delay(4);
  55. }
  56. /****************** 讀一個字節函數 ****************/
  57. uchar read_byte()
  58. {
  59. uchar vaul,i;
  60. DQ=1; // 先拉高電平,為讀作準備
  61. for(i=0;i<8;i++)
  62. {
  63. DQ=0;
  64. vaul>>=1;
  65. DQ=1;
  66. if(DQ)
  67. vaul|=0x80;
  68. delay(4);
  69. }
  70. return vaul;
  71. }
  72. /****************** 讀取溫度值函數 ****************/
  73. int read_temper()
  74. {
  75. uchar templ,temph, flag;
  76. int temp;
  77. reset_ds18b20();// 復位操作
  78. write_byte(0xcc);// 跳過 ROM
  79. write_byte(0x44);// 溫度轉換
  80. delay(300);//***************************
  81. reset_ds18b20();// 復位操作
  82. write_byte(0xcc);// 跳過 ROM
  83. write_byte(0xbe);// 讀內部 RAM 內容
  84. templ=read_byte();
  85. temph=read_byte();
  86. flag=(temph&0x80)>>7;// 判斷高字節符號位是 1 還是 0(1 為負溫度, 0 為正溫度)
  87. if(flag==0)
  88. //temp=(temph<<=4)+((templ&=0xf0)>>4);
  89. temp=(templ+temph*256)*0.625;// 將精度 0.0625 擴大 10 倍,因為 temp 為整形,小數部分讀不到
  90. // 此項目需要保留一位小數,所以 x10,小數點后移一位
  91. // 所以可得要保留幾位小數點就擴大 10 的幾次方
  92. else
  93. temp=(~((templ+temph*256)-1))*(-0.625);
  94. return temp;}
  95. /****************** 顯示函數 ****************/
  96. void display(int num)
  97. {
  98. uchar i,zf,bai,shi,ge,fen;
  99. if(num<0)
  100. {
  101. zf=0;// 溫度 — 符號位
  102. num=num*(-1);
  103. }
  104. else
  105. zf=1;// 溫度 + 符號位
  106. bai=num/1000;
  107. shi=num%1000/100;
  108. ge=num%100/10;
  109. fen=num%10;
  110. for(i=0;i<6;i++)
  111. {

  112. duan=1;
  113. switch(i)
  114. {
  115. case 0: if(zf==0)
  116. P0=numfh[zf];
  117. else
  118. if(bai!=0)
  119. P0=numd[bai];
  120. else
  121. if(shi!=0)
  122. P0=numd[shi];
  123. else
  124. P0=numdg[ge];
  125. break;
  126. case 1: if(zf==0&&shi!=0)
  127. P0=numd[shi];
  128. else
  129. if(zf==0&&shi==0)
  130. P0=numdg[ge];
  131. else
  132. if(zf!=0&&bai!=0)
  133. P0=numd[shi];
  134. else
  135. if(zf!=0&&bai==0&&shi!=0)
  136. P0=numdg[ge];
  137. else
  138. if(zf!=0&&bai==0&&shi==0)
  139. P0=numd[fen];
  140. break;
  141. case 2: if(zf==0&&shi!=0)
  142. P0=numdg[ge];
  143. else
  144. if(zf==0&&shi==0)
  145. P0=numd[fen];
  146. else
  147. if(zf!=0&&bai!=0)
  148. P0=numdg[ge];
  149. else
  150. if(zf!=0&&bai==0&&shi!=0)
  151. P0=numd[fen];
  152. else
  153. if(zf!=0&&bai==0&&shi==0)
  154. P0=0x63;
  155. break;
  156. case 3: if(zf==0&&shi!=0)
  157. P0=numd[fen];
  158. else
  159. if(zf==0&&shi==0)
  160. P0=0x63;
  161. else
  162. if(zf!=0&&bai!=0)
  163. P0=numd[fen];
  164. else
  165. if(zf!=0&&bai==0&&shi!=0)
  166. P0=0x63;
  167. else
  168. if(zf!=0&&bai==0&&shi==0)
  169. P0=0x39;
  170. break;
  171. case 4: if(zf==0&&shi!=0)
  172. P0=0x63;
  173. else
  174. if(zf==0&&shi==0)
  175. P0=0x39;
  176. else
  177. if(zf!=0&&bai!=0)
  178. P0=0x63;
  179. else
  180. if(zf!=0&&bai==0&&shi!=0)
  181. P0=0x39;
  182. else
  183. P0=0x00;
  184. break;
  185. case 5: if(zf==0&&shi!=0)
  186. P0=0x39;else
  187. if(zf!=0&&bai!=0)
  188. P0=0x39;
  189. else
  190. P0=0x00;
  191. break;
  192. }
  193. duan=0;
  194. P0=0x00;// 消影
  195. wei=1;
  196. P0=numw[i];
  197. wei=0;
  198. P1=0x00;// 消影
  199. delay0(10);
  200. }
  201. }
  202. /****************** 主函數 ****************/
  203. void main()
  204. {
  205. while(1)
  206. {
  207. display(read_temper());
  208. }
  209. }

復制代碼
回復

使用道具 舉報

ID:123289 發表于 2017-6-3 19:25 | 顯示全部樓層
弄清段碼組字符的原理就一定能解決問題。
回復

使用道具 舉報

ID:207108 發表于 2017-6-3 20:58 | 顯示全部樓層
yzwzfyz 發表于 2017-6-3 19:25
弄清段碼組字符的原理就一定能解決問題。

我是初學,不是太懂,能幫忙找一下具體問題嗎
回復

使用道具 舉報

ID:111634 發表于 2017-6-3 23:23 | 顯示全部樓層
本帖最后由 zl2168 于 2017-6-4 08:23 編輯

顯示函數太復雜,沒必要。介紹你一個案例,供參考!
Proteus仿真一下,確認有效。
實例97 DS18B20測溫.rar (51.78 KB, 下載次數: 30)
DS18B20 測溫.jpg
以上摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil CProteus》清華大學出版社ISBN 978-7-302-41682-1內有常用的單片機應用100案例,用于仿真實驗操作,電路與程序真實可靠可信可行仿真電路和Hex文件能在清華出版社網站免費下載,程序源代碼只能到書上看了。到圖書館借,或到新華書店翻閱,或到網上書店打折購買。

回復

使用道具 舉報

ID:207108 發表于 2017-6-4 15:05 | 顯示全部樓層
zl2168 發表于 2017-6-3 23:23
顯示函數太復雜,沒必要。介紹你一個案例,供參考!
先Proteus仿真一下,確認有效。

先說聲謝謝!書我會去看的,但還是想知道我這個為什么有問題,顯示程序不知道哪里有問題了
回復

使用道具 舉報

ID:111634 發表于 2017-6-4 22:15 | 顯示全部樓層
wdg 發表于 2017-6-4 15:05
先說聲謝謝!書我會去看的,但還是想知道我這個為什么有問題,顯示程序不知道哪里有問題了

那么多if-else,太復雜,程序不是這樣編的。至于哪里錯了,你的程序太冗長,一般人沒耐心沒時間看的,只有自己對照正確的程序,耐心細致的查找。
回復

使用道具 舉報

ID:207882 發表于 2017-6-5 08:32 | 顯示全部樓層
先單獨調試數碼管看顯示正不正常,再看DS18b20程序部分,,時序很重要
回復

使用道具 舉報

ID:207882 發表于 2017-6-5 08:33 | 顯示全部樓層
先調試數碼管,看能不能正常顯示,再看18B20程序,主要時序不用弄錯
回復

使用道具 舉報

ID:201102 發表于 2017-6-5 18:59 | 顯示全部樓層
數碼管顯示程序太長了,就算實現了基本功能速度也會很慢
回復

使用道具 舉報

ID:207108 發表于 2017-6-6 13:31 | 顯示全部樓層
改了一下顯示程序,還是亂碼,各位大佬幫忙看一下啊,到底哪里有問題
void display(int num)
{
uchar i,zf,bai,shi,ge,fen;
if(num<0)
{
zf=0;// 溫度 — 符號位

}
else
zf=1;// 溫度 + 符號位
bai=num/1000;
shi=num%1000/100;
ge=num%100/10;
fen=num%10;
for(i=0;i<7;i++)
{
wei=1;
P0=numw[i];
wei=0;
P1=0x00;// 消影
duan=1;
switch(i)
{
case 0: if(zf==0)
P0=numfh[zf];
else
P0=0x00;
delay0(5);
case 1: if(bai!=0)
P0=numd[bai];
else
P0=0x00;
delay0(5);
case 2: if(shi!=0)
P0=numd[shi];
else
if(bai==0)
P0=0x00;
else
P0=0x3f;
delay0(5);
case 3: if(ge!=0)
P0=numdg[ge];
delay0(5);
case 4:
P0=numd[fen];
delay0(5);
case 5:
P0=0x63;
delay0(5);
case 6:
P0=0x39;
delay0(5);       
}
duan=0;
P0=0x00;// 消影
delay0(5);
}
}
回復

使用道具 舉報

ID:111634 發表于 2017-6-7 10:15 | 顯示全部樓層
給了你正確的東西,你不去看,那么你就等吧!網上有多少忽悠人的東西,給你實實在在的,你不看不學,唉!
回復

使用道具 舉報

ID:208743 發表于 2017-6-7 11:30 | 顯示全部樓層
不要總用百度的東西,要自己寫
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品永久免费 | 久草青青草 | 91在线视频免费观看 | 亚洲在线一区二区 | 久草色播 | av网站在线播放 | 亚洲视频免费在线观看 | 成人福利在线 | 亚洲电影一区二区三区 | 亚洲午夜av久久乱码 | 日本不卡一区二区三区在线观看 | 精品国产精品国产偷麻豆 | 成人免费高清 | 免费在线观看成人 | 免费激情av | 春色av| 午夜影院| av日韩在线播放 | 精品九九 | 欧美6一10sex性hd | 99精品欧美一区二区三区综合在线 | a级片www| 国产福利在线小视频 | 日本三级网站在线 | 日韩精品一区二区三区免费视频 | 国产欧美一区二区三区日本久久久 | 国产成人综合一区二区三区 | 久久精品中文 | 99精品国产一区二区三区 | 成人二区三区 | 免费国产一区二区 | 中文字幕免费在线 | 久久最新| 日韩不卡一区二区 | 在线观看av网站 | 精久久 | 懂色tv| 国产高清视频在线 | 99久久精品一区二区成人 | 久久国内精品 | 欧美日韩视频在线播放 |