打印

麻烦大家帮我看看这个红外解码程序

[复制链接]
1603|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Metalor|  楼主 | 2010-7-11 15:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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;    //开中断
}

相关帖子

沙发
戒指320| | 2010-7-11 17:09 | 只看该作者
其实写程序倒没什么,难的是从里面查出问题,我觉得 这个问题你还是自己好好查查。如果能贴上波形图,大家可以帮你分析一下

使用特权

评论回复
板凳
Metalor|  楼主 | 2010-7-12 22:36 | 只看该作者

顶一下~

使用特权

评论回复
地板
xxdcq| | 2010-7-13 17:19 | 只看该作者
用万能红外解码模块吧!
不需要关心红外编码协议
http://www.yofeng.com/IrCtrR.asp

使用特权

评论回复
5
大秦正声| | 2010-7-13 17:41 | 只看该作者
建议用uart串口发送和接收!简单,可靠,我的使用距离在9米以上,波特率2400b/s

不要使用外部中断引脚解码 !很繁琐



承接USB和RF设计应用
销售c8051f单片机开发工具、usb、RF 、NET学习板
http://yang96381.blog.163.com

使用特权

评论回复
6
bpwater| | 2010-7-13 17:55 | 只看该作者
软件的问题,自己慢慢查,这个其实很简单的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

224

帖子

1

粉丝