『壹』 單片機如何實現紅外遙控
以下文件是51單片機實現遙控解碼,通過數碼管顯示鍵碼的程序,P0口驅動數碼管段選,p2.6和p2.7為數碼管位選,接收頭連到P3.2口。此程序以通過驗證,可以直接編譯使用,另外還有一個繼電器和蜂鳴器的控制,不用可以屏蔽掉。
;********************************************************************************
;* 描述: *
;* 遙控鍵值讀取器 *
;* 數碼管顯示, P0口為數碼管的數據口 *
;* *
;********************************************************************************
;遙控鍵值解碼-數碼管顯示 *
;********************************************************************************/
#include <reg51.h>
#include <intrins.h>
void IR_SHOW();
void delay(unsigned char x);//x*0.14MS
void delay1(unsigned char ms);
void beep();
sbit IRIN = P3^2;
sbit BEEP = P3^7;
sbit RELAY= P1^3;
sbit GEWEI= P2^7;
sbit SHIWEI= P2^6;
unsigned char IRCOM[8];
unsigned char code table[16] =
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
main()
{
IE = 0x81; //允許總中斷中斷,使能 INT0 外部中斷
TCON = 0x1; //觸發方式為脈沖負邊沿觸發
delay(1);
IRIN=1;
BEEP=1;
RELAY=1;
for(;;)
{
IR_SHOW();
}
} //end main
void IR_IN() interrupt 0 using 0
{
unsigned char i,j,k,N=0;
EA = 0;
I1:
for (i=0;i<4;i++)
{
if (IRIN==0) break;
if (i==3) {EA =1;return;}
}
delay(20);
if (IRIN==1) goto I1; //確認IR信號出現
while (!IRIN) //等 IR 變為高電平
{delay(1);}
for (j=0;j<4;j++)
{
for (k=0;k<8;k++)
{
while (IRIN) //等 IR 變為低電平
{delay(1);}
while (!IRIN) //等 IR 變為高電平
{delay(1);}
while (IRIN) //計算IR高電平時長
{
delay(1);
N++;
if (N>=30) {EA=1;return;}
}
IRCOM[j]=IRCOM[j] >> 1;
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
N=0;
}//end for k
}//end for j
if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
IRCOM[5]=IRCOM[2] & 0x0F;
IRCOM[6]=IRCOM[2] & 0xF0;
IRCOM[6]=IRCOM[6] >> 4;
beep();
EA = 1;
}
void IR_SHOW()
{
P0 = table[IRCOM[5]];
GEWEI = 0;
SHIWEI = 1;
delay1(4);
P0 = table[IRCOM[6]];
SHIWEI = 0;
GEWEI = 1;
delay1(4);
}
void beep()
{
unsigned char i;
for (i=0;i<100;i++)
{
delay(5);
BEEP=!BEEP;
}
BEEP=1;
}
void delay(unsigned char x)//x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
void delay1(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i<120; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
『貳』 51單片機怎麼用紅外遙控小車
檢查看電機是否影響了紅外接收的供電
『叄』 紅外遙控器與51單片機
org 00h ORG 30H MOV P1,#0FFH MOV P2,#0FFH MOV P3,#0FFH START:
JB P3.7,$;等待遙控信號出現 SB: MOV R4,#8 ;8毫秒為高電平錯誤 SBA: MOV R5,#250 SBB: JB P3.7,SXB1 DJNZ R5,SBB DJNZ R4,SBA MOV R4,#2 JMP SBC SXB1: MOV R5,#5 SXB2: ;去掉20US的尖峰干擾信號 JNB P3.7,SBB DJNZ R5,SXB2 JMP START SBC: MOV R5,#250 SB1: JB P3.7,SB2 ;2MS內不為高電平錯誤(監測9MS的低電 平引導碼) DJNZ R5,SB1 DJNZ R4,SBC JMP START SB2: ;去掉20US的尖峰干擾信號 MOV R5,#5 SB2_A: JNB P3.7,SB1 DJNZ R5,SB2_A MOV R4,#3 SB2_1: MOV R5,#250 SB3: ;監測4.5MS高電平,如3MS內出現低電平錯誤 JNB P3.7,SXC DJNZ R5,SB3 DJNZ R4,SB2_1 MOV R4,#2 JMP SB3_1 SXC: ;去掉20US的尖峰干擾信號 MOV R5,#5 SXC1: JB P3.7,SB3 DJNZ R5,SXC1 JMP START SB3_1: ;監測4.5MS高電平,如5MS內不為低電平錯誤 MOV R5,#250 SB3_2: JNB P3.7,SB4 DJNZ R5,SB3_2 DJNZ R4,SB3_1 JMP START SB4: ;去掉20US的尖峰干擾信號 MOV R5,#5 SB4_1: JB P3.7,SB3_2 DJNZ R5,SB4_1 MOV R1,#1AH ;設定1AH為起始RAM區 MOV R2,#4 PP: MOV R3,#8 JJJJ: MOV R5,#250 JJJJ2: ;1MS內不為低電平錯誤 JB P3.7,JJJJ3 DJNZ R5,JJJJ2 JMP START JJJJ3: LCALL YS1 ;高電平開始後用882微秒的時間尺去判斷信 號此時的高低電平狀態 MOV C,P3.7 ;將P3.7引腳此時的電平狀態0或1存入C中 JNC UUU ;如果為0就跳轉到UUU MOV R5,#250 JJJJ4: JNB P3.7,UUU NOP DJNZ R5,JJJJ4 JMP START UUU:MOV A,@R1 ;將R1中地址的給A RRC A ;將C中的值0或1移入A中的最低位 MOV @R1,A ;將A中的數暫時存放在R1中 DJNZ R3,JJJJ ;接收地址碼的高8位 INC R1 ;對R1中的值加1,換成下一個RAM DJNZ R2,PP ;接收完16位地址碼和8位數據碼和8位數據 反碼,存放在1AH/1BH/1CH/1DH的RAM中 ;以下對代碼是否正確和定義進行識別 MOV A,1AH;比較高8位地址碼 XRL A,#00000000B;判斷1AH的值是否等於00000000, 相等的話A為0 JNZ EXIT;如果不相等說明解碼失敗退出解碼程序 MOV A,1BH;比較低8位地址 XRL A,#11111111B;再判斷高8位地址是否正確 JNZ EXIT;如果不相等說明解碼失敗退出解碼程序 LCALL YS3 MOV A,1CH;比較數據碼和數據反碼是否正確? CPL A XRL A,1DH ;將1CH的值取反後和1DH比較 不同則無效丟 棄,核對數據是否准確 JNZ EXIT;如果不相等說明解碼失敗退出解碼程序 LCALL YS3 AJMP BIJIAO ;判斷在118毫秒內是否有連發碼 AA:MOV R1,#25 XX:ACALL YS2 JNB P3.7,HH;跳轉到判斷連發代碼是否正確的程序段 DJNZ R1,XX EXIT: ;對所有埠清零
AJMP START ;連發碼判斷程序段-----------HH:MOV R6,#4 S: ACALL YS1;調用882微秒延時子程序 JB P3.7,EXIT;延時882微秒後判斷P3.7腳是否出現高電平 如果有就退出解碼程序 DJNZ R6, S;重復4次,目的是確認連發碼的低電平信號波 形 JNB P3.7, $ ;等待高電? LCALL YS3 AJMP AA
BIJIAO:MOV A,1CH;按鍵數值判斷執 CJNE A,#10h,TT1 clr p0.0 TT1: CJNE A,#03h,T2 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p0.1 T2: CJNE A,#01h,T3 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p0.2 T3: CJNE A,#06h,T4 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p0.3 T4: CJNE A,#09h,T5 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p0.4 T5: CJNE A,#1dh,T6 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p0.5 T6:CJNE A,#1fh,T7 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p0.6 T7: CJNE A,#0dh,T8 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p0.7 T8:CJNE A,#19h,t9 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p1.0 T9:CJNE A,#1bh,t10 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p1.1 T10: CJNE A,#11h,t11 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p1.2 T11: CJNE A,#15h,t12 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p1.3 T12: CJNE A,#17h,t13 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p1.4 T13: CJNE A,#12h,t14 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p1.5 T14: CJNE A,#16h,t15 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p1.6 T15: CJNE A,#4ch,t16 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p1.7 T16: CJNE A,#40h,t17 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p2.0 T17: CJNE A,#48h,t18 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p2.1 T18: CJNE A,#04h,t19 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p2.2 T19: CJNE A,#00h,t20 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p2.3 T20: CJNE A,#02h,t21 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p2.4 T21: CJNE A,#05h,t22 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p2.5 T22: CJNE A,#54h,t23 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p2.6 T23: CJNE A,#4dh,t24 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p2.7 T24: CJNE A,#0ah,t25 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p3.0 T25: CJNE A,#1eh,t26 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p3.1 T26: CJNE A,#0eh,t27 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p3.2 T27: CJNE A,#,t28 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p3.3 T28: CJNE A,#1ch,t29 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p3.4 T29: CJNE A,#14h,t31 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
clr p3.5 T31: CJNE A,#0ch,t32 mov p0,#0ffh mov p1,#0ffh mov p2,#0ffh mov p3,#0ffh
t32:AJMP AA YS1:MOV R4,#20 ;延時子程序1,精確延時882微秒 D1: MOV R5,#20 DJNZ R5,$ DJNZ R4,D1 RET YS2: MOV R4,#10 ;延時子程序2,精確延時4740微秒 D2: MOV R5,#235 DJNZ R5,$ DJNZ R4,D2 RET YS3:MOV R4,#2;延時程序3,精確延時1000微秒 D3:MOV R5,#248 DJNZ R5,$ DJNZ R4,D3 RET END
『肆』 51單片機紅外遙控控制小車
沒有人把程序寫出來就可以正常運行的,都是需要調試的。慢慢調試好就可以了。
首先調試紅外發送的數據,接收端是否能正常接收,例如可以先把紅外解碼做好。然後就是小車的驅動是否正常,即用固定的數據寫進去,小車是否能按預期運行。
然後再結合調試。
『伍』 求51單片機紅外遙控程序
sbitIR_OUT=P3^2;
unsignedcharSigInfo[4];//存儲紅外按鍵編碼,SigInfo[2]為按鍵值
voidCmd_Require(void);
voidINT_Ext0()interrupt1//外部中斷0
{
u8i,j;
u16time=8000;
EA=0;
for(i=0;i<10;i++){
delay0_7ms();
if(IR_OUT){
EA=1;
return;
}
}
while(!IR_OUT);
delay2_5ms();
if(!IR_OUT){
EA=1;
return;
}
while(IR_OUT&&time){
time--;
}
time=8000;
for(i=0;i<4;i++){
for(j=0;j<8;j++){
SigInfo[i]>>=1;
while(!IR_OUT);
delay0_7ms();
if(IR_OUT){
SigInfo[i]|=0x80;
while(IR_OUT&&time){
time--;
}
time=8000;
}
}
}
Cmd_Require();
EA=1;
}
voidCmd_Require(void)
{
switch(SigInfo[2]){
case0x0c:
//此處代碼隨意
break;
case0x18:
//...
break;
//...
default:
break;
}
}
延時沒寫,因單片機而異的,要精確點才能解碼。
『陸』 51單片機紅外遙控
需要找讀碼器讀出來,給你一具C51的紅外C程序,試用過,可以用。
/*
紅外遙控編碼識別工具軟體
C51紅外遙控鍵碼識別軟體,用軟體方法測量紅外遙控編碼,由串口送出,利用串口調試助手接收,顯示鍵碼規律,
由顯示的高低電平長度,可以分析出是PHILIPS編碼(PPM編碼),還是NEC編碼(PWM編碼),再根據編碼的長度,
編寫識別軟體,我做實驗的晶體頻率是11.0592MHZ,長度是軟體執行周期的相對值,如果識別軟體採用相同的脈沖
寬度測量方法,可以用於鍵碼識別。
*/
#include <reg51.H>
sbit IFda = P3^3;
unsigned char idata dat[230]={1,};
void main(void)
{
SCON=0X52;
TMOD=0X20;
TH1=0XFD;
TR1=1;
EX1=1;
EA =1;
IFda =1;
while (1);
}
void IFreceiver(void) interrupt 2
{
unsigned char i;
unsigned int s;
EA=0;
if(IFda==0)
{
dat[i]=0XF0;
i++;
for(s=1;s!=0; s++) if(IFda==1) break;
dat[i]=s/256;
i++;
dat[i]=s;
i++;
}
if(IFda==1)
{
dat[i]=0xFF;
i++;
for(s=1;s!=0;s++) if(IFda==0) break;;
dat[i]=s/256;
i++;
dat[i]=s;
i++;
}
for(i=0;i<216;i++)
{
TI=0;
SBUF=dat[i];
while(TI==0);
}
for(s=1;s!=0;s++);
EA=1;
}
『柒』 51單片機最小系統怎樣連接紅外遙控模塊
紅外信號的發射由紅外發射電路中的紅外發光二極體完成,通常情況下為了提高抗干擾能力與降低電源消耗,遙控器將遙控信號(二進制脈沖碼)調制在載波(載波是傳送信息的物理基礎和承載工具)上經放大後發送至紅外二極體,再由二極體轉換為紅外信號發送出去。遙控器上不同的按鍵有著不一樣的鍵值,按下相對應的鍵,紅外二極體就會發送對應的信號,接收裝置接收到信號後會對信號進行信號解調後會得到相應按鍵的鍵值,再根據不同的鍵值執行相應的操作。
『捌』 51單片機紅外遙控程序是什麼
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden = P2^7;
sbit lcdrs = P2^6;
sbit lcdwr = P2^5;
sbit IR = P3^2;
uchar IRCOM[6];//數組,用於存儲紅外編碼
uchar code table1[] = "remote control";
uchar code table2[] = "CODE:";
void delayms(uchar x)// 延時x*0.14ms
{
uchar i;
while(x--)
for(i=0;i<13;i++){}
}
void delay(uchar x) //延時xms
{
uchar i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
/****************************LCD部分***********************************************/
void write_com(uchar com)
{
lcden = 0;
lcdrs = 0;
lcdwr = 0;
P0 = com;
delay(5);
lcden = 1;
delay(5);
lcden = 0; //別忘了lcden拉低
}
void write_date(uchar date)
{
lcden = 0;
lcdrs = 1;
lcdwr = 0;
P0 = date;
delay(5);
lcden = 1;
delay(5);
lcden = 0;
}
void lcd_init(void)
{
lcden = 0;
lcdrs = 0;
lcdwr = 0;
delay(5);
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
/*****************main()************************/
void main(void)
{
uchar count=0;
IR = 1;
lcd_init();
write_com(0x80);
while(table1[count]!='\0')
{
write_date(table1[count]);
count++;
delay(5);
}
count = 0;
write_com(0x80+0x40);
while(table2[count]!='\0')
{
write_date(table2[count]);
count++;
delay(5);
}
IE = 0x81; //開中斷
TCON = 0x01;//脈沖負邊沿觸發
while(1);
}
/*********************紅外中斷**************************/
void IR_time() interrupt 0
{
uchar i,j,TimeNum=0;//TimeNum用來計IR高電平次數 從而判斷是0還是1
EX0 = 0; //關閉中斷
delayms(5);
if(1 == IR)
{
EX0 = 1;
return;
}
while(!IR) //跳過9ms前導低電平
delayms(1);
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
while(IR) //跳過4.5ms的前導高電平
delayms(1);
while(!IR) //跳過0.56ms的低電平
delayms(1);
while(IR)
{
TimeNum++; //計時高電平時間從而判斷讀取的是0還是1
delayms(1);
}
if(TimeNum>=30)//按鍵按下時間過長 跳過
{
EX0 = 1;
return;
}
IRCOM[i] = IRCOM[i]>>1;
if(TimeNum >= 8) //8*0.14ms 這時讀取的是1;
{
IRCOM[i] = IRCOM[i]|0x80;
}
TimeNum = 0;
}
}
if(IRCOM[2]!=~IRCOM[3])//判斷八位數據和八位數據反碼是否相等
{
EX0 = 1;
return;
}
IRCOM[4] = IRCOM[2]&0x0f;//取低四位
IRCOM[5] = IRCOM[2]>>4; //IRCOM[5]取IRCOM[2]高四位
if(IRCOM[4] > 9) //轉換成字元
{
IRCOM[4] = IRCOM[4] + 0x37;
}
else
IRCOM[4] = IRCOM[4] + 0x30;
if(IRCOM[5] > 9)
{
IRCOM[5] = IRCOM[5] + 0x37;
}
else
IRCOM[5] = IRCOM[5] + 0x30;
delay(5);
write_com(0x80 + 0x40 + 5);
write_date(IRCOM[5]);
write_date(IRCOM[4]);
EX0 = 1; //重新開啟外部中斷
}
『玖』 51單片機怎麼用紅外線
--你是指紅外遙控解碼吧,給你一點提示,在單片機定義一個I/O口為紅外遙控的輸入埠,(紅外遙控解碼不一定要用到定時器和中斷方式.具體方法有很多的,看場合選取)當然輸入這個埠的信號是經過遙控接收電路處理過的一串數據,如TTL或者CMOS電平。再然後就是對這個輸入信號進行處理,也就是解調出遙控碼值出來,要解這個碼,首先又要知道其波形如何,即是邏輯電平和時序等問題...
建議你還是先熟知一下各種IR的遙控協議,有挺多的,典型的有NEC,飛利浦等。說說NEC的也有兩種,簡單的一種就是有32位數據,前16bit為地址碼,後16bit為遙控碼值的正碼與反碼,地址碼用於區分相同協議下不同的遙控所帶來的干擾等,正碼和反碼用於解調後進行校驗數據。不多說了,主要是找點相關資料研究研究就明白了。圖片是一個32bitNEC的遙控波形,這個波形的地址碼是807F,正碼是0x12,如果看懂了,用MCU解遙控碼就很容易了..