基于AT89C51單片機(jī)低成本溫度控制實(shí)驗(yàn)系統(tǒng)
筆者在電子市場(chǎng)購(gòu)買了一塊3.6V450mAh的鋰離子充電本文介紹一種以AT89C51單片機(jī)為核心的低成本溫度控制實(shí)驗(yàn)系統(tǒng)。該系統(tǒng)采用溫度傳感器DS18820實(shí)現(xiàn)一線數(shù)字式測(cè)溫,經(jīng)過PID算法輸出PWM波,再由PWM信號(hào)控制固態(tài)繼電器,調(diào)節(jié)熱阻絲發(fā)熱功率,最終達(dá)到控制被控對(duì)象溫度的目的,該系統(tǒng)還擴(kuò)展了人機(jī)接口和串口通信,實(shí)現(xiàn)溫度設(shè)定、控制及圖像顯示。
硬件設(shè)計(jì)
1.總體設(shè)計(jì)
系統(tǒng)結(jié)構(gòu)框圖如圖1所示,以AT89C51單片機(jī)為控制核心,DS18820電池,外型尺寸完全符合原機(jī)的內(nèi)部空間要求。按照正確的正負(fù)極性焊連到電路中即可完成電池的更換工作。實(shí)際使用效果極佳,連續(xù)播放時(shí)間超過了7個(gè)小時(shí)(圖4)。測(cè)量被控溫度,外圍電路包括人機(jī)接口的按鍵與數(shù)碼顯示電路、溫度讀取與控制驅(qū)動(dòng)電路以及與上位機(jī)串行通信電路。用戶通過按鍵設(shè)定加熱溫度后,系統(tǒng)啟動(dòng)加熱“熱得快”燒水。當(dāng)前水溫經(jīng)過DS18820測(cè)量送給單片機(jī),單片機(jī)經(jīng)PID校正后輸出PWM信號(hào),然后通過固態(tài)繼電器驅(qū)動(dòng)熱得快加熱,最終使水溫保持在設(shè)定值上,誤差不超過O.1℃。
單片機(jī)系統(tǒng)通過串口與上位PC機(jī)實(shí)現(xiàn)通訊,上位機(jī)實(shí)現(xiàn)溫度、溫度曲線顯示以及PID參數(shù)的設(shè)定,用戶通過上位機(jī)可以清晰地看到設(shè)定的PID參數(shù)所產(chǎn)生的控制作用,如系統(tǒng)的微調(diào)、時(shí)間等參數(shù)。
2溫度測(cè)試模塊
系統(tǒng)選用美國(guó)DALLAS公司生產(chǎn)的單總線DS18820數(shù)字式溫度傳感器作為溫度模塊,引腳圖如下圖所示。
DS18820具有體積小、經(jīng)濟(jì)、使用方便靈活、測(cè)試精度高、性價(jià)比高、CRC校驗(yàn)功能等特點(diǎn),溫度測(cè)量范圍為-55+125℃,可編程為9位~12位A/D轉(zhuǎn)換精度,測(cè)溫分辨率達(dá)0.0625℃,被測(cè)溫度采用帶符號(hào)位擴(kuò)展的16位數(shù)字方式串行輸出。其工作電源即可在遠(yuǎn)端引入,也可采用寄生電源方式產(chǎn)生,多個(gè)DS18820可以并聯(lián)到3根或2根線上,CPU只需一根端口線即可與多個(gè)DS18820通信,占用微處理器的端口較少,可節(jié)省大量的引線和邏輯電路。
文中的DS18820三引腳分別接公共電源+5V、電源地和單片機(jī)P1.O引腳,具體電路如下圖所示,由于DS18820為1-WIRE器件,只需在其信號(hào)線上加一個(gè)上拉電阻到+5V電源即可。
同時(shí),每一個(gè)DS18820均有唯一系列號(hào),即允許在不同地方放置溫度靈敏器件,通過SearchRom指令選擇不同的DS18820芯片,實(shí)現(xiàn)溫度的多點(diǎn)監(jiān)測(cè),如HVAC環(huán)境控制、建筑物、設(shè)備或機(jī)械內(nèi)溫度檢測(cè)、過程溫度監(jiān)視和控制等。
3鍵盤及顯示電路模塊
本系統(tǒng)采用PT6961驅(qū)動(dòng)控制電路同時(shí)驅(qū)動(dòng)鍵盤與數(shù)碼管。PT6961為帶有鍵盤掃描接口的LED驅(qū)動(dòng)控制專用電路,內(nèi)部集成MCU數(shù)字接口、數(shù)據(jù)鎖存器、LED高壓驅(qū)動(dòng)、鍵盤掃描等電路。主要應(yīng)用于VCR、VCD、DVD及家庭影院等產(chǎn)品的顯示屏驅(qū)動(dòng)、多種顯示模式(11段×7位~14段×4位)、鍵掃描(10×3bit)電路、灰度調(diào)節(jié)電路(占空比8級(jí)可調(diào)),與單片機(jī)實(shí)現(xiàn)串行數(shù)據(jù)傳輸,節(jié)省了單片機(jī)引腳。PT6961可以自己驅(qū)動(dòng)顯示和鍵盤模塊電路,可實(shí)現(xiàn)串行數(shù)據(jù)傳輸,同日寸對(duì)時(shí)序要求較高。
單片機(jī)的P0.6引腳與PT6961的時(shí)鐘線相連,控制時(shí)序;P0.7引腳與PT6961的片選端相連,選通芯片,P0.4、PO.5引腳與PT6961的DOUT、DIN端相連,進(jìn)行數(shù)據(jù)和指令的串行傳輸,具體的傳輸數(shù)據(jù)仍由單片機(jī)編程控制。PT6961在cLOCk端產(chǎn)生下降沿時(shí),讀取DIN口的數(shù)據(jù),在clock端產(chǎn)生上升沿時(shí),在DOUT口產(chǎn)生按鍵寄存器值可供單片機(jī)讀取。硬件連接電路如下圖所示,該芯片可以同時(shí)驅(qū)動(dòng)(8~14)段×(4~7)位數(shù)碼管和3×10個(gè)按鍵,本文選用驅(qū)動(dòng)6個(gè)數(shù)碼管和1×6個(gè)按鍵。
4.執(zhí)行模塊
系統(tǒng)采用固態(tài)繼電器(SSR)控制熱得快電源,固態(tài)繼電器是一種四端器件,兩個(gè)輸人端,兩個(gè)輸出端,輸入端接控制信號(hào),輸出端與負(fù)載、電源串聯(lián),SSR實(shí)際是一個(gè)受控電力電子開關(guān)。
單片機(jī)經(jīng)PID算法,從P1.5口輸出PWM波,經(jīng)ULN2003反相驅(qū)動(dòng)后,作為SSR的控制信號(hào),如圖5所示,在固態(tài)繼電器輸出端接兩個(gè)二端口插件,方便引線串入熱得快插線中。由于SSR與熱得快接口是整個(gè)系統(tǒng)和電路板唯一一塊強(qiáng)電部分,為將其對(duì)弱電部分的干擾降到最低,弱電電路線遠(yuǎn)離該部分電路,且不共地,接線端子的腳間距應(yīng)大于SSR的腳間距。
5.串行通信模塊
本系統(tǒng)采用串口實(shí)現(xiàn)單片機(jī)與上位計(jì)算機(jī)的連接,單片機(jī)向上位機(jī)傳送溫度值,上位機(jī)顯示該值,并畫出溫度變化曲線圖,反應(yīng)溫度的變化情況,同時(shí)上位機(jī)可以調(diào)整PID參數(shù),使系統(tǒng)適用于不同的對(duì)象。串行通信連接如下圖所示,其中5個(gè)電容均取O.1μF的典型值,串口
DB9的5端為公共端接地端,2、3端則分別連接信號(hào)的接收端和發(fā)送端,該電路完成TTL電平與RS232電平轉(zhuǎn)換,DB9接口通過交叉串口線連接到PC機(jī)上,完成硬件的串行通信。
軟件設(shè)計(jì)
為加強(qiáng)程序的可讀性、可移植性和便于調(diào)試,系統(tǒng)軟件設(shè)計(jì)采用模塊化思想,程序運(yùn)行時(shí),通過主程序調(diào)用各子程序模塊。本文主程序流程如下圖所示,軟件設(shè)計(jì)主要講述DS18820信號(hào)處理子程序和串口通信子程序。
1.DS18820信號(hào)處理子程序
DSl8820為1-wire制器件,采用一根信號(hào)線即可與單片機(jī)進(jìn)行串行通信,簡(jiǎn)化了硬件電路,但是,在軟件設(shè)計(jì)中須進(jìn)行復(fù)雜的時(shí)序控制。DS1820單線通信功能為分日寸完成,有嚴(yán)格的時(shí)隙概念,系統(tǒng)對(duì)DS1820的各種操作必須按協(xié)議進(jìn)行。
操作協(xié)議為:初始化DS1820(發(fā)復(fù)位脈沖)→發(fā)ROM功能命令→發(fā)存儲(chǔ)器操作命令→處理數(shù)據(jù),DS18820操作程序流程如下圖所示。
本文只有一個(gè)DSl8820掛在總線上,因此每次對(duì)總線進(jìn)行讀寫日寸,可跳過讀ROM指令,為提高測(cè)溫精度,文中采用默認(rèn)的12位數(shù)碼轉(zhuǎn)換,即0.0625度/位,程序如下:
#include
sbit DQ=P1^O;
void Init_DS18820();
WriteOneChar(unsigned char dat);
char ReadOneChar();
void deIay(unsigned int i);
unsigned int ReadTemperature()
{
unsigned char a=0,c=O:
unsigned char b=O;
unsigned int t=O;
float tt=0;
Init_DS18820();
WriteOneChar(0xCC);
/*跳過讀序號(hào)列號(hào)的操作*/
WriteOneChar(Ox44);
/*啟動(dòng)溫度轉(zhuǎn)換*/
Init_DS18820();
WriteOneChar(OxCC);
/*跳過讀序號(hào)列號(hào)的操作*/
WriteOneCha r(0xBE);
/*讀取溫度寄存器等(共可讀9個(gè)寄
存器)前兩個(gè)就是溫度*/
a=ReadOneChar();
/*Read the low byte of the tem-perature*/
b=ReadOneChar();
/*high*/
c=a;
a>>=4;
b<<=4;
t=aㄧb;
, c&=0x0F;
tt=c;
tt*=0.0625;
c=tt*1 0+0.5;
t=t*1 0+c;
return t;
/*溫度轉(zhuǎn)化,位了避免浮點(diǎn)數(shù)運(yùn)算,
盡量用整形數(shù)據(jù)運(yùn)算,這樣可以減輕CPU負(fù)擔(dān)*/
}
void Init_DS18820()
/*初始化函數(shù)*/
{
unsigned char x=0;
DQ=1;
/*DQ復(fù)位*/
delay(8);
/*稍做延時(shí)*/
DQ=0;
?。瘑纹瑱C(jī)將DQ拉低*/
delay(80);
/*精確延時(shí)大于480μs*/
DQ=1;
/*拉高總線*/
delay(1 4):
x=DQ;
?。?稍做延時(shí)后,如果x=0則初始化
成功x=1則初始化失敗*/
}
char ReadoneChar()
?。?讀一個(gè)字節(jié)*/
{
unsigned char i=O;
unsigned char dat=O;
for(i=8;i>O;i--)
{
DQ=0:
/*給脈沖信號(hào)*/
dat>>=1;
DQ=1;
/*給脈沖信號(hào)*/
if(DQ)
datl=Ox80;
delay(4);
}
return(dat);
}
WriteOneChar(unsigned char dat)
/*寫一個(gè)字節(jié)*/
{
unsigned char i=O;
for(i=8:i>O:i--)
{
DO=0;
DQ=dat&Ox01;
delay(5);
DQ=1:
dat>>=1;
}
delay(4);
}
void delay(unsigned int i)
?。?延時(shí)函數(shù)*/
{
while(i--);
}
2,串行通信程序設(shè)計(jì)
單片機(jī)通過引腳RXD(P3.O,串行數(shù)據(jù)接收端)和引腳TXD(P3.1,串行數(shù)據(jù)發(fā)送端)與外界通訊,SBUF為串行口緩沖寄存器,包括發(fā)送寄存器和接收寄存器,具有相同名字和地址空間,但不會(huì)出現(xiàn)沖突,因?yàn)槠渲幸粋€(gè)只能被CPU讀出數(shù)據(jù),另一個(gè)只能被CPU寫入數(shù)據(jù)。
單片機(jī)的串行口的四種工作方式中,方式0和2的波特率是固定的,方式1和3的波特率是可變的,由定時(shí)器T1的溢出率控制,方式2為自動(dòng)重裝入初值的8位定時(shí)器/計(jì)數(shù)器模式,作為本文的波特率發(fā)生器。
上位機(jī)編程中,本文采用最常用的通信控件MSComm,實(shí)現(xiàn)可視化界面。MSComm控件的常用屬性有:Comm-Port設(shè)置并返回通訊端口號(hào):Settings以字符串的形式設(shè)置并返回波特率、奇偶校驗(yàn)、數(shù)據(jù)位、停止位;PortOpen設(shè)置并返回通訊端口的狀態(tài),也可以打開和關(guān)閉端口;Input從接收緩沖區(qū)返回和刪除字符;Output向傳輸緩沖區(qū)寫一個(gè)字符串。
串口初始化程序如下
BOOLJWDIg::OnInitDialog()
{
Comport SetCommPort(1):
if(!Comport GetPortOpen())
Comport.SetPortOpen(TRUE);
/*打開指定的串口*/
Comport.
SetlnputMode
(cOm-Input-
ModeBinary);
/*設(shè)置數(shù)據(jù)
獲取方式*/
Comport.
SetSettings
(“9600,n.8,1”);
/*設(shè)置波特率及其他通信
數(shù)*/
Comport.
SetRThreshOld
(n);
/*設(shè)定每接受n個(gè)字符觸發(fā)一次
MSComm事件*/
Comport.SetInputLen(0);
?。O(shè)置讀取方式*/
Comport.GetInput();
/*預(yù)置緩沖區(qū)以清除殘留數(shù)據(jù)*/
return TRU E;
}
系統(tǒng)測(cè)試
本系統(tǒng)實(shí)現(xiàn)的電路實(shí)物圖如下圖所示,通過按鍵設(shè)置預(yù)定溫度,如81.7℃,設(shè)定PID參數(shù),比例系數(shù)Kc=O.8、積分系數(shù)KI=O.007以及微分系數(shù)KD=5,設(shè)定PWM控制信號(hào)周期為20ms,采樣周期Ts=1S,測(cè)量的實(shí)驗(yàn)數(shù)據(jù)經(jīng)串行通信傳遞到上位機(jī)后實(shí)時(shí)顯示的響應(yīng)曲線實(shí)驗(yàn)中,測(cè)量溫度由低升高,最后與設(shè)定溫度值一致。
結(jié)論
本文介紹的溫控實(shí)驗(yàn)系統(tǒng)即有單片機(jī)主控的可靠性,又有上位機(jī)監(jiān)測(cè)的方便性,同時(shí)基于1-Wire總線DS18820實(shí)現(xiàn)多路溫度測(cè)控,具有現(xiàn)場(chǎng)安裝簡(jiǎn)單、