打印

红外解码程序!!请高手帮忙看看

[复制链接]
楼主: 贺信
手机看帖
扫描二维码
随时随地手机跟帖
41
服了...红外仿真个P,,,红外信号难道还跟着你停顿的?                拿个口出来点灯,,,再弄个串口输出.

使用特权

评论回复
42
酱油店老板| | 2009-10-14 10:14 | 只看该作者
延时什么的可以纯软仿真,看看到底大概跑多长时间,

使用特权

评论回复
43
酱油店老板| | 2009-10-14 10:14 | 只看该作者
大多情况下不建议硬仿真.

使用特权

评论回复
44
xwj| | 2009-10-14 10:29 | 只看该作者
唉,服了你了

延时死等的方法是最笨也最不可靠的,你的程序没有任何错误判断和超时退出处理,
要是信号被干扰、或被挡了一下、或者别的遥控器发个别的编码,你这程序岂不是100%的死翘翘?

所以,LZ还是先去看看老x N年前发的状态机的典范-HT6222红外遥控芯片接收程序
学会设计、应用最简单的状态机的思路和方法吧~


这种方法,由于只是处理信号下降沿,所以可以空出很多时间留给前台操作;而且可以容许很大的波特率误差

使用特权

评论回复
45
贺信|  楼主 | 2009-10-14 10:30 | 只看该作者
谢谢大家的教训,本人实在惭愧,我会好好努力的!!谢谢

使用特权

评论回复
46
贺信|  楼主 | 2009-10-14 10:31 | 只看该作者
"到节点3就不亮了,前面的灯都亮"
回复:
问题出在这里:

//节点2
        ET1 = 1;                                //当有低电平到来打开定时器
        while(IR_RE == 0);                //低电平等待,T0计数 ...
程序匠人 发表于 2009-10-13 21:17


下面是我的定时器中断实验
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int

sbit led   = P2^1; //红外接受中断口

/***************************定时器0初始化*********************************/
void InitialTimer0()
{
TMOD = 0x01;  // 定时器0, 1工作模式1, 16位定时方式

TH1  = 0xfe;  //定时500uS
TL1  = 0x0c;
//TCON = 0x01;
EA   = 1;
ET0=1;     
TR0  = 1;   //开定时器0中断
}
/**************************定时器0中断******************
定时500uS,用来解码高低电平
********************************************************/
void timer0() interrupt 1
{


//T0Count++;
led =~led;

TH1 = 0xfe;        //定时500uS
TL1 = 0x33;

}

//**********************主程序**********************************
void main()
{
InitialTimer0(); //定时器0初始化
while(1)
{
  ;
}
}
开始程序里面有个错,我的定时器ET0=1没开!!!!
实验出来的定时时间也有错下面有我采集出来的定时器产生的波形!!

使用特权

评论回复
47
贺信|  楼主 | 2009-10-14 10:33 | 只看该作者
采集的波形

F0001TEK.JPG (82.15 KB )

F0001TEK.JPG

使用特权

评论回复
48
贺信|  楼主 | 2009-10-14 10:46 | 只看该作者
看到这波形我晕了!!肯定是我定时器出错了!!
甚至我该TH1 = 0x00;它还是输出同样的波!!!!!!!!!!

使用特权

评论回复
49
程序匠人| | 2009-10-14 10:49 | 只看该作者
洗碗机先不必急着指责楼主的程序滥。呵呵,那不是本贴主题。

况且楼主也说了这只是一个测试程序。一切从简也是可以的。

当务之急是找到阻碍解码程序正常运行下去的原因。

楼主,我们也只能给你一些建议,主要还是靠你自己临场发挥的分析和判断。

等把这个调通了不要跑,再来收拾你的编程思路问题(那才是真正的大问题)

使用特权

评论回复
50
程序匠人| | 2009-10-14 10:53 | 只看该作者
定时器的设置是基本功问题了,你自己翻书应该可以解决吧。等这个解决来再继续。(实在解决不了也可以吱声,呵呵)

使用特权

评论回复
51
贺信|  楼主 | 2009-10-14 11:21 | 只看该作者
sbit led   = P2^1;        //红外接受中断口


/***************************定时器0初始化*********************************/

void InitialTimer0()
{
        TMOD = 0x02;                // 定时器0, 1工作模式2, 8位自动从装定时方式
       
        TH1         = 0x9C;                //定时100uS
        TL1         = 0x00;
        //TCON = 0x01;
        EA          = 1;
        ET0=1;                                 
        TR0         = 1;                        //开定时器0中断
}

/**************************定时器0中断******************

定时500uS,用来解码高低电平

********************************************************/

void timer0() interrupt 1
{


        //T0Count++;
        led =~led;
       

}



//**********************主程序**********************************

void main()
{
        InitialTimer0();        //定时器0初始化
        while(1)
        {
                ;
        }

}

我怎么改变初值都是一样的波形!!用这个程序就一直是250us的方波!!
        TH1         = 0x9C;                //定时100uS
        TL1         = 0x00;
我都改它为00和FF和其他,但led上怎么就波形老是250us的方波!!
不明白???

使用特权

评论回复
52
xujin2002ji| | 2009-10-14 11:29 | 只看该作者
呵呵,匠人很热心啊,  在此敬佩,
我以前做过红外接收解码芯片,
我讲一下思路:  1, 检测头,  要查到一段低电平(9ms),  实际肯定放宽到5~15ms之间, 这个误差是必须的,  先处理高点平(连续几个采样),找到低(至少两个以上采样),然后连续读到低电平,必须数字滤波(看采样率)防止采到一个高电平毛刺。 这样就触发同步头,否则就返回,继续等待,。
   2. 处理数据也是,+-30%的误差,必须,  如果要求高,还要放宽,
  3.   收完数据,状态一定要回到检查同步头时。

使用特权

评论回复
53
sy21icbbs| | 2009-10-14 11:29 | 只看该作者
if( T0Count > 17)                //电平为高,判断计数时间0.5* 17 = 8.5ms约为9.0ms

不妨将17改小一点试试或者将该判断条件改为if (T0Count >= 17)

使用特权

评论回复
54
贺信|  楼主 | 2009-10-14 11:38 | 只看该作者
if( T0Count > 17)                //电平为高,判断计数时间0.5* 17 = 8.5ms约为9.0ms

不妨将17改小一点试试或者将该判断条件改为if (T0Count >= 17)
sy21icbbs 发表于 2009-10-14 11:29


试了,现在关键是我的定时器都不能正常我要的方波

使用特权

评论回复
55
踢球老越位| | 2009-10-14 11:44 | 只看该作者
/***************************定时器0初始化*********************************/

void InitialTimer0()
{
        TMOD = 0x02;                // 定时器0, 1工作模式2, 8位自动从装定时方式
        
        TH1         = 0x9C;                //定时100uS
        TL1         = 0x00;
        //TCON = 0x01;
        EA          = 1;
        ET0=1;                                 
        TR0         = 1;                        //开定时器0中断
}
好久没弄51,没记错的话TH1,TL1是设置定时器1的。。。
楼主翻翻书吧。。。。

使用特权

评论回复
56
贺信|  楼主 | 2009-10-14 11:54 | 只看该作者
55# 踢球老越位

惭愧!!!真的蒙了,看样子要清醒下!!谢谢大家!!!
小弟惭愧呀!!
基础太不扎实了!!

使用特权

评论回复
57
踢球老越位| | 2009-10-14 11:56 | 只看该作者
呵呵,一步一步来。。。

使用特权

评论回复
58
有风| | 2009-10-14 11:57 | 只看该作者
我怎么改变初值都是一样的波形!!用这个程序就一直是250us的方波!!
        TH1         = 0x9C;                //定时100uS
        TL1         = 0x00;
我都改它为00和FF和其他,但led上怎么就波形老是250us的方波!!
不明白???

不要用定时器来做太短的延时,
你想想一般的51,一个指令都要12us,
中断延时要多少个指令周期呢?
这样做,肯定不准的.
搞个delay_550us()函数,一步到位,不更好?
void delay_550us(void)
{
        uchar i;
        i = 150;        // 改这个值吧,与编译选项有关
        while(i > 0)
        {
                i--;
        }
}

使用特权

评论回复
59
wangyy608| | 2009-10-14 12:24 | 只看该作者
定时器0你设1干嘛

使用特权

评论回复
60
酱油店老板| | 2009-10-14 12:26 | 只看该作者
有风Y真够热心...

使用特权

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

本版积分规则