作為一個51單片機的初學(xué)者,自己完成一個實物制作是感到很有成就感的事,在這里與大家分享,也希望可以和這里的大佬們進行交流和學(xué)習(xí)。本人算是入門新手,有錯誤或者不足的地方希望大佬可以指正和交流,在這里先提前請教。有想要做關(guān)于熱敏電阻測溫的也可以拿去參考希望我的這個拙作能給你帶來一些啟發(fā)。
首先我來談一談熱敏電阻測溫裝置制作中遇到的困難,這個東西大概花費了一周的時間,最難完成的部分就是測溫不準確的問題,首先我寫程序的時候,關(guān)于采集的電壓值轉(zhuǎn)化為ADC值,最后又轉(zhuǎn)化為溫度的這個過程,最初是使用了公式進行轉(zhuǎn)換的,但是,進入調(diào)試環(huán)節(jié)后發(fā)現(xiàn),顯示的不準確,因為每一個不同的NTC熱敏電阻不會和它自身B值所計算的電阻值那么吻合,實際的使用中有著許多不確定的因素,所以我最后就確定使用EXCEL 表格去計算出對應(yīng)的電壓值,最后在得出我需要的ADC值,然后放在數(shù)組中,直接使用。
硬件部分的Proteus仿真圖如下:
U$LKC~FAV4[_4OD({717APE.png (231.68 KB, 下載次數(shù): 81)
下載附件
2021-1-2 16:53 上傳
我使用的AD是adc0832 8位并行的芯片,測溫范圍為0-200度,所以精度不高,誤差有1度左右,還是挺大的,如果追求高精度的可以選擇12位或者更高位的AD轉(zhuǎn)化芯片。溫度采集使用的分壓式,分壓電阻是2K歐姆,熱敏電阻是10K電阻B值為3940.
制作出來的實物圖如下::
新建文件夾IMG_20201225_124745.jpg (9.49 MB, 下載次數(shù): 76)
下載附件
2021-1-2 16:49 上傳
新建文件夾IMG_20201225_124822.jpg (9.92 MB, 下載次數(shù): 59)
下載附件
2021-1-2 17:00 上傳
/*單片機程序如下*/
- #include <reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit CS =P1^0;
- sbit CLK=P1^1;
- sbit DIO =P1^2;
- sbit K_H=P1^3;
- sbit K_L=P1^4;
- sbit LED_U=P1^5;
- sbit LED_D=P1^6;
- sbit SOUNDER=P1^7;
- sbit K_T =P3^1;
- sbit K_U =P3^2;
- sbit K_D =P3^3;
- uint i,j,m,n,H,L,T,num,date,a=0,b=0;
- void Delay10ms(unsigned int c) //延遲為10ms的延遲函數(shù),用于按鍵的延遲去抖
- {
- unsigned char a, b;
- for (;c>0;c--)
- {
- for (b=38;b>0;b--)
- {
- for (a=130;a>0;a--);
- }
- }
- }
- uchar code table[]={//共陰數(shù)碼管段碼"0~f"
- 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x80};
- uchar data dis_buf[4];
- uchar code Temp[201]={//溫度:0-200 對應(yīng)的ADC值
- 255.9,255.8, 255.7, 255.6, 255.5, 255.4, 255.3, 255.2, 255.1, 254.1, 253.1, 252.1, 251.0, 249.9, 248.7, 247.6, 246.4, 245.1,
- 243.8, 242.5, 241.1, 239.8, 238.3, 236.9, 235.4, 233.8, 232.2, 230.6, 229.0, 227.3, 225.6, 223.8, 222.0, 220.2, 218.4, 216.5,
- 214.6, 212.6, 210.6, 208.6, 206.6, 204.5, 202.5, 200.4, 198.2, 196.1, 193.9, 191.7, 189.5, 187.3, 185.1, 182.8, 180.6, 178.3,
- 176.0, 173.8, 171.5, 169.2, 166.9, 164.6, 162.3, 160.1, 157.8, 155.5, 153.2, 151.0, 148.7, 146.5, 144.3, 142.1, 139.9, 137.7,
- 135.6, 133.4, 131.3, 129.2, 127.1, 125.1, 123.0, 121.0, 119.1, 117.1, 115.2, 113.2, 111.4, 109.5, 107.7, 105.9, 104.1, 102.4,
- 100.6, 98.9 ,97.3 ,95.7 ,94.0 ,92.5 ,90.9 ,89.4 ,87.9 ,86.4 ,85.0 ,83.6 ,82.2 ,80.9 ,79.5 ,78.2 ,77.0 ,75.7 ,74.5 ,72.7 ,72.1 ,71.0 ,69.9 ,
- 68.8 ,67.7 ,66.6 ,65.6 ,64.6 ,63.6 ,62.7 ,61.7 ,60.8 ,59.9 ,59.0 ,58.2 ,57.4 ,56.5 ,55.7 ,55.0 ,54.2 ,53.5 ,52.7 ,52.0 ,51.3 ,50.7 ,50.0 ,
- 49.4 ,48.7 ,48.1 ,47.5 ,46.9 ,46.4 ,45.8 ,45.3 ,44.7 ,44.2 ,43.7 ,43.2 ,42.7 ,42.3 ,41.8 ,41.3 ,40.9 ,40.5 ,40.1 ,39.6 ,39.2 ,38.9 ,38.5 ,38.1 ,
- 37.7 ,37.4 ,37.0 ,36.7 ,36.4 ,36.0 ,35.7 ,35.4 ,35.1 ,34.8 ,34.5 ,34.3 ,34.0 ,33.7 ,33.5 ,33.2 ,33.0 ,32.7 ,32.5 ,32.3 ,32.0 ,31.8 ,31.6 ,
- 31.4 ,31.2 ,31.0 ,30.8 ,30.6 ,30.4 ,30.2 ,30.0 ,29.9 ,29.7 ,29.9 ,29.7 ,29.5 ,29.0 ,28.9 ,28.7 ,28.6 ,28.4 ,
- };
- uchar ADC0832() //ADC0832 8位串行的AD轉(zhuǎn)換芯片
- {
- uchar aaa,temp;
- CS=1; //一個轉(zhuǎn)換周期開始
- CLK=0; //為第一個脈沖作準備
- CS=0; //CS置0,片選有效
- DIO=1; //DIO置1,規(guī)定的起始信號
- CLK=1; //第一個脈沖
- CLK=0; //第一個脈沖的下降沿,此前DIO必須是高電平
- DIO=1; //DIO置1, 通道選擇信號
- CLK=1; //第二個脈沖,第2、3個脈沖下沉之前,DI必須跟別輸入兩位數(shù)據(jù)用于選擇通道,這里選通道CH0
- CLK=0; //第二個脈沖下降沿
- DIO=0; //DI置0,選擇通道0
- CLK=1; //第三個脈沖
- CLK=0; //第三個脈沖下降沿
- DIO=1; //第三個脈沖下沉之后,輸入端DIO失去作用,應(yīng)置1
- CLK=1; //第四個脈沖
- for(aaa=0;aaa<8;aaa++) //高位在前
- {
- CLK=1; //第四個脈沖
- CLK=0;
- temp<<=1; //將下面儲存的低位數(shù)據(jù)向右移
- temp|=(uchar)DIO; //將輸出數(shù)據(jù)DIO通過或運算儲存在dat最低位
- }
- CS=1; //片選無效
- return temp; //將讀的數(shù)據(jù)返回
- }
- void delay(uint n)
- {
- uint i,j;
- for(i=n;i>0;i--)
- for(j=30;j>0;j--);
- }
- void LED_SOUND() //LED和蜂鳴器的報警顯示
- {
- LED_U=0;
- LED_D=0;
- SOUNDER=0;
- if(T>=H) //溫度高于上限紅色LED燈亮,同時蜂鳴器報警
- {
- LED_U=1;
- SOUNDER=1;
- }
- if(T<=L) //溫度低于下限黃燈點亮,同時蜂鳴器報警
- {
- LED_D=1;
- SOUNDER=1;
- }
- }
- void xianshi() //用于數(shù)碼管顯示的函數(shù)
- {
- static uchar i=0;
- P0=0x00;
- P2=~(0x01<<i);
- delay(1);
- P0=dis_buf[ i];[ i]
- i++;
- i%=4;
- }
- void main()
- {
- LED_U=0;
- EX0=1;
- IT0=1;
- EX1=1;
- IT1=1;
- EA=1;
- while(1)
- {
- for(j=0;j<5;j++) //多次采集求平均值,用于防止顯示時值的不穩(wěn)定
- {
- num+=ADC0832();
- date=num/5;
- }
- j=0;
- num=0;
-
- for(i=0;i<201;i++) //用于判斷ADC值在那個值的范圍內(nèi),然后輸出數(shù)組值,也就是對應(yīng)的溫度值
- {
- if(date<=Temp[ i]&&date>Temp[i+1])[ i]
- {
- T=i;
- break;
- }
- }
- dis_buf[0]=table[T/100]; //個位顯示
- dis_buf[1]=table[T/10%10]; //十位顯示
- dis_buf[2]=table[T%10]; //百位顯示
- dis_buf[3]=0x39; //顯示“C”
- xianshi();
- delay(1);
- if(K_H==0) //按鍵是否按下
- {
- Delay10ms(1); //按鍵的延遲去抖
- if(K_H==0)
- {
- while(1) //用于顯示上限的報警數(shù)值
- {
- H=20+a;
- dis_buf[0]=0x76;
- dis_buf[1]=table[H/100];
- dis_buf[2]=table[H/10%10];
- dis_buf[3]=table[H%10];
- xianshi();
- if(K_H==0) //再次按下按鍵,跳出調(diào)節(jié)上限的顯示界面,繼續(xù)顯示溫度
- {
- Delay10ms(1);
- if(K_H==0)
- break;
- }
- }
- }
- }
- if(K_L==0) //按鍵是否按下
- {
- Delay10ms(1); //按鍵的延遲去抖
- if(K_L==0)
- {
- while(1) //用于顯示下限的報警數(shù)值
- {
- L=10+b;
- dis_buf[0]=0x38;
- dis_buf[1]=table[L/100];
- dis_buf[2]=table[L/10%10];
- dis_buf[3]=table[L%10];
- xianshi();
- if(K_L==0) //再次按下按鍵,跳出調(diào)節(jié)下限的顯示界面,繼續(xù)顯示溫度
- {
- Delay10ms(1);
- if(K_L==0)
- break;
- }
- }
- }
- }
- LED_SOUND(); //報警函數(shù)
- }
- }
- void u_init() interrupt 0 //用于按鍵“加一”的中斷函數(shù)
- {
- if(K_U==0)
- {
- Delay10ms(1);
- if(K_U==0)
- {
- if(dis_buf[0]==0X76) //用于判斷數(shù)碼管是否處于調(diào)節(jié)上限顯示的界面
- {
- a++;
- }
- if(dis_buf[0]==0X38) //用于判斷數(shù)碼管是否處于調(diào)節(jié)下限顯示的界面
- {
- b++;
- }
- }
- }
- }
- void d_init() interrupt 2 //用于按鍵“減一”的中斷函數(shù)
- {
- if(K_D==0)
- {
- Delay10ms(1);
- if(K_D==0)
- {
- if(dis_buf[0]==0X76) //用于判斷數(shù)碼管是否處于調(diào)節(jié)上限顯示的界面
- {
- a--;
- }
- if(dis_buf[0]==0X38) //用于判斷數(shù)碼管是否處于調(diào)節(jié)下限顯示的界面
- {
- b--;
- }
- }
- }
- }
復(fù)制代碼
51hei.png (21.39 KB, 下載次數(shù): 62)
下載附件
2021-1-2 22:19 上傳
51hei.png (3.15 KB, 下載次數(shù): 74)
下載附件
2021-1-2 22:23 上傳
最后我有將程序,仿真,還有ADC處理等放在附件內(nèi),有需要的可以下載,希望可以得到大家的指正和交流 。
全部資料51hei下載地址:
熱敏電阻測溫裝置.7z
(79.56 KB, 下載次數(shù): 148)
2022-4-27 23:16 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|