采用熱敏電阻pt100設計溫度傳感電路,溫度傳感電路通過放大電路進行放大后加載到A/D轉換模塊(ADC0804),以AT89C51單片機為主控制端,外接晶振電路滿足各模塊時序,最終通過7段數碼管進行溫度顯示
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei截圖20200909193703.png (57.62 KB, 下載次數: 95)
下載附件
2020-9-9 19:37 上傳
單片機源程序如下:
- #include<reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define ad0_7 P1 //AD數據口
- sbit cs=P2^4; //片選信號,低電平有效,控制芯片的啟動和結果讀取
- sbit rd=P2^7; //讀數據控制,低電平有效
- sbit wr=P2^6; //AD啟動控制,上升沿有效
- sbit intr=P2^5; //AD轉換完成輸出低電平
- uchar i;
- uchar led[11]={ 0x3F, //"0"
- 0x06, //"1"
- 0x5B, //"2"
- 0x4F, //"3"
- 0x66, //"4"
- 0x6D, //"5"
- 0x7D, //"6"
- 0x07, //"7"
- 0x7F, //"8"
- 0x6F, //"9"
- 0x40, //"-"
- };
- uchar dat_AD[4]={0};
-
- //啟動AD轉換子程序//////////////////
- void start_ad(void)
- { cs=0; //允許AD
- wr=0;
- _nop_();
- wr=1; //WR由低變高時啟動AD轉換
-
- while(intr); //等待轉換完成,低電平有效
- cs=1; //停止AD轉換
- }////////////////////
- read_ad()
- { uint ad_data;
- ad0_7=0xff;
- cs=0; //允許讀
- rd=0; //讀取轉換數據結果
- _nop_();
- ad_data=ad0_7; //把數據存到AD——data中
- rd=1;cs=1; //停止讀取AD
- return(ad_data);
- }
- // 數據處理函數
- //實際測量當0度時,AD數據為133,所以數據處理時判斷AD數據和133的大小來識別正負溫度。
- //由于ADC芯片精度不夠,所以測量時有誤差,8位AD的分辨率為19.5mV,約為20mV,
- //放大電路輸出的電壓,溫度每變化一度,電壓變化只有10mV左右,所以測量有誤差,
- //以下溫度和AD數據的計算公式為實測數據后線性擬合得到的,實際線性擬合得到公式為:y=0.503x+133.63.
- //因為AD數據為0-255的整數,所以公式簡化為以下計算方式
- void data_shout(uint ad_data)
- {
- float temp;
- uint T;
- if(ad_data<79)
- {
- temp=614.422-7.811*ad_data;
- T=(uint)temp;
- dat_AD[0]=10;
- } //負溫度 dat_AD[0]中為溫度符號數據
- else if(ad_data<=204)
- {
- temp=7.990*ad_data-628.491;
- T=(uint)temp;
- dat_AD[0]=T/1000;
- } //正溫度
- else if(ad_data>204)
- {
- temp=8.124*ad_data-655.742;
- T=(uint)temp;
- dat_AD[0]=T/1000;
- } //ad_data=T;
-
- dat_AD[1]=T%1000/100; //溫度值的十位
- dat_AD[2]=T%100/10; //2溫度值的個位
- dat_AD[3]=T%10; //溫度值的小數位
- }
- //顯示函數
- void disp(){
- switch(i){
- case 0: P0=0xfe;P3=led[dat_AD[0]];i++;break; //顯示符號位
- case 1: P0=0xfd;P3=led[dat_AD[1]];i++;break;
- case 2: P0=0xfb;P3=led[dat_AD[2]]|0x80;i++;break;
- case 3: P0=0xf7;P3=led[dat_AD[3]];i=0;break;
- }
- }
- //定時器初始化
- //用作數碼管顯示的刷新
- void t0init(){
- TMOD=0x01;
- TH0=(65535-2000)/256; //定時20ms時間
- TL0=(65535-2000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- }
- //定時器中斷函數,在中斷中刷新數碼管顯示
- void Time0( ) interrupt 1{
- TH0=(65535-2000)/256;
- TL0=(65535-2000)%256;
- disp();
- }
- //主函數
- void main(void){
- t0init(); //初始化
- while(1){
- start_ad(); //開始AD
- data_shout(read_ad()); //數據處理
- }
- }
復制代碼
所有資料51hei提供下載:
pt100熱敏電阻的體溫計.zip
(48.38 KB, 下載次數: 305)
2020-9-9 19:37 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|