打印

遥控解码大家谈,内有精美遥控器图片

[复制链接]
楼主: 古道热肠
手机看帖
扫描二维码
随时随地手机跟帖
21
AV693| | 2008-9-10 09:25 | 只看该作者 回帖奖励 |倒序浏览

21IC论坛的语法高亮测试


#include <REG52.H>
#define uchar unsigned char
#define
 uint  unsigned int
 //11.0592晶振
#define TIME_0_00MS        0x0000
#define TIME_1_00MS        0x039a
#define TIME_1_13MS        0x0480
#define TIME_2_00MS        0x0733
#define TIME_2_50MS        0x0900
#define TIME_13_2MS        0x2ecd
#define TIme_11_ms          (TIME_13_2MS-TIME_2_50MS )
#define TIME_20_0MS        0x47ff
#define TIME1_LOAD        (0xffff - TIME_20_0MS)
unsigned char Irdat;
bit Irok;
uchar IrCode4;
uchar  IrCodeIndex=0;
void IrInit(void)                     //遥控接收初始化
{
    TMOD &=0xf0;
    TMOD |= 0x01;                      
    TH0    = TIME1_LOAD >> 8;
    TL0    = TIME1_LOAD & 0xff;
    IP|=0x01;                          
    IT0=1;                            
    TR0   = 1;
    EX0=1;
    EA=1;
    ET0=1;                                                      
}
unsigned char IrGetcode(void)//返回遥控码
{
        Irok=0;
        return(Irdat);
}
bit IrTest(void)//检查有无遥控信号
{  
    return Irok;
}
void int0_isr(void) interrupt 0 using 1       //遥控使用外部中断0,接P3.2口
{
    unsigned int timer; 
    TR0 = 0;
    timer = ((TH0 << 8) | TL0) - TIME1_LOAD;
    TH0 = TIME1_LOAD >> 8;
    TL0 = TIME1_LOAD & 0xff;
    TR0 = 1;
    if(timer > TIME_1_00MS && timer < TIME_1_13MS)//data 0
    {
        IrCodeIrCodeIndex/8<<=1;
        IrCodeIndex++ ;
    }
    else if(timer > TIME_2_00MS && timer < TIME_2_50MS)//data 1
    {
        IrCodeIrCodeIndex/8<<=1;
        IrCodeIrCodeIndex/8+=1;
        IrCodeIndex++;
    }
    else if(timer == TIME_0_00MS || timer > TIME_13_2MS)
    {

        IrCode0=0;
        IrCode1=0;
        IrCode2=0;
        IrCode3=0;
        IrCodeIndex=0;
    }
    else if(timer < TIME_13_2MS && timer > TIme_11_ms)//自动重发功能。
    {
       Irok=1
    }
}

void time0_isr(void) interrupt 1 using 1       //遥控使用定时计数器0
{
    TR0 = 0;
    TH0 = TIME1_LOAD >> 8;
    TL0 = TIME1_LOAD & 0xff;
    if(IrCodeIndex ==32)
     {

          if(IrCode2 ==(uchar)(~IrCode3])) 
          {

               Irdat = IrCode2;
             Irok = 1;
          }
     }
}

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

void Uart_T1_init(void)
{

    SCON    =   0x40;
    TMOD    &=  0x0f;
    TMOD    |=  0x20;
    TH1     =   0xFD;   //9600B ,11.0592Mhz
    TL1     =   0xFD;
    PCON    &=  0x7f;
    TR1     =   1;
    TI      =   1;
}
void DebugOut( uchar c )
{

    SBUF    =   c;
    while(TI!=1);
    TI=0;
}
/******************************************************/
/******************************************************/

void main(void)
{

    IrInit();
    Uart_T1_init();
    EA=1;
    while(1)
    {

        if (IrTest())
        {

            DebugOut(IrGetcode());
        } 
        PCON |=0x01;
    }
}


使用特权

评论回复
22
AV693| | 2008-9-10 10:18 | 只看该作者

测试结果,21IC的ABC语法存在BUG

在有方括弧的代码里,解释混乱(这是因为ABC代码是用方括弧标示的,论坛把正常的程序代码解释成ABC代码中的方括弧了.即使在程序中方括弧的前和后都加上的一空格也不行).

使用特权

评论回复
23
xwj| | 2008-9-10 10:28 | 只看该作者

Keil下用数组也不会快多少

要快还是得用联合思想得汇编,以避免无谓得参数传递

教学程序,可读性第一,要优化还是得自己干哦:-)

使用特权

评论回复
24
AV693| | 2008-9-10 10:41 | 只看该作者

程序是改了楼上的,Keil下能省差不多100字节代码空间

使用特权

评论回复
25
zyok| | 2008-9-10 10:49 | 只看该作者

顶!占个位学习...

使用特权

评论回复
26
古道热肠|  楼主 | 2008-9-10 10:57 | 只看该作者

郑重声明一下

yewuyi作为项目组的助威团长,要注意言外之意,不能让人误会.前面我发贴中提到的那个人当然不会是XWJ的.
实际上,XWJ也不必较真,给了,谢谢别人,不给,也用不着责怪,自己的事还是得自己做,至于单片机外围接口,有了芯片的PDF文档,只要费点心思索想一想,即使一无所有,也能摸着石头过河的,

使用特权

评论回复
27
yewuyi| | 2008-9-10 12:01 | 只看该作者

哈哈,找个机会拿洗碗机开涮而已

洗碗机同学的代码老早就在BBS上发过,洗碗机同学肯定不会笨到如此地步的了。。。



哈哈,俺一开涮,哗啦啦的就出了一堆代码,嘿嘿,开涮成功。。。



俺助威团工作开展的有声有色啊,自己陶醉一下。。。

使用特权

评论回复
28
walnutcy| | 2008-9-10 12:39 | 只看该作者

知道了洗碗机叫“徐文军”,

别的东西都没看,不感兴趣,IR解码很早的时候就做过,

项目中都有用的,  IR做短按,长按,连发,抬起功能都有过,,,

目前而言,觉得下降沿捕获的方式最简洁,计算时差,   如果没有捕获,就用下降沿中断,然后读取系统的时钟跳变,要求100us以下精度,

使用特权

评论回复
29
765vcf| | 2008-9-10 12:44 | 只看该作者

"徐文军" 牌洗碗机

功能强大,操作简单,......(此处省略三百字).是大婶级主妇的必备工具....

使用特权

评论回复
30
芯行天下| | 2008-9-10 13:07 | 只看该作者

哈哈这里真热闹呀

这里真热闹呀,没想到这里讨论红外这一块这么火呀。
看来一个程序的功能好实现,要做到简洁优化还是要动动脑子的。

使用特权

评论回复
31
芯行天下| | 2008-9-10 13:10 | 只看该作者

以后要多多学习

以后要多多学习,状态机的写法用的不是很多,但要读TI公司的一些代码的时候基本都是用的状态机,给我的感觉读起来比较因难。因为状态量太多了。刚开始根本不知道是干什么用的。
看来干什么都得养成一种好的习惯呀

使用特权

评论回复
32
芯行天下| | 2008-9-10 13:19 | 只看该作者

占用资源

从占用资源及效率上我认我的代码还是比较好的。
呵呵,自夸了。大家不要笑我呀。
我那段程序主程序初始化以后完全不再需要别的程序干预,更容易做成一个功能程序段,我认为移植起来更方便。同时在主程序中要使用时只需判断一个标志位即可确定是否有正确的数据过来。主程序操作起来更方便快捷。

使用特权

评论回复
33
dcp| | 2008-9-10 18:35 | 只看该作者

如果用捕获中断代码还可以更短

。。。

使用特权

评论回复
34
芯行天下| | 2008-9-10 19:04 | 只看该作者

是捕获中断

用捕获中断的好处就是在接收红外数据时不需要用户程序干预,完全是用中断进行了。如果没有红外数据,是无全不占用CPU资源的,也不占用CPU的执行时间。这样更有利于CPU去做更多的工作。

使用特权

评论回复
35
walnutcy| | 2008-9-10 19:54 | 只看该作者

30楼广告做得不错,,

使用特权

评论回复
36
1248| | 2008-9-10 23:09 | 只看该作者

了解了解也不错

使用特权

评论回复
37
懒人| | 2008-9-11 13:28 | 只看该作者

UP

使用特权

评论回复
38
芯行天下| | 2008-9-20 17:42 | 只看该作者

PT2262也做过

用PT2262和PT2272来做,不需要什么解码的,直接出来就是数据。这个要比红外更简单吧。

使用特权

评论回复
39
wjcy131421| | 2008-9-21 21:53 | 只看该作者

有点意思

使用特权

评论回复
40
avocationA| | 2008-9-22 19:25 | 只看该作者

请教13楼的彩色代码是如何贴上来的?????????

请教13楼的彩色代码是如何贴上来的?????????

使用特权

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

本版积分规则