1 系統(tǒng)概述
1.1 STC89C52單片機(jī)簡介
STC89C52是美國ATMEL公司生產(chǎn)的低電壓、高性能CMOS8位單片機(jī),片內(nèi)4bytes的可反復(fù)擦寫的只讀程序存儲(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向量兩級中斷結(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ī)為核心,通過數(shù)字溫度傳感器對外界環(huán)境溫度進(jìn)行數(shù)據(jù)采集,從而建立一個(gè)控制系統(tǒng),使電風(fēng)扇隨溫度的變化而自動(dòng)調(diào)節(jié)檔位,實(shí)現(xiàn)“溫度高、風(fēng)力大、溫度低、風(fēng)力弱”的性能。另外,通過紅外發(fā)射和接收裝置及按鍵實(shí)現(xiàn)各種功能的啟動(dòng)與關(guān)閉,并且可對各種功能實(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è)檔位,可由用戶通過鍵盤設(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 溫度傳感器的選用
溫度傳感器可由以下幾種方案可供選擇:
方案一:選用熱敏電阻作為感測溫度的核心元件,通過運(yùn)算放大器放大由于溫度變化引起熱敏電阻電阻的變化、進(jìn)而導(dǎo)至的輸出電壓變化的微弱電壓變化信號,再用AD轉(zhuǎn)換芯片ADC0809將模擬信號轉(zhuǎn)化為數(shù)字信號輸入單片機(jī)處理。
方案二:采用熱電偶作為感測溫度的核心元件,配合橋式電路,運(yùn)算放大電路和AD轉(zhuǎn)換電路,將溫度變化信號送入單片機(jī)處理。
方案三:采用數(shù)字式集成溫度傳感器DS18B20作為感測溫度的核心元件,直接輸出數(shù)字溫度信號供單片機(jī)處理。
對于方案一,采用熱敏電阻有價(jià)格便宜、元件易購的優(yōu)點(diǎn),但熱敏電阻對溫度的細(xì)微變化不敏感,在信號采集、放大、轉(zhuǎn)換過程中還會(huì)產(chǎn)生失真和誤差,并且由于熱敏電阻的R-T關(guān)系的非線性,其本身電阻對溫度的變化存在較大誤差,雖然可以通過一定電路予以糾正,但不僅將使電路復(fù)雜穩(wěn)定性降低,而且在人體所處溫度環(huán)境溫度變化中難以檢測到小的溫度變化。故該方案不適合本系統(tǒng)。
對于方案二,采用熱電偶和橋式測量電路相對于熱敏電阻其對溫度的敏感性和器件的非線性誤差都有較大提高,其測溫范圍也非常寬,從-50攝氏度到1600攝氏度均可測量。但是依然存在電路復(fù)雜,對溫度敏感性達(dá)不到本系統(tǒng)要求的標(biāo)準(zhǔn),故不采用該方案。
對于方案三,由于數(shù)字式集成溫度傳感器DS18B20的高度集成化,大大降低了外接放大轉(zhuǎn)換等電路的誤差因素,溫度誤差很小,并且由于其感測溫度的原理與上述兩種方案的原理有著本質(zhì)的不同,使得其溫度分辨力極高。溫度值在器件內(nèi)部轉(zhuǎn)換成數(shù)字量直接輸出,簡化了系統(tǒng)程序設(shè)計(jì),又由于該傳感器采用先進(jìn)的單總線技術(shù)(1-WRIE),與單片機(jī)的接口變的非常簡潔,抗干擾能力強(qiáng)。關(guān)于DS18B20的詳細(xì)參數(shù)參看下面“硬件設(shè)計(jì)”中的器件介紹。
2.2 控制核心的選擇
方案一:采用電壓比較電路作為控制部件。溫度傳感器采用熱敏電阻或熱電偶等,溫度信號轉(zhuǎn)為電信號并放大,由集成運(yùn)放組成的比較電路判決控制風(fēng)扇轉(zhuǎn)速,當(dāng)高于或低于某值時(shí)將風(fēng)扇切換到相應(yīng)檔位。
方案二:采用單片機(jī)作為控制核心。以軟件編程的方法進(jìn)行溫度判斷,并在端口輸出控制信號。
對于方案一,采用電壓比較電路具有電路簡單、易于實(shí)現(xiàn),以及無需編寫軟件程序的特點(diǎn),但控制方式過于單一,不能自由設(shè)置上下限動(dòng)作溫度,無法滿足不同用戶以及不同環(huán)境下的多種動(dòng)作溫度要求,故不在本系統(tǒng)中采用。
對于方案二,以單片機(jī)作為控制器,通過編寫程序不但能將傳感器感測到的溫度通過顯示電路顯示出來,而且用戶能通過鍵盤接口,自由設(shè)置上下限動(dòng)作溫度值,滿足全方位的需求。并且通過程序判斷溫度具有極高的精準(zhǔn)度,能精確把握環(huán)境溫度的微小變化。故本系統(tǒng)采用方案二。
2.3顯示電路
方案一:采用五位共陽數(shù)碼管顯示溫度,動(dòng)態(tài)掃描顯示方式。
方案二:采用液晶顯示屏LCD顯示溫度
對于方案一,該方案成本低廉,顯示溫度明確醒目,在夜間也能看見,功耗極低,顯示驅(qū)動(dòng)程序的編寫也相對簡單,這種顯示方式得到廣泛應(yīng)用。不足的地方是掃描顯示方式是使五個(gè)LED逐個(gè)點(diǎn)亮,因此會(huì)有閃爍,但是人眼的視覺暫留時(shí)間為20MS,當(dāng)數(shù)碼管掃描周期小于這個(gè)時(shí)間時(shí)人眼將感覺不到閃爍,因此可以通過增大掃描頻率來消除閃爍感。
對于方案二,液晶體顯示屏具有顯示字符優(yōu)美,不但能顯示數(shù)字還能顯示字符甚至圖形的優(yōu)點(diǎn),這是LED數(shù)碼管無法比擬的。但是液晶顯示模塊價(jià)格昂貴,驅(qū)動(dòng)程序復(fù)雜,從簡單實(shí)用的原則考慮,本系統(tǒng)采用方案一。
2.4調(diào)速方式
方案一:采用變壓器調(diào)節(jié)方式,運(yùn)用電磁感應(yīng)原理將220V電壓通過線圈降壓到不同的電壓,控制風(fēng)扇電機(jī)接到不同電壓值的線圈上可控制電機(jī)的轉(zhuǎn)速,從而控制風(fēng)扇風(fēng)力大小。
方案二:采用晶閘管構(gòu)成無級調(diào)速電路。
對于方案一,由于采用變壓器改變電壓調(diào)節(jié),有風(fēng)速級別限制,不能適應(yīng)人性化要求。且在變壓過程中會(huì)有損耗發(fā)熱,效率不高,發(fā)熱有不安全因素。
對于方案二,以電位器控制晶閘管的導(dǎo)通角大小,可實(shí)現(xiàn)由最大風(fēng)速到關(guān)閉的無級別調(diào)速,可將風(fēng)力調(diào)節(jié)在關(guān)閉無風(fēng)到最大風(fēng)之間的任意風(fēng)力,實(shí)現(xiàn)“自由風(fēng)”。且在調(diào)速環(huán)節(jié)中基本無電力損耗。故本系統(tǒng)采用方案二。
2.5控制執(zhí)行部件
方案一:采用數(shù)模轉(zhuǎn)換芯片AD0832控制,由單片機(jī)根據(jù)當(dāng)前溫度值送出相應(yīng)數(shù)字量到AD0832,由AD0832產(chǎn)生模擬信號控制晶閘管的導(dǎo)通角,從而配合無級調(diào)速電路實(shí)現(xiàn)溫控時(shí)的自動(dòng)無級風(fēng)力調(diào)節(jié)。
方案二:采用繼電器,繼電器的接有控制晶閘管導(dǎo)通角的電阻的接入電路與否由單片機(jī)控制,根據(jù)當(dāng)前溫度值在相應(yīng)管腳送出高/低電平,決定某個(gè)繼電器的導(dǎo)通角控制電阻是否接入電路。(詳見4.2.4)
對于方案一,該方案能夠?qū)崿F(xiàn)在風(fēng)扇處于溫控狀態(tài)時(shí)也能無級調(diào)速,但是D/A轉(zhuǎn)換芯片價(jià)格較高,與其溫控狀態(tài)下無級調(diào)速功能相比性價(jià)比不高。
對于方案二,雖然在溫控狀態(tài)下只能實(shí)現(xiàn)弱/大風(fēng)兩級調(diào)速,但采用繼電器價(jià)格便宜,控制可靠,且出于在溫控狀態(tài)時(shí)無級調(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í)所對應(yīng)的電壓有效值(V); I 為可控硅在一個(gè)電源周期全導(dǎo)通時(shí)所對應(yīng)的電流有效值(A)。由式(3) 可知,當(dāng)U , I ,N 為定值時(shí), 只要改變n 值的大小即可控制功率的輸出,從而達(dá)到調(diào)
節(jié)電機(jī)轉(zhuǎn)速的目的。圖9 電機(jī)控制模塊中斷響應(yīng)流程圖
結(jié) 束 語 本系統(tǒng)以STC89C52單片機(jī)為核心,單片機(jī)主要完成對外界環(huán)境溫度信號的采集、處理、顯示等功能;用Altium Designer 6軟件繪制電路原理圖和PCB電路印刷板圖,由Protues軟件進(jìn)行訪真測試,利用MCS-51 C語言編制。
運(yùn)行程序該系統(tǒng)的主要特點(diǎn)是:
(1)適用性強(qiáng),用戶只需對界面參數(shù)進(jìn)行設(shè)置并啟動(dòng)系統(tǒng)正常運(yùn)行便可滿足不同用戶對最適合溫度的要求,實(shí)現(xiàn)對最適溫度的實(shí)時(shí)監(jiān)控。
(2)隨時(shí)可以根據(jù)軟件編寫新的功能加入產(chǎn)品。操作界面可擴(kuò)展性強(qiáng),只要稍加改變,即可增加其他按鍵的使用功能。
本系統(tǒng)溫度控制采用DS18B20數(shù)字溫度傳感器作為感溫元件?煽毓璐釉陔娫磁c負(fù)載電風(fēng)扇,借改變定周期內(nèi)可控硅的導(dǎo)通與截止時(shí)間之比來實(shí)現(xiàn)調(diào)速功能,其設(shè)計(jì)完使用方便就,適應(yīng)人們睡辦公等不同場合的使用。
基于STC89C52單片機(jī)所設(shè)計(jì)與研制的電風(fēng)扇智能調(diào)速系統(tǒng),造價(jià)低且具有穩(wěn)定性高、性能優(yōu)越、節(jié)約電能等優(yōu)點(diǎn),在夜間無需定時(shí),同樣能給人們帶來更多的方便。
本設(shè)計(jì)在模擬檢測中運(yùn)行較好,但采樣據(jù)不太穩(wěn)定。功能上的缺憾是對于兩個(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ā)電路語音電路分冊[M].北京:科學(xué)技術(shù)文獻(xiàn)出版社,2003
附錄一
數(shù)字溫度傳感器模塊和顯示子模塊程序:
#include <reg52.h> //調(diào)用單片機(jī)頭文件
#define uchar unsigned char //無符號字符型 宏定義 變量范圍0~255 #define uint unsignedint //無符號整型 宏定義 變量范圍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中讀出來*****************/
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);
}
/**************開機(jī)初始化保存的數(shù)據(jù)*****************/
void init_eeprom()
{
read_eeprom(); //先讀
if(a_a != 22) //新的單片機(jī)初始單片機(jī)內(nèi)問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初始化信號
delay_uint(20); //200us
dq = 1; //把總線拿高 釋放總線
}
/*************寫18b20內(nèi)的數(shù)據(jù)***************/
void write_18b20(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{ //寫數(shù)據(jù)是低位開始
dq = 0; //把總線拿低寫時(shí)間隙開始
dq = dat & 0x01; //向18b20總線寫數(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í)間隙開始
value >>= 1; //讀數(shù)據(jù)是低位開始
dq = 1; //釋放總線
if(dq == 1) //開始讀寫數(shù)據(jù)
value |= 0x80;
delay_uint(5); //60us 讀一個(gè)時(shí)間隙最少要保持60us的時(shí)間
}
return value; //返回?cái)?shù)據(jù)
}
/*************讀取溫度的值 讀出來的是小數(shù)***************/
uint read_temp()
{
uint value;
uchar low; //在讀取溫度的時(shí)候如果中斷的太頻繁了,就應(yīng)該把中斷給關(guān)了,否則會(huì)影響到18b20的時(shí)序
init_18b20(); //初始化18b20
EA = 0;
write_18b20(0xcc); //跳過64位ROM
write_18b20(0x44); //啟動(dòng)一次溫度轉(zhuǎn)換命令
EA = 1;
delay_uint(50); //500us
init_18b20(); //初始化18b20
EA = 0;
write_18b20(0xcc); //跳過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; //開總中斷
TMOD = 0X11; //定時(shí)器0、定時(shí)器1工作方式1
ET0 = 1; //開定時(shí)器0中斷 TR0 = 1; //允許定時(shí)器0定時(shí)
ET1 = 1; //開定時(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 ++ ; //按鍵按下未松開自動(dòng)加三次
else
t_high += 10; //按鍵按下未松開自動(dòng)加三次之后每次自動(dòng)加10
if(t_high > 990)
t_high = 990;
}
if(key_can == 3)
{
if(flag_lj_3_en == 0)
t_high -- ; //按鍵按下未松開自動(dòng)減三次
else
t_high -= 10; //按鍵按下未松開自動(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 ++ ; //按鍵按下未松開自動(dòng)加三次
else
t_low += 10; //按鍵按下未松開自動(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 -- ; //按鍵按下未松開自動(dòng)減三次
else
t_low -= 10; //按鍵按下未松開自動(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)扇全開 {
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(); //開始初始化保存的數(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;
}
}
}
|