打印
[技术问答]

红外解码的问题

[复制链接]
3161|34
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dongjie_0000|  楼主 | 2014-4-20 11:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dongjie_0000 于 2014-4-20 11:50 编辑

    我写了一个红外解码的程序,调不通,调试的时候,查看ucTImeouts的数值,发现为7,不知道出现什么问题,求大神们帮忙解决
因为M058内部频率最高位50MHZ,所以我的延时程序为
   /************延时程序***********/
void delay_us(void)
{
        char i;
        for(i = 0;i < 50;i++);
}

void delay(int n)
{
        int i;
        for(i = 0;i < n;i++);
        delay_us();
}
/*************中断处理**************/
    void EINT0_IRQHandler(void)
{   
         
          char ucIRBuf[4];
          unsigned char ucTimeouts=0;
          unsigned char i,j;
        
          P3->ISRC = GPIO_ISRC_ISRC2;        
//           _GPIO_SET_PIN_MODE(P4, 4, GPIO_PMD_OUTPUT);
//            P44=0;
          /*开始判断是否为NEC波形引导码的前9MS和后4.5MS*/
                ucTimeouts=0;                        //计数时间清0
        //        P3->ISRC = GPIO_ISRC_ISRC2;        
                while(!P32)
                {
                        /* 调用0.1MS延时计数,ucTimeouts每调用一次加1*/
                        delay(100);
                        ucTimeouts++;
                }

                /*NEC引导码前9MS,ucTimeouts约等于90,给个误差值,用80-100之间来判断*/
                if(ucTimeouts<80||ucTimeouts>100)        
                {
                        
                         return;
                }        

                ucTimeouts=0;

                while(P32)
                {        
                        /* 调用0.1MS延时计数,ucTimeouts每调用一次加1*/
                        delay(100);
                        ucTimeouts++;
                        /*NEC引导码引导码的后4.5MS,ucTimeouts约4S*/
                        if(ucTimeouts>50)               
                        {
                                 
                                 return;               
                        }        
                }

                /*NEC引导码引导码的后4.5MS,ucTimeouts约4S*/
                if(ucTimeouts<40)               
                {
                         return;
                }        

                /*开始接收4字节内容*/        
                for(i=0;i<4;i++)
                {
                        for(j=0;j<8;j++)
                        {
                                
                                while(!P32);//低电平开始,等待高电平接收               
                                
                                ucTimeouts=0;
                                
                                while(P32)  //高电平开始,等待低电平接收
                                {                        
                                        /* 调用0.1MS延时计数,ucTimeouts每调用一次加1*/
                                        delay(100);
                                        ucTimeouts++;   
                                       
                                        if(ucTimeouts>20)
                                        {   
                                                 return;               
                                        }                                       
                                                
                                }
               
                                /* 高电平结束,判断数据1或0向变量移入 */
                                ucIRBuf>>=1;                        
                                
                                if(ucTimeouts>10)
                                {
                                         ucIRBuf|=0x80;
                                }                        
                                       
                        }
                }
               
                /* 接收数据成功 */
                g_ucIRData = ucIRBuf[2];
               
                g_bIRRecvEnd = TRUE;               

               
                        
                // printf("P3.2 EINT0 occurred. \n");
                }
   
沙发
dongjie_0000|  楼主 | 2014-4-20 11:47 | 只看该作者
这个程序我是移植的教程的程序。

使用特权

评论回复
板凳
通宵敲代码| | 2014-4-20 20:08 | 只看该作者

使用特权

评论回复
地板
dongjie_0000|  楼主 | 2014-4-20 20:46 | 只看该作者
通宵敲代码 发表于 2014-4-20 20:08

使用特权

评论回复
5
从小木丁丁| | 2014-4-21 10:43 | 只看该作者
移植的啊?

使用特权

评论回复
6
从小木丁丁| | 2014-4-21 15:12 | 只看该作者
通宵敲代码 发表于 2014-4-20 20:08

代码兄弟来给解释解释

使用特权

评论回复
7
通宵敲代码| | 2014-4-21 15:39 | 只看该作者
从小木丁丁 发表于 2014-4-21 15:12
代码兄弟来给解释解释

高手如云,我就不献丑了。

不过delay延时精度不高,建议用定时器。

使用特权

评论回复
8
dongjie_0000|  楼主 | 2014-4-21 16:41 | 只看该作者
通宵敲代码 发表于 2014-4-21 15:39
高手如云,我就不献丑了。

不过delay延时精度不高,建议用定时器。

用SYS_SysTickDelay这个呢

使用特权

评论回复
9
dongjie_0000|  楼主 | 2014-4-21 16:41 | 只看该作者
通宵敲代码 发表于 2014-4-21 15:39
高手如云,我就不献丑了。

不过delay延时精度不高,建议用定时器。

用这个SYS_SysTickDelay呢

使用特权

评论回复
10
通宵敲代码| | 2014-4-21 16:45 | 只看该作者
dongjie_0000 发表于 2014-4-21 16:41
用这个SYS_SysTickDelay呢

滴答时钟吗,可以用。

使用特权

评论回复
11
dongjie_0000|  楼主 | 2014-4-21 16:46 | 只看该作者
通宵敲代码 发表于 2014-4-21 16:45
滴答时钟吗,可以用。

时间应该延时很准吧

使用特权

评论回复
12
通宵敲代码| | 2014-4-21 16:49 | 只看该作者
dongjie_0000 发表于 2014-4-21 16:46
时间应该延时很准吧

恩,挺准的,不过得好好计算一下!

使用特权

评论回复
13
dongjie_0000|  楼主 | 2014-4-21 16:53 | 只看该作者
通宵敲代码 发表于 2014-4-21 16:49
恩,挺准的,不过得好好计算一下!

他应该是以us计算的吧,

使用特权

评论回复
14
通宵敲代码| | 2014-4-21 16:55 | 只看该作者
dongjie_0000 发表于 2014-4-21 16:53
他应该是以us计算的吧,

这得看晶振的大小,还有你设置的几分频。

使用特权

评论回复
15
从小木丁丁| | 2014-4-22 20:46 | 只看该作者
通宵敲代码 发表于 2014-4-21 15:39
高手如云,我就不献丑了。

不过delay延时精度不高,建议用定时器。

一般情况下应该使用定时器的,代码兄说的对

使用特权

评论回复
16
从小木丁丁| | 2014-4-22 20:47 | 只看该作者
dongjie_0000 发表于 2014-4-21 16:41
用这个SYS_SysTickDelay呢

滴答定时器貌似也不是太准

使用特权

评论回复
17
从小木丁丁| | 2014-4-22 20:47 | 只看该作者
通宵敲代码 发表于 2014-4-21 16:45
滴答时钟吗,可以用。

这个也不是太准却啊,但是可以使用

使用特权

评论回复
18
通宵敲代码| | 2014-4-22 22:59 | 只看该作者
从小木丁丁 发表于 2014-4-22 20:47
这个也不是太准却啊,但是可以使用

主要是简单,权衡利弊吗!

使用特权

评论回复
19
通宵敲代码| | 2014-4-22 22:59 | 只看该作者
从小木丁丁 发表于 2014-4-22 20:47
这个也不是太准却啊,但是可以使用

主要是简单,权衡利弊吗!

使用特权

评论回复
20
sltsai| | 2014-4-23 10:15 | 只看该作者
本帖最后由 sltsai 于 2014-4-23 10:20 编辑

參考下第13頁。
如果利用Timer capture或PWM capture都很容易實現。
視屏19:00有解說
www .nuvoton-m0 .com/forum.php?mod=viewthread&tid=197

Nano100 Timer & IR remote receiver简中.pdf (749.08 KB)
Sample code.zip (769.42 KB)

使用特权

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

本版积分规则

10

主题

43

帖子

0

粉丝