微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 小菜鸟求助,关于定时器的问题

小菜鸟求助,关于定时器的问题

时间:10-02 整理:3721RD 点击:
本人毕业设计做门禁系统,有一要求:门口有人(红外探测输出高电平),LCD点亮显示欢迎词;若门口人站那超过2分钟,LCD显示请离开,并蜂鸣器报警。人离开后,LCD待机,待检测到有人,如此循环。
就这个2分钟的定时器程序怎么写?该怎样加入main()函数中?下面是本人写的程序,但功能不能实现。
sw1为红外传感器,高电平说明有人;
lcd()为欢迎词程序;
lcd1()为警告词程序;
lcd_init()为LCD初始化程序;
问题:
1.sw1==1时(有人),显示欢迎词,同时定时器开启;此时我把sw1==0(没人),这时定时器应该停止,LCD待机。但我写的这个程序,一直亮欢迎词,按    下sw1==0后不会立即初始化,直到定时器2分钟定完过后才初始化。正确的应该是定时中若sw1==0,LCD立即就能初始化的效果。

2.2分钟结束后,警告词只亮一次,然后又就跳到欢迎词。正确的应该是警告词一直显示,直到人走后(sw1==0),才待机,检测到人,显示欢迎词再如 此循环。
以下为自己写的程序(一些程序省篇幅就不贴出来了)
void Time0_init()
{
    TMOD = 0x01;//定时器T0工作在方式1,定时时间60ms=0.06s
    TH0 = 0x15;//高8位初值
    TL0 = 0xA0;//低8位初值
    EA = 1;//开总中断
    ET0 = 1;//开定时器T0中断
    TR0=1;//启动定时器
}
void main()
{         
         while(1)
   {       
     a=0;//变量a清零
            if(sw1==1)
     {
            Time0_init();
            lcd();
            if(sw1==0)
        {
            lcd_init();
         }                     
    }
        while(2000-a !=0);//等待延时2000x0.06=120s=2min
        TR0=0;//关闭定时器  
         while(sw1==1)
     {
         lcd1();
     }
   }
}
void Time0() interrupt 1//中断服务程序
{
  TH0 = 0x15;//重装定时器高8位初值
  TL0 = 0xA0;//重装定时器低8位初值
  a++;//变量a加1
}

望各路大神帮忙指点,谢谢!

没有及时响应的地方。while(2000-a !=0);

那应该怎样修改啊大神!

直接放到定时器中断服务函数里面。那个 a变量,不做其他用的话,可以在服务函数里定义,并修饰成static类型的。用if判断a的值是不是到2000了。
if(2000 == a)
{
  a = 0;
  //到这里就表示已经2min了。可以定义个全局变量标识比如g_2min_flag,在这更改它的值。或者直接用这个a变量,定时到了就把最高位置1. a  |= 0x8000; 然后main程序判断a的最高位是不是1就行了。
}
不能把等待的循环放在main里呐。

先解决你第一个问题  关于sw==1变化到sw==0时,为啥不会立即初始化,问题在下面这段程序上
if(sw1==1)
      {
            Time0_init();
             lcd();
             if(sw1==0)
        {
             lcd_init();
          }                     
     }
        while(2000-a !=0);//等待延时2000x0.06=120s=2min

你想一下,当if(sw==1)成立的时候,仅仅经过了两个函数运行的时间(我们暂且把这段时间叫做 s 吧,它可能只需要几十微秒),就来判断sw是否为0。这显然不合理,因为人从站到门口,到离开门口,怎么可能只要几十微秒呢,也就是说,当人还没有来得及离开时,你就要求sw==0了。你的程序架构需要修改,不知道你听明白没

有空到小店看看:
shop71676727.taobao.com/shop/view_shop.htm?tracelog=twddp

针对着问题 你可以把 if(sw==0) 改成while(sw)
有空到小店看看:
shop71676727.taobao.com/shop/view_shop.htm?tracelog=twddp

上贴有一点错了
针对这个问题 你可以把 if(sw==0) 改成while(sw);  (这里多了个分号)

有空到小店看看:
shop71676727.taobao.com/shop/view_shop.htm?tracelog=twddp

感谢大神指点!已经搞定了!

非常感谢!已经弄好了!

还是新手看不懂

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top