打印

新手求帮讲解一个单片机红外控制程序

[复制链接]
3248|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
桥洞洞主|  楼主 | 2012-9-26 15:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void tim0_isr (void) interrupt 1 using 1{  irtime++;  //用于计数2个下降沿之间的时间}void EX0_ISR (void) interrupt 0 //外部中断0服务函数{  static uchar  i;             //接收红外信号处理  static bit startflag;                //是否开始处理标志位if(startflag)                            {    if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms                        i=0;            irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1            irtime=0;            i++;                if(i==33)                  {                   irok=1;                 i=0;                  }          }       else        {        irtime=0;        startflag=1;        }}这个程序中irtime是全局变量。那么当程序一开始,定时器就在工作,那么irtime如何能取值到33到63之间?bit startflag只是定义,是否给出了startflag的值?值到33到63之间?bit startflag只是定义,是否给出了startflag的值?

相关帖子

沙发
桥洞洞主|  楼主 | 2012-9-26 15:36 | 只看该作者
程序怎么成这样了···
再发下:
void tim0_isr (void) interrupt 1 using 1
{
  irtime++;  //用于计数2个下降沿之间的时间
}
void EX0_ISR (void) interrupt 0 //外部中断0服务函数
{
  static uchar  i;             //接收红外信号处理
  static bit startflag;                //是否开始处理标志位

if(startflag)                        
   {
    if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms
                        i=0;
            irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
            irtime=0;
            i++;
                if(i==33)
                  {
                   irok=1;
                 i=0;
                  }
          }
       else
        {
        irtime=0;
        startflag=1;
        }

}

使用特权

评论回复
板凳
桥洞洞主|  楼主 | 2012-9-26 15:37 | 只看该作者
问题是:
这个程序中irtime是全局变量。那么当程序一开始,定时器就在工作,那么irtime如何能取值到33到63之间?bit startflag只是定义,是否给出了startflag的值?值到33到63之间?bit startflag只是定义,是否给出了startflag的值?

使用特权

评论回复
地板
阿南| | 2012-9-26 16:54 | 只看该作者
看程序irtime是在产生第一个外部中断中初始化成0的。
startflag已经申明为static静态变量,是分配固定的RAM空间的,所以每次修改后值都一直保存。

使用特权

评论回复
5
桥洞洞主|  楼主 | 2012-9-26 20:02 | 只看该作者
4# 阿南
startflag定义时并没有赋值啊···那么它的初值是多少啊?

使用特权

评论回复
6
桥洞洞主|  楼主 | 2012-9-26 20:04 | 只看该作者
4# 阿南
定时器中断一直都在运行,如果没有外部中断,那么定时器中断程序就会一直运行,又因为irtime是全局变量,那么irtime就会一直增加。那么irtime<63&&irtime>=33又怎样实现呢?

使用特权

评论回复
7
hjs1618| | 2012-9-26 20:21 | 只看该作者
STATIC定义的,默认初始化为0

使用特权

评论回复
8
桥洞洞主|  楼主 | 2012-9-26 22:04 | 只看该作者
7# hjs1618
谢谢啊~这个懂了,能否帮我解答下第一问啊?

使用特权

评论回复
9
阿南| | 2012-9-27 10:35 | 只看该作者
如果没有外部中断,即意味着你不用irtime,它一直加也不影响呀。
一旦你有外部中断就把irtime这设为0了,下次中断时irtime差不多就在33到63之间了,否则就认为他无效。

使用特权

评论回复
10
szshawn2010| | 2012-10-3 15:59 | 只看该作者
:lol

使用特权

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

本版积分规则

0

主题

17

帖子

0

粉丝