欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7275|回復: 14
收起左側(cè)

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

[復制鏈接]
ID:207108 發(fā)表于 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;// 數(shù)碼管段選
  6. sbit wei=P2^7; // 數(shù)碼管位選
  7. uchar code numw[]={0x01,0x02,0x04,0x08,0x10,// 數(shù)碼管位選
  8. 0x20,0x40,0x80,0x00};
  9. uchar code numd[]={0x3f,0x06,0x5b,0x4f,0x66,// 數(shù)碼管段選顯示( 0—9)
  10. 0x6d,0x7d,0x07,0x7f,0x6f};
  11. uchar code numdg[]={0xbf,0x86,0xdb,0xcf,0xe6,// 數(shù)碼管“個”位段選顯示因為保留一位小數(shù),
  12. 0xed,0xfd,0x87,0xff,0xef};// 所以各位后要顯示小數(shù)點,所以需要重新編碼( 0— 9)
  13. uchar code numfh[]={0x40,0x00}; // 溫度 + — 符號位
  14. /******************1ms 延時函數(shù) ****************/
  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 延時函數(shù) ****************/
  22. void delay(uint z)
  23. {
  24. while(z--);
  25. }
  26. /****************** 初始化 DS18B20函數(shù) ****************/
  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 變?yōu)楦唠娖?br />
  39. // 因為存在脈沖檢測結(jié)束后自動拉高 */
  40. //return stat;
  41. }
  42. /****************** 寫一個字節(jié)函數(shù) ****************/
  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 線上的數(shù)據(jù)( 45us) ***************
  51. DQ=1;
  52. dat>>=1;
  53. }
  54. delay(4);
  55. }
  56. /****************** 讀一個字節(jié)函數(shù) ****************/
  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. /****************** 讀取溫度值函數(shù) ****************/
  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);// 溫度轉(zhuǎn)換
  80. delay(300);//***************************
  81. reset_ds18b20();// 復位操作
  82. write_byte(0xcc);// 跳過 ROM
  83. write_byte(0xbe);// 讀內(nèi)部 RAM 內(nèi)容
  84. templ=read_byte();
  85. temph=read_byte();
  86. flag=(temph&0x80)>>7;// 判斷高字節(jié)符號位是 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 為整形,小數(shù)部分讀不到
  90. // 此項目需要保留一位小數(shù),所以 x10,小數(shù)點后移一位
  91. // 所以可得要保留幾位小數(shù)點就擴大 10 的幾次方
  92. else
  93. temp=(~((templ+temph*256)-1))*(-0.625);
  94. return temp;}
  95. /****************** 顯示函數(shù) ****************/
  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. /****************** 主函數(shù) ****************/
  203. void main()
  204. {
  205. while(1)
  206. {
  207. display(read_temper());
  208. }
  209. }

復制代碼
回復

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

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

回復

使用道具 舉報

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

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

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

ID:207108 發(fā)表于 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 發(fā)表于 2017-6-7 10:15 | 顯示全部樓層
給了你正確的東西,你不去看,那么你就等吧!網(wǎng)上有多少忽悠人的東西,給你實實在在的,你不看不學,唉!
回復

使用道具 舉報

12#
無效樓層,該帖已經(jīng)被刪除
ID:208743 發(fā)表于 2017-6-7 11:30 | 顯示全部樓層
不要總用百度的東西,要自己寫
回復

使用道具 舉報

14#
無效樓層,該帖已經(jīng)被刪除
15#
無效樓層,該帖已經(jīng)被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

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