|
- /*風(fēng)扇遙控芯片:BA5104 紅外遙控解碼程序 晶振頻率:11.0592MHZ 1幀12位,一次至少發(fā)2幀*//*歷時(shí)8天成功調(diào)試,干擾碼直接清零,只顯示相關(guān)鍵值*/
- /*解碼后的鍵值:關(guān)機(jī) 0xfd81; 開(kāi)/風(fēng)速 0xfd82; 風(fēng)類(lèi) 0xfd84; 定時(shí) 0xfd88; 搖頭 0xfd90; 彩燈 0xfdc3; 無(wú) 0xfda0; 無(wú) 0xfdc6*/
- #include "STC8G.h"/*單片機(jī):STC8G1K08-TSSOP20*//*紅外端口:P33(包含外部中斷1,改端口時(shí)要注意)*/
- unsigned char q,b,s,g,/*位選*/ir[13],j,c,dw;unsigned int r,m,d0,d1,ds,se,buz;bit off,on,sm,cd,gj,yt;
- unsigned char code dm[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x08,0x48,0x49,0x76,0x00};/*共陰段碼*/
- void delayms(unsigned int i){while(i--);}/*延時(shí)函數(shù)*/void int1init(){PX1=1;/*設(shè)置中斷優(yōu)先級(jí)*/IT1=1;EX1=1;EA=1;}/*外部中斷1初始化函數(shù),設(shè)置成下降沿觸發(fā)*/
- void d0init()/*定時(shí)器0 1微秒@11.0592MHz*/
- {AUXR |= 0x80;/*定時(shí)器時(shí)鐘1T模式*/TMOD &= 0xF0;/*設(shè)置定時(shí)器模式*/TL0 = 0xF5;/*設(shè)置定時(shí)初始值*/TH0 = 0xFF;/*設(shè)置定時(shí)初始值*/TF0 = 0;/*清除TF0標(biāo)志*/TR0 = 0;/*定時(shí)器0先不計(jì)時(shí)*/}
- void d1init()/*定時(shí)器1初始化函數(shù)*/{AUXR |= 0x40;/*1T*/TMOD &= 0x0F;TL1 = 0x70;/*初始值*/TH1 = 0xFF;/*初始值*/TF1 = 0;/*清除TF1標(biāo)志*/TR1=0;/*先不啟動(dòng)*/ET1=1;/*開(kāi)中斷*/EA=1;}
- void kayscan()/*P1端口對(duì)地增加按鍵*/
- {
- P1=0xff;
- P34=1;P35=1;P36=1;P37=1;
- if(P11==0){delayms(5);if(P11==0){m=0xfd90;buz=1;while(!P11);}} /*搖頭*/
- if(P12==0){delayms(5);if(P12==0){m=0xfd84;buz=1;while(!P12);}} /*風(fēng)類(lèi)*/
- if(P13==0){delayms(5);if(P13==0){m=0xfd81;buz=1;while(!P13);}} /*關(guān)機(jī)*/
- if(P14==0){delayms(5);if(P14==0){m=0xfd88;buz=1;while(!P14);}} /*定時(shí)*/
- if(P15==0){delayms(5);if(P15==0){m=0xfd82;buz=1;while(!P15);}} /*開(kāi)/風(fēng)速*/
- P1=0x00;
- }
- void display()/*數(shù)碼管掃描*/
- {
- unsigned char i;for(i=0;i<4;i++){switch(i)/*選擇顯示位置*/
- {
- case(0):P34=0;P35=1;P36=1;P37=1;break; /*千位*/
- case(1):P34=1;P35=0;P36=1;P37=1;break; /*百位*/
- case(2):P34=1;P35=1;P36=0;P37=1;break; /*十位*/
- case(3):P34=1;P35=1;P36=1;P37=0;break; /*個(gè)位*/
- }
- if(i==0){P1=dm[q];}/*千位*/
- if(i==0&se>0&sm==1){P1=dm[20];}
- if(i==1){P1=dm[b]; /*百位*/
- if(ds>999&sm==1){P1=dm[b]+0x80;}}
- if(i==2){P1=dm[s];}/*十位*/
- if(i==3){P1=dm[g];/*個(gè)位*/
- if(yt==1){P1=dm[g]+0x80;}}
- if(P33==1){delayms(50);} /*間隔一段時(shí)間掃描*/
- P1=0x00; /*消隱*/
- }
- }
- void ircl() /*紅外時(shí)間記錄*/
- {
- unsigned char c1;
- if(!P33)
- {
- d1=0;
- TR1=1; /*啟動(dòng)定時(shí)器1*/
- while(!P33);
- TR1=0;
- ir[j]=d1;
- } /*編碼位置清零*/
- if(P33==1&&j>0)/*當(dāng)端口高電平時(shí),編碼位置還未清零*/
- {
- c1++; /*計(jì)算一下持續(xù)時(shí)間*/
- if(c1>250) /*超過(guò)一定的時(shí)間*/
- {
- c++;c1=0;
- }
- if(c>5) /*就要再次按遙控按鍵*/
- {
- j=0;c=0; /*如果還有干擾碼就直接清零*/
- }
- }
- }
- void kzhs()/*鍵值控制函數(shù) 包含主板按鍵和紅外遙控按鍵*/
- {
- unsigned char fl,zd;
- if(on==1&cd==1){display();/*開(kāi)數(shù)碼管*/}
- if(on==1&m==0xfd81){fl=0;on=0;dw=0;zd=0;se=0;ds=0;TR0=0;cd=0;j=0;}/*關(guān)機(jī)狀態(tài)*/
- if(m==0xfd82&fl==0){fl=0;off=0;on=1;dw=dw+1;if(dw>3){dw=1;}cd=1;gj=0;j=0;m=0;}/*開(kāi)機(jī)狀態(tài)*/
- if(on==1&m==0xfd90){yt=~yt;cd=1;j=0;m=0;}/*搖頭*/if(dw==0){P31=0;P32=0;P55=0;}
- if(fl==0&dw==1){P31=1;P32=0;P55=0;q=16;}/*慢檔*/
- if(fl==0&dw==2){P31=0;P32=1;P55=0;q=17;}/*中檔*/
- if(fl==0&dw==3){P31=0;P32=0;P55=1;q=18;}/*快檔*/
- if(on==1&m==0xfd88){ds=ds+1800;d0=0;TR0=1;if(ds>28800){ds=0;}cd=1;gj=1;j=0;m=0;}
- /*定時(shí)控制函數(shù)*//*8.0小時(shí)=480分鐘=28800秒 999秒=16.65分鐘=0.2775小時(shí)*/
- if(ds>999){g=19;s=ds/60/6%10;b=ds/60/60;}/*g位顯示H,s顯示10進(jìn)制的分鐘,b顯示小時(shí)加小數(shù)點(diǎn)*/
- if(ds<999){g=ds%10;s=ds/10%10;b=ds/100%10;/*q=ds/1000%10;*/}/*顯示剩余秒數(shù)*/
- if(on==1&m==0xfd84){fl++;if(fl>2){fl=0;}zd=0;cd=1;j=0;m=0;}if(fl==0){se=0;}
- /*A類(lèi)自然風(fēng):高速運(yùn)轉(zhuǎn)10秒,中速運(yùn)轉(zhuǎn)10秒,低速運(yùn)轉(zhuǎn)10秒;進(jìn)入循環(huán)*/
- if(fl==1){q=10;if(se>1&se<11){zd=3;}if(se>10&se<21){zd=2;}if(se>20&se<31){zd=1;}if(se>30|se==0){se=1;}TR0=1;}
- /*b類(lèi)睡眠風(fēng):高速轉(zhuǎn)10分鐘,中速轉(zhuǎn)30分鐘;之后退出睡眠模式,返回長(zhǎng)風(fēng)1檔*/
- if(fl==2){q=11;if(se>1&se<600){zd=3;}if(se>600&se<1800){zd=2;}if(se>1800){m=0xfd84;}if(se==0){se=1;}TR0=1;}
- if(zd==1){P31=1;P32=0;P55=0;}/*慢檔*/if(zd==2){P31=0;P32=1;P55=0;}/*中檔*/if(zd==3){P31=0;P32=0;P55=1;}/*快檔*/
- if(m==0xfdc3){cd=~cd;j=0;m=0;}/*彩燈開(kāi)關(guān),關(guān)機(jī)后單顯示電壓,開(kāi)機(jī)后定時(shí)和電壓切換顯示*/
- if(ds!=0&c==0){ET0=1;}/*定時(shí)打開(kāi)時(shí),檢測(cè)有無(wú)紅外信號(hào)*/if(se!=0&c==0){ET0=1;}/*自動(dòng)風(fēng)打開(kāi)時(shí),檢測(cè)有無(wú)紅外信號(hào)*/
- }
- void fmq()/*蜂鳴器*/
- {
- if(off==0&buz>0)
- {
- buz++;
- P54=0;
- }
- if(buz>800)/*延時(shí)*/
- {
- P54=1;
- if(m==0xfd81)
- {
- off=1;
- m=0;
- }
- buz=0;
- }
- }
- void main()
- {
- P1M0=0xff; P1M1=0; P3M0=0x06; P3M1=0; P5M0=0x30; P5M1=0;/*端口模式*/
- P31=0;P32=0;P33=1;P54=1;P55=0;cd=1;j=0;dw=0;ds=0;gj=0;yt=0;buz=0;/*初始化*/
- d0init()/*定時(shí)器0初始化*/;d1init();/*定時(shí)器1初始化*/int1init();/*外部中斷1初始化*/
- buz=1;fmq();/*上電蜂鳴器響一聲*/
- while(1)
- {
- ircl();
- kayscan();
- kzhs();
- fmq();
- }
- }
- /*傳統(tǒng)51單片機(jī)具有5個(gè)中斷源,中斷優(yōu)先級(jí)從高到低依次是:外部中斷0(interrupt0)、定時(shí)器0(interrupt1)、外部中斷1(interrupt2)、定時(shí)器1(interrupt3)和串口中斷(interrupt4)。*/
- void dsq0() interrupt 1
- {
- unsigned int ms,tu,tm;
- tu=965; /*調(diào)整微秒,建議:965*/
- tm=99; /*毫秒調(diào)整,建議:99*/
- d0=d0++; /*每約1微秒加1*/
- if(buz>0)
- {
- buz++;
- P54=0;
- }
- if(buz>800) /*延時(shí)*/
- {
- P54=1;
- buz=0;
- }
- if(!P33) /*檢測(cè)到紅外信號(hào)*/
- {
- ET0=0; /*返回主程序*/
- }
- if(d0>tu) /*受紅外信號(hào)檢測(cè)影響,建議199*/
- {
- ms++; /*每約1000微秒=1毫秒*/
- d0=0; /*us清零*/
- }
- if(ms>tm/2) /*每約0.5秒*/
- {
- sm=0; /*關(guān)閉閃秒*/
- }
- if(ms>tm) /*每約1000毫秒=1秒 參考值:19*/
- {
- if(ds>0)
- {
- ds--; /*定時(shí)秒數(shù)自減*/
- }
- se++;
- sm=1; /*點(diǎn)亮閃秒*/
- if(gj==1&ds==0)/*允許關(guān)機(jī),定時(shí)時(shí)間到了*/
- {
- m=0xfd81; /*送出關(guān)機(jī)指令*/
- gj=0;
- }
- ms=0; /*毫秒清零*/
- }
- }
- void int1() interrupt 2 /*外部中斷1服務(wù)函數(shù),低電平觸發(fā)*//*受遙控中斷影響,不夠時(shí)間處理編碼,記錄時(shí)間不放在這函數(shù)*/
- {
- unsigned char i;
- j++; /*編碼位置*/
- if(m==0) /*如果還沒(méi)解碼正確*/
- {
- for(i=1;i<13;i++) /*未捕獲間隔碼*/
- {
- r=r<<1; /*從低位起左移1位*/
- if(ir[i]>70&&ir[i]<125) /*編碼為1*/
- {
- r=r|0x001;/*或1*/
- }
- }
- }
- if(j>12){r=r|0xf000;} /*表示收到符合長(zhǎng)度的編碼*/
- else{r=0x0000;} /*干擾清零*/
- if(r==0xfd81|r==0xfd82|r==0xfd84|r==0xfd88|r==0xfd90|r==0xfdc3|r==0xfda0|r==0xfdc6)
- {
- m=r; /*收錄合格編碼*/
- buz=1; /*啟動(dòng)蜂鳴器*/
- }
- else
- {
- m=0; /*干擾碼清零*/
- }
- if(j>12&m==0){j=0;} /*如果大于12位了,編碼還不正確,就把位置清零,防止下一幀亂碼*/
- }
- void dsqi() interrupt 3 /*定時(shí)器1 中斷服務(wù)函數(shù),每約13微秒中斷1次*/{d1++;/*每約13微秒加1*/}
復(fù)制代碼 |
|