電路原理圖如下:
制作說明:
這個電路采用15W104單片機通過紅外遙控器控制電風扇。
在初次使用時,首先進行按鍵學碼。
學碼方法:找一個閑置的紅外遙控器,選擇兩個好用的按鍵,按住其中一個遙控
按鍵不放約6秒,蜂鳴器響一聲,表明學習完成。同樣方法學習另外一個遙控按鍵。
正常使用時,短按一下已學習的按鍵即可控制對應的開關反轉,蜂鳴器會響一聲。
第一個學習的按鍵為風扇開關,開后吹風3小時會自動關閉,防止長開。第二個學
習的按鍵為自然風開關,自然風啟動后電扇吹7秒停3秒,再按關閉自然風。由于使用
延時控制,開自然風后遙控反應會延遲。
如果需要換別的遙控按鍵或另外一個遙控器,重新上述操作,即可刪除舊的按鍵,
使用新的按鍵。
紅外接收端為1腳。輸出端為5腳,低電平為工作態。蜂鳴器接8腳,低電平為工作
態。
落地扇或臺扇一般有3個檔位,實際制作時可將其中一個檔位改成遙控,另外兩個
仍用手動。我是將最慢的1檔改成了遙控。
電路圖是借用別人的,程序也是應邀修改的,只要把8腳的led指示燈換成蜂鳴器即
可。當然不換也行,看各人愛好。程序不會沖突,指示燈和蜂鳴器都是低電平工作。
單片機源程序如下:
- #define CPU_Fosc 11059200uL //定義時鐘,自適應解碼和延時用
- #include <REG51.h>
- #include<EROM_STC10_11_15.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define USER_H 0x80 //用戶碼高8位
- #define USER_L 0x7F //用戶碼低8位
- #define Check_EN 0 //是否要校驗16位用戶碼:不校驗填0,校驗則填1
- #define CA_S 40 //長按時間設置,單位:108mS(即 108mS整數倍,10倍以上為宜)
- /*┈┈┈┈┈┈┈┈┈┈ 基準 ┈┈┈┈┈┈┈┈┈┈┈*/
- #define Boot_Limit (((9000+4500) +2000)/Step) //引導碼周期上限
- #define Boot_Lower (((9000+4500) -2000)/Step) //引導碼周期下限
- #define Bit1_Limit ((2250 +800)/Step) //“1”周期上限
- #define Bit0_Limit ((1125 +400)/Step) //“0”周期上限
- #define Step 400//紅外采樣步長:400us
- #define TH_H ((65536-Step*(CPU_Fosc/300)/40000)/256) //定時器高8位基準賦值
- #define TH_L ((65536-Step*(CPU_Fosc/300)/40000)%256) //定時器低8位基準賦值
- sfr P3M0 = 0xB2; //0000,0000 端口3模式寄存器0
- sfr P3M1 = 0xB1; //0000,0000 端口3模式寄存器1
- uint IR_BT; //解碼效果返回:0無效,1有效,2短按,3長按
- uchar NEC[4]; //解碼存放:16位用戶碼、操作碼正反碼
- uint cntCA; //長按計數
- uint cntStep; //步數計
- bit IRa,IRb; //電位狀態保存
- bit IRsync; //同步標志
- bit bz1,bz2,bz3,bz4;
- bit m1,m2; //紅外輸入鍵值變量
- uint BitN; //位碼裝載數
- uchar num1,num2,num3,num4;
- uchar aa;
- float tm;
- /********************************************/
- sbit out_1 = P3^0; //輸出1
- sbit BE = P3^3; //蜂鳴器
- sbit IR = P3^4; //定義紅外線接口(任意引腳)
- /************************************************/
- //========================================================================
- // 函數: void delayms(unsigned int ms)
- // 描述: 延時函數。
- // 參數: ms,要延時的ms數, 這里只支持1~65535ms. 自動適應主時鐘.
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2013-4-1
- // 備注:
- //========================================================================
- void DelayMs(unsigned int ms)
- {
- unsigned int i;
- do{
- i = CPU_Fosc / 13000;
- while(--i) ; //14T per loop
- }while(--ms);
- }
- /****************蜂鳴器*************************/
- void beep()
- {
- BE=0;
- DelayMs(500);
- BE=1;
- }
- /***************寫數據 ***************************/
- void W_W_1(void)//寫數據
- {
- num1 = NEC[2];
- EA = 0; //關中斷
- EROM_C(0); //讀擦除EPPROM
- EROM_W(0,5,num1); //寫EPPROM
- num2 = EROM_R(0,5); //讀EPPROM
- EA = 1; //開中斷
- }
- /**************寫數據 ****************************/
- void W_W_2(void)//寫數據
- {
- num3 = NEC[2];
- EA = 0; //關中斷
- EROM_C(1); //讀擦除EPPROM
- EROM_W(1,10,num3); //寫EPPROM
- num4 = EROM_R(1,10); //讀EPPROM
- EA = 1; //開中斷
- }
- /****************遙控短按處理*************************/
- void KZ0()//函數:遙控短按處理
- {
- beep();
- num2 = EROM_R(0,5); //讀EPPROM
- num4 = EROM_R(1,10);
- if(num2 == num1)
- {
- // bz3 = m1;
- // out_1 = ~out_1;
- m1=~m1;
- }
- if(num4 == num3)
- {
- m2=~m2;
- }
- }
- /*****************遙控長按處理********************/
- void KZ1()//函數:遙控長按處理
- {
- beep();
- //m2 = 1;
- //m1 = 1;
- aa ++;
- if(aa == 1)
- {
- W_W_1();//讀寫程序
- }
- if(aa == 2)
- {
- W_W_2();//讀寫程序
- aa = 0;
- }
-
- }
- /****************紅外解碼初始化************************/
- void IR_Init() //紅外線解碼初始化
- {
- TMOD &= 0xF0; //清定時器0
- TMOD |= 0x01; //定時器0:16位定時器
- TL0 = TH_L; //每步時間
- TH0 = TH_H;
- ET0 = 1;
- EA = 1;
- TR0 = 1;
- }
- /****************主函數*************************/
- void main(void)
- {
- P3M0 = 0x03; //
- P3M1 = 0x00; //
- m1 = 0;
- m2 = 0;
- BE=1;
- IR_Init(); //紅外線解碼初始化
- num2 = EROM_R(0,5); //讀EPPROM
- num4 = EROM_R(1,10); //讀EPPROM
- while(1)
- {
- if((IR_BT == 2) || (IR_BT == 3))//遙控檢測
- {
- tm=0; //有操作,開機時間清0
- if(IR_BT == 2)
- KZ0(); //短按處理
- else
- KZ1(); //長按處理
- IR_BT = 0; //清有效標志
- }
- if(tm>27000000) //風扇開啟3小時后關閉(3*3600*1000000us/400us=27000000次)
- {
- m1=1; //風扇停電
- tm=27000001; //停止計時防止溢出
- }
- out_1=~m1;
- if(m1==1)
- {
- if(m2==1)
- {
- DelayMs(7000); //風扇通電7s
- out_1=1;
- DelayMs(3000); //風扇停電3s
- }
- }
- }
- }
- /********************** 定時器0中斷函數************************/
- void time0(void) interrupt 1
- {
- TL0 = TH_L; //重賦值
- TH0 = TH_H;
- IRb = IRa; //上次電位狀態
- IRa = IR; //當前電位狀態
- tm ++;
- cntStep ++;
- if(IR_BT == 1)
- if(cntStep > 300)
- IR_BT = 2;//解碼有效后,如果無長按,120ms(400us×300)后默認短按
- if(IRb && !IRa) //是否下降沿(上次高,當前低)
- {
- if(cntStep > Boot_Limit) //超過同步時間?
- {
- if(IR_BT == 1) //解碼有效后,繼續按住遙控>CA_S即長按
- if(++ cntCA > CA_S)
- IR_BT = 3;
- IRsync = 0; //同步位清0
- }
- else
- if(cntStep > Boot_Lower)
- {
- IRsync = 1; //同步位置1,裝載位碼數
- BitN = 32;
- }
- else
- if(IRsync) //如果已同步
- {
- if(cntStep > Bit1_Limit)
- IRsync = 0;
- else
- {
- NEC[3] >>= 1;
- if(cntStep > Bit0_Limit)NEC[3] |= 0x80; //“0”與“1”
- if(-- BitN == 0)
- {
- IRsync = 0; //同步位清0
- #if (Check_EN == 1)
- if((NEC[0] == USER_H) && (NEC[1] == USER_L) && (NEC[2] == ~NEC[3])) //校驗16位用戶碼、操作碼正反碼
- {
- IR_BT = 1; //解碼有效,接下來判斷:短按?長按?
- cntCA = 0;
- }
- #else
- if(NEC[2] == ~NEC[3])//校驗操作碼正反碼
- {
- IR_BT = 1;
- cntCA = 0;
- }
- #endif
- }
- else
- if((BitN & 0x07) == 0)//NEC[3]每裝滿8位,移動保存一次(即 BitN%8 == 0)
- {
- NEC[0] = NEC[1];
- NEC[1] = NEC[2];
- NEC[2] = NEC[3];
- }
- }
- }
- cntStep = 0; //步數計清0
- }
- /******************************************/
- if(IR_BT == 1)//寫鍵值指示
- {
- num1 = NEC[2];
- }
- /*****************************************/
- if(IR_BT == 1)//寫鍵值指示
- {
- num3 = NEC[2];
- }
- }
復制代碼
所有資料51hei提供下載:
兩路學習型風扇遙控開關帶自然風6.rar
(51.48 KB, 下載次數: 150)
2019-8-28 19:06 上傳
點擊文件名下載附件
|