❶ 基于51单片机的红外接收模块的c编程
这个是自己搭电路 然后用红外接收管,利用外部中断计数器的管脚,才专捕捉到的脉冲属,在进行软件内部的解码解调,照这个思路就可以努力想,才能学会51单片机,而且51是最基础的,还是自己做出来为好。
红外发射模块用51单片机编程使用:用定时器中断来做,红外发送引脚连接到P1.0口, 计数一下定时初值(让P1.0的翻转频率为38KHZ),进定时器中断就对P1.0取反,这样红外就发送出去了。
❷ 51单片机红外接收端的程序怎么写,我想知道写的方法和原理,最好有一个具体的模版,好让我参考.
这是采用STC12C5A60S2单片机的红外解码程序及其说明。
;采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的"0";
;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的"1
;上述"0"和"1"组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,
;达到降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空间发射
;遥控编码是连续的32位二进制码组,其中前16位为用户识别码,能区别不同的电器设备,
;防止不同机种遥控码互相干扰。该芯片的用户识别码固定为十六进制01H
;后16位为8位操作码(功能码)及其反码。
;当一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这108ms发射代码由一个起始码(9ms),
;一个结果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)
;和这8位数据的反码(9ms~18ms)组成。如果键按下超过108ms仍未松开,
;接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。
;
;解码的关键是如何识别"0"和"1",接收端而言,"0"是0.56ms的高+0.56ms的低。"1"是1.68ms的高+0.56ms的低。
;所以可以根据高电平的宽度区别"0"和"1"。当高电平出现时开始延时,0.56ms以后,若读到的电平为低,
;说明该位为"0",反之则为"1",为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为"0",
;读到的已是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms左右均可。
;为了共用引导部分延时程序,这里用0.9ms延时。
;-------------红外解码程序---------------------------
EXINT0:
PUSH ACC
PUSH PSW
PUSH 1
PUSH 2
PUSH 6
CLR EA ;暂时关闭中断请求
MOV R6,#10
EXINT10:
LCALL DELAY09MS ;调用900us延时子程序
JB IRIN,INTOUT1 ;判断P3.2是否有高电平,如果有就退出解码程序
DJNZ R6,EXINT10 ;循环10次,检测在900微妙中是否存在高电平。以上完成对遥控信号的9000微秒的初始低电平信号的识别。
JNB IRIN,$ ;等待高电平避开9毫秒低电平引导脉冲
LCALL DELAY45MS ;延时4.5毫秒
;-------------接受32位代码--------------------------
MOV R1,#IRUSERL
MOV R2,#04H
EXINT101:
MOV R6,#08H ;每组数据位8位
EXINT102:
JNB IRIN,$ ;等待地址码第一组数据的高电平信号
LCALL DELAY09MS ;高电平开始后延时判断信号此时的高/低状态
MOV C,IRIN ;将P3.2引脚此时的电平状态0或1存入C中
JNC INT1OUT ;如果为0跳出
LCALL DELAY1MS
INT1OUT:
MOV A,@R1
RRC A ;将C中的数据0/1移入A中最低位
MOV @R1,A ;将A中的数据暂存在R1
DJNZ R6,EXINT102 ;接受完8位代码
INC R1
DJNZ R2,EXINT101 ;接受完4组32位代码
;--------------数据码比较-------------------------------
MOV A,IRDATAL
; LCALL SENDRXDAT
MOV A,IRDATAL
CPL A
CJNE A,IRDATAH,INTOUT1 ;判断数码正误,不等退出
MOV IR_DAT,IRDATAL ;相等则保存正确数据
MOV A,IR_DAT
; LCALL SENDRXDAT
SETB IRBIT
INTOUT1:
LCALL DELAY45MS
SETB EA ;允许中断
POP 6
POP 2
POP 1
POP PSW
POP ACC
RETI
;;*****************11.0592*900=9953******************
DELAY09MS: ;6
PUSH 4 ;4
PUSH 3 ;4
MOV R4,#20 ;2
DLY900:
MOV R3,#122 ;2
DJNZ R3,$ ;4
DJNZ R4,DLY900 ;4
MOV R4,#11 ;2
DJNZ R4,$ ;4
POP 3 ;3
POP 4 ;3
RET ;4
;TOTAL=9952
;;*****************11.0592*560=6193******************
DELAY056: ;6
PUSH 4 ;4
PUSH 3 ;4
MOV R4,#12 ;2
DLY5600:
MOV R3,#122 ;2
DJNZ R3,$ ;4
DJNZ R4,DLY5600 ;4
MOV R4,#71 ;2
DJNZ R4,$ ;4
POP 3 ;3
POP 4 ;3
RET ;4
;TOTAL=6194
;;*****************11.0592*4500=49766****************
DELAY45MS: ;6
PUSH 4 ;4
PUSH 3 ;4
MOV R4,#52 ;2
DLY45:
MOV R3,#236 ;2
DJNZ R3,$ ;4
DJNZ R4,DLY45 ;4
MOV R4,#85 ;2
DJNZ R4,$ ;4
POP 3 ;3
POP 4 ;3
RET ;4
;;TOTAL=49768
;;*****************11.0592*1000=11059****************
DELAY1MS: ;6
PUSH 4 ;4
PUSH 3 ;4
MOV R4,#20 ;2
DLY1MS:
MOV R3,#136 ;2
DJNZ R3,$ ;4
DJNZ R4,DLY1MS ;4
MOV R4,#8 ;2
DJNZ R4,$ ;4
POP 3 ;3
POP 4 ;3
RET ;4
;TOTAL=11060
;;***************************************************
DELAY100US: ;6
PUSH 4 ;4
MOV R4,#140 ;2
DJNZ R4,$ ;4
MOV R4,#131 ;2
DJNZ R4,$ ;4
POP 4 ;3
RET ;4
;TOTAL=1105
;;***************************************************
❸ 51单片机红外解码C程序
单片机采用外部中断P3.3管脚和红外接收头的信号线相连,中断方式为边沿触发方式。并用定时器0计算中断的间隔时间,来区分前导码、二进制的“1”、“0”码。并将8位操作码提取出来在数码管上显示。
// 解码值在Im[2]中,当IrOK=1时解码有效。
/* 51单片机红外遥控解码程序 */
//用遥控器对准红外接收头,按下遥控器按键,在数码管前两位上就会显示对应按键的编码
#include <reg52.h>
#define uchar unsigned char
sbit la=P2^6;
sbit wela=P2^7;
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
unsigned char 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()
{
la=0;
P0=table[show[0]];
la=1;
la=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);
P0=table[show[1]];
la=1;
la=0;
P0=0xfd;
wela=1;
wela=0;
delay(5);
} //外部中断解码程序
void intersvr1(void) interrupt 2 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;
}
else IrOK=0; //取码完成后判断读码是否正确
}
//准备读下一码
}
}
/*演示主程序*/
void main(void)
{
unsigned int a;
m=0;
f=0;
EA=1;
IT1=1;EX1=1;
TMOD=0x11;
TH0=0;TL0=0;
TR0=1;//ET0=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();
}
}
}
解码程序这个就能实现
❹ 基于51单片机红外遥控代码(C语言)
以下文件是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_();
}
}
}