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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

簡單的單片機ds18b20,但實在調不通程序

[復制鏈接]
跳轉到指定樓層
樓主
各位大佬和努力中朋友,本人制作個數碼管時鐘,mcu是stc15w408as,之前用的是12T,單獨測試時鐘,溫度都能顯示,本來改1T也是輕輕松松的事,但結果耗費我多少個晚上和周末,現在時鐘沒問題,自動調光也沒問題,但溫度顯示始終是有問題的,現在一直顯示-06℃。我也大概知道可能時序問題,但參照很多例程,就是調不好,真是絕望的很。只能求助了。

單片機源程序如下:
ds18b20.c
  1. //===========================================================================
  2. //                包含頭文件
  3. //===========================================================================
  4. #include "DS18B20.h"
  5. #include "Delay.h"

  6. //===========================================================================
  7. //                宏定義
  8. //===========================================================================



  9. //===========================================================================
  10. //                函數原型聲明
  11. //===========================================================================


  12. //===========================================================================
  13. //                全局變量聲明
  14. //===========================================================================
  15. u8 DisplayData[4];
  16. u8 const code smgduan[] = {0x3c};                       // 'c'符號,1100 0110數碼管0是亮
  17. u8 const code dis_code_z[] = {                              // 正裝共陽數碼管
  18.                                                 0xC0,                  // '0'
  19.                                                 0xF9,                  // '1'
  20.                                                 0xA4,                  // '2'
  21.                                                 0xB0,                  // '3'
  22.                                                 0x99,                  // '4'
  23.                                                 0x92,                  // '5'
  24.                                                 0x82,                  // '6'
  25.                                                 0xF8,                  // '7'
  26.                                                 0x80,                  // '8'
  27.                                                 0x90,                  // '9'
  28.                                                 0xFF                   // off
  29.                                                 };                                                      

  30. u8 const code dis_code_d[] = {                            // 倒裝共陽數碼管
  31.                                                 0xC0,                 // '0'
  32.                                                 0xCF,                 // '1'
  33.                                                 0xA4,                 // '2'
  34.                                                 0x86,                 // '3'
  35.                                                 0x8B,                 // '4'
  36.                                                 0x92,                 // '5'
  37.                                                 0x90,                 // '6'
  38.                                                 0xC7,                 // '7'
  39.                                                 0x80,                 // '8'
  40.                                                 0x82,                 // '9'
  41.                                                 0xFF                  // 'off'
  42.                                                 };                                                               



  43. //===========================================================================
  44. //                外部變量聲明
  45. //===========================================================================




  46. /*""FUNC COMMENT""***********************************************************
  47. *----------------------------------------------------------------------------
  48. * 功    能        : 初始化
  49. *----------------------------------------------------------------------------
  50. * 引    數        : 無
  51. *----------------------------------------------------------------------------
  52. * 返 回 值        : 初始化成功返回1,失敗返回0
  53. *----------------------------------------------------------------------------
  54. * 注意事項        : 無
  55. *----------------------------------------------------------------------------
  56. *""FUNC COMMENT END""*******************************************************/
  57. bit ds18b20_reset(void)
  58. {
  59.         u8 F_init = 0;        
  60.         
  61.          DQ = 1;                                // 首先將數據線置高
  62.         delay_us(1);                          // 短暫延時 (大約2us)
  63.         DQ = 0;                                // 送出低電平復位信號
  64.         delay_250us();                     // 延時在480~960US之間
  65.         delay_250us();
  66.     delay_250us();
  67.     DQ = 1;                                // 拉高 釋放數據線
  68.         delay_70us();                  // 延時等待要求大于60us
  69.         F_init = DQ;                   // DS18B20產生“存在脈沖”                                                                                                                                          
  70.                                         // 檢測DQ若低,則復位成功,DS18B20存在
  71.                                       // 若高,則復位失敗,DS18B20損壞或不存在
  72.     delay_250us();             // 等待釋放數據線,避免影響下一步操作
  73.         delay_250us();
  74.    
  75.         return (F_init);           // 返回復位結果
  76. }

  77. /*""FUNC COMMENT""***********************************************************
  78. *----------------------------------------------------------------------------
  79. * 功    能        : 向18B20寫入一個字節
  80. *----------------------------------------------------------------------------
  81. * 引    數        : dat
  82. *----------------------------------------------------------------------------
  83. * 返 回 值        : 無
  84. *----------------------------------------------------------------------------
  85. * 注意事項        : 無
  86. *----------------------------------------------------------------------------
  87. *""FUNC COMMENT END""*******************************************************/
  88. void ds18b20_writeData(u8 byte)
  89. {
  90.         u8 i;
  91.    
  92.         for (i = 0; i < 8; i++)     // 重復直到發送完整個字節
  93.         {
  94.         DQ = 1;
  95.                 delay_us(1);
  96.                 DQ = 0;                      // 數據線首先拉低,開始寫
  97.                 delay_us(1);               // 低電平保持1us以上
  98.         DQ = byte & 0x01;             // 送出數據                                 
  99.                 delay_70us();           // 寫周期在60us-120us間,等待時間片結束
  100.                 DQ = 1;                  // 釋放數據線
  101.                 byte >>= 1;
  102.                 delay_us(1);          // 恢復延時      
  103.         }
  104. }

  105. /*""FUNC COMMENT""***********************************************************
  106. *----------------------------------------------------------------------------
  107. * 功    能        : 讀取一個字節
  108. *----------------------------------------------------------------------------
  109. * 引    數        : 無
  110. *----------------------------------------------------------------------------
  111. * 返 回 值        : 讀取的數據
  112. *----------------------------------------------------------------------------
  113. * 注意事項        : 無
  114. *----------------------------------------------------------------------------
  115. *""FUNC COMMENT END""*******************************************************/
  116. u8 ds18b20_readData(void)
  117. {
  118.         u8 i;
  119.     u8 byte = 0;
  120.         
  121.         for (i = 0; i < 8; i++)           // 重復接收直到讀完整個字節
  122.         {
  123.         
  124.         DQ = 0;                         // 開始時間片,開始一個讀過程
  125.                 delay_us(1);         // 保持1us以上
  126.         DQ = 1;                     // 準備接收,開始讀取數據線狀態        
  127.                 delay_us(1);      // 讀時間片開始后15us內主機對數據線進行采集
  128.                 byte >>= 1;
  129.                 if(DQ)
  130.                 {
  131.                         byte |= 0x80;  // 讀取數據        
  132.                 }
  133.                 delay_70us();            // 等待時間片結束,讀周期60us-120us間
  134.         }
  135.         return (byte);
  136. }

  137. /* void ds1820_setResolution(u8 res)//設置分辨率 默認12wei
  138. {
  139.     while (ds18b20_reset());
  140.     ds18b20_writeByte(0x4E);
  141.     ds18b20_writeByte(0xFF);
  142.     ds18b20_writeByte(0xFF);
  143.     ds18b20_writeByte(0x1F | (res << 5));   //設置分辨率(0 R1 R0 1  1111)   
  144. } */

  145. /*""FUNC COMMENT""***********************************************************
  146. *----------------------------------------------------------------------------
  147. * 功    能        : 讀溫度
  148. *----------------------------------------------------------------------------
  149. * 引    數        : 無
  150. *----------------------------------------------------------------------------
  151. * 返 回 值        : 讀取的溫度數據
  152. *----------------------------------------------------------------------------
  153. * 注意事項        : 無
  154. *----------------------------------------------------------------------------
  155. *""FUNC COMMENT END""*******************************************************/
  156. u16 ds18b20_readTemperature(void)
  157. {
  158.         u8 TPL, TPH;

  159.        u16 temp;//@001
  160.         ds18b20_reset();
  161.         ds18b20_writeData(0xCC);                                
  162.         ds18b20_writeData(0x44);                                                     
  163.                                                               
  164.         while(!DQ);                                    
  165.                                                                                                                
  166.         ds18b20_reset();                                 
  167.         ds18b20_writeData(0xCC);  
  168.         ds18b20_writeData(0xBE);  
  169.                
  170.         TPL = ds18b20_readData();   
  171.         TPH = ds18b20_readData();  
  172.         
  173.          temp = TPH;
  174.        temp <<= 8;                                                                                    
  175.         temp |= TPL;                              
  176.    
  177.         return (temp);  
  178. }

  179. /*""FUNC COMMENT""***********************************************************
  180. *----------------------------------------------------------------------------
  181. * 功    能        : 獲取溫度數據并處理
  182. *----------------------------------------------------------------------------
  183. * 引    數        : temp
  184. *----------------------------------------------------------------------------
  185. * 返 回 值        : 無
  186. *----------------------------------------------------------------------------
  187. * 注意事項        : 無
  188. *----------------------------------------------------------------------------
  189. *""FUNC COMMENT END""*******************************************************/
  190. void ds18b20_dataProcess(u16 temp) //@@1
  191. {
  192.         float tp;
  193. //        if (temp < 0)                                                                              
  194.         if ((temp & 0xF800) != 0)
  195.         {
  196.                 DisplayData[3] = 0xBF; // '-'

  197.                 //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
  198.                 temp = temp - 1;
  199.                 temp = ~temp;
  200.                 tp = temp;
  201.                 temp = tp*0.0625*100 + 0.5;
  202.                 //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  203.                 //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  204.                 //算加上0.5,還是在小數點后面。
  205.                 DisplayData[2] = dis_code_z[temp / 10];        // 十位
  206.                 DisplayData[1] = dis_code_d[temp % 10];      // 個位
  207.                 DisplayData[0] = smgduan[0];                       // 顯示C符號
  208.         }
  209.         else
  210.         {
  211.                 //DisplayData[0] = 0x00;
  212.                 tp = temp;//因為數據處理有小數點所以將溫度賦給一個浮點型變量
  213.                 //如果溫度是正的那么,那么正數的原碼就是補碼它本身
  214.                 temp = tp*0.0625*100 + 0.5;
  215.                 //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  216.                 //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  217.                 //算加上0.5,還是在小數點后面。
  218.                 if (( temp / 100 ) == 0)
  219.                 {
  220.                         DisplayData[3] = 0xFF;
  221.                 }
  222.                 else
  223.                 {
  224.                         DisplayData[3] = dis_code_z[temp / 100];        // 千位
  225.                         DisplayData[2] = dis_code_z[temp % 100 / 10] & 0x7F;// 十位
  226.                         DisplayData[1] = dis_code_d[temp % 10];      // 個位
  227.                         DisplayData[0] = smgduan[0];                       // 顯示C符號        
  228.                 }
  229.         }        
  230. }

復制代碼
還有個很莫名的問題也廢了很多時間就是定時中斷,參照著datasheet改1T,但若不加/12就不是1ms中斷。。后來發現后加上能輸出1ms。
        #define T1MS    (65536 - FOSC/1000/12)  

Snipaste_2019-09-03_21-00-53.png (66.1 KB, 下載次數: 132)

Snipaste_2019-09-03_21-00-53.png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:84492 發表于 2019-9-3 21:09 | 只看該作者
期間用到的1us,實測在4us;70us,250us大概差不多

Snipaste_2019-09-03_21-09-25.png (2.66 KB, 下載次數: 124)

Snipaste_2019-09-03_21-09-25.png
回復

使用道具 舉報

板凳
ID:84492 發表于 2019-9-4 09:36 | 只看該作者
這是上面說的1ms定時,中斷配置

Snipaste_2019-09-04_09-32-01.png (34.3 KB, 下載次數: 111)

Snipaste_2019-09-04_09-32-01.png
回復

使用道具 舉報

地板
ID:84492 發表于 2019-9-4 20:56 | 只看該作者
溫度一直一個數值,難道是轉換部分有問題?
回復

使用道具 舉報

5#
ID:84492 發表于 2019-9-4 22:03 | 只看該作者
防塵            
回復

使用道具 舉報

6#
ID:351097 發表于 2019-9-5 09:28 | 只看該作者
用邏輯分析儀器看一下單片機和DS18B20的通信過程,看看DS18B20能否正常回應數據。DS18B20對時序要求很嚴格的。
回復

使用道具 舉報

7#
ID:275826 發表于 2019-9-5 09:53 | 只看該作者
DS18B20對時序要求比較嚴格,估計是時序問題
回復

使用道具 舉報

8#
ID:101339 發表于 2019-9-5 12:51 | 只看該作者
DS18B20對時序要求比較嚴格,估計是時序問題
回復

使用道具 舉報

9#
ID:212177 發表于 2019-9-5 17:17 來自手機 | 只看該作者
你先把單片機其他功能都去掉單獨調好1820再放到一起
回復

使用道具 舉報

10#
ID:84492 發表于 2019-9-5 20:07 | 只看該作者
l6931639 發表于 2019-9-5 17:17
你先把單片機其他功能都去掉單獨調好1820再放到一起

我之前用12T時也只調試溫度,可以顯示但溫度比實際低個10度左右,現在正和時鐘就改1T,但真是崩潰
回復

使用道具 舉報

11#
ID:84492 發表于 2019-9-5 20:10 | 只看該作者
沒有你 發表于 2019-9-5 09:28
用邏輯分析儀器看一下單片機和DS18B20的通信過程,看看DS18B20能否正常回應數據。DS18B20對時序要求很嚴格 ...

水平也不行,所以調試這個真是太費時間了,你的建議我會試試但估計看不懂
回復

使用道具 舉報

12#
ID:607642 發表于 2019-9-5 20:37 | 只看該作者
這東西 很扣時序。在讀這個時 中斷都最好關掉
回復

使用道具 舉報

13#
ID:213173 發表于 2019-9-6 09:02 | 只看該作者
樓主調不成功主要還是時序問題,給你一個1T單片機的示例程序,是在郭天祥的12T程序基礎上改的,經過實物驗證無誤。
  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測試當前環境溫度, 并通過數碼管顯示當前溫度值
  8. sbit wela = P2^7;  //數碼管位選
  9. sbit dula = P2^6;  //數碼管段選
  10. sbit ds = P2^2;        //單總線通訊端口
  11. //0-F數碼管的編碼(共陰極)
  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數碼管的編碼(共陰極), 帶小數點
  18. uchar code tableWidthDot[]={
  19.                 0xbf, 0x86, 0xdb, 0xcf,
  20.                 0xe6, 0xed, 0xfd,
  21.                 0x87, 0xff, 0xef};
  22. //1ms延時函數
  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讀取一位數據   
  83. //讀一位, 讓DS18B20一小周期低電平, 然后兩小周期高電平,   
  84. //之后DS18B20則會輸出持續一段時間的一位數據  
  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. //讀取一字節數據, 通過調用readBit()來實現
  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. //最先讀出的是最低位數據  
  115.                 dat = (j << 7) | (dat >> 1);  
  116.         }   
  117.         return dat;  
  118. }  
  119. //向DS18B20寫入一字節數據
  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", 讓低電平持續2個小延時, 高電平持續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", 讓低電平持續8個小延時, 高電平持續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發送溫度轉換命令  
  161. void sendChangeCmd()
  162. {  
  163.         dsInit();    //初始化DS18B20
  164.         delay();    //延時1ms  
  165.         writeByte(0xcc); //寫入跳過序列號命令字
  166.         writeByte(0x44); //寫入溫度轉換命令字
  167. }
  168. //向DS18B20發送讀取數據命令
  169. void sendReadCmd()
  170. {  
  171.         dsInit();     //初始化DS18B20
  172.         delay();      //延時1ms  
  173.         writeByte(0xcc); //寫入跳過序列號命令字
  174.         writeByte(0xbe); //寫入讀取數據令字
  175. }
  176. //獲取當前溫度值
  177. uint getTmpValue()
  178. {  
  179.         uint value; //存放溫度數值
  180.         float t;  
  181.         uchar low, high;
  182.         sendReadCmd();
  183. //連續讀取兩個字節數據
  184.         low = readByte();  
  185.         high = readByte();  
  186. //將高低兩個字節合成一個整形變量
  187.         value = high;
  188.         value <<= 8;
  189.         value |= low;  
  190. //DS18B20的精確度為0.0625度, 即讀回數據的最低位代表0.0625度
  191.         t = value * 0.0625;  
  192. //將它放大10倍, 使顯示時可顯示小數點后一位, 并對小數點后第二2進行4舍5入
  193. //如t=11.0625, 進行計數后, 得到value = 111, 即11.1 度
  194.         value = t * 10 + 0.5;   
  195.         return value;
  196. }
  197. //顯示當前溫度值, 精確到小數點后一位
  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) 個數碼管  
  209.                 wela = 1; //打開鎖存, 給它一個下降沿量
  210.                 wela = 0;
  211.                 //段選
  212.                 dula = 0;
  213.                 if(count != 1)
  214.                 {  
  215.                         P0 = table[datas[count]];  //顯示數字
  216.                 }
  217.                 else
  218.                 {
  219.                         P0 = tableWidthDot[datas[count]]; //顯示帶小數點數字
  220.                 }  
  221.                 dula = 1;  //打開鎖存, 給它一個下降沿量
  222.                 dula = 0;  
  223.                 delay(); //延時1ms, 即亮1ms
  224. //清除段先, 讓數碼管滅, 去除對下一位的影響, 去掉高位對低位重影
  225. //若想知道影響效果如何, 可自行去掉此段代碼
  226. //因為數碼管是共陰極的, 所有滅的代碼為: 00H
  227.                 dula = 0;  
  228.                 P0 = 0x00;  //顯示數字  
  229.                 dula = 1; //打開鎖存, 給它一個下降沿量
  230.                 dula = 0;
  231.         }
  232. }
  233. void main()
  234. {  
  235.         uchar i;
  236.         uint value;
  237.         while(1)
  238.         {  //啟動溫度轉換
  239.                 sendChangeCmd();
  240.                 value = getTmpValue();
  241.                 //顯示3次  
  242.                 for(i = 0; i < 3; i++)
  243.                 {  
  244.                         display(value);
  245.                 }
  246.         }
  247. }
復制代碼
回復

使用道具 舉報

14#
ID:84492 發表于 2019-9-9 17:06 | 只看該作者
fox_hk 發表于 2019-9-5 20:37
這東西 很扣時序。在讀這個時 中斷都最好關掉

你是正確的,后來我在電源網上看到說中斷會影響,關閉之后就可以正常顯示溫度了。這個問題真是耗費了我很多精力和時間,要是能早點看到你的回復就好了,也多謝回復!
回復

使用道具 舉報

15#
ID:84492 發表于 2019-9-9 17:07 | 只看該作者
wulin 發表于 2019-9-6 09:02
樓主調不成功主要還是時序問題,給你一個1T單片機的示例程序,是在郭天祥的12T程序基礎上改的,經過實物驗 ...

確實是時序問題,是中斷引起的。多謝!
回復

使用道具 舉報

16#
ID:84492 發表于 2019-9-9 17:10 | 只看該作者
謝謝各位的幫助,已經實現了。也謝謝51hei這個平臺一直能有網友幫助和學習機會。
回復

使用道具 舉報

17#
ID:212177 發表于 2019-9-9 18:23 來自手機 | 只看該作者
join22life 發表于 2019-9-5 20:07
我之前用12T時也只調試溫度,可以顯示但溫度比實際低個10度左右,現在正和時鐘就改1T,但真是崩潰

我解決1820的辦法是使用定時器中斷做定時120us把程序寫在中斷里,使用非阻塞程序設計。
回復

使用道具 舉報

18#
ID:212177 發表于 2019-9-9 18:25 來自手機 | 只看該作者
使用定時器中斷非阻塞程序設計就可以隨便移植,基本不用每次重新調試。
回復

使用道具 舉報

19#
ID:84492 發表于 2019-9-27 16:49 | 只看該作者
l6931639 發表于 2019-9-9 18:25
使用定時器中斷非阻塞程序設計就可以隨便移植,基本不用每次重新調試。

你好,你的意思是把計時相關的放中斷去處理嗎?之前我也是想過,但實際操作發現程序寫起來不順手。。。比如:1820需要延遲120us,中斷10us一次,那么在中斷中只做減減,當12次中斷后時間為零,這時在其他函數做判斷處理,當時間為0則進行之后程序并重新時間賦值,這樣延遲做到了,也沒有傻傻的delay。對嗎?
回復

使用道具 舉報

20#
ID:246783 發表于 2020-3-20 21:48 來自手機 | 只看該作者
訪問DS18時關斷全局中斷,讀完再開即可
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲天堂色 | 天天人人精品 | 欧日韩在线| 国产情侣激情 | 中文字幕一区二区三区不卡在线 | 国产日产欧产精品精品推荐蛮挑 | 91精品国产乱码久久久久久久 | 成人久久久 | 啪啪免费 | 亚洲欧美综合精品久久成人 | 国产精品亚洲一区 | 青草青草久热精品视频在线观看 | 九九精品影院 | 久久a久久 | 在线不卡 | 久久综合色综合 | 久草热8精品视频在线观看 午夜伦4480yy私人影院 | 亚洲国产精品一区二区久久 | 在线中文字幕视频 | 国产1区 | 国产精品视频在线观看 | 国产日韩一区 | 久久综合久色欧美综合狠狠 | 干一干操一操 | 日韩电影一区二区三区 | 国产一区二区三区视频免费观看 | 日韩成人免费中文字幕 | 国产激情视频在线观看 | 日韩欧美三级 | 91偷拍精品一区二区三区 | 国产亚洲一区精品 | 日韩成人免费视频 | 国产欧美精品一区二区 | 日韩中文欧美 | 伊人青青久久 | 日干夜操 | 蜜桃av鲁一鲁一鲁一鲁 | 最新中文字幕第一页视频 | 亚洲 自拍 另类 欧美 丝袜 | www.亚洲精品 | 亚洲成人在线网 |