国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

ELEOK

標題: 無AD功能51單片機用1個電容1個熱敏電阻測溫度 原理圖程序 [打印本頁]

作者: coolfire    時間: 2021-4-21 03:04
標題: 無AD功能51單片機用1個電容1個熱敏電阻測溫度 原理圖程序
根據RC充電原理知道:未知Rx=(未知充電時間us/已知充電時間us)*已知電阻k
先用10K(或100k或其它精密電阻)根據下圖測出所用時間us(粗測出289us,公式用到)

顯示的數碼管線路可能不同,我自己焊在P1口上。
制作出來的實物圖如下:

其實還可以改精度更高些,主要關鍵穩定電壓,穩定質量電阻電容,還有公式取的精度。
粗陋對比18B20溫度


51單片機源程序:測試已知電阻充電時間也用上面小改一下,讓數碼管顯示Rxt就是被測時間。
  1. #include<reg52.h>
  2. #define u8  unsigned char
  3. #define u16 unsigned int
  4. sbit Rc=P0^0;u16 s=0,r=0;
  5. sbit a=P3^4;sbit b=P3^5;sbit c=P3^6;sbit d=P3^7; //4個數碼管
  6. u8 code tab[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0,0x63};
  7. u8 us,t,dw[4];//數碼管顯示0--9,0是關顯示,0x63是溫度符號
  8. u16 code ntc100[]={31076,29541,28090,26720,25424,24199,23039,21942,20904,
  9. 19920,18988,18106,17269,16475,15723,15009,14331,13688,13077,12497,11946,
  10. 11422,10924,10451,10000,9571,9163,8775,8405,8052,7717,7397,7092,6801,6524,
  11. 6259,6007,5766,5536,5316,5106,4906,4714,4531,4356,4189,4029,3875,3729,3588};
  12. //1--50的溫度//自己設置需要的溫度
  13. void Delay(u16 n){while(--n);}//12M公式n=(延時-6)*0.12493899(us)
  14. void disp()
  15. {  s++;if(s==3000)s=0; //s=3000是延時一會兒再讀取溫度
  16.    dw[0]=10;dw[1]=t%100/10;dw[2]=t%10;dw[3]=11;
  17.    P1=tab[dw[0]];a=1;Delay(70);a=0;P1=tab[dw[1]];b=1;Delay(70);b=0;
  18.    P1=tab[dw[2]];c=1;Delay(70);c=0;P1=tab[dw[3]];d=1;Delay(70);d=0;P1=0;}
  19. void T0init()
  20. {TMOD=0x02;TH0=0x00;TL0=0x00;ET0=1;EA=1;}
  21. void main(void)
  22. { long u16 Rxt;u16 temp;u8 j;
  23.   T0init();
  24. while(1)
  25. {
  26.    if(s==0){Rc=0;Delay(600);//約5ms
  27.          Rc=1;TR0=1;while(!Rc);TR0=0;
  28.          Rxt=us*256+TL0;TL0=0;us=0;Rc=0;
  29.          r=((float)(Rxt*1.0/289*1.0)+0.00005)*10*100;}
  30.          //289us是已知電阻(10K)測到的時間*10是10k單位是k,
  31.          //*100是取溫度有效值,如26度ntc100k是(95.7132k)ntc10k(9.631K)
  32.      if((r>3455)&&(r<32500))//阻值在1~50度之間,顯示對應的溫度
  33.          {for(j=0;j<50;j++){temp=ntc100[j];if(r>=temp) break;}
  34.           t=j;}
  35.          disp();
  36. }}
  37. void t0() interrupt 1
  38. {us++;if(us==255)us=0;}
復制代碼






歡迎光臨 ELEOK (http://www.afoofa.cn/) Powered by Discuz! X5.0