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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索

簡單的單片機ds18b20,但實在調(diào)不通程序

查看數(shù): 4356 | 評論數(shù): 19 | 收藏 0
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請稍候......
發(fā)布時間: 2019-9-3 21:06

正文摘要:

各位大佬和努力中朋友,本人制作個數(shù)碼管時鐘,mcu是stc15w408as,之前用的是12T,單獨測試時鐘,溫度都能顯示,本來改1T也是輕輕松松的事,但結(jié)果耗費我多少個晚上和周末,現(xiàn)在時鐘沒問題,自動調(diào)光也沒問題,但溫 ...

回復(fù)

ID:246783 發(fā)表于 2020-3-20 21:48
訪問DS18時關(guān)斷全局中斷,讀完再開即可
ID:84492 發(fā)表于 2019-9-27 16:49
l6931639 發(fā)表于 2019-9-9 18:25
使用定時器中斷非阻塞程序設(shè)計就可以隨便移植,基本不用每次重新調(diào)試。

你好,你的意思是把計時相關(guān)的放中斷去處理嗎?之前我也是想過,但實際操作發(fā)現(xiàn)程序?qū)懫饋聿豁樖。。。比如?820需要延遲120us,中斷10us一次,那么在中斷中只做減減,當(dāng)12次中斷后時間為零,這時在其他函數(shù)做判斷處理,當(dāng)時間為0則進行之后程序并重新時間賦值,這樣延遲做到了,也沒有傻傻的delay。對嗎?
ID:212177 發(fā)表于 2019-9-9 18:25
使用定時器中斷非阻塞程序設(shè)計就可以隨便移植,基本不用每次重新調(diào)試。
ID:212177 發(fā)表于 2019-9-9 18:23
join22life 發(fā)表于 2019-9-5 20:07
我之前用12T時也只調(diào)試溫度,可以顯示但溫度比實際低個10度左右,現(xiàn)在正和時鐘就改1T,但真是崩潰

我解決1820的辦法是使用定時器中斷做定時120us把程序?qū)懺谥袛嗬,使用非阻塞程序設(shè)計。
ID:84492 發(fā)表于 2019-9-9 17:10
謝謝各位的幫助,已經(jīng)實現(xiàn)了。也謝謝51hei這個平臺一直能有網(wǎng)友幫助和學(xué)習(xí)機會。
ID:84492 發(fā)表于 2019-9-9 17:07
wulin 發(fā)表于 2019-9-6 09:02
樓主調(diào)不成功主要還是時序問題,給你一個1T單片機的示例程序,是在郭天祥的12T程序基礎(chǔ)上改的,經(jīng)過實物驗 ...

確實是時序問題,是中斷引起的。多謝!
ID:84492 發(fā)表于 2019-9-9 17:06
fox_hk 發(fā)表于 2019-9-5 20:37
這東西 很扣時序。在讀這個時 中斷都最好關(guān)掉

你是正確的,后來我在電源網(wǎng)上看到說中斷會影響,關(guān)閉之后就可以正常顯示溫度了。這個問題真是耗費了我很多精力和時間,要是能早點看到你的回復(fù)就好了,也多謝回復(fù)!
ID:213173 發(fā)表于 2019-9-6 09:02
樓主調(diào)不成功主要還是時序問題,給你一個1T單片機的示例程序,是在郭天祥的12T程序基礎(chǔ)上改的,經(jīng)過實物驗證無誤。
  1. //DS18b20測溫程序
  2. #include <STC15F2K60S2.H>
  3. #include <intrins.h>
  4. //#include <reg51.H>
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. //通過DS18B20測試當(dāng)前環(huán)境溫度, 并通過數(shù)碼管顯示當(dāng)前溫度值
  8. sbit wela = P2^7;  //數(shù)碼管位選
  9. sbit dula = P2^6;  //數(shù)碼管段選
  10. sbit ds = P2^2;        //單總線通訊端口
  11. //0-F數(shù)碼管的編碼(共陰極)
  12. uchar code table[]={
  13.                 0x3f,0x06,0x5b,0x4f,
  14.                 0x66,0x6d,0x7d,0x07,
  15.                 0x7f,0x6f,0x77,0x7c,
  16.                 0x39,0x5e,0x79,0x71};
  17. //0-9數(shù)碼管的編碼(共陰極), 帶小數(shù)點
  18. uchar code tableWidthDot[]={
  19.                 0xbf, 0x86, 0xdb, 0xcf,
  20.                 0xe6, 0xed, 0xfd,
  21.                 0x87, 0xff, 0xef};
  22. //1ms延時函數(shù)
  23. void delay()        //@11.0592MHz
  24. {
  25.         unsigned char i, j;
  26.         _nop_();
  27.         _nop_();
  28.         _nop_();
  29.         i = 11;
  30.         j = 190;
  31.         do
  32.         {
  33.                 while (--j);
  34.         } while (--i);
  35. }

  36. void Delay824us()                //@11.0592MHz
  37. {
  38.         unsigned char i, j;

  39.         _nop_();
  40.         i = 9;
  41.         j = 218;
  42.         do
  43.         {
  44.                 while (--j);
  45.         } while (--i);
  46. }
  47. void Delay34us()                //@11.0592MHz
  48. {
  49.         unsigned char i;

  50.         _nop_();
  51.         _nop_();
  52.         i = 91;
  53.         while (--i);
  54. }
  55. void Delay3us()                //@11.0592MHz
  56. {
  57.         unsigned char i;

  58.         _nop_();
  59.         _nop_();
  60.         _nop_();
  61.         i = 5;
  62.         while (--i);
  63. }

  64. //初始化DS18B20
  65. //讓DS18B20一段相對長時間低電平, 然后一段相對非常短時間高電平, 即可啟動
  66. void dsInit()
  67. {
  68. //一定要使用unsigned int型, 一個i--指令的時間, 作為與DS18B20通信的小時間間隔
  69. //以下都是一樣使用unsigned int型
  70. //        uint i;   
  71.         ds = 0;  
  72. //        i = 103;  
  73. //        while(i>0) //824us
  74. //                i--;  
  75.         Delay824us();
  76.         ds = 1;  
  77.         Delay34us();
  78. //        i = 4;      
  79. //        while(i>0) //34us
  80. //                i--;  
  81. }
  82. //向DS18B20讀取一位數(shù)據(jù)   
  83. //讀一位, 讓DS18B20一小周期低電平, 然后兩小周期高電平,   
  84. //之后DS18B20則會輸出持續(xù)一段時間的一位數(shù)據(jù)  
  85. bit readBit()  
  86. {   
  87. //        uint i;  
  88.         bit b;  
  89.         ds = 0;  
  90.         Delay3us();
  91. //        i++;   
  92.         ds = 1;   
  93.         Delay3us();
  94.         Delay3us();
  95. //        i++;
  96. //        i++;  
  97.         b = ds;  
  98.         Delay34us();
  99.         Delay34us();
  100. //        i = 8;     
  101. //        while(i>0)
  102. //                i--;  
  103.         return b;  
  104. }

  105. //讀取一字節(jié)數(shù)據(jù), 通過調(diào)用readBit()來實現(xiàn)
  106. uchar readByte()  
  107. {
  108.         uint i;  
  109.         uchar j, dat;  
  110.         dat = 0;   
  111.         for(i=0; i<8; i++)  
  112.         {
  113.                 j = readBit();   
  114. //最先讀出的是最低位數(shù)據(jù)  
  115.                 dat = (j << 7) | (dat >> 1);  
  116.         }   
  117.         return dat;  
  118. }  
  119. //向DS18B20寫入一字節(jié)數(shù)據(jù)
  120. void writeByte(uchar dat)  
  121. {
  122. //        uint i;  
  123.         uchar j;  
  124.         bit b;   
  125.         for(j = 0; j < 8; j++)  
  126.         {   
  127.                 b = dat & 0x01;  
  128.                 dat >>= 1;   
  129. //寫"1", 讓低電平持續(xù)2個小延時, 高電平持續(xù)8個小延時  
  130.                 if(b)
  131.                 {   
  132.                         ds = 0;  
  133.                         Delay3us();
  134.                         Delay3us();
  135. //                        i++;// 3us
  136. //                        i++;  
  137.                         ds = 1; //1us  
  138.                         Delay34us();
  139.                         Delay34us();
  140. //                        i = 8;   //2us   
  141. //                        while(i>0) //66us
  142. //                                i--;
  143.                 }
  144.                 else  //寫"0", 讓低電平持續(xù)8個小延時, 高電平持續(xù)2個小延時  
  145.                 {
  146.                         ds = 0;   
  147.                         Delay34us();
  148.                         Delay34us();
  149. //                        i = 8;   
  150. //                        while(i>0)
  151. //                                i--;  
  152.                         ds = 1;  
  153.                         Delay3us();
  154.                         Delay3us();
  155. //                        i++;
  156. //                        i++;  
  157.                 }  
  158.         }  
  159. }
  160. //向DS18B20發(fā)送溫度轉(zhuǎn)換命令  
  161. void sendChangeCmd()
  162. {  
  163.         dsInit();    //初始化DS18B20
  164.         delay();    //延時1ms  
  165.         writeByte(0xcc); //寫入跳過序列號命令字
  166.         writeByte(0x44); //寫入溫度轉(zhuǎn)換命令字
  167. }
  168. //向DS18B20發(fā)送讀取數(shù)據(jù)命令
  169. void sendReadCmd()
  170. {  
  171.         dsInit();     //初始化DS18B20
  172.         delay();      //延時1ms  
  173.         writeByte(0xcc); //寫入跳過序列號命令字
  174.         writeByte(0xbe); //寫入讀取數(shù)據(jù)令字
  175. }
  176. //獲取當(dāng)前溫度值
  177. uint getTmpValue()
  178. {  
  179.         uint value; //存放溫度數(shù)值
  180.         float t;  
  181.         uchar low, high;
  182.         sendReadCmd();
  183. //連續(xù)讀取兩個字節(jié)數(shù)據(jù)
  184.         low = readByte();  
  185.         high = readByte();  
  186. //將高低兩個字節(jié)合成一個整形變量
  187.         value = high;
  188.         value <<= 8;
  189.         value |= low;  
  190. //DS18B20的精確度為0.0625度, 即讀回數(shù)據(jù)的最低位代表0.0625度
  191.         t = value * 0.0625;  
  192. //將它放大10倍, 使顯示時可顯示小數(shù)點后一位, 并對小數(shù)點后第二2進行4舍5入
  193. //如t=11.0625, 進行計數(shù)后, 得到value = 111, 即11.1 度
  194.         value = t * 10 + 0.5;   
  195.         return value;
  196. }
  197. //顯示當(dāng)前溫度值, 精確到小數(shù)點后一位
  198. void display(uint v)  
  199. {  
  200.         uchar count;
  201.         uchar datas[] = {0, 0, 0};  
  202.         datas[0] = v / 100;
  203.         datas[1] = v % 100 / 10;
  204.         datas[2] = v % 10;  
  205.         for(count = 0; count < 3; count++)
  206.         {  //片選         
  207.                 wela = 0;   
  208.                 P0 = ((0xfe << count) | (0xfe >> (8 - count))); //選擇第(count + 1) 個數(shù)碼管  
  209.                 wela = 1; //打開鎖存, 給它一個下降沿量
  210.                 wela = 0;
  211.                 //段選
  212.                 dula = 0;
  213.                 if(count != 1)
  214.                 {  
  215.                         P0 = table[datas[count]];  //顯示數(shù)字
  216.                 }
  217.                 else
  218.                 {
  219.                         P0 = tableWidthDot[datas[count]]; //顯示帶小數(shù)點數(shù)字
  220.                 }  
  221.                 dula = 1;  //打開鎖存, 給它一個下降沿量
  222.                 dula = 0;  
  223.                 delay(); //延時1ms, 即亮1ms
  224. //清除段先, 讓數(shù)碼管滅, 去除對下一位的影響, 去掉高位對低位重影
  225. //若想知道影響效果如何, 可自行去掉此段代碼
  226. //因為數(shù)碼管是共陰極的, 所有滅的代碼為: 00H
  227.                 dula = 0;  
  228.                 P0 = 0x00;  //顯示數(shù)字  
  229.                 dula = 1; //打開鎖存, 給它一個下降沿量
  230.                 dula = 0;
  231.         }
  232. }
  233. void main()
  234. {  
  235.         uchar i;
  236.         uint value;
  237.         while(1)
  238.         {  //啟動溫度轉(zhuǎn)換
  239.                 sendChangeCmd();
  240.                 value = getTmpValue();
  241.                 //顯示3次  
  242.                 for(i = 0; i < 3; i++)
  243.                 {  
  244.                         display(value);
  245.                 }
  246.         }
  247. }
復(fù)制代碼
ID:607642 發(fā)表于 2019-9-5 20:37
這東西 很扣時序。在讀這個時 中斷都最好關(guān)掉
ID:84492 發(fā)表于 2019-9-5 20:10
沒有你 發(fā)表于 2019-9-5 09:28
用邏輯分析儀器看一下單片機和DS18B20的通信過程,看看DS18B20能否正;貞(yīng)數(shù)據(jù)。DS18B20對時序要求很嚴格 ...

水平也不行,所以調(diào)試這個真是太費時間了,你的建議我會試試但估計看不懂
ID:84492 發(fā)表于 2019-9-5 20:07
l6931639 發(fā)表于 2019-9-5 17:17
你先把單片機其他功能都去掉單獨調(diào)好1820再放到一起

我之前用12T時也只調(diào)試溫度,可以顯示但溫度比實際低個10度左右,現(xiàn)在正和時鐘就改1T,但真是崩潰
ID:212177 發(fā)表于 2019-9-5 17:17
你先把單片機其他功能都去掉單獨調(diào)好1820再放到一起
ID:101339 發(fā)表于 2019-9-5 12:51
DS18B20對時序要求比較嚴格,估計是時序問題
ID:275826 發(fā)表于 2019-9-5 09:53
DS18B20對時序要求比較嚴格,估計是時序問題
ID:351097 發(fā)表于 2019-9-5 09:28
用邏輯分析儀器看一下單片機和DS18B20的通信過程,看看DS18B20能否正;貞(yīng)數(shù)據(jù)。DS18B20對時序要求很嚴格的。
ID:84492 發(fā)表于 2019-9-4 22:03
防塵            
ID:84492 發(fā)表于 2019-9-4 20:56
溫度一直一個數(shù)值,難道是轉(zhuǎn)換部分有問題?

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

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

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