![]() |
發(fā)布時間: 2016-9-25 23:39
正文摘要:紅外線編碼是數(shù)據(jù)傳輸和家用電器遙控常用的一種通訊方法,其實質(zhì)是一種脈寬調(diào)制的串行通訊。家電遙控 中常用的紅外線編碼電路有μPD6121G型HT622型和7461型等。 這里就以 ... |
感謝樓主無私奉獻的分享。 原程序只有LCD屏幕顯示遙控器鍵值,發(fā)光二極管沒有點亮。 在樓主的基礎上增加了點燈功能,分享給大家。 #include "At89x51.h" #include "stdio.h" #include "stdlib.h" #include "string.h" sbit RELAY1= P1^0; sbit RELAY2= P1^1; sbit RELAY3= P1^2; sbit RELAY4= P1^3; sbit RELAY5= P1^4; sbit RELAY6= P1^5; sbit RELAY7= P1^6; sbit RELAY8= P1^7; #define JINGZHEN 48 #define TIME0TH ((65536-100*JINGZHEN/12)&0xff00)>>8 #define TIME0TL ((65536-100*JINGZHEN/12)&0xff) #define TIME1TH ((65536-5000*JINGZHEN/12)&0xff00)>>8 #define TIME1TL ((65536-5000*JINGZHEN/12)&0xff) #define uchar unsigned char #define uint unsigned int code uchar BitMsk[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,}; uint IrCount=0,Show=0,Cont=0; uchar IRDATBUF[32],s[20]; uchar IrDat[5]={0,0,0,0,0}; uchar IrStart=0,IrDatCount=0; extern void initLCM( void); extern void DisplayListChar(uchar X,uchar Y, unsigned char *DData); void timer1int (void) interrupt 3 using 3{ EA=0; TH1 = TIME1TH; TL1 = TIME1TL; Cont++; if(Cont>10)Show=1; EA=1; } void timer0int (void) interrupt 1 using 1{ uchar i,a,b,c,d; EA=0; TH0 = TIME0TH; TL0 = TIME0TL; if(IrCount>500)IrCount=0; if(IrCount>300&&IrStart>0){IrStart=0;IrDatCount=0;IrDat[0]=IrDat[1]=IrDat[2]=IrDat[3]=0;IrCount=0;} if(IrStart==2) { IrStart=3; for(i=0;i<IrDatCount;i++) { if(i<32) { a=i/8; b=IRDATBUF[i]; c=IrDat[a]; d=BitMsk[i%8]; if(b>5&&b<14)c|=d; if(b>16&&b<25)c&=~d; IrDat[a]=c; } } if(IrDat[2]!=~IrDat[3]) { IrStart=0;IrDatCount=0;IrDat[0]=IrDat[1]=IrDat[2]=IrDat[3]=0;IrCount=0; } EA=1; return; } IrCount++; EA=1; } void int0() interrupt 0 using 0 { EA=0; if(IrStart==0) { IrStart=1;IrCount=0;TH0 = TIME0TH;TL0 = TIME0TL; IrDatCount=0;EA=1; return; } if(IrStart==1) { if(IrDatCount>0&&IrDatCount<33) IRDATBUF[IrDatCount-1]=IrCount; if(IrDatCount>31) {IrStart=2;TH0 = TIME0TH;TL0 = TIME0TL;EA=1;return;} if(IrCount>114&&IrCount<133&&IrDatCount==0) {IrDatCount=1;}else if(IrDatCount>0)IrDatCount++; } IrCount=0;TH0 = TIME0TH;TL0 = TIME0TL; EA=1; } main() { uchar *a,n; TMOD |= 0x011; TH0 = TIME0TH; TL0 = TIME0TL; ET0=1; TR0=1; ET1=1; TR1=1; IT0 = 1; EX0 = 1; initLCM(); EA=1; for(;;) { if(Show==1) { Show=0; Cont=0; DisplayListChar(0,1,"Please keys"); a=""; switch (IrDat[3]) { case 0x12: a="ON/C"; break; case 0x0b: a="+/-"; break; case 0x1a: a="+"; break; case 0x1e: a="-"; break; case 0x0e: a="/"; break; case 0x1d: a="MRC"; break; case 0x1f: a="M-"; break; case 0x1b: a="M+"; break; case 0x00: if(IrDat[2]==0xff)a="0"; break; case 0x01: a="1"; RELAY1=!RELAY1; break; case 0x02: a="2"; RELAY2=!RELAY2; break; case 0x03: a="3"; RELAY3=!RELAY3; break; case 0x04: a="4"; RELAY4=!RELAY4; break; case 0x05: a="5"; RELAY5=!RELAY5; break; case 0x06: a="6"; RELAY6=!RELAY6; break; case 0x07: a="7"; RELAY7=!RELAY7; break; case 0x08: a="8"; RELAY8=!RELAY8; break; case 0x09: a="9"; break; case 0x2A: a="%"; break; case 0x2B: a="X"; break; case 0x2C: a="."; break; case 0x2D: a="="; break; case 0x2E: a=" "; break; } n=strlen(a); if(n>0)sprintf(s,"Key is [%s]",a);else sprintf(s,"Not Key ",a); DisplayListChar(0,0,s); } } } |
參與人數(shù) 1 | 黑幣 +50 | 收起 理由 |
---|---|---|
![]() | + 50 | 回帖助人的獎勵! |
請問這個程序可以改為2*2的矩陣鍵盤嘛? |
謝謝分享,非常有用 |
6666很棒 |
謝謝。 |
![]() 謝謝分享啊 |
謝謝分享啊 |
666 謝謝分享![]() |
謝謝分享 |
謝謝分享! |
Powered by 單片機教程網(wǎng)