本設計以STM32F407ZGT6開發板為硬件基礎。制作了一個基于紅外遙控的多功能智能電風扇控制器,主要實現了以下功能: 1.實現電風扇的無極調速,并可以對電風扇的轉速進行設置和轉速的實時測試和顯示。 2. 電風扇至少產生三類風:“自然風”、“常風”和“睡眠風”。 3. 能實現自帶定時開、關機。 4. 具備溫度測量功能和省電功能,可以根據溫度自動微調風速,當外界溫度低于設定溫度,電風扇停止轉動;外界溫度高于設定溫度,電風扇可恢復轉動測溫精度優于1攝氏度。 5. 具有LCD顯示功能,能顯示日期、時間、溫度、風扇轉速、運行模式等等信息。 6. 能實現全功能紅外遙控;通過紅外遙控板實現全部的參數設置與調節。 7.可編程模式,可設置鬧鐘。
1.png (14.26 KB, 下載次數: 86)
下載附件
2018-7-17 10:46 上傳
0.png (43.8 KB, 下載次數: 88)
下載附件
2018-7-17 18:48 上傳
單片機源程序如下:
- #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; //輸入捕獲狀態
- 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;//睡眠風初始時間
- int ton=30; //定時開機時間
- int toff=30; //定時關機時間
- int flag=0,flag0=0,flag1=0;//模式標志
- int flag2=0,flag3=0,flag4=0;//起始標志為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,"多功能智能風扇控制器",24,0);
- POINT_COLOR= DARKBLUE ;
- Show_Str(75,200,120,24,"設定轉速: ",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,"風扇轉速: ",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,"設置的溫度: ",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,"當前的溫度: ",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,"定時關機:",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);
- }
- //溫度顯示函數
- void Show_temperature(void)
- {
- u8 t;
- temperature=DS18B20_Get_Temp();
- if(temperature<0)
- {
- LCD_ShowChar(30+40,520,'-',16,0); //顯示負號
- temperature=-temperature; //轉為正數
- }else LCD_ShowChar(30+40,520,' ',16,0); //去掉負號
- LCD_ShowNum(150+70+8,520,temperature/10,2,24); //顯示正數部分
- LCD_ShowNum(150+70+40,520,temperature%10,1,24); //顯示小數部分
- }
- int main(void)
- {
- u8 key;
- u8 *str=0;
- u8 t=0;
-
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設置系統中斷優先級分組2
- delay_init(168); //初始化延時函數
- 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相關變量申請內存
- font_init();
- TIM2_Int_Init(4999,8399); //計數0.5s發生一次中斷
- TIM3_Int_Init(9999,8399); //計數1s發生一次中斷
- TIM7_Int_Init(4999,8399); //計數0.5s發生一次中斷
- TIM4_Int_Init(9999,8399); //計數1s發生一次中斷
- TIM14_PWM_Init(1000-1,4-1); //84M/4=21Mhz的計數頻率,重裝載值500,所以PWM頻率為 21M/1000=21Khz.
-
- TIM5_CH1_Cap_Init(0XFFFFFFFF,84-1); //以1Mhz的頻率計數
-
- 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; //關閉下一次捕獲
- 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: //調溫
- str="UP";
- temperature_set++;
- j=0;
- break;
- case 168:str="DOWN";
- temperature_set--;
- j=0;
- break;
-
-
-
- case 152:str="2"; //調速
- 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"; //定時關機
- ton++;
- flag2=1;
- break;
- case 90: str="9";
- ton--;
- flag2=1;
- break;
-
-
- case 104:str="1"; //定時關機
- toff++;
- flag2=0;
- break;
- case 16:str="7";
- toff--;
- flag2=0;
- break;
-
-
- case 48:str="4"; //可編程模式時間設置
- t2++;
- break;
- case 24:str="5";
- t3++;
- break;
- case 122:str="6";
- t4++;
- break;
-
-
- case 2:str="PLAY"; //確認開關機
- {
- if(flag3==0)
- {
- TIM_Cmd(TIM4, ENABLE); //定時開/關機
- }
- if(flag3==1)
- {
- TIM_Cmd(TIM4, DISABLE); //取消定時開/關機
- flag3=0;
- }
- }
- break;
-
-
-
- case 34: //模式調節
- i--;
- str="LEFT";
- if(i==1)
- {
- LCD_Fill(180,350,600,420,WHITE); //清除之前的顯示
- Show_Str(200,360,400,24,"常風",24,0);
- TIM_Cmd(TIM7,DISABLE);
- }
- if(i==2)
- {
- LCD_Fill(180,350,600,420,WHITE); //清除之前的顯示
- Show_Str(200,360,400,24,"睡眠風",24,0);
- TIM_Cmd(TIM7,DISABLE);
- flag1=0;
- }
- if(i==3)
- {
- LCD_Fill(180,350,600,420,WHITE); //清除之前的顯示
- Show_Str(200,360,400,24,"自然風",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,"常風",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,"睡眠風",24,0);
- flag1=0;
- }
- if(i==3)
- {
- LCD_Fill(180,350,600,420,WHITE); //清除之前的顯示
- Show_Str(200,360,400,24,"自然風",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) //常風
- {
- TIM_Cmd(TIM3,DISABLE); //失能TIM3 (睡眠風計時)
- TIM_Cmd(TIM7,DISABLE); //失能TIM7 (自然風計時)
- TIM_Cmd(TIM2, DISABLE);
- }
- if(i==2) //睡眠風
- {
- TIM_Cmd(TIM7,DISABLE); //失能TIM7
- TIM_Cmd(TIM3,ENABLE); //使能定時器3
- TIM_Cmd(TIM2, DISABLE);
- }
- if(i==3) //自然風
- {
- 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中斷服務函數 睡眠風定時
- void TIM3_IRQHandler(void)
- {
- if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中斷
- {
- if(flag1==0)
- {
- t1--;
- if(t1==0) //關機
- {
- 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); //清除中斷標志位
- }
- //定時器7中斷服務函數 自然風
- 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); //清除中斷標志位
- }
- }
- //定時器2中斷服務函數 可編程
- 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); //清除中斷標志位
- }
- }
- //定時器4中斷服務函數 定時開/關機
- 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); //清除中斷標志位
- }
- }
復制代碼
所有資料51hei提供下載:
智能風扇.rar
(9.11 MB, 下載次數: 446)
2018-7-17 18:49 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|