《課程設(shè)計(jì)報(bào)告 單片機(jī)通過熱敏電阻測溫》由會員分享,可在線閱讀,更多相關(guān)《課程設(shè)計(jì)報(bào)告 單片機(jī)通過熱敏電阻測溫(9頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、
單片機(jī)通過熱敏電阻測溫
一、前言
近年來,隨著科學(xué)技術(shù)和生產(chǎn)的不斷發(fā)展,越來越多的參數(shù)需要通過溫度測量來獲得。因此,溫度一詞在生產(chǎn)生活中出現(xiàn)的頻率日益增加。與之相對應(yīng)的,溫度測量也成為了生產(chǎn)生活中頻繁使用的詞語,同時它在各行各業(yè)中也發(fā)揮著重要的作用。
溫度是表征物體冷熱程度的物理量,溫度測量則是工農(nóng)業(yè)生產(chǎn)過程中一個很重要而普遍的參數(shù)。溫度的測量對保證產(chǎn)品質(zhì)量、提高生產(chǎn)效率、節(jié)約能源、生產(chǎn)安全、促進(jìn)國民經(jīng)濟(jì)的發(fā)展起到非常重要的作用。由于溫度測量的普遍性,溫度傳感器的數(shù)量在各種傳感器中居首位。而且隨著科學(xué)技術(shù)和生產(chǎn)的不斷發(fā)展,溫度傳感
2、器的種類還是不斷增加豐富來滿足生產(chǎn)生活中的需要。
而作為一種具有功能強(qiáng),體積小,功耗低,價(jià)格便宜,工作可靠,使用方便等特點(diǎn)的器件,單片機(jī)成為溫度測量系統(tǒng)的首選部件。近年年來隨著計(jì)算機(jī)在社會領(lǐng)域的滲透和大規(guī)模集成電路的發(fā)展,單片機(jī)的應(yīng)用正在不斷地走向深入,越來越廣泛地應(yīng)用各個領(lǐng)域。單片機(jī)溫度測量師對溫度進(jìn)行有效的測量,并且能夠在工業(yè)生產(chǎn)中得到了廣泛的應(yīng)用,尤其在電力工程、化工生產(chǎn)、機(jī)械制造、冶金工業(yè)等重要工業(yè)領(lǐng)域中,擔(dān)負(fù)著重要的測量任務(wù)。在日常生活中,也可以廣泛實(shí)用于地?zé)?、空調(diào)器、電加熱器等各種家庭室溫測量及工業(yè)設(shè)備溫度測量場合。
3、
三、硬件設(shè)計(jì)
如圖所示,本設(shè)計(jì)包括最小系統(tǒng)、測溫電路、數(shù)碼管顯示、下載口、蜂鳴器、鍵盤等部分。本設(shè)計(jì)采用按鍵設(shè)置溫度報(bào)警點(diǎn)通過測溫電路采集溫度信息,經(jīng)過STC12C5410AD進(jìn)行模數(shù)轉(zhuǎn)換、處理并將實(shí)際溫度值和設(shè)定溫度值分別顯示在共陰極數(shù)碼顯示管LED上。
3.1 溫度采樣部分
如圖3.1所示,測溫電路利用熱敏電阻將溫度轉(zhuǎn)化為電量,并將電壓值輸入STC12C5410AD進(jìn)行模數(shù)轉(zhuǎn)換。STC12C5410AD將轉(zhuǎn)換所得的數(shù)值輸入數(shù)碼管顯示出來。
圖3.1 溫度采樣電路
4、
3.2 溫度顯示部分
LED數(shù)碼管將STC12C5410AD處理的溫度信息顯示出來。圖3.2為測溫系統(tǒng)的顯示部分。數(shù)碼管的8個管腳由STC12C5410AD的P2口控制。4個三極管用來控制數(shù)碼管顯示。其基極分別與P3.2~P3.5口相接。若P3.2輸出高電平,則Q1導(dǎo)通,STC12C5410AD的P2口控制第一個數(shù)碼管的8個管腳。P2口輸出高電平,對應(yīng)的管腳發(fā)光;反之,管腳不發(fā)光。如此將數(shù)值顯示出來。4個數(shù)碼管都顯示出數(shù)值后,即得到溫度值。
圖3.2 溫度顯示部分
3.3 溫度報(bào)警部分
溫度報(bào)警部分包括報(bào)警點(diǎn)設(shè)置和蜂鳴器。
本
5、設(shè)計(jì)通過鍵盤進(jìn)行溫度報(bào)警點(diǎn)設(shè)置。5個按鍵分別接至P1.6~P1.2口。其中,conf鍵控制數(shù)碼管。當(dāng)該鍵按下時,數(shù)碼管顯示全部為0,即將數(shù)碼管切換至溫度報(bào)警點(diǎn)設(shè)置界面。Bai、shi、ge、dian鍵分別控制百位、十位、個位和小數(shù)點(diǎn)后一位。該4鍵每按一下,數(shù)值增1。當(dāng)數(shù)值為9后,再按一下則歸0。
蜂鳴器一管腳接至P3.7口。若所測溫度超限時,則報(bào)警。
3.4 程序下載部分
下載口的作用是將編寫的程序燒入單片機(jī)內(nèi)。
四、軟件設(shè)計(jì)
4.1 熱敏電阻曲線擬合
y=-30:5:110;
x0=[909.
6、42 876.84 838.24 647.6 742.91 688.04 630.31 570.9 512 453.56...
398.73 347.87 301.65 260.28 223.81 191.89 169.24 140.17 119.73...
102.31 87.86 74.97 64.3 55.22 47.65 41.18];
x=0.005.*x0;
cftool(x,y)
得結(jié)果:
Linear model Poly3:
f(x) = p1*x^3 + p2*x^2 + p3*x + p4
7、Coefficients (with 95% confidence bounds):
p1 = -2.537 (-3.205, -1.869)
p2 = 22.01 (16.95, 27.08)
p3 = -77.14 (-87.64, -66.64)
p4 = 117.9 (112.8, 123)
Goodness of fit:
SSE: 357.4
R-square: 0.993
Adjusted R-square: 0.9921
RMSE:
8、3.781
可得溫度與電壓值間的關(guān)系:
T= -2.537 U^3+22.01 U^2-77.14 U+117.9
4.2 編程
#include
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sbit beep=P3^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77
9、,0x7c,0x39,0x5e,0x79,0x71};//0-f
ulong alarmT;
void delay(uchar a)//延時a ms
{
uchar j;
while(a--!=0)
{
for(j=0;j<125;j++);
}
}
uint GetAdData() //AD轉(zhuǎn)換子程序
{
uchar Lo2;
uint Hi8;
ADC_CONTR=0xEF; //啟動AD,并選p1.7為AD轉(zhuǎn)換通道
P1M0=0x03;
P1M1=0x03; //p1
10、.7先設(shè)開漏
while(!(ADC_CONTR&0x10)); //等待AD轉(zhuǎn)換標(biāo)志置1,即轉(zhuǎn)換結(jié)束
ADC_CONTR = 0x87; //關(guān)AD電源,清D轉(zhuǎn)換標(biāo)志,仍置p1.7為AD轉(zhuǎn)換通道
Lo2 =ADC_LOW2;
Lo2&=0x03;
Hi8 =ADC_DATA;
Hi8<<=2;
Hi8+=Lo2;
return(Hi8);
}
void display(uchar date)
{
uint bai,shi,ge,dian;
bai=date/1000;
shi=date%1000/10
11、0;
ge=date%100/10;
dian=date%10;
P3=0x04;
P2=table[bai];
delay(2);
P3=0;
P3=0x08;
P2=table[shi];
delay(2);
P3=0;
P3=0x10;
P2=table[ge]+0x80;
delay(2);
P3=0;
P3=0x20;
P2=table[dian];
delay(2);
P3
12、=0;
}
void keyscan()
{
uint bai,shi,ge,dian,i;
if(P1^6==0) //按下功能切換鍵,設(shè)置報(bào)警溫度
{
delay(1);
if(P1^6==0)
{ display(0);
if(P1^5==0)
{
delay(1);
if(P1^5==0) //按下百位控制鍵
{
bai+=1;
if(bai>9) bai=0;
}
}
if(P1^
13、4==0) //按下十位控制鍵
{
delay(1);
if(P1^4==0)
{
shi+=1;
if(shi>9) shi=0;
}
}
if(P1^3==0) //按下個位控制鍵
{
delay(1);
if(P1^3==0)
{
ge+=1;
if(ge>9) ge=0;
}
}
if(P1^2==0) //按下點(diǎn)位控制鍵
{
14、 delay(1);
if(P1^2==0)
{
dian+=1;
if(dian>9) dian=0;
}
}
for(i=0;i<100;i++) //顯示所設(shè)置的溫度
{
display((bai*100+shi*10+ge+0.1*dian)*10);
}
}
}
alarmT=bai*100+shi*10+ge+0.1*dian;
for(i=0;i<100;i++) //顯示報(bào)警溫度
{
display(
15、alarmT*10);
}
}
void main()
{
ulong U,T;
uchar i,j;
while(1)
{
U=GetAdData();
U=U*5/1024; //10位AD轉(zhuǎn)換為模擬電壓,參考電壓為5V
T= -2.537*U*U*U+22.01*U*U-77.14*U+117.9; //計(jì)算溫度
for(i=0;i<100;i++) //顯示溫度
{
display(T*10);
}
keyscan();
if(T>=alarmT) //報(bào)警
{
for(j=0;j<100;j++)
{
beep=!beep;
}
}
}
}