|
- /*風(fēng)扇遙控芯片:BA5104 紅外遙控解碼程序 晶振頻率:11.0592MHZ 1幀12位,一次至少發(fā)2幀*//*歷時8天成功調(diào)試,干擾碼直接清零,只顯示相關(guān)鍵值*/
- /*解碼后的鍵值:關(guān)機(jī) 0xfd81; 開/風(fēng)速 0xfd82; 風(fēng)類 0xfd84; 定時 0xfd88; 搖頭 0xfd90; 彩燈 0xfdc3; 無 0xfda0; 無 0xfdc6*/
- #include "STC8G.h"/*單片機(jī):STC8G1K08-TSSOP20*//*紅外端口:P33(包含外部中斷1,改端口時要注意)*/
- unsigned char q,b,s,g,/*位選*/xs,ir[13],j,c;unsigned int r,m,d0,d1;
- unsigned char code dm[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};/*共陰段碼*/
- void delayms(unsigned int i){while(i--);}/*延時函數(shù)*/
- void int1init(){IT1=1;EX1=1;EA=1;}/*外部中斷1初始化函數(shù),設(shè)置成下降沿觸發(fā)*/
- void d1r1Init()/*定時器1初始化函數(shù)*/{AUXR |= 0x40;/*1T*/TMOD &= 0x0F;TL1 = 0x70;/*初始值*/TH1 = 0xFF;/*初始值*/TF1 = 0;/*清除TF1標(biāo)志*/TR1=0;/*先不啟動*/ET1=1;/*開中斷*/EA=1;}
- void kayscan()/*P1端口對地增加按鍵*/
- {
- P1=0xff;
- P34=1;P35=1;P36=1;P37=1;
- if(P11==0){delayms(5);if(P11==0){IAP_CONTR |= 0x20;/*軟件復(fù)位,并且從用戶程序開始執(zhí)行*/while(!P11);}}
- if(P12==0){delayms(5);if(P12==0){xs=1;while(!P12);}}if(P13==0){delayms(5);if(P13==0){xs=2;while(!P13);}}
- 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;/*個位*/}
- if(i==0){P1=dm[q];}/*千位*/if(i==1){P1=dm[b];}/*百位*/if(i==2){P1=dm[s];}/*十位*/if(i==3){P1=dm[g];}/*個位*/delayms(50); /*間隔一段時間掃描*/P1=0x00;/*消隱*/}
- }
- void ircl()/*紅外時間記錄*/
- {
- unsigned char c1;
- if(!P33)
- {
- d1=0;
- TR1=1;/*啟動定時器1*/
- while(!P33);
- TR1=0;
- ir[j]=d1;
- }
- /*編碼位置清零*/
- if(P33==1&&j>0)/*當(dāng)端口高電平時,編碼位置還未清零*/
- {
- c++;/*計算一下持續(xù)時間*/
- if(c>250){c1++;c=0;}/*超過一定的時間*/
- if(c1>5){j=0;c1=0;}/*就要再次按遙控按鍵*/
- /*如果還有干擾碼就直接清零*/
- }
- }
- void xssz() /*顯示的數(shù)值*/
- {
- /*按K1顯示收錄的紅外編碼*/
- if(xs==0){g=m/1%16;s=m/16%16;b=m/256%16;q=m/4096%16;}/*1倍代表示4位16進(jìn)制,16倍表示8位16進(jìn)制,256倍表示12位16進(jìn)制,4096倍表示16位16進(jìn)制*/
- /*按K2顯示0表示編碼位置清零成功*/
- if(xs==1){g=c%10;s=c/10%10;b=c/100%10;q=0;}
- /*按K3顯示大約中斷次數(shù)和快速清零*/
- if(xs==2){g=j%10;s=j/10%10;b=j/100%10;q=j/1000%10;}
- }
- void main()
- {
- P1M0=0xff; P1M1=0; P3M0=0; P3M1=0; P5M0=0; P5M1=0;/*端口模式*/P33=1;j=0;xs=0;
- d1r1Init();/*定時器1初始化*/
- delayms(1000);/*等待電源穩(wěn)定*/
- int1init();/*外部中斷1初始化*/
- while(1)
- {
- ircl();
- kayscan();
- xssz();
- display();
- }
- }
- /*傳統(tǒng)51單片機(jī)具有5個中斷源,中斷優(yōu)先級從高到低依次是:外部中斷0(interrupt0)、定時器0(interrupt1)、外部中斷1(interrupt2)、定時器1(interrupt3)和串口中斷(interrupt4)。*/
- void int1() interrupt 2 /*外部中斷1服務(wù)函數(shù),低電平觸發(fā)*//*受遙控中斷影響,不夠時間處理編碼,記錄時間不可以在這函數(shù)里*/
- {
- unsigned int i;
- j++;/*編碼位置*/
- if(m==0)/*如果還沒解碼正確*/
- {
- for(i=1;i<13;i++)/*未捕獲間隔碼*/
- {
- r=r<<1;
- if(ir[i]>70&&ir[i]<125)
- {
- r=r|0x001;
- }
- }
- }
- if(j>12){r=r|0xf000;}/*表示收到符合長度的編碼*/else{r=0x0000;}/*清零*/
- if(r==0xfd81|r==0xfd82|r==0xfd84|r==0xfd88|r==0xfd90|r==0xfdc3|r==0xfda0|r==0xfdc6)
- {
- m=r;/*收錄合格編碼*/
- }
- else
- {
- m=0;
- }
- if(j>12&m==0){j=0;}/*如果大于12位了,編碼還不正確,就把位置清零,防止下一幀亂碼*/
- }
- void TM1_Isr() interrupt 3 /*定時器1 中斷服務(wù)函數(shù),每約13微秒中斷1次*/{d1++;/*每約13微秒加1*/}
復(fù)制代碼 |
|