本設(shè)計以STM32F407ZGT6開發(fā)板為硬件基礎(chǔ)。制作了一個基于紅外遙控的多功能智能電風(fēng)扇控制器,主要實現(xiàn)了以下功能: 1.實現(xiàn)電風(fēng)扇的無極調(diào)速,并可以對電風(fēng)扇的轉(zhuǎn)速進(jìn)行設(shè)置和轉(zhuǎn)速的實時測試和顯示。 2. 電風(fēng)扇至少產(chǎn)生三類風(fēng):“自然風(fēng)”、“常風(fēng)”和“睡眠風(fēng)”。 3. 能實現(xiàn)自帶定時開、關(guān)機。 4. 具備溫度測量功能和省電功能,可以根據(jù)溫度自動微調(diào)風(fēng)速,當(dāng)外界溫度低于設(shè)定溫度,電風(fēng)扇停止轉(zhuǎn)動;外界溫度高于設(shè)定溫度,電風(fēng)扇可恢復(fù)轉(zhuǎn)動測溫精度優(yōu)于1攝氏度。 5. 具有LCD顯示功能,能顯示日期、時間、溫度、風(fēng)扇轉(zhuǎn)速、運行模式等等信息。 6. 能實現(xiàn)全功能紅外遙控;通過紅外遙控板實現(xiàn)全部的參數(shù)設(shè)置與調(diào)節(jié)。 7.可編程模式,可設(shè)置鬧鐘。
單片機源程序如下:
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "lcd.h"
- #include "usmart.h"
- #include "rtc.h"
- #include "key.h"
- #include "timer.h"
- #include "remote.h"
- #include "ds18b20.h"
- #include "fontupd.h"
- #include "text.h"
- #include "w25qxx.h"
- #include "pwm.h"
- #include "mypid.h"
- #include "wkup.h"
- extern u8 TIM5CH1_CAPTURE_STA; //輸入捕獲狀態(tài)
- extern u16 TIM5CH1_CAPTURE_VAL; //輸入捕獲值
- long long temp,now_ses;
- long long set_in=30;
- long long pwm_out0;
- int t1=31,t2=5,t3=5,t4=5,t5=30;//睡眠風(fēng)初始時間
- int ton=30; //定時開機時間
- int toff=30; //定時關(guān)機時間
- int flag=0,flag0=0,flag1=0;//模式標(biāo)志
- int flag2=0,flag3=0,flag4=0;//起始標(biāo)志為0
- short temperature;
- short temperature_set=25;
- int i=0,j=0;
- //RTC實時時鐘顯示
- void RTC_SHOW(void)
- {
- RTC_TimeTypeDef RTC_TimeStruct;
- RTC_DateTypeDef RTC_DateStruct;
- u8 tbuf[40];
- POINT_COLOR=BLUE;
- RTC_GetTime(RTC_Format_BIN,&RTC_TimeStruct);
- sprintf((char*)tbuf,"%02d:%02d:%02d",RTC_TimeStruct.RTC_Hours,RTC_TimeStruct.RTC_Minutes,RTC_TimeStruct.RTC_Seconds);
- LCD_ShowString(180,120,210,16,24,tbuf);
-
- RTC_GetDate(RTC_Format_BIN, &RTC_DateStruct);
-
- sprintf((char*)tbuf,"20%02d-%02d-%02d",RTC_DateStruct.RTC_Year,RTC_DateStruct.RTC_Month,RTC_DateStruct.RTC_Date);
- LCD_ShowString(30,120,210,16,24,tbuf);
-
-
- sprintf((char*)tbuf,"%d",RTC_DateStruct.RTC_WeekDay);
- LCD_ShowString(373,120,210,16,24,tbuf);
- }
- //LCD顯示
- void LCD_SHOW(void)
- {
- // set_in=30;
- POINT_COLOR=BLUE;
- Show_Str(300,120,400,24,"星期: ",24,0);
- POINT_COLOR=RED;
- Show_Str(100,50,400,24,"多功能智能風(fēng)扇控制器",24,0);
- POINT_COLOR= DARKBLUE ;
- Show_Str(75,200,120,24,"設(shè)定轉(zhuǎn)速: ",24,0);
- LCD_ShowString(350,200,100,4,24,"r/s");
- LCD_ShowxNum(228,200,set_in,3,24,0);
- Show_Str(75,280,200,24,"風(fēng)扇轉(zhuǎn)速: ",24,0);
- LCD_ShowString(350,280,100,4,24,"r/s");
- LCD_ShowxNum(228,280,now_ses,3,24,0);
- Show_Str(75,360,400,24,"運行模式: ",24,0);
- Show_Str(75,440,400,24,"設(shè)置的溫度: ",24,0);
- LCD_ShowString(245,440,100,4,24,". C");
- LCD_ShowxNum(228,440,temperature_set,3,24,0);
- Show_Str(75,520,400,24,"當(dāng)前的溫度: ",24,0);
- LCD_ShowString(250,520,100,4,24,". C");
- LCD_ShowxNum(180,600,toff,3,24,0);
- LCD_ShowxNum(335,600,ton,3,24,0);
- Show_Str(75,600,400,24,"定時關(guān)機:",24,0);
- Show_Str(230,600,400,24,"定時開機:",24,0);
- Show_Str(350,680,400,24,"flag2= ",24,0);
- LCD_ShowxNum(410,680,flag2,3,24,0);
- Show_Str(75,660,400,24,"睡眠時間: ",24,0);
- Show_Str(75,700,120,24,"t1: ",24,0);
- LCD_ShowxNum(120,700,t1,3,24,0);
- Show_Str(195,700,45,24,"t5: ",24,0);
- LCD_ShowxNum(240,700,t5,3,24,0);
-
- Show_Str(40,760,45,24,"t2:",24,0);
- LCD_ShowxNum(85,760,t2,3,24,0);
- Show_Str(160,760,45,24,"t3:",24,0);
- LCD_ShowxNum(205,760,t3,3,24,0);
- Show_Str(280,760,45,24,"t4: ",24,0);
- LCD_ShowxNum(325,760,t4,3,24,0);
- // Show_Str(75,600,400,24,"占空比: /1000",24,0);
- // LCD_ShowxNum(175,600,pwm_out0,3,24,0);
- }
- //溫度顯示函數(shù)
- void Show_temperature(void)
- {
- u8 t;
- temperature=DS18B20_Get_Temp();
- if(temperature<0)
- {
- LCD_ShowChar(30+40,520,'-',16,0); //顯示負(fù)號
- temperature=-temperature; //轉(zhuǎn)為正數(shù)
- }else LCD_ShowChar(30+40,520,' ',16,0); //去掉負(fù)號
- LCD_ShowNum(150+70+8,520,temperature/10,2,24); //顯示正數(shù)部分
- LCD_ShowNum(150+70+40,520,temperature%10,1,24); //顯示小數(shù)部分
- }
- int main(void)
- {
- u8 key;
- u8 *str=0;
- u8 t=0;
-
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級分組2
- delay_init(168); //初始化延時函數(shù)
- uart_init(115200); //初始化串口波特率為115200
- usmart_dev.init(168); //初始化USMART
- LED_Init(); //初始化LED
- LCD_Init(); //初始化LCD
- My_RTC_Init(); //初始化RTC
- Remote_Init(); //紅外接收初始化
- DS18B20_Init();
- W25QXX_Init(); //初始化W25Q128
- exfuns_init(); //為fatfs相關(guān)變量申請內(nèi)存
- font_init();
- TIM2_Int_Init(4999,8399); //計數(shù)0.5s發(fā)生一次中斷
- TIM3_Int_Init(9999,8399); //計數(shù)1s發(fā)生一次中斷
- TIM7_Int_Init(4999,8399); //計數(shù)0.5s發(fā)生一次中斷
- TIM4_Int_Init(9999,8399); //計數(shù)1s發(fā)生一次中斷
- TIM14_PWM_Init(1000-1,4-1); //84M/4=21Mhz的計數(shù)頻率,重裝載值500,所以PWM頻率為 21M/1000=21Khz.
-
- TIM5_CH1_Cap_Init(0XFFFFFFFF,84-1); //以1Mhz的頻率計數(shù)
-
- RTC_Set_WakeUp(RTC_WakeUpClock_CK_SPRE_16bits,0); //配置WAKE UP中斷,1秒鐘中斷一次
- while(DS18B20_Init()) //DS18B20初始化
- {
- LCD_ShowString(30,130,200,16,16,"DS18B20 Error");
- delay_ms(200);
- }
-
- TIM_SetCompare1(TIM14,550);
- while(1)
- {
- RTC_Set_AlarmA(2,18,37,0);
- RTC_SHOW();
- LCD_SHOW();
- Show_temperature();
- key=Remote_Scan();
-
- // TIM_SetCompare1(TIM14,0);
- if(temperature_set<temperature/10||temperature_set==temperature/10)
- {
- if(j==0)
- {
- LCD_LED=1;
- if(TIM5CH1_CAPTURE_STA&0X80)
- {
- temp=TIM5CH1_CAPTURE_STA&0X3F;
- temp*=0XFFFFFFFF;
- temp+=TIM5CH1_CAPTURE_VAL;
-
- printf("HIGH:%lld us\r\n",temp);
- TIM5CH1_CAPTURE_STA=0x80; //關(guān)閉下一次捕獲
- TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,DISABLE);
- now_ses = 1000000 / (temp * 200);
- pwm_out0 = pid_function2(set_in,now_ses);
- TIM_SetCompare1(TIM14,pwm_out0);
-
- TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//允許更新中斷 ,允許CC1IE捕獲中斷
- TIM5CH1_CAPTURE_STA=0; //開啟下一次捕獲
- }
- }
- }
- else if(temperature_set>temperature/10)
- {
- pwm_out0 =0;now_ses =0;
- TIM_SetCompare1(TIM14,pwm_out0);
- LCD_LED=0;
- j=0;
-
- }
-
- if(key)
- {
- delay_ms(200);
- if(key == Remote_Scan())
- {
- switch(key)
- {
-
- case 98: //調(diào)溫
- str="UP";
- temperature_set++;
- j=0;
- break;
- case 168:str="DOWN";
- temperature_set--;
- j=0;
- break;
-
-
-
- case 152:str="2"; //調(diào)速
- set_in++;
- break;
-
- case 56:str="8";
- set_in--;
- break;
-
-
- case 224:str="VOL-"; //睡眠時間
- if(flag4==0)
- {
- t1--;
- }
- if(flag4==1)
- {
- t5--;
- }
- break;
-
- case 144:str="VOL+";
- if(flag4==0)
- {
- t1++;
- }
- if(flag4==1)
- {
- t5++;
- }
- break;
-
-
- case 162:str="POWER";
- {
- TIM_Cmd(TIM5, DISABLE); //失能TIM5
- TIM_SetCompare1(TIM14,0); //PWM輸出高電平
- TIM5CH1_CAPTURE_STA=1;
- TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,DISABLE);
- LCD_LED=0;
- flag3=0;
- j=1;
- break;
- }
- case 226:str="ALIENTEK";
- {
- TIM_Cmd(TIM5, ENABLE); //使能TIM5 (捕獲模式)
- TIM_SetCompare1(TIM14,550);
- TIM5CH1_CAPTURE_STA=0;
- TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);
- LCD_LED=1;
- j=0;
- flag3=0;
- }
- break;
-
-
- case 176: str="3"; //定時關(guān)機
- ton++;
- flag2=1;
- break;
- case 90: str="9";
- ton--;
- flag2=1;
- break;
-
-
- case 104:str="1"; //定時關(guān)機
- toff++;
- flag2=0;
- break;
- case 16:str="7";
- toff--;
- flag2=0;
- break;
-
-
- case 48:str="4"; //可編程模式時間設(shè)置
- t2++;
- break;
- case 24:str="5";
- t3++;
- break;
- case 122:str="6";
- t4++;
- break;
-
-
- case 2:str="PLAY"; //確認(rèn)開關(guān)機
- {
- if(flag3==0)
- {
- TIM_Cmd(TIM4, ENABLE); //定時開/關(guān)機
- }
- if(flag3==1)
- {
- TIM_Cmd(TIM4, DISABLE); //取消定時開/關(guān)機
- flag3=0;
- }
- }
- break;
-
-
-
- case 34: //模式調(diào)節(jié)
- i--;
- str="LEFT";
- if(i==1)
- {
- LCD_Fill(180,350,600,420,WHITE); //清除之前的顯示
- Show_Str(200,360,400,24,"常風(fēng)",24,0);
- TIM_Cmd(TIM7,DISABLE);
- }
- if(i==2)
- {
- LCD_Fill(180,350,600,420,WHITE); //清除之前的顯示
- Show_Str(200,360,400,24,"睡眠風(fēng)",24,0);
- TIM_Cmd(TIM7,DISABLE);
- flag1=0;
- }
- if(i==3)
- {
- LCD_Fill(180,350,600,420,WHITE); //清除之前的顯示
- Show_Str(200,360,400,24,"自然風(fēng)",24,0);
- }
- if(i==4)
- {
- LCD_Fill(180,350,600,420,WHITE); //清除之前的顯示
- Show_Str(200,360,400,24,"可編程模式",24,0);
- TIM_Cmd(TIM7,DISABLE);
- }
- if(i<=0)
- {
- i=0;
- set_in=30;
- }
- break;
-
- case 194:
- i++;
- str="RIGHT";
- if(i==1)
- {
- LCD_Fill(180,350,600,420,WHITE); //清除之前的顯示
- Show_Str(200,360,400,24,"常風(fēng)",24,0);
- TIM_SetCompare1(TIM14,pwm_out0); //失能TIM14
- TIM_Cmd(TIM5, ENABLE); //失能TIM5
- TIM5CH1_CAPTURE_STA=0;
- TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);
- }
- if(i==2)
- {
- LCD_Fill(180,350,600,420,WHITE); //清除之前的顯示
- Show_Str(200,360,400,24,"睡眠風(fēng)",24,0);
- flag1=0;
- }
- if(i==3)
- {
- LCD_Fill(180,350,600,420,WHITE); //清除之前的顯示
- Show_Str(200,360,400,24,"自然風(fēng)",24,0);
- TIM_SetCompare1(TIM14,pwm_out0); //失能TIM14
- TIM_Cmd(TIM5, ENABLE); //失能TIM5
- TIM5CH1_CAPTURE_STA=0;
- TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);
- }
- if(i==4)
- {
- LCD_Fill(180,350,600,420,WHITE); //清除之前的顯示
- Show_Str(200,360,400,24,"可編程模式",24,0);
- }
- if(i>=5)
- {
- i=0;
- set_in=30;
- }
- break;
- }
- }
- if(i==1) //常風(fēng)
- {
- TIM_Cmd(TIM3,DISABLE); //失能TIM3 (睡眠風(fēng)計時)
- TIM_Cmd(TIM7,DISABLE); //失能TIM7 (自然風(fēng)計時)
- TIM_Cmd(TIM2, DISABLE);
- }
- if(i==2) //睡眠風(fēng)
- {
- TIM_Cmd(TIM7,DISABLE); //失能TIM7
- TIM_Cmd(TIM3,ENABLE); //使能定時器3
- TIM_Cmd(TIM2, DISABLE);
- }
- if(i==3) //自然風(fēng)
- {
- TIM_Cmd(TIM3,DISABLE); //失能TIM3
- TIM_Cmd(TIM7,ENABLE); //使能TIM7
- TIM_Cmd(TIM2, DISABLE);
- }
- if(i==4) //可編程
- {
- TIM_Cmd(TIM3,DISABLE); //失能TIM3
- TIM_Cmd(TIM7,DISABLE); //使能TIM7
- TIM_Cmd(TIM2,ENABLE); //使能TIM2
- }
- }
- }
- }
- //定時器3中斷服務(wù)函數(shù) 睡眠風(fēng)定時
- void TIM3_IRQHandler(void)
- {
- if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中斷
- {
- if(flag1==0)
- {
- t1--;
- if(t1==0) //關(guān)機
- {
- flag1=1;
- TIM_SetCompare1(TIM14,0); //失能TIM14
- TIM_Cmd(TIM5, DISABLE); //失能TIM5
- TIM5CH1_CAPTURE_STA=1;
- TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,DISABLE);
- TIM_Cmd(TIM7,DISABLE);
- LCD_LED=0;
- j=1;
- flag4=1;
- }
- }
- if(flag1==1)
- {
- t1++;
- if(t1==t5) //開機
- {
- flag1=0;
- TIM_SetCompare1(TIM14,pwm_out0); //使能TIM14
- TIM_Cmd(TIM5, ENABLE); //使能TIM5
- TIM5CH1_CAPTURE_STA=0;
- TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);
- TIM_Cmd(TIM7,ENABLE);
- LCD_LED=1;
- j=0;
- flag4=0;
- }
- }
- }
- TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中斷標(biāo)志位
- }
- //定時器7中斷服務(wù)函數(shù) 自然風(fēng)
- void TIM7_IRQHandler(void)
- {
- if(TIM_GetITStatus(TIM7,TIM_IT_Update)==SET) //溢出中斷
- {
- if(flag==0)
- {
- set_in--;
- if(set_in<=1)
- {
- flag=1;
- }
- }
- if(flag==1)
- {
- set_in++;
- if(set_in>=55)
- {
- flag=0;
- }
- }
- TIM_ClearITPendingBit(TIM7,TIM_IT_Update); //清除中斷標(biāo)志位
- }
- }
- //定時器2中斷服務(wù)函數(shù) 可編程
- void TIM2_IRQHandler(void)
- {
- if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET) //溢出中斷
- {
- if(flag0==0)
- {
- t2--;
- set_in=50;
- if(t2==0)
- {
- TIM_Cmd(TIM7,DISABLE);
- flag0=1;
- t2=5;
- }
- }
-
- if(flag0==1)
- {
- t3--;
- set_in=30;
- if(t3==0)
- {
- TIM_Cmd(TIM7,DISABLE);
- flag0=2;
- t3=5;
- }
- }
-
- if(flag0==2)
- {
- t4--;
- TIM_Cmd(TIM7,ENABLE);
- if(t4==0)
- {
- TIM_Cmd(TIM7,DISABLE);
- TIM_Cmd(TIM5, DISABLE); //失能TIM5
- TIM_SetCompare1(TIM14,0); //PWM輸出高電平
- TIM5CH1_CAPTURE_STA=1;
- TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,DISABLE);
- LCD_LED=0;
- j=1;
- flag0=0;
- t4=5;
- TIM_Cmd(TIM2, DISABLE);
- }
- }
- TIM_ClearITPendingBit(TIM2,TIM_IT_Update); //清除中斷標(biāo)志位
- }
- }
- //定時器4中斷服務(wù)函數(shù) 定時開/關(guān)機
- void TIM4_IRQHandler(void)
- {
- if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET) //溢出中斷
- {
- if(flag2==0)
- {
- toff--;
- flag3=1;
- if(toff==0)
- {
- TIM_Cmd(TIM4, DISABLE);
- TIM_SetCompare1(TIM14,0); //失能TIM14
- TIM_Cmd(TIM5, DISABLE); //失能TIM5
- TIM5CH1_CAPTURE_STA=1;
- TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,DISABLE);
- LCD_LED=0;
- j=1;
- }
- }
- if(flag2==1)
- {
- ton--;
- flag3=1;
- if(ton==0)
- {
- TIM_Cmd(TIM4, DISABLE);
- TIM_Cmd(TIM5, ENABLE); //使能TIM5 (捕獲模式)
- TIM5CH1_CAPTURE_STA=0;
- TIM_SetCompare1(TIM14,550);
- TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);
- LCD_LED=1;
- j=0;
- }
- }
- TIM_ClearITPendingBit(TIM4,TIM_IT_Update); //清除中斷標(biāo)志位
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
智能風(fēng)扇.rar
(9.11 MB, 下載次數(shù): 446)
2018-7-17 18:49 上傳
點擊文件名下載附件
|