‘壹’ 51单片机 红外控制程序中 if (IRCOM[2]!=~IRCOM[3]) { EX0=1; return; }是什么意思
应该是接到的数据,正反码吧,因为红外线可能受干扰,需要校验 一般会采取发两个字节,这两个字节的值是反码关系,接受如果发现不是就认为数据出错。。。。。EX0的作用就不知道了,也许是某个IO,猜测而已,你如果把源码发出来可能分析一下,凭空写个这东西很难知道干啥的。。。
‘贰’ 51单片机怎么用红外线
--你是指红外遥控解码吧,给你一点提示,在单片机定义一个I/O口为红外遥控的输入端口,(红外遥控解码不一定要用到定时器和中断方式.具体方法有很多的,看场合选取)当然输入这个端口的信号是经过遥控接收电路处理过的一串数据,如TTL或者CMOS电平。再然后就是对这个输入信号进行处理,也就是解调出遥控码值出来,要解这个码,首先又要知道其波形如何,即是逻辑电平和时序等问题...
建议你还是先熟知一下各种IR的遥控协议,有挺多的,典型的有NEC,飞利浦等。说说NEC的也有两种,简单的一种就是有32位数据,前16bit为地址码,后16bit为遥控码值的正码与反码,地址码用于区分相同协议下不同的遥控所带来的干扰等,正码和反码用于解调后进行校验数据。不多说了,主要是找点相关资料研究研究就明白了。图片是一个32bitNEC的遥控波形,这个波形的地址码是807F,正码是0x12,如果看懂了,用MCU解遥控码就很容易了..
‘叁’ 最简单51单片机红外编码获取问题
这有个帖子,你看了就明白,看看是怎样实现输入晶振频率自适应解码。
#define CPU_Fosc 12000000L //输入主频,自适应解码(单位:Hz,范围:6MHz ~ 40MHz)
红外线解码程序+遥控器程序+仿真文件(可定义任意I/O作接收脚,支持长/短按,适应6MHz~40MHz)
http://www.ourdev.cn/thread-5155483-1-1.html
‘肆’ 51单片机红外线发射时,数据是高位在前还是低位在前
高位在前,先是前导,后面是数据
‘伍’ 谁有51单片机红外遥控亮灭LED代码就只要一个键控制点亮,另一个键控制灭就行
答:编程思路兄穗 红外遥控羡如卜解橡逗码。
上面是 "0" / "1" 的表示方法
用中断 测出 低脉冲的持续就可以知道 0 1 了, 最后通过键数据码 来定义 单片机要干什么事
‘陆’ 51单片机红外遥控和按键怎么连接
1、首先通过4个按键,可以直接按下触发红外线编码。
2、其次发射出的红外线与红外线遥控器相同。
3、最后接通电源,系统进入工作状态,等待接收命令即可。
‘柒’ 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();
}
}
}
解码程序这个就能实现