出于興趣做的萬能紅外解碼器,請大家多多指教。
本設計基于51單片機設計
主要功能可以解讀紅外的用戶碼和地址碼
可以通過不同按鍵控制同一繼電器并且保存按鍵值
0.png (43.05 KB, 下載次數: 48)
下載附件
2018-12-25 01:49 上傳
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.png (33.78 KB, 下載次數: 40)
下載附件
2018-12-25 01:50 上傳
0.png (11.2 KB, 下載次數: 37)
下載附件
2018-12-25 01:50 上傳
單片機源程序如下:
-
- #include<reg52.h>
- #include"bst_car.h"
- #include"led.h"
- #include "uart.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define Imax 14000 //此處為晶振為11.0592時的取值,
- #define Imin 8000 //如用其它頻率的晶振時,
- #define Inum1 1450 //要改變相應的取值。
- #define Inum2 700
- #define Inum3 3000
- sbit s1=P2^1;
- sbit s2=P2^4;
- sbit s3=P2^3;
- sbit s4=P2^2;
- sbit fmq=P2^0;
- sbit s11=P3^7;
- sbit s12=P3^6;
- sbit s13=P3^5;
- sbit s14=P3^4;
- unsigned char flag_REC;
- unsigned char buff[20]=0;
- unsigned char f=0,aa,zz,cc,cc1,dd;
- unsigned char Im[4]={0x00,0x00,0x00,0x00};
- unsigned char show[2]={0,0};
- unsigned long m,Tc;
- unsigned char IrOK;
- uchar code Tab1[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//"0123456789ABCDEF";
- uchar Tab2[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- /************************************************************************/
- void delayms(uchar x)
- {
- unsigned int i,j;
- for(i=0;i<x;i++)
- for(j=0;j<110;j++)
- ;
- }
-
- /*--主函數--*/
- void jieshou()
- {
- if(Im[2]==Tab2[1])
- {
- aa=aa;
- }
- else
- if(Im[2]==Tab2[2])
- {
- aa=aa;
- }
- else
- if(Im[2]==Tab2[3])
- {
- aa=aa;
- }
- else
- if(Im[2]==Tab2[4])
- {
- aa=aa;
- }
- else
- if(Im[2]==Tab2[5])
- {
- aa=aa;
- }
- else
- if(Im[2]==Tab2[6])
- {
- aa=aa;
- }
- else
- if(Im[2]==Tab2[7])
- {
- aa=aa;
- }
- else
- if(Im[2]==Tab2[8])
- {
- aa=aa;
- }
- else
- if(Im[2]==Tab2[9])
- {
- aa=aa;
- }
- else
- if(Im[2]==Tab2[10])
- {
- aa=aa;
- }
- else
- if(Im[2]==Tab2[11])
- {
- aa=aa;
- }
- else
- if(Im[2]==Tab2[12])
- {
- aa=aa;
- }
- else
- if(Im[2]==Tab2[13])
- {
- aa=aa;
- }
- else
- if(Im[2]==Tab2[14])
- {
- aa=aa;
- }
- else
- if(Im[2]==Tab2[15])
- {
- aa=aa;
- }
- else
- if(Im[2]==Tab2[16])
- {
- aa=aa;
- }
- else
- if(Im[2]==Tab2[17])
- {
- aa=aa;
- }
- else
- if(Im[2]==Tab2[18])
- {
- aa=aa;
- }
- else
- if(Im[2]==Tab2[19])
- {
- aa=aa;
- }
- else
- if(Im[2]==Tab2[20])
- {
- aa=aa;
- }
- else
- if(Im[2]==Tab2[21])
- {
- aa=aa;
- }
- else
- if(Im[2]==Tab2[22])
- {
- aa=aa;
- }
- else
- if(Im[2]==Tab2[23])
- {
- aa=aa;
- }
- else
- if(Im[2]==Tab2[24])
- {
- aa=aa;
- }
- else
- {aa=aa+1;}
- }
- void shuju()
- {
- Tab2[aa]=Im[2];
-
- if(Im[2]==Tab2[1])
- {
-
- s1=~s1;
- LcdWriteCom(0x84);
- LcdWriteData('0'+0);
- LcdWriteData('0'+1);
-
- }
- else
- if(Im[2]==Tab2[2])
- {
-
- LcdWriteCom(0x84);
- LcdWriteData('0'+0);
- LcdWriteData('0'+2);
- s2=~s2;
- }
- else
- if(Im[2]==Tab2[3])
-
- {
-
- s3=~s3;
- LcdWriteCom(0x84);
- LcdWriteData('0'+0);
- LcdWriteData('0'+3);
-
- }
- else
- if(Im[2]==Tab2[4])
- {
-
- s4=~s4;
- LcdWriteCom(0x84);
- LcdWriteData('0'+0);
- LcdWriteData('0'+4);
-
- }
- else
-
-
- // { dd=1;
- // TMOD= 0X20;
- if(Im[2]==Tab2[5])
- {
- dd=dd+1;
- LcdWriteCom(0x84);
- LcdWriteData('0'+0);
- LcdWriteData('0'+5);
- }
- else
- if(Im[2]==Tab2[6])
- {
- // dd=0;
- // TMOD= 0X11;
-
- LcdWriteCom(0x84);
- LcdWriteData('0'+0);
- LcdWriteData('0'+6);
- }
- else
- if(Im[2]==Tab2[7])
-
- {
-
- LcdWriteCom(0x84);
- LcdWriteData('0'+0);
- LcdWriteData('0'+7);
- }
- else
- if(Im[2]==Tab2[8])
- {
-
- LcdWriteCom(0x84);
- LcdWriteData('0'+0);
- LcdWriteData('0'+8);
- }
- else
- if(Im[2]==Tab2[9])
- {
-
- LcdWriteCom(0x84);
- LcdWriteData('0'+0);
- LcdWriteData('0'+9);
- }
- else
- if(Im[2]==Tab2[10])
- {
-
- LcdWriteCom(0x84);
- LcdWriteData('0'+1);
- LcdWriteData('0'+0);
- }
- else
- if(Im[2]==Tab2[11])
- {
-
- LcdWriteCom(0x84);
- LcdWriteData('0'+1);
- LcdWriteData('0'+1);
- }
- else
- if(Im[2]==Tab2[12])
- {
-
- LcdWriteCom(0x84);
- LcdWriteData('0'+1);
- LcdWriteData('0'+2);
- }
- else
- if(Im[2]==Tab2[13])
- {
-
- LcdWriteCom(0x84);
- LcdWriteData('0'+1);
- LcdWriteData('0'+3);
- } else
- if(Im[2]==Tab2[14])
- {
-
- LcdWriteCom(0x84);
- LcdWriteData('0'+1);
- LcdWriteData('0'+4);
- }
- else
- if(Im[2]==Tab2[15])
- {
-
- LcdWriteCom(0x84);
- LcdWriteData('0'+1);
- LcdWriteData('0'+5);
- }
- else
- if(Im[2]==Tab2[16])
- {
-
- LcdWriteCom(0x84);
- LcdWriteData('0'+1);
- LcdWriteData('0'+6);
- }
- else
- if(Im[2]==Tab2[17])
- {
-
- LcdWriteCom(0x84);
- LcdWriteData('0'+1);
- LcdWriteData('0'+7);
- }
- else
- if(Im[2]==Tab2[18])
- {
-
- LcdWriteCom(0x84);
- LcdWriteData('0'+1);
- LcdWriteData('0'+8);
- }
- else
- if(Im[2]==Tab2[19])
- {
-
- LcdWriteCom(0x84);
- LcdWriteData('0'+1);
- LcdWriteData('0'+9);
- }
- else
- if(Im[2]==Tab2[20])
- {
-
- LcdWriteCom(0x84);
- LcdWriteData('0'+2);
- LcdWriteData('0'+0);
- }
- else
- if(Im[2]==Tab2[21])
- {
-
- LcdWriteCom(0x84);
- LcdWriteData('0'+2);
- LcdWriteData('0'+1);
- } else
- if(Im[2]==Tab2[22])
- {
-
- LcdWriteCom(0x84);
- LcdWriteData('0'+2);
- LcdWriteData('0'+2);
- }
- else
- if(Im[2]==Tab2[23])
- {
-
- LcdWriteCom(0x84);
- LcdWriteData('0'+2);
- LcdWriteData('0'+3);
- }
- else
- if(Im[2]==Tab2[24])
- {
-
- LcdWriteCom(0x84);
- LcdWriteData('0'+2);
- LcdWriteData('0'+4);
- }
- else
- if(Im[2]==Tab2[25])
- {
-
- LcdWriteCom(0x84);
- LcdWriteData('0'+2);
- LcdWriteData('0'+5);
- }
- }
- void xianshi()
- {
-
- LcdWriteCom(0x8A);
- if(cc==0xa)
- {
- LcdWriteData('A');
- }
- else
- if(cc==0xb)
- {
- LcdWriteData('B');
- }
- else
- if(cc==0xc)
- {
- LcdWriteData('C');
- }else
- if(cc==0xd)
- {
- LcdWriteData('D');
- }else
- if(cc==0xe)
- {
- LcdWriteData('E');
- }else
- if(cc==0xf)
- {
- LcdWriteData('F');
- }
- else
- LcdWriteData('0'+Tab1[cc]);
-
- if(cc1==0xa)
- {
- LcdWriteData('A');
- }
- else
- if(cc1==0xb)
- {
- LcdWriteData('B');
- }
- else
- if(cc1==0xc)
- {
- LcdWriteData('C');
- }else
- if(cc1==0xd)
- {
- LcdWriteData('D');
- }else
- if(cc1==0xe)
- {
- LcdWriteData('E');
- }else
- if(cc1==0xf)
- {
- LcdWriteData('F');
- }
- else
- LcdWriteData('0'+Tab1[cc1]);
- }
- void lanya()
- {
- if(flag_REC==1) //
- {
- flag_REC=0;
- if(buff[0]=='o') //第一個字節為O,第二個字節為N,第三個字節為控制碼
-
- switch(buff[1])
- {
- case '1' :
- if(buff[2]=='0')
- s1=1;
- else
- s1=0;
- break;
- case '2':
- if(buff[2]=='0')
- s2=1;
- else
- s2=0;
- break;
- case '3':
- if(buff[2]=='0')
- s3=1;
- else
- s3=0;
- break;
- case '4':
- if(buff[2]=='0')
- s4=1;
- else
- s4=0;
- break;
- case '5':
- if(buff[2]=='0')
- dd=1;
- else
- dd=0;
- break;
- }
- LcdWriteCom(0xC7);
- LcdWriteData('O');
- LcdWriteData('0'+buff[1]);
- LcdWriteData('0'+buff[2]);
- }
-
- }
- void hwint()
- {
- s11=s12=s13=s14=0;
- m=0;
- f=1;
- IT0=1;
- EX0=1;
- TMOD=0x11;
- TH0=0;
- TL0=0;
- TR0=1;
- EA=1;
- }
- void main(void)
- {
- LcdInit();
- hwint();
-
- aa=0;
- LcdWriteCom(0x80);
- LcdWriteData('H');
- LcdWriteData('W');
- LcdWriteCom(0xC0);
- LcdWriteData('L');
- LcdWriteData('A');
- LcdWriteData('N');
- LcdWriteData('Y');
- LcdWriteData('A');
- LcdWriteCom(0x88);
- LcdWriteData('0');
- LcdWriteData('X');
- while(1) /*無限循環*/
- {
-
-
- if(IrOK==1) //如果處理好后進行紅外處理
- {
-
- shuju();
- xianshi();
- IrOK=0;
- LcdWriteCom(0x8e);
- LcdWriteData('0'+dd);
- delayms(1000);
- EA=1;
- }
- if(dd==3)
- {
- dd=0;
- Uart_init();
- while(1)
- {
- lanya();
- LcdWriteCom(0x8e);
- LcdWriteData('0'+dd);
- if(dd==1)
- {
- dd=0;
- hwint();
- break;
- }
- }
- }
- if(s11==1)
- {
- s1=~s1;
- while(!s11);
- }
- if(s12==1)
- {
- s2=~s2;
- while(!s12);
- }
- if(s13==1)
- {
- s3=~s3;
- while(!s13);
- }
- if(s14==1)
- {
- s4=~s4;
- while(!s14);
- }
- }
- }
- /************************************************************************/
- //外部中斷解碼程序
- void intersvr0(void) interrupt 1 using 1
- {
- 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;
- jieshou();
- cc=Im[2]/0x10;
- cc1=Im[2]%0x10;
- fmq=0;
- delayms(100);
- fmq=1;
- delayms(100);
- EA=0;
- if(Im[2]==Tab2[aa])
- {
- delayms(200);
- {
- if(Im[2]==Tab2[aa])
- {
- delayms(2100);
- }
- }
- }
- }
- else IrOK=0; //取碼完成后判斷讀碼是否正確
- }
- //準備讀下一碼
- }
-
- }
- void uart_rx(void) interrupt 4 using 3 //放在這里 和放在main()里面是一樣的
- {
- unsigned char i;
- unsigned char flag;
- unsigned char dat;
- if(RI) //是否接收中斷
- {
- RI=0;
- dat=SBUF;
- if(dat=='o'&&(i==0)) //接收數據第一幀
- {
- buff[i]=dat;
- flag=1; //開始接收數據
- }
- else
- if(flag==1)
- {
- i++;
- buff[i]=dat;
- if(i>=2)
- {
- i=0;
- flag=0;
- flag_REC=1 ;
- } // 停止接收
- }
- }
- }
-
復制代碼
所有資料51hei提供下載:
程序PCB.7z
(1.23 MB, 下載次數: 45)
2023-3-14 13:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|