关于单片机红外解码问题求教
2019-07-15 08:53发布
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
我用51单片机尝试了红外解码,可以在1602上显示编码,但是有几个问题还是不能搞明白,希望大神们能够帮助一下:(1)在红外解码初始化的程序中:TR0=1;//开启了定时器。但是在外部中断函数里直接读取定时器的值作为起始码的时间,如果运行很长时间才按下按键,这个时候外部中断函数里得到的定时器时间根本就不是起始码的时间,怎么能判断是这个是起始码呢?
(2)在运行过程中,发现一个问题:第一次按键需要按两次才能够正常工作,请问这是什么原因呢?
下面附上我的程序,希望大神们能够帮忙解答一下,不胜感激。(因为字符限制,就把1602显示函数给删了)
#include <reg51.h>
#include <intrins.h>
#include <intrins.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define Imax 14000 //15.19 ms
#define Imin 8000 //8.68 ms
#define Inum1 1450 //1.57 ms
#define Inum2 700 //0.75 ms
#define Inum3 3000 //3.25 ms
unsigned char Im[4]={0x00,0x00,0x00,0x00};
uchar INT0_Step;
ulong m,Tc;
uchar IrOK;
uchar num;
uchar a,b,c,d;
sbit INT00 =P3^2;
sbit led0 =P1^0;
sbit led1 =P1^1;
sbit led2 =P1^2;
sbit led3 =P1^3;
//LCD
sfr DBPort = 0x80;
sbit rs = P2^0;
sbit rw = P2^1;
sbit en = P2^2;
uchar code table1[ ] = " Red Control ";
uchar code table2[ ] = " IR-CODE: -----H";
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void lcd_display()
{
lcd_init();
lcd_wcmd(0x80);
for(num=0;num<16;num++)
{
lcd_wdat(table1[num]);
delay(5);
}
lcd_wcmd(0xc0);
for(num=0;num<16;num++)
{
lcd_wdat(table2[num]);
delay(5);
}
}
void Hongwai_INT0_SET()
{
IT0=1;
EX0=1;
TMOD|=0x01;
TH0=0;
TL0=0;
TR0=1;
EA=1;
}
void display()
{
switch(Im[2])
{
case 0x64:
{
led0=0;
led1=1;
led2=1;
led3=1;
}
break;
case 0x54:
{
led0=1;
led1=0;
led2=1;
led3=1;
}
break;
case 0x74:
{
led0=1;
led1=1;
led2=0;
led3=1;
}
break;
case 0x44:
{
led0=1;
led1=1;
led2=1;
led3=0;
}
break;
}
}
void intersvr1() interrupt 0
{
Tc=TH0*256+TL0;
TH0=0;
TL0=0;
if(INT0_Step==0)
{
if((Tc>Imin)&&(Tc<Imax))
{
m=0;
INT0_Step=1;
}
else
{
INT0_Step=0;
}
}
if(INT0_Step==1)
{
if(Tc>Inum1&&Tc<Inum3)
{
Im[m/8]=Im[m/8]>>1|0x80;
m++;
}
else if(Tc>Inum2&&Tc<Inum1)
{
Im[m/8]=Im[m/8]>>1;
m++;
}
if(m>=32)
{
m=0;
INT0_Step=0;
if(Im[2]==~Im[3])
{
IrOK=1;
}
else
{
IrOK=0;
}
}
}
else
{
INT0_Step=0;
}
if(IrOK)
{
IrOK=0;
一周热门 更多>