標(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)部RAM32個(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/minn5=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