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

標題: 單片機ntc檢測溫度,不顯示溫度值 是什么問題?求解 [打印本頁]

作者: qwettyuio    時間: 2021-10-11 16:57
標題: 單片機ntc檢測溫度,不顯示溫度值 是什么問題?求解

  1. #include<reg52.h>                                 //頭文件
  2. #include<intrins.h>
  3. #include"eeprom52.h"                  //調用STC89C52單片機的EEPROM控制程序
  4. #include "math.h"
  5. #define uchar unsigned char                 //宏定義
  6. #define uint unsigned int                 //宏定義
  7. #define LCD1602_dat P0                         //LCD1602的數據傳輸IO口

  8. sbit LCD1602_rs=P3^5;//LCD1602命令數據控制IO
  9. sbit LCD1602_rw=P3^6; //LCD1602讀寫IO控制
  10. sbit LCD1602_e=P3^4;  //數據脈沖輸入

  11. sbit DIN  = P2^0;        //串行數據輸入端
  12. sbit DCLK  = P2^1;        //I/O時鐘輸入
  13. sbit DOUT = P2^5;   //串行數據輸出端
  14. sbit CS   = P3^7;        //片選腳IO

  15. #define  AD_CH3 0xe4

  16. float zhi;        //暫存讀取的輸入變量

  17. int temp;        //讀取熱敏溫度計的溫度數據

  18. void delay(uint T)                //系統延時程序
  19. {
  20.         while(T--);
  21. }

  22. /*=========================================
  23. 函數   :SPI_Write(uchar DAT)
  24. 參數   :DAT需要發送的數據
  25. 返回值 :無
  26. 描述   :發送一個字節數據
  27. ==========================================*/
  28. void SPI_Write(uchar DAT)
  29. {
  30.         uchar i;
  31.         for(i=0;i<8;i++)     //分別寫8次,每次寫一位
  32.         {
  33.                 DCLK = 0;        //拉低時鐘總,允許DIN變化
  34.                 if(DAT & 0x80)   //先寫數據最高位
  35.                         DIN = 1;     //寫1
  36.                 else
  37.                         DIN = 0;     //寫0
  38.                 DCLK = 1;        //拉高時鐘,讓從位機讀取DIN        
  39.                 DAT <<=1;
  40.         }
  41. }
  42. /*========================================
  43. 函數   :ReadByte()
  44. 參數   :無
  45. 返回值 :返回讀出的數據
  46. =========================================*/
  47. uint SPI_Read()
  48. {
  49.         uchar i;
  50.         uint DAT;
  51.         for(i=0;i<12;i++)  //分別讀12次,每次讀一位
  52.         {
  53.                 DAT <<=1;      //數據左移一位,準備接收一位
  54.                 DCLK = 1;      //拉高時鐘總線,讀取SDA上的數據
  55.                 DCLK = 0;      //拉低時鐘總線,允許從機控制SDA變化
  56.                 if(DOUT)
  57.                 DAT |= 0x01;   //為1則寫1,否則不執行寫1,通過左移補零
  58.         }
  59.         return(DAT);   //返回讀出的數據
  60. }
  61. /*=======================================
  62. 函數   :PCF8591Read(uchar cmd)
  63. 參數   :cmd XPT2046控制字節
  64. 返回值 :AD轉出的數字量
  65. 描述   :讀指定通道的輸入的模擬量轉為數字量
  66. ========================================*/
  67. uint ReadAD(uchar cmd)
  68. {
  69.         uint DAT;
  70.         CS = 0;
  71.         SPI_Write(cmd);
  72.         DCLK = 0;        //拉低時鐘總線
  73.         _nop_();
  74.         _nop_();
  75.         _nop_();
  76.         _nop_();
  77.         _nop_();
  78.         DAT = SPI_Read();
  79.         CS = 1;
  80.         return(DAT);    //返回讀出數據
  81. }
  82. /********************************************************************
  83. * 名稱 : LCD1602_write(uchar order,dat)
  84. * 功能 : 1602寫如數據函數
  85. * 輸入 : 輸入的命令值
  86. * 輸出 : 無
  87. ***********************************************************************/
  88. void LCD1602_write(uchar order,dat)                                  //1602 一個字節  處理
  89. {
  90.     LCD1602_e=0;
  91.     LCD1602_rs=order;
  92.     LCD1602_dat=dat;
  93.     LCD1602_rw=0;
  94.     LCD1602_e=1;
  95.     delay(1);
  96.     LCD1602_e=0;                                                                                                                                                                                                     
  97. }
  98. /********************************************************************
  99. * 名稱 : LCD1602_writebye(uchar *prointer)
  100. * 功能 : 1602寫入數據函數  指針式
  101. * 輸入 : 輸入的命令值
  102. * 輸出 : 無
  103. ***********************************************************************/
  104. void LCD1602_writebyte(uchar *prointer)                                   //1602 字符串    處理
  105. {
  106.     while(*prointer!='\0')
  107.     {
  108.         LCD1602_write(1,*prointer);
  109.         prointer++;
  110.     }
  111. }
  112. /********************************************************************
  113. * 名稱 : LCD1602_cls()
  114. * 功能 : 初始化1602液晶
  115. * 輸入 : 無
  116. * 輸出 : 無
  117. ***********************************************************************/
  118. void LCD1602_cls()                                                                         //1602 初始化
  119. {
  120.         LCD1602_write(0,0x01);     //1602 清屏 指令
  121.         delay(1500);
  122.         LCD1602_write(0,0x38);     // 功能設置 8位、5*7點陣
  123.         delay(1500);
  124.         LCD1602_write(0,0x0c);     //設置 光標   不顯示開關、不顯示光標、字符不閃爍
  125.         LCD1602_write(0,0x06);
  126.         LCD1602_write(0,0xd0);
  127.         delay(1500);
  128. }
  129. /********************************************************************
  130. * 名稱 : show()
  131. * 功能 : LCD1602液晶顯示程序
  132. * 輸入 : 無
  133. * 輸出 : 無
  134. ***********************************************************************/
  135. void show()                        //顯示數據
  136. {

  137.                 LCD1602_write(0,0x80);                   //顯示位置設定
  138.                 LCD1602_writebyte("Temp:");                //顯示當前溫度值
  139.                 if(temp>=0)                         //顯示溫度整數部分
  140.                 {
  141.                            if(temp>999)LCD1602_write(1,0x30+temp/1000%10);           
  142.                         else LCD1602_writebyte(" ");
  143.                         if(temp>99)LCD1602_write(1,0x30+temp/100%10);
  144.                         else LCD1602_writebyte(" ");
  145.                         LCD1602_write(1,0x30+temp/10%10);
  146.                         LCD1602_writebyte(".");
  147.                            LCD1602_write(1,0x30+temp%10);
  148.                 }else
  149.                 {
  150.                         LCD1602_writebyte("-");          //顯示溫度負數部分
  151.                         if(temp*-1>99)LCD1602_write(1,0x30+(temp*-1)/10%10);
  152.                         else LCD1602_writebyte(" ");
  153.                         LCD1602_write(1,0x30+(temp*-1)%10);        
  154.                         LCD1602_writebyte(".");
  155.                            LCD1602_write(1,0x30+temp%10);
  156.                 }
  157.                 LCD1602_write(1,0xdf);
  158.                 LCD1602_writebyte("C  ");
  159. }
  160. /********************************************************************
  161. * 名稱 : float TempCalculate(float Rx,float B,float Revise,float BasicRx)
  162. * 功能 : 根據當前熱敏電阻的阻值、以及參數、通過Sin曲線求出當前系統的溫度值  并返回浮點型的溫度值
  163. * 輸入 : 無
  164. * 輸出 : 無
  165. ***********************************************************************/
  166. float TempCalculate(float Rx,float B,float Revise,float BasicRx)
  167. {
  168. /*

  169. Rx:  熱敏電阻當前阻值
  170. B:   熱敏電阻參數B值
  171. Revise:  校正溫度
  172. BasicRx:  熱敏電阻25度時電阻(標稱電阻數值)
  173. 返回: 攝氏度

  174. */  


  175.     Rx = Rx / BasicRx;

  176.     Rx = log(Rx);

  177.     Rx = (Rx) / B;

  178.     Rx = Rx + 0.003356;
  179.     Rx = 1 / Rx;
  180.     Rx = Rx - 273.13;  
  181.     Rx = Rx + Revise;


  182.     return Rx;

  183. }
  184. /********************************************************************
  185. * 名稱 : void main()
  186. * 功能 : 系統主程序
  187. * 輸入 : 無
  188. * 輸出 : 無
  189. ***********************************************************************/
  190. void main()
  191. {
  192.         float Rad;               //生成運算暫存變量
  193.         LCD1602_cls();     //LCD1602初始化程序調用
  194.         while(1)
  195.         {
  196.                 zhi=(float)ReadAD(AD_CH3)/819.0;  //計算電壓值
  197.                 Rad=zhi/((5.0-zhi)/10000.0);   //計算熱敏電阻當前阻值
  198.                 temp=(int)((temp * 0.5) + (TempCalculate(Rad,4200.0,0,10000.0) * 0.5)*10);//求出當前系統的當前溫度
  199.                 show();                 //顯示函數
  200.         }
  201. }

復制代碼

作者: munuc_w    時間: 2021-10-11 17:27
數據采集和數據顯示應該是獨立工作的兩個模塊,先調顯示函數,正常工作后再調數據采集部分。
作者: Jiang_YY    時間: 2021-10-11 19:39
是所有都沒有顯示,還是其它固定顯示的正常,只有溫度沒有顯示?如果有顯示,按代碼看,溫度一定會顯示數字,那就是溫度值顯示不對?如果都沒有顯示,那就先把顯示調出來。如果是有顯示,但是溫度顯示不對,先顯示固定的溫度值,看顯示是否正常,如果正常,就分析你的ADC檢測及溫度轉化部分。
作者: qwettyuio    時間: 2021-10-13 11:37
Jiang_YY 發表于 2021-10-11 19:39
是所有都沒有顯示,還是其它固定顯示的正常,只有溫度沒有顯示?如果有顯示,按代碼看,溫度一定會顯示數字 ...

其他都正常,固定顯示溫度也可以,ADC轉換顯示在1602液晶屏可以顯示正確溫度,在斷碼屏顯示不出正常溫度,一直顯示三個0,不知道是什么原因





歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1