標(biāo)題: 單片機(jī)溫控風(fēng)扇設(shè)計(jì)論文 [打印本頁(yè)]
作者: IT小老鼠 時(shí)間: 2017-11-30 14:50
標(biāo)題: 單片機(jī)溫控風(fēng)扇設(shè)計(jì)論文
1 系統(tǒng)概述
1.1 STC89C52單片機(jī)簡(jiǎn)介
STC89C52是美國(guó)ATMEL公司生產(chǎn)的低電壓、高性能CMOS8位單片機(jī),片內(nèi)4bytes的可反復(fù)擦寫(xiě)的只讀程序存儲(chǔ)器(PEROM)和128bytes的隨機(jī)存取數(shù)據(jù)存儲(chǔ)器(RAM),器件采用ATMEL公司的高密度、非易失性存儲(chǔ)技術(shù)生產(chǎn),兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng),片內(nèi)置用8位中央處理器(CPU)和Flash存儲(chǔ)單元,功能強(qiáng)大。STC89C52單片機(jī)可靈活應(yīng)用于各種控制領(lǐng)域。
STC89C52單片機(jī)提供以下標(biāo)準(zhǔn)功能:4K字節(jié)Flash閃速存儲(chǔ)器,128字節(jié)內(nèi)部RAM,32個(gè)I/O口線,兩個(gè)16位定時(shí)、計(jì)數(shù)器,一個(gè)5向量?jī)杉?jí)中斷結(jié)構(gòu),一個(gè)全雙工串行通信口,片內(nèi)振蕩器及時(shí)鐘電路。同時(shí),STC89C52單片機(jī)可降至0Hz的靜態(tài)邏輯操作,并支持兩種軟件可選的節(jié)電工作模式?臻e方式停止CPU的工作,但允許RAM,定時(shí)、計(jì)數(shù)器,串行通行口及中斷系統(tǒng)繼續(xù)工作。掉電方式保存RAM中的內(nèi)容,但振蕩器停止工作并禁止其它所有部件工作直到下一個(gè)硬件復(fù)位。
1. 2 本設(shè)計(jì)任務(wù)和主要內(nèi)容
本文以STC89C52單片機(jī)為核心,通過(guò)數(shù)字溫度傳感器對(duì)外界環(huán)境溫度進(jìn)行數(shù)據(jù)采集,從而建立一個(gè)控制系統(tǒng),使電風(fēng)扇隨溫度的變化而自動(dòng)調(diào)節(jié)檔位,實(shí)現(xiàn)“溫度高、風(fēng)力大、溫度低、風(fēng)力弱”的性能。另外,通過(guò)紅外發(fā)射和接收裝置及按鍵實(shí)現(xiàn)各種功能的啟動(dòng)與關(guān)閉,并且可對(duì)各種功能實(shí)現(xiàn)遙控,用戶可以在一定范圍內(nèi)設(shè)置電風(fēng)扇的最低工作溫度,當(dāng)溫度低于所設(shè)置溫度時(shí),電風(fēng)扇將自動(dòng)關(guān)閉,當(dāng)高于此溫度時(shí)電風(fēng)扇又將重新啟動(dòng)。
本設(shè)計(jì)主要內(nèi)容如下:
(1)風(fēng)速設(shè)為從低到高共2個(gè)檔位,可由用戶通過(guò)鍵盤(pán)設(shè)定。
(2)每當(dāng)溫度低于下限值時(shí),則電風(fēng)扇風(fēng)速關(guān)閉。
(3)每當(dāng)溫度在下限和上限之間時(shí),則電風(fēng)扇轉(zhuǎn)速緩慢。
(4))每當(dāng)溫度高于上限值時(shí),則電風(fēng)扇風(fēng)速全速運(yùn)轉(zhuǎn)。
2 方案論證
本系統(tǒng)實(shí)現(xiàn)風(fēng)扇的溫度控制,需要有較高的溫度變化分辨率和穩(wěn)定可靠的換檔停機(jī)控制部件。
2.1 溫度傳感器的選用
溫度傳感器可由以下幾種方案可供選擇:
方案一:選用熱敏電阻作為感測(cè)溫度的核心元件,通過(guò)運(yùn)算放大器放大由于溫度變化引起熱敏電阻電阻的變化、進(jìn)而導(dǎo)至的輸出電壓變化的微弱電壓變化信號(hào),再用AD轉(zhuǎn)換芯片ADC0809將模擬信號(hào)轉(zhuǎn)化為數(shù)字信號(hào)輸入單片機(jī)處理。
方案二:采用熱電偶作為感測(cè)溫度的核心元件,配合橋式電路,運(yùn)算放大電路和AD轉(zhuǎn)換電路,將溫度變化信號(hào)送入單片機(jī)處理。
方案三:采用數(shù)字式集成溫度傳感器DS18B20作為感測(cè)溫度的核心元件,直接輸出數(shù)字溫度信號(hào)供單片機(jī)處理。
對(duì)于方案一,采用熱敏電阻有價(jià)格便宜、元件易購(gòu)的優(yōu)點(diǎn),但熱敏電阻對(duì)溫度的細(xì)微變化不敏感,在信號(hào)采集、放大、轉(zhuǎn)換過(guò)程中還會(huì)產(chǎn)生失真和誤差,并且由于熱敏電阻的R-T關(guān)系的非線性,其本身電阻對(duì)溫度的變化存在較大誤差,雖然可以通過(guò)一定電路予以糾正,但不僅將使電路復(fù)雜穩(wěn)定性降低,而且在人體所處溫度環(huán)境溫度變化中難以檢測(cè)到小的溫度變化。故該方案不適合本系統(tǒng)。
對(duì)于方案二,采用熱電偶和橋式測(cè)量電路相對(duì)于熱敏電阻其對(duì)溫度的敏感性和器件的非線性誤差都有較大提高,其測(cè)溫范圍也非常寬,從-50攝氏度到1600攝氏度均可測(cè)量。但是依然存在電路復(fù)雜,對(duì)溫度敏感性達(dá)不到本系統(tǒng)要求的標(biāo)準(zhǔn),故不采用該方案。
對(duì)于方案三,由于數(shù)字式集成溫度傳感器DS18B20的高度集成化,大大降低了外接放大轉(zhuǎn)換等電路的誤差因素,溫度誤差很小,并且由于其感測(cè)溫度的原理與上述兩種方案的原理有著本質(zhì)的不同,使得其溫度分辨力極高。溫度值在器件內(nèi)部轉(zhuǎn)換成數(shù)字量直接輸出,簡(jiǎn)化了系統(tǒng)程序設(shè)計(jì),又由于該傳感器采用先進(jìn)的單總線技術(shù)(1-WRIE),與單片機(jī)的接口變的非常簡(jiǎn)潔,抗干擾能力強(qiáng)。關(guān)于DS18B20的詳細(xì)參數(shù)參看下面“硬件設(shè)計(jì)”中的器件介紹。
2.2 控制核心的選擇
方案一:采用電壓比較電路作為控制部件。溫度傳感器采用熱敏電阻或熱電偶等,溫度信號(hào)轉(zhuǎn)為電信號(hào)并放大,由集成運(yùn)放組成的比較電路判決控制風(fēng)扇轉(zhuǎn)速,當(dāng)高于或低于某值時(shí)將風(fēng)扇切換到相應(yīng)檔位。
方案二:采用單片機(jī)作為控制核心。以軟件編程的方法進(jìn)行溫度判斷,并在端口輸出控制信號(hào)。
對(duì)于方案一,采用電壓比較電路具有電路簡(jiǎn)單、易于實(shí)現(xiàn),以及無(wú)需編寫(xiě)軟件程序的特點(diǎn),但控制方式過(guò)于單一,不能自由設(shè)置上下限動(dòng)作溫度,無(wú)法滿足不同用戶以及不同環(huán)境下的多種動(dòng)作溫度要求,故不在本系統(tǒng)中采用。
對(duì)于方案二,以單片機(jī)作為控制器,通過(guò)編寫(xiě)程序不但能將傳感器感測(cè)到的溫度通過(guò)顯示電路顯示出來(lái),而且用戶能通過(guò)鍵盤(pán)接口,自由設(shè)置上下限動(dòng)作溫度值,滿足全方位的需求。并且通過(guò)程序判斷溫度具有極高的精準(zhǔn)度,能精確把握環(huán)境溫度的微小變化。故本系統(tǒng)采用方案二。
2.3顯示電路
方案一:采用五位共陽(yáng)數(shù)碼管顯示溫度,動(dòng)態(tài)掃描顯示方式。
方案二:采用液晶顯示屏LCD顯示溫度
對(duì)于方案一,該方案成本低廉,顯示溫度明確醒目,在夜間也能看見(jiàn),功耗極低,顯示驅(qū)動(dòng)程序的編寫(xiě)也相對(duì)簡(jiǎn)單,這種顯示方式得到廣泛應(yīng)用。不足的地方是掃描顯示方式是使五個(gè)LED逐個(gè)點(diǎn)亮,因此會(huì)有閃爍,但是人眼的視覺(jué)暫留時(shí)間為20MS,當(dāng)數(shù)碼管掃描周期小于這個(gè)時(shí)間時(shí)人眼將感覺(jué)不到閃爍,因此可以通過(guò)增大掃描頻率來(lái)消除閃爍感。
對(duì)于方案二,液晶體顯示屏具有顯示字符優(yōu)美,不但能顯示數(shù)字還能顯示字符甚至圖形的優(yōu)點(diǎn),這是LED數(shù)碼管無(wú)法比擬的。但是液晶顯示模塊價(jià)格昂貴,驅(qū)動(dòng)程序復(fù)雜,從簡(jiǎn)單實(shí)用的原則考慮,本系統(tǒng)采用方案一。
2.4調(diào)速方式
方案一:采用變壓器調(diào)節(jié)方式,運(yùn)用電磁感應(yīng)原理將220V電壓通過(guò)線圈降壓到不同的電壓,控制風(fēng)扇電機(jī)接到不同電壓值的線圈上可控制電機(jī)的轉(zhuǎn)速,從而控制風(fēng)扇風(fēng)力大小。
方案二:采用晶閘管構(gòu)成無(wú)級(jí)調(diào)速電路。
對(duì)于方案一,由于采用變壓器改變電壓調(diào)節(jié),有風(fēng)速級(jí)別限制,不能適應(yīng)人性化要求。且在變壓過(guò)程中會(huì)有損耗發(fā)熱,效率不高,發(fā)熱有不安全因素。
對(duì)于方案二,以電位器控制晶閘管的導(dǎo)通角大小,可實(shí)現(xiàn)由最大風(fēng)速到關(guān)閉的無(wú)級(jí)別調(diào)速,可將風(fēng)力調(diào)節(jié)在關(guān)閉無(wú)風(fēng)到最大風(fēng)之間的任意風(fēng)力,實(shí)現(xiàn)“自由風(fēng)”。且在調(diào)速環(huán)節(jié)中基本無(wú)電力損耗。故本系統(tǒng)采用方案二。
2.5控制執(zhí)行部件
方案一:采用數(shù)模轉(zhuǎn)換芯片AD0832控制,由單片機(jī)根據(jù)當(dāng)前溫度值送出相應(yīng)數(shù)字量到AD0832,由AD0832產(chǎn)生模擬信號(hào)控制晶閘管的導(dǎo)通角,從而配合無(wú)級(jí)調(diào)速電路實(shí)現(xiàn)溫控時(shí)的自動(dòng)無(wú)級(jí)風(fēng)力調(diào)節(jié)。
方案二:采用繼電器,繼電器的接有控制晶閘管導(dǎo)通角的電阻的接入電路與否由單片機(jī)控制,根據(jù)當(dāng)前溫度值在相應(yīng)管腳送出高/低電平,決定某個(gè)繼電器的導(dǎo)通角控制電阻是否接入電路。(詳見(jiàn)4.2.4)
對(duì)于方案一,該方案能夠?qū)崿F(xiàn)在風(fēng)扇處于溫控狀態(tài)時(shí)也能無(wú)級(jí)調(diào)速,但是D/A轉(zhuǎn)換芯片價(jià)格較高,與其溫控狀態(tài)下無(wú)級(jí)調(diào)速功能相比性價(jià)比不高。
對(duì)于方案二,雖然在溫控狀態(tài)下只能實(shí)現(xiàn)弱/大風(fēng)兩級(jí)調(diào)速,但采用繼電器價(jià)格便宜,控制可靠,且出于在溫控狀態(tài)時(shí)無(wú)級(jí)調(diào)速并不是特別需要的功能,綜合考慮采用方案二。
3 系統(tǒng)原理
3.1 系統(tǒng)總體設(shè)計(jì)
|
| file:///C:/Users/17361/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png |
取n1=875r/min。則可得出五個(gè)檔位的轉(zhuǎn)速值:
n1=875r/min,n2=980r/min,n3=1063r/min,n4=1150 r/min,n5=1250r/min
又由于負(fù)載上電壓的有效值
u0=u1 (2)
式(2)中,u1為輸入交流電壓的有效值,α為控制角。解得:
(3)
式中:P 為負(fù)載得到的功率(kW); n 為給定時(shí)間內(nèi)可控硅導(dǎo)通的正弦波個(gè)數(shù);N 為給定時(shí)間內(nèi)交流正弦波的總個(gè)數(shù); U為可控硅在一個(gè)電源周期全導(dǎo)通時(shí)所對(duì)應(yīng)的電壓有效值(V); I 為可控硅在一個(gè)電源周期全導(dǎo)通時(shí)所對(duì)應(yīng)的電流有效值(A)。由式(3) 可知,當(dāng)U , I ,N 為定值時(shí), 只要改變n 值的大小即可控制功率的輸出,從而達(dá)到調(diào)
節(jié)電機(jī)轉(zhuǎn)速的目的。圖9 電機(jī)控制模塊中斷響應(yīng)流程圖
結(jié) 束 語(yǔ)
本系統(tǒng)以STC89C52單片機(jī)為核心,單片機(jī)主要完成對(duì)外界環(huán)境溫度信號(hào)的采集、處理、顯示等功能;用Altium Designer 6軟件繪制電路原理圖和PCB電路印刷板圖,由Protues軟件進(jìn)行訪真測(cè)試,利用MCS-51 C語(yǔ)言編制。
運(yùn)行程序該系統(tǒng)的主要特點(diǎn)是:
(1)適用性強(qiáng),用戶只需對(duì)界面參數(shù)進(jìn)行設(shè)置并啟動(dòng)系統(tǒng)正常運(yùn)行便可滿足不同用戶對(duì)最適合溫度的要求,實(shí)現(xiàn)對(duì)最適溫度的實(shí)時(shí)監(jiān)控。
(2)隨時(shí)可以根據(jù)軟件編寫(xiě)新的功能加入產(chǎn)品。操作界面可擴(kuò)展性強(qiáng),只要稍加改變,即可增加其他按鍵的使用功能。
本系統(tǒng)溫度控制采用DS18B20數(shù)字溫度傳感器作為感溫元件。可控硅串接在電源與負(fù)載電風(fēng)扇,借改變定周期內(nèi)可控硅的導(dǎo)通與截止時(shí)間之比來(lái)實(shí)現(xiàn)調(diào)速功能,其設(shè)計(jì)完使用方便就,適應(yīng)人們睡辦公等不同場(chǎng)合的使用。
基于STC89C52單片機(jī)所設(shè)計(jì)與研制的電風(fēng)扇智能調(diào)速系統(tǒng),造價(jià)低且具有穩(wěn)定性高、性能優(yōu)越、節(jié)約電能等優(yōu)點(diǎn),在夜間無(wú)需定時(shí),同樣能給人們帶來(lái)更多的方便。
本設(shè)計(jì)在模擬檢測(cè)中運(yùn)行較好,但采樣據(jù)不太穩(wěn)定。功能上的缺憾是對(duì)于兩個(gè)檔之間的臨界溫度處理不好,并且檔位太少,還有待改進(jìn)。
參考文獻(xiàn)
[1] 曹巧媛.單片機(jī)原理及應(yīng)用.北京:電子工業(yè)出版社,2002.2
[2] 王倫.電風(fēng)扇原理與維修技術(shù)[M].北京:新時(shí)代出版社,1999
[3] 張毅剛.新編MCS-51單片機(jī)應(yīng)用設(shè)計(jì).哈爾濱工業(yè)大學(xué)出版社,2006,10
[4] 梁廷貴、王裕琛.可控硅觸發(fā)電路語(yǔ)音電路分冊(cè)[M].北京:科學(xué)技術(shù)文獻(xiàn)出版社,2003
附錄一
數(shù)字溫度傳感器模塊和顯示子模塊程序:
#include <reg52.h> //調(diào)用單片機(jī)頭文件
#define uchar unsigned char //無(wú)符號(hào)字符型 宏定義 變量范圍0~255
#define uint unsignedint //無(wú)符號(hào)整型 宏定義 變量范圍0~65535
#include "eeprom52.h"
//數(shù)碼管段選定義 0 1 2 3 4 5 6 7 8 9
uchar codesmg_du[]={0x28,0xee,0x42,0x52,0xe5,0xa8,0x41,0xe7,0x20,0xa0,
0x60,0x25,0x39,0x26,0x31,0x71,0xff}; //斷碼
//數(shù)碼管位選定義
uchar code smg_we[]={0xef,0xdf,0xbf,0x7f};
uchar dis_smg[8] = {0x28,0xee,0x32,0xa2,0xe4,0x92,0x82,0xf8};
uchar smg_i = 3; //顯示數(shù)碼管的個(gè)位數(shù)
sbit dq = P2^4; //18b20 IO口的定義
bit flag_lj_en; //按鍵連加使能
bit flag_lj_3_en; //按鍵連3次連加后使能 加的數(shù)就越大了
uchar key_time,key_value; //用做連加的中間變量
bit key_500ms ;
sbit pwm = P2^3;
uchar f_pwm_l ; //越小越暗
uint temperature ; //
bit flag_300ms ;
uchar menu_1; //菜單設(shè)計(jì)的變量
uint t_high = 300,t_low = 100; //溫度上下限報(bào)警值
/***********************1ms延時(shí)函數(shù)*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
/***********************小延時(shí)函數(shù)*****************************/
void delay_uint(uint q)
{
while(q--);
}
/***********************數(shù)碼顯示函數(shù)*****************************/
void display()
{
static uchar i;
i++;
if(i >= smg_i)
i = 0;
P1 = 0xff; //消隱
P3 = smg_we; //位選
P1 = dis_smg; //段選
}
/******************把數(shù)據(jù)保存到單片機(jī)內(nèi)部eepom中******************/
void write_eeprom()
{
SectorErase(0x2000);
byte_write(0x2000, t_high% 256);
byte_write(0x2001, t_high/ 256);
byte_write(0x2002, t_low% 256);
byte_write(0x2003, t_low/ 256);
byte_write(0x2055, a_a);
}
/******************把數(shù)據(jù)從單片機(jī)內(nèi)部eepom中讀出來(lái)*****************/
void read_eeprom()
{
t_high = byte_read(0x2001);
t_high <<= 8;
t_high |= byte_read(0x2000);
t_low = byte_read(0x2003);
t_low <<= 8;
t_low |= byte_read(0x2002);
a_a = byte_read(0x2055);
}
/**************開(kāi)機(jī)初始化保存的數(shù)據(jù)*****************/
void init_eeprom()
{
read_eeprom(); //先讀
if(a_a != 22) //新的單片機(jī)初始單片機(jī)內(nèi)問(wèn)eeprom
{
t_high = 320;
t_low = 280;
a_a = 22;
write_eeprom(); //保存數(shù)據(jù)
}
}
/***********************18b20初始化函數(shù)*****************************/
void init_18b20()
{
bit q;
dq = 1; //把總線拿高
delay_uint(1); //15us
dq = 0; //給復(fù)位脈沖
delay_uint(80); //750us
dq = 1; //把總線拿高 等待
delay_uint(10); //110us
q = dq; //讀取18b20初始化信號(hào)
delay_uint(20); //200us
dq = 1; //把總線拿高 釋放總線
}
/*************寫(xiě)18b20內(nèi)的數(shù)據(jù)***************/
void write_18b20(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{ //寫(xiě)數(shù)據(jù)是低位開(kāi)始
dq = 0; //把總線拿低寫(xiě)時(shí)間隙開(kāi)始
dq = dat & 0x01; //向18b20總線寫(xiě)數(shù)據(jù)了
delay_uint(5); // 60us
dq = 1; //釋放總線
dat >>= 1;
}
}
/*************讀取18b20內(nèi)的數(shù)據(jù)***************/
uchar read_18b20()
{
uchar i,value;
for(i=0;i<8;i++)
{
dq = 0; //把總線拿低讀時(shí)間隙開(kāi)始
value >>= 1; //讀數(shù)據(jù)是低位開(kāi)始
dq = 1; //釋放總線
if(dq == 1) //開(kāi)始讀寫(xiě)數(shù)據(jù)
value |= 0x80;
delay_uint(5); //60us 讀一個(gè)時(shí)間隙最少要保持60us的時(shí)間
}
return value; //返回?cái)?shù)據(jù)
}
/*************讀取溫度的值 讀出來(lái)的是小數(shù)***************/
uint read_temp()
{
uint value;
uchar low; //在讀取溫度的時(shí)候如果中斷的太頻繁了,就應(yīng)該把中斷給關(guān)了,否則會(huì)影響到18b20的時(shí)序
init_18b20(); //初始化18b20
EA = 0;
write_18b20(0xcc); //跳過(guò)64位ROM
write_18b20(0x44); //啟動(dòng)一次溫度轉(zhuǎn)換命令
EA = 1;
delay_uint(50); //500us
init_18b20(); //初始化18b20
EA = 0;
write_18b20(0xcc); //跳過(guò)64位ROM
write_18b20(0xbe); //發(fā)出讀取暫存器命令
low = read_18b20(); //讀溫度低字節(jié)
value =read_18b20(); //讀溫度高字節(jié)
EA = 1;
value <<= 8; //把溫度的高位左移8位
value |= low; //把讀出的溫度低位放到value的低八位中
value *= 0.625; //轉(zhuǎn)換到溫度值 小數(shù)
return value; //返回讀出的溫度 帶小數(shù)
}
/*************定時(shí)器0初始化程序***************/
void time_init()
{
EA = 1; //開(kāi)總中斷
TMOD = 0X11; //定時(shí)器0、定時(shí)器1工作方式1
ET0 = 1; //開(kāi)定時(shí)器0中斷
TR0 = 1; //允許定時(shí)器0定時(shí)
ET1 = 1; //開(kāi)定時(shí)器0中斷
TR1 = 0; //允許定時(shí)器0定時(shí)
}
/********************獨(dú)立按鍵程序*****************/
uchar key_can; //按鍵值
void key() //獨(dú)立按鍵程序
{
static uchar key_new;
key_can = 20; //按鍵值還原
P2 |= 0x07;
if((P2 & 0x07) !=0x07) //按鍵按下
{
if(key_500ms == 1) //連加
{
key_500ms = 0;
key_new = 1;
}
delay_1ms(1); //按鍵消抖動(dòng)
if(((P2 & 0x07) != 0x07) && (key_new == 1))
{ //確認(rèn)是按鍵按下
key_new = 0;
switch(P2 & 0x07)
{
case 0x06: key_can = 3; break; //得到k2鍵值
case 0x05: key_can = 2; break; //得到k3鍵值
case 0x03: key_can = 1; break; //得到k4鍵值
}
flag_lj_en = 1; //連加使能
}
}
else
{
if(key_new == 0)
{
key_new = 1;
write_eeprom(); //保存數(shù)據(jù)
flag_lj_en = 0; //關(guān)閉連加使能
flag_lj_3_en = 0; //關(guān)閉3秒后使能
key_value = 0; //清零
key_time = 0;
key_500ms = 0;
}
}
}
/****************按鍵處理數(shù)碼管顯示函數(shù)***************/
void key_with()
{
if(key_can == 1) //設(shè)置鍵
{
f_pwm_l = 30;
menu_1 ++;
if(menu_1 >= 3)
{
menu_1 = 0;
smg_i = 3; //數(shù)碼管顯示3位
}
}
if(menu_1 == 1) //設(shè)置高溫報(bào)警
{
smg_i = 4; //數(shù)碼管顯示4位
if(key_can == 2)
{
if(flag_lj_3_en == 0)
t_high ++ ; //按鍵按下未松開(kāi)自動(dòng)加三次
else
t_high += 10; //按鍵按下未松開(kāi)自動(dòng)加三次之后每次自動(dòng)加10
if(t_high > 990)
t_high = 990;
}
if(key_can == 3)
{
if(flag_lj_3_en == 0)
t_high -- ; //按鍵按下未松開(kāi)自動(dòng)減三次
else
t_high -= 10; //按鍵按下未松開(kāi)自動(dòng)減三次之后每次自動(dòng)減10
if(t_high <= t_low)
t_high = t_low + 1;
}
dis_smg[0] = smg_du[t_high % 10]; //取小數(shù)顯示
dis_smg[1] = smg_du[t_high / 10 % 10] & 0xdf; //取個(gè)位顯示
dis_smg[2] = smg_du[t_high / 100 % 10] ; //取十位顯示
dis_smg[3] = 0x64; //H
}
if(menu_1 == 2) //設(shè)置低溫報(bào)警
{
smg_i = 4; //數(shù)碼管顯示4位
if(key_can == 2)
{
if(flag_lj_3_en == 0)
t_low ++ ; //按鍵按下未松開(kāi)自動(dòng)加三次
else
t_low += 10; //按鍵按下未松開(kāi)自動(dòng)加三次之后每次自動(dòng)加10
if(t_low >= t_high)
t_low = t_high - 1;
}
if(key_can == 3)
{
if(flag_lj_3_en == 0)
t_low -- ; //按鍵按下未松開(kāi)自動(dòng)減三次
else
t_low -= 10; //按鍵按下未松開(kāi)自動(dòng)加三次之后每次自動(dòng)加10
if(t_low <= 10)
t_low = 10;
}
dis_smg[0] = smg_du[t_low % 10]; //取小數(shù)顯示
dis_smg[1] = smg_du[t_low / 10 % 10] & 0xdf; //取個(gè)位顯示
dis_smg[2] = smg_du[t_low / 100 % 10] ; //取十位顯示
dis_smg[3] = 0x3D; //L
}
}
/****************風(fēng)扇控制函數(shù)***************/
void fengshan_kz()
{
// static uchar value;
if(temperature >=t_high) //風(fēng)扇全開(kāi)
{
TR1 = 1;
pwm = 0;
}
else if((temperature <t_high) && (temperature >=t_low)) //風(fēng)扇緩慢
{
f_pwm_l = 60;
TR1 = 1;
}
else if(temperature <t_low) //關(guān)閉風(fēng)扇
{
TR1 = 0;
pwm = 1;
}
}
/****************主函數(shù)***************/
void main()
{
time_init(); //初始化定時(shí)器
temperature =read_temp(); //先讀出溫度的值
init_eeprom(); //開(kāi)始初始化保存的數(shù)據(jù)
delay_1ms(650);
temperature =read_temp(); //先讀出溫度的值
dis_smg[0] =smg_du[temperature % 10]; //取溫度的小數(shù)顯示
dis_smg[1] =smg_du[temperature / 10 % 10] & 0xdf; //取溫度的個(gè)位顯示
dis_smg[2] =smg_du[temperature / 100 % 10] ; //取溫度的十位顯示
f_pwm_l = 50;
while(1)
{
key(); //按鍵程序
if(key_can < 10)
{
key_with(); //設(shè)置報(bào)警溫度
}
if(flag_300ms == 1) //300ms 處理一次溫度程序
{
flag_300ms = 0;
temperature =read_temp(); //先讀出溫度的值
if(menu_1 == 0)
{
smg_i = 3;
dis_smg[0] = smg_du[temperature % 10]; //取溫度的小數(shù)顯示
dis_smg[1] = smg_du[temperature / 10 % 10] & 0xdf; //取溫度的個(gè)位顯示
dis_smg[2] = smg_du[temperature / 100 % 10] ; //取溫度的十位顯示
}
}
fengshan_kz(); //風(fēng)扇控制函數(shù)
}
}
/*************定時(shí)器0中斷服務(wù)程序***************/
void time0_int() interrupt 1
{
static uchar value; //定時(shí)2ms中斷一次
TH0 = 0xf8;
TL0 = 0x30; //2ms
display(); //數(shù)碼管顯示函數(shù)
value++;
if(value >= 150)
{
value = 0;
flag_300ms = 1;
}
if(flag_lj_en == 1) //按下按鍵使能
{
key_time ++;
if(key_time >= 250) //500ms
{
key_time = 0;
key_500ms = 1; //500ms
key_value ++;
if(key_value > 3)
{
key_value = 10;
flag_lj_3_en = 1; //3次后1.5秒連加大些
}
}
}
}
/*******************定時(shí)器1用做單片機(jī)模擬PWM 調(diào)節(jié)***********************/
void Timer1() interrupt 3 //調(diào)用定時(shí)器1
{
static uchar value_l;
TH1=0xfe; // 定時(shí)10ms中斷一次
TL1=0x0c; //500us
if(pwm==1)
{
value_l+=3;
if(value_l > f_pwm_l) //高電平
{
value_l=0;
if(f_pwm_l != 0)
pwm=0;
}
}
else
{
value_l+=3;
if(value_l > 100 -f_pwm_l) //低電平
{
value_l=0;
pwm=1;
}
}
}
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |