欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3947|回復: 0
打印 上一主題 下一主題
收起左側

單片機溫控風扇設計論文

[復制鏈接]
跳轉到指定樓層
樓主
ID:255686 發表于 2017-11-30 14:50 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
1  系統概述
1.1  STC89C52單片機簡介

STC89C52是美國ATMEL公司生產的低電壓、高性能CMOS8位單片機,片內4bytes的可反復擦寫的只讀程序存儲器(PEROM)和128bytes的隨機存取數據存儲器(RAM),器件采用ATMEL公司的高密度、非易失性存儲技術生產,兼容標準MCS-51指令系統,片內置用8位中央處理器(CPU)和Flash存儲單元,功能強大。STC89C52單片機可靈活應用于各種控制領域。

STC89C52單片機提供以下標準功能:4K字節Flash閃速存儲器,128字節內部RAM32I/O口線,兩個16位定時、計數器,一個5向量兩級中斷結構,一個全雙工串行通信口,片內振蕩器及時鐘電路。同時,STC89C52單片機可降至0Hz的靜態邏輯操作,并支持兩種軟件可選的節電工作模式。空閑方式停止CPU的工作,但允許RAM,定時、計數器,串行通行口及中斷系統繼續工作。掉電方式保存RAM中的內容,但振蕩器停止工作并禁止其它所有部件工作直到下一個硬件復位。

1. 2  本設計任務和主要內容
本文以STC89C52單片機為核心,通過數字溫度傳感器對外界環境溫度進行數據采集,從而建立一個控制系統,使電風扇隨溫度的變化而自動調節檔位,實現“溫度高、風力大、溫度低、風力弱”的性能。另外,通過紅外發射和接收裝置及按鍵實現各種功能的啟動與關閉,并且可對各種功能實現遙控,用戶可以在一定范圍內設置電風扇的最低工作溫度,當溫度低于所設置溫度時,電風扇將自動關閉,當高于此溫度時電風扇又將重新啟動。
本設計主要內容如下:
(1)風速設為從低到高共2個檔位,可由用戶通過鍵盤設定。
(2)每當溫度低于下限值時,則電風扇風速關閉。
(3)每當溫度在下限和上限之間時,則電風扇轉速緩慢。
(4))每當溫度高于上限值時,則電風扇風速全速運轉






2 方案論證
本系統實現風扇的溫度控制,需要有較高的溫度變化分辨率和穩定可靠的換檔停機控制部件。

2.1 溫度傳感器的選用
溫度傳感器可由以下幾種方案可供選擇:
方案一:選用熱敏電阻作為感測溫度的核心元件,通過運算放大器放大由于溫度變化引起熱敏電阻電阻的變化、進而導至的輸出電壓變化的微弱電壓變化信號,再用AD轉換芯片ADC0809將模擬信號轉化為數字信號輸入單片機處理。
方案二:采用熱電偶作為感測溫度的核心元件,配合橋式電路,運算放大電路和AD轉換電路,將溫度變化信號送入單片機處理。
方案三:采用數字式集成溫度傳感器DS18B20作為感測溫度的核心元件,直接輸出數字溫度信號供單片機處理。
對于方案一,采用熱敏電阻有價格便宜、元件易購的優點,但熱敏電阻對溫度的細微變化不敏感,在信號采集、放大、轉換過程中還會產生失真和誤差,并且由于熱敏電阻的R-T關系的非線性,其本身電阻對溫度的變化存在較大誤差,雖然可以通過一定電路予以糾正,但不僅將使電路復雜穩定性降低,而且在人體所處溫度環境溫度變化中難以檢測到小的溫度變化。故該方案不適合本系統。
對于方案二,采用熱電偶和橋式測量電路相對于熱敏電阻其對溫度的敏感性和器件的非線性誤差都有較大提高,其測溫范圍也非常寬,從-50攝氏度到1600攝氏度均可測量。但是依然存在電路復雜,對溫度敏感性達不到本系統要求的標準,故不采用該方案。
對于方案三,由于數字式集成溫度傳感器DS18B20的高度集成化,大大降低了外接放大轉換等電路的誤差因素,溫度誤差很小,并且由于其感測溫度的原理與上述兩種方案的原理有著本質的不同,使得其溫度分辨力極高。溫度值在器件內部轉換成數字量直接輸出,簡化了系統程序設計,又由于該傳感器采用先進的單總線技術(1-WRIE),與單片機的接口變的非常簡潔,抗干擾能力強。關于DS18B20的詳細參數參看下面“硬件設計”中的器件介紹。

2.2  控制核心的選擇
方案一:采用電壓比較電路作為控制部件。溫度傳感器采用熱敏電阻或熱電偶等,溫度信號轉為電信號并放大,由集成運放組成的比較電路判決控制風扇轉速,當高于或低于某值時將風扇切換到相應檔位。
方案二:采用單片機作為控制核心。以軟件編程的方法進行溫度判斷,并在端口輸出控制信號。
對于方案一,采用電壓比較電路具有電路簡單、易于實現,以及無需編寫軟件程序的特點,但控制方式過于單一,不能自由設置上下限動作溫度,無法滿足不同用戶以及不同環境下的多種動作溫度要求,故不在本系統中采用。
對于方案二,以單片機作為控制器,通過編寫程序不但能將傳感器感測到的溫度通過顯示電路顯示出來,而且用戶能通過鍵盤接口,自由設置上下限動作溫度值,滿足全方位的需求。并且通過程序判斷溫度具有極高的精準度,能精確把握環境溫度的微小變化。故本系統采用方案二。

2.3顯示電路
方案一:采用五位共陽數碼管顯示溫度,動態掃描顯示方式。
方案二:采用液晶顯示屏LCD顯示溫度
對于方案一,該方案成本低廉,顯示溫度明確醒目,在夜間也能看見,功耗極低,顯示驅動程序的編寫也相對簡單,這種顯示方式得到廣泛應用。不足的地方是掃描顯示方式是使五個LED逐個點亮,因此會有閃爍,但是人眼的視覺暫留時間為20MS,當數碼管掃描周期小于這個時間時人眼將感覺不到閃爍,因此可以通過增大掃描頻率來消除閃爍感。
對于方案二,液晶體顯示屏具有顯示字符優美,不但能顯示數字還能顯示字符甚至圖形的優點,這是LED數碼管無法比擬的。但是液晶顯示模塊價格昂貴,驅動程序復雜,從簡單實用的原則考慮,本系統采用方案一。

2.4調速方式
方案一:采用變壓器調節方式,運用電磁感應原理將220V電壓通過線圈降壓到不同的電壓,控制風扇電機接到不同電壓值的線圈上可控制電機的轉速,從而控制風扇風力大小。
方案二:采用晶閘管構成無級調速電路。
對于方案一,由于采用變壓器改變電壓調節,有風速級別限制,不能適應人性化要求。且在變壓過程中會有損耗發熱,效率不高,發熱有不安全因素。
對于方案二,以電位器控制晶閘管的導通角大小,可實現由最大風速到關閉的無級別調速,可將風力調節在關閉無風到最大風之間的任意風力,實現“自由風”。且在調速環節中基本無電力損耗。故本系統采用方案二。

2.5控制執行部件
方案一:采用數模轉換芯片AD0832控制,由單片機根據當前溫度值送出相應數字量到AD0832,由AD0832產生模擬信號控制晶閘管的導通角,從而配合無級調速電路實現溫控時的自動無級風力調節。
方案二:采用繼電器,繼電器的接有控制晶閘管導通角的電阻的接入電路與否由單片機控制,根據當前溫度值在相應管腳送出高/低電平,決定某個繼電器的導通角控制電阻是否接入電路。(詳見4.2.4
對于方案一,該方案能夠實現在風扇處于溫控狀態時也能無級調速,但是D/A轉換芯片價格較高,與其溫控狀態下無級調速功能相比性價比不高。
對于方案二,雖然在溫控狀態下只能實現弱/大風兩級調速,但采用繼電器價格便宜,控制可靠,且出于在溫控狀態時無級調速并不是特別需要的功能,綜合考慮采用方案二。



3 系統原理
3.1  系統總體設計


file:///C:/Users/17361/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png

n1=875r/min。則可得出五個檔位的轉速值:
n1=875r/minn2=980r/minn3=1063r/minn4=1150 r/minn5=1250r/min
又由于負載上電壓的有效值
u0=u1                                 2
式(2)中,u1為輸入交流電壓的有效值,α為控制角。解得:
                            (3)
式中:P 為負載得到的功率(kW; n 為給定時間內可控硅導通的正弦波個數;N 為給定時間內交流正弦波的總個數; U為可控硅在一個電源周期全導通時所對應的電壓有效值(V; I 為可控硅在一個電源周期全導通時所對應的電流有效值(A。由式(3) 可知,當U , I ,N 為定值時, 只要改變n 值的大小即可控制功率的輸出,從而達到調
節電機轉速的目的。圖9 電機控制模塊中斷響應流程圖







結 束 語
本系統以STC89C52單片機為核心,單片機主要完成對外界環境溫度信號的采集、處理、顯示等功能;用Altium Designer 6軟件繪制電路原理圖和PCB電路印刷板圖,由Protues軟件進行訪真測試,利用MCS-51 C語言編制。
運行程序該系統的主要特點是:
(1)適用性強,用戶只需對界面參數進行設置并啟動系統正常運行便可滿足不同用戶對最適合溫度的要求,實現對最適溫度的實時監控。
(2)隨時可以根據軟件編寫新的功能加入產品。操作界面可擴展性強,只要稍加改變,即可增加其他按鍵的使用功能。
本系統溫度控制采用DS18B20數字溫度傳感器作為感溫元件。可控硅串接在電源與負載電風扇,借改變定周期內可控硅的導通與截止時間之比來實現調速功能,其設計完使用方便就,適應人們睡辦公等不同場合的使用。
基于STC89C52單片機所設計與研制的電風扇智能調速系統,造價低且具有穩定性高、性能優越、節約電能等優點,在夜間無需定時,同樣能給人們帶來更多的方便。
本設計在模擬檢測中運行較好,但采樣據不太穩定。功能上的缺憾是對于兩個檔之間的臨界溫度處理不好,并且檔位太少,還有待改進。


















參考文獻
[1] 曹巧媛.單片機原理及應用.北京:電子工業出版社,2002.2
[2] 王倫.電風扇原理與維修技術[M].北京:新時代出版社,1999
[3] 張毅剛.新編MCS-51單片機應用設計.哈爾濱工業大學出版社,2006,10
[4] 梁廷貴、王裕琛.可控硅觸發電路語音電路分冊[M].北京:科學技術文獻出版社,2003

































附錄一

數字溫度傳感器模塊和顯示子模塊程序:
#include <reg52.h>             //調用單片機頭文件

#define uchar unsigned char //無符號字符型 宏定義   變量范圍0~255

#define uint  unsignedint    //無符號整型 宏定義 變量范圍0~65535

#include "eeprom52.h"

//數碼管段選定義     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};   //斷碼
//數碼管位選定義
uchar code smg_we[]={0xef,0xdf,0xbf,0x7f};
uchar dis_smg[8] = {0x28,0xee,0x32,0xa2,0xe4,0x92,0x82,0xf8};   
uchar smg_i = 3;    //顯示數碼管的個位數
sbit dq   = P2^4; //18b20 IO口的定義

bit flag_lj_en;        //按鍵連加使能
bit flag_lj_3_en;  //按鍵連3次連加后使能  加的數就越大了

uchar key_time,key_value;     //用做連加的中間變量

bit key_500ms  ;
sbit pwm = P2^3;  
uchar f_pwm_l ;     //越小越暗

uint temperature ;  //
bit flag_300ms ;
uchar menu_1;       //菜單設計的變量
uint t_high = 300,t_low = 100;     //溫度上下限報警值

/***********************1ms延時函數*****************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
     for(j=0;j<120;j++);
}

/***********************小延時函數*****************************/
void delay_uint(uint q)
{
while(q--);
}


/***********************數碼顯示函數*****************************/
void display()
{
static uchar i;   
i++;
if(i >= smg_i)
     i = 0;
P1 = 0xff;          //消隱
P3 = smg_we;            //位選

P1 = dis_smg;       //段選           


}

/******************把數據保存到單片機內部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);
}

/******************把數據從單片機內部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);
}

/**************開機初始化保存的數據*****************/
void init_eeprom()
{
read_eeprom();        //先讀
if(a_a != 22)     //新的單片機初始單片機內問eeprom
{
     t_high = 320;
     t_low  = 280;
     a_a = 22;
     write_eeprom();      //保存數據
}   
}


/***********************18b20初始化函數*****************************/
void init_18b20()
{
bit q;
dq = 1;                //把總線拿高
delay_uint(1);        //15us
dq = 0;                //給復位脈沖
delay_uint(80);       //750us
dq = 1;                //把總線拿高 等待
delay_uint(10);       //110us
q = dq;                //讀取18b20初始化信號
delay_uint(20);       //200us
dq = 1;                //把總線拿高 釋放總線
}

/*************寫18b20內的數據***************/
void write_18b20(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{                    //寫數據是低位開始
     dq = 0;             //把總線拿低寫時間隙開始
     dq = dat & 0x01; //向18b20總線寫數據了
     delay_uint(5);     // 60us
     dq = 1;             //釋放總線
     dat >>= 1;
}   
}

/*************讀取18b20內的數據***************/
uchar read_18b20()
{
uchar i,value;
for(i=0;i<8;i++)
{
     dq = 0;             //把總線拿低讀時間隙開始
     value >>= 1;   //讀數據是低位開始
     dq = 1;             //釋放總線
     if(dq == 1)        //開始讀寫數據
         value |= 0x80;
     delay_uint(5);     //60us    讀一個時間隙最少要保持60us的時間
}
return value;      //返回數據
}

/*************讀取溫度的值 讀出來的是小數***************/
uint read_temp()
{
uint value;
uchar low;            //在讀取溫度的時候如果中斷的太頻繁了,就應該把中斷給關了,否則會影響到18b20的時序
init_18b20();        //初始化18b20
EA = 0;
write_18b20(0xcc);      //跳過64位ROM
write_18b20(0x44);      //啟動一次溫度轉換命令
EA = 1;
delay_uint(50);          //500us

init_18b20();        //初始化18b20

EA = 0;
write_18b20(0xcc);      //跳過64位ROM
write_18b20(0xbe);      //發出讀取暫存器命令

low = read_18b20();     //讀溫度低字節

value =read_18b20();  //讀溫度高字節

EA = 1;
value <<= 8;         //把溫度的高位左移8位
value |= low;        //把讀出的溫度低位放到value的低八位中

value *= 0.625;         //轉換到溫度值 小數

return value;        //返回讀出的溫度 帶小數
}

/*************定時器0初始化程序***************/
void time_init()   
{
EA   = 1;        //開總中斷
TMOD = 0X11;    //定時器0、定時器1工作方式1

ET0  = 1;        //開定時器0中斷

TR0  = 1;        //允許定時器0定時

ET1  = 1;        //開定時器0中斷

TR1  = 0;        //允許定時器0定時
}

/********************獨立按鍵程序*****************/
uchar key_can;  //按鍵值

void key()  //獨立按鍵程序
{
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);        //按鍵消抖動
     if(((P2 & 0x07) != 0x07) && (key_new == 1))
     {                       //確認是按鍵按下
         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();       //保存數據
         flag_lj_en = 0;       //關閉連加使能
         flag_lj_3_en = 0; //關閉3秒后使能
         key_value = 0;        //清零
         key_time = 0;
         key_500ms = 0;
     }
}   
}

/****************按鍵處理數碼管顯示函數***************/
void key_with()
{
if(key_can == 1)    //設置鍵
{
     f_pwm_l = 30;
     menu_1 ++;
     if(menu_1 >= 3)
     {
         menu_1 = 0;
         smg_i = 3;       //數碼管顯示3位
     }
}
if(menu_1 == 1)           //設置高溫報警
{
     smg_i = 4;       //數碼管顯示4位
     if(key_can == 2)
     {
         if(flag_lj_3_en == 0)
             t_high ++ ;       //按鍵按下未松開自動加三次  
         else
             t_high += 10; //按鍵按下未松開自動加三次之后每次自動加10
         if(t_high > 990)
             t_high = 990;
     }
     if(key_can == 3)
     {
         if(flag_lj_3_en == 0)
             t_high -- ;       //按鍵按下未松開自動減三次  
         else
             t_high -= 10; //按鍵按下未松開自動減三次之后每次自動減10
         if(t_high <= t_low)
             t_high = t_low + 1;
     }
     dis_smg[0] = smg_du[t_high % 10];             //取小數顯示
     dis_smg[1] = smg_du[t_high / 10 % 10] & 0xdf;  //取個位顯示
     dis_smg[2] = smg_du[t_high / 100 % 10] ;     //取十位顯示
     dis_smg[3] = 0x64;    //H
}   
if(menu_1 == 2)           //設置低溫報警
{
     smg_i = 4;       //數碼管顯示4位
     if(key_can == 2)
     {
         if(flag_lj_3_en == 0)
             t_low ++ ;         //按鍵按下未松開自動加三次  
         else
             t_low += 10;      //按鍵按下未松開自動加三次之后每次自動加10
         if(t_low >= t_high)
             t_low = t_high - 1;
     }
     if(key_can == 3)
     {
         if(flag_lj_3_en == 0)
             t_low -- ;         //按鍵按下未松開自動減三次  
         else
             t_low -= 10;      //按鍵按下未松開自動加三次之后每次自動加10
         if(t_low <= 10)
             t_low = 10;
     }
     dis_smg[0] = smg_du[t_low % 10];              //取小數顯示
     dis_smg[1] = smg_du[t_low / 10 % 10] & 0xdf;   //取個位顯示
     dis_smg[2] = smg_du[t_low / 100 % 10] ;          //取十位顯示
     dis_smg[3] = 0x3D;     //L
}   
}  

/****************風扇控制函數***************/
void fengshan_kz()
{
//  static uchar value;

if(temperature >=t_high)    //風扇全開

{   
     TR1 = 1;
     pwm = 0;
}

else if((temperature <t_high)  && (temperature >=t_low))         //風扇緩慢

{
     f_pwm_l = 60;     
     TR1 = 1;
}

else if(temperature <t_low)     //關閉風扇

{
     TR1 = 0;
     pwm = 1;
}           
}
     

/****************主函數***************/
void main()
{
time_init();                    //初始化定時器

temperature =read_temp();      //先讀出溫度的值  

init_eeprom();  //開始初始化保存的數據
delay_1ms(650);               

temperature =read_temp();               //先讀出溫度的值

dis_smg[0] =smg_du[temperature % 10];  //取溫度的小數顯示

dis_smg[1] =smg_du[temperature / 10 % 10] & 0xdf; //取溫度的個位顯示

dis_smg[2] =smg_du[temperature / 100 % 10] ;    //取溫度的十位顯示

f_pwm_l = 50;
while(1)
{      
     key();                 //按鍵程序
     if(key_can < 10)
     {
         key_with();           //設置報警溫度   
     }
     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];  //取溫度的小數顯示
             dis_smg[1] = smg_du[temperature / 10 % 10] & 0xdf; //取溫度的個位顯示
             dis_smg[2] = smg_du[temperature / 100 % 10] ;    //取溫度的十位顯示
         }
     }
     fengshan_kz();        //風扇控制函數
}
}

/*************定時器0中斷服務程序***************/
void time0_int() interrupt 1
{   
static uchar value;           //定時2ms中斷一次
TH0 = 0xf8;
TL0 = 0x30;     //2ms
display();     //數碼管顯示函數
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秒連加大些
         }                       
     }
}
}


/*******************定時器1用做單片機模擬PWM 調節***********************/

void Timer1() interrupt 3 //調用定時器1

{
static uchar value_l;
TH1=0xfe;    //    定時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;
     }
    }
}





分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表