谁能帮我解释一下这个有关51单片机的红外解码的部分程序

谁能帮我解释一下这个有关51单片机的红外解码的部分程序,第1张

那个N大于30是因为已经超出了0和1代表的时间长度。0和1所代表的高低电平时间不一样。当高电平时长超过n=8时,代表1否则代表0这个是和你红外设置的0,1代表时间长度有关系,请问你有时序图吗??那就一目了然了

我以前做的一个项目,红外遥控开关,解码部分的code,供参考

6121码,外部中断0,at89s52

void int0() interrupt 0 //外部中断1服务函数,红外解码程序

{

static uchar wei; //定义静态变量

static uchar pp; //定义静态变量

if(tt<56&&tt>50) {d2=0; tt=0;pp=0;wei=0;}//起始信号符合,将d2标记为0,各变量清零

if(tt>11)tt=0;

if(d2==0&&tt>=4)

{

buf[pp]>>=1;

if(tt>5) buf[pp]|=0x80; //如果时间大于780us ,则视为收到数据1

wei++;

if(wei==8)

{

pp++;

wei=0;

if(pp==4) { pp=0; d2=1;} //接收满4个字节,标志位清除

} //在 d2为0期间进入中断8次,说明已经收到一个字节数据,字节号加1

}

tt=0;//每次进入中断都清零

}

void timer1() interrupt 3 //红外解码计时

{

tt++;

}

红外解码,先有引导码9ms高电平45ms低电平,然后是用户正码,用户反码,按键正码,按键反码,IRCOM[2]是一个4位数组,用来存放红外接受码的,IRCOM[0]是用来存放用户正码IRCOM[1]用户反码、IRCOM[2]按键正码、IRCOM[3]按键反码,你程序里面:

if (IRCOM[2]!=取反IRCOM[3]) //判断如果按键正码不等于取反按键反码

{

EX0=1; //打开外部中断0

return; //跳出结束

}

IRCOM[0]用户正码、IRCOM[1]用户反码,0和1是用来区别不同遥控器的,市场上面遥控器很多,都是用用户码来区别不同遥控器的,希望我的回答对你有帮助!

#include <reg52h> //特殊寄存器头文件

#define c(x) (x110592/120000) //是晶振值,为计数器计一下所需要的微秒数,120000为12M,110592为110592M

sbit Ir_Pin=P3^3; //位声明,把P33/外部中断1的状态读到Ir_Pin中

unsigned char code Led_Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,

0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //共阳极数码显示码0-F

unsigned char code Led_Sel[]={0xe,0xd,0xb,0x7}; //位选编码

unsigned char Led_Buf[4]; //显示缓冲区

char Led_Index; //位选信号定义

unsigned char Ir_Buf[4]; //用于保存解码结果

//==============================================================

//数码管扫描

timer0() interrupt 1 using 1 //定时器中断零程序

{

TH0=(65536-1000)/256;

TL0=(65536-1000)%256; //定时器0设定约1000us中断一次,用于数码管扫描

P0=0xff; //数码管初始显示零

P2=Led_Sel[Led_Index]; //位选

P0=Led_Tab[Led_Buf[Led_Index]]; //段选

if(++Led_Index>3) Led_Index=0; //四个扫描完了,到第一个数码管

}

//==============================================================

unsigned int Ir_Get_Low() //脉冲为低电平的时间

{

TL1=0;

TH1=0; //为定时器1赋初值

TR1=1; //开启定时器1

while(!Ir_Pin && (TH1&0x80)==0); //判断,如果P33口为低电平则执行TR1=0

TR1=0; //关闭定时器1

return TH1256+TL1; //返回TH1256+TL1的值

}

//=============================================================

unsigned int Ir_Get_High() //脉冲高电平时间

{

TL1=0;

TH1=0; //为定时器1赋初值

TR1=1; //开启定时器1

while(Ir_Pin && (TH1&0x80)==0); //判断,如果P33口为低电平则执行TR1=0

TR1=0; //关闭定时器1

return TH1256+TL1; //返回TH1256+TL1的值

}

//==============================================================

main()

{

unsigned int temp;

char i,j;

Led_Index=1;

TMOD=0x11;

TL0=(65536-1000)%256;

TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描

EA=1; //开总中断

ET0=1; //定时计数器0的开放控制位

TR0=1; //定时器0的运行控制位

Led_Buf[0]=0;

Led_Buf[1]=0;

Led_Buf[2]=0;

Led_Buf[3]=0; //显示区设成0

do{

restart:

while(Ir_Pin); //判断P33口

temp=Ir_Get_Low(); //取脉冲为低电平的时间

if(temp<c(8500) || temp>c(9500)) continue; //引导脉冲低电平9000

temp=Ir_Get_High(); //取脉冲高电平时间

if(temp<c(4000) || temp>c(5000)) continue; //引导脉冲高电平4500

for(i=0;i<4;i++) //4个字节

for(j=0;j<8;j++) //每个字节8位

{

temp=Ir_Get_Low();

if(temp<c(200) || temp>c(800)) goto restart; //根据编码格式,低电平小于02ms大于08ms视为无效电平,重新检测

temp=Ir_Get_High();

if(temp<c(200) || temp>c(2000)) goto restart; //根据编码格式,低电平小于02ms大于2ms视为无效电平,重新检测

Ir_Buf[i]>>=1; //把Ir_Buf[i]右移一位,然后赋值给Ir_Buf[i]

if(temp>c(1120)) Ir_Buf[i]|=0x80; //根据编码格式,如果电平大于112ms,则把0x80赋值给Ir_Buf[i]

}

Led_Buf[0]=Ir_Buf[2]&0xf;

Led_Buf[1]=(Ir_Buf[2]/16)&0xf;

Led_Buf[2]=Ir_Buf[3]&0xf;

Led_Buf[3]=(Ir_Buf[3]/16)&0xf; //显示结果

}while(1);

}

sbit d1=P1^0,d2=P1^2,d3=P1^3;//不能这应进行位定义。应改为:

sbit d1=P1^0;

sbit d2=P1^2;

sbit d3=P1^3;

程序中的TR=1;应该是TR0 = 1;如果不是,那么TR这个变量在使用前就没有声明,所以发生错误。

以上就是关于谁能帮我解释一下这个有关51单片机的红外解码的部分程序全部的内容,包括:谁能帮我解释一下这个有关51单片机的红外解码的部分程序、关于51单片机红外解码程序,哪位大侠帮我看下、51单片机 红外控制程序中 if (IRCOM[2]!=~IRCOM[3]) { EX0=1; return; }是什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9797319.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存