樓主的程序我加上了控制LED的正確函數。加上三極管就可以控制繼電器驅動電器。- /***********************************************
- 功能:萬能紅外遙控器解碼并用數碼管顯示。
- 只顯示鍵值碼.根據鍵值控制LED
- 加上三極管就可以控制繼電器
- 紅外接收頭的輸出接外部中斷1. P3.3
- 晶振:11.0592M
- 單片機:STC12C5A60S2
- 作者 :蘇義江改編自51黑論壇
- *************************************************/
- #include <reg52.h>
- #define uchar unsigned char
- sbit dula=P0^7;
- sbit wela=P0^6;
- sbit fmq=P1^7;
- sbit IR=P3^3;
- //共陽
- uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
- 0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,
- 0xa1,0x86,0x8e,0x89};
- //共陰
- /*uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
- 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; */
- uchar f;
- #define Imax 14000 //此處為晶振為11.0592時的取值,
- #define Imin 8000 //如用其它頻率的晶振時,
- #define Inum1 1450 //要改變相應的取值。
- #define Inum2 700
- #define Inum3 3000
- uchar Im[4]={0x00,0x00,0x00,0x00};
- uchar show[2]={0,0};
- unsigned long m,Tc;
- unsigned char IrOK;
- void delay(uchar i)//延時
- {
- uchar j,k;
- for(j=i;j>0;j--)
- for(k=125;k>0;k--);
- }
- void display()//顯示函數
- {
- P2=table[show[0]];
- dula=1;
- dula=0;
- P2=0xff;
-
- wela=0;
- P2=0xfe;
- wela=1;
- wela=0;
- delay(5);
-
- P2=table[show[1]];
- dula=1;
- dula=0;
- P2=0xff;
-
- P2=0xfd;
- wela=1;
- wela=0;
- delay(5);
- }
- //外部中斷1解碼程序
- void intersvr1(void) interrupt 2 using 1
- {
- fmq=0; //蜂鳴器響
- Tc=TH0*256+TL0; //提取中斷時間間隔時長
- TH0=0;
- TL0=0; //定時中斷重新置零
- if((Tc>Imin)&&(Tc<Imax))
- {
- m=0;
- f=1;
- return;
- } //找到啟始碼
- if(f==1)
- {
- if(Tc>Inum1&&Tc<Inum3)
- {
- Im[m/8]=Im[m/8]>>1|0x80; m++;
- }
- if(Tc>Inum2&&Tc<Inum1)
- {
- Im[m/8]=Im[m/8]>>1; m++; //取碼
- }
- if(m==32)
- {
- m=0;
- f=0;
- if(Im[2]==~Im[3])//鍵值碼和反碼相同
- {
- IrOK=1; //正確至1
- }
- else IrOK=0; //取碼完成后判斷讀碼是否正確
- }
- //準備讀下一碼
- }
- fmq=1; //蜂鳴器關,如果嫌吵,可刪掉此行和上面對應的開喇叭那一行
- }
- /*主程序*/
- void main(void)
- {
- uint a;
- m=0;
- f=0;
- EA=1;
- IT1=1;
- EX1=1;
- TMOD=0x11;
- TH0=0;TL0=0;
- TR0=1;
- while(1)
- {
-
- if(IrOK==1)
- {
- show[1]=Im[2] & 0x0F; //取鍵碼的低四位
- show[0]=Im[2] >> 4;
- IrOK=0;
- }
- for(a=100;a>0;a--)
- {
- display();
- }
- switch(Im[2])
- {
- case 0x1b:P0=0XFE;break;
- case 0x18:P0=0XFd;break;
- case 0x17:P0=0XFb;break;
- case 0x16:P0=0XF7;break;
- case 0x15:P0=0Xef;break;
- case 0x14:P0=0Xdf;break;
- default: break;
- // return;
- }
- }
- }
復制代碼 |