本帖最后由 Metalor 于 2010-7-11 16:00 编辑
弄了很久了,一直有问题。请大家帮发我看看我的程序有什么问题。用的是51单片机,买的遥控器,自己焊了个接收电路。将接收的信号接入中断脚。
现在的情况是遥控器上的部分按键能解码成功,但还有部分按键无法解码。遥控器隔太远(大概超过1m)就无**常解码……
而且只能解码一次,之后程序就一直停在那,不管按什么键都不动……必须复位才能再次工作。有点像进入了某个死循环,但检查了很久也没发现原因。
还有希望大家讲讲怎么防止阳光的干扰,因为我一通上电之后一体化接收头就一直在接收数据,程序就不停滴进入中断,我用程序基本上解决了这个问题,但单片机老进入中断也不是根本的办法呀。。谢谢大家了~
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
unsigned long date;
uchar t2;
uint num;
bit start;
void init();
void reseve();
void main()
{
init();
while(1)
{
reseve();
}
}
void reseve()
{
if(num==32) //已接收完毕
{
uchar ad1,ad2,da1,da2; //ad1,ad2用来装地址码,da1,da2用来装数据码
EX0=0;
TR2=0;
t2=0;
start=0;
num=0;
// ad1=date; //先暂时不管地址码
// date>>=8;
// ad2=date;
date>>=16;
da1=date; //读取数据码
date>>=8;
da2=date; //读取数据反码
if(ad1==ad2) //判断两次地址码是否一样
{
if((da1+da2)==0xff) //判断数据码和数据反码是否正确
P1=da2; //P1接8个LED灯
}
}
}
void int0() interrupt 0
{
uchar t; //t用来读取定时器溢出次数
TR2=0;
t=t2; //读取计数器溢出次数
t2=0;
TR2=1; //计数器继续计数
if(start==0) //start为1表示已收到正确的起始码,为0表示未收到起始码
{
P1=0xff;
if(t>7) //超过8ms,起始码正确,
start=1; if(t>14) //t>14说明是干扰,丢弃。程序重新回到未收到起始码的状态
{
TR2=0;
t2=0;
start=0;
date=0;
num=0;
}
}
else
{
P1=0x55;
if(t>14) //t>14说明是干扰,此语句用于消除干扰
{
TR2=0;
t2=0;
start=0;
date=0;
num=0;
}
else if(t>=2) //大于等于2ms,判为1
{
date>>=1; //date用来装接收到的数据
date|=0x80000000;
}
else //否则判为1
date>>=1;
num++; //接收到一位加1,加到32则说明以接受完一次数据
}
}
void timer2() interrupt 5 //定时器2
{
TF2=0; //清楚标志
t2++;
}
void init() //初始化
{
start=0,t2=0,num=0;
EA=1;
ET2=1;
IT0=1; //下降沿触发
T2CON=0x00; //定时/计数器2,16位自动重装
TH2=0xfc; //1ms中断一次
TL2=0x66;
RCAP2H=0xfc;
RCAP2L=0x66;
EX0=1; //开中断
} |