AVR单片机在执行delay函数时如何响应外部按键的操作?

来源:百度知道 编辑:UC知道 时间:2024/06/03 00:15:32
我写了温控报警器的程序,在超过设定温度值时,使蜂鸣器发出间断的声音,打开蜂鸣器与关闭蜂鸣器之间调用到了delay函数,延迟时间为500ms,但是在这500ms延迟的过程中,按温度设定按键是无效的,明显要按好几次才能按到,我知道可以使用中断,但是不太会用,本人较笨,希望能举个简单的例子说明中断如何使用,在每行命令后面加个注释。
那要是有多个按键呢,设定按钮有两只,一个按键是“+”操作,一个按键是“-"操作……

不用延时,把控制蜂鸣器的过程放在定时器的溢出中断处理过程中。

比如定时器溢出1次的需要的时间是10毫秒,所以你先在主程序中先让蜂鸣器打开,然后启动定时器。然后在定时器的溢出中断程序中记录溢出的次数,当溢出50次时就关闭蜂鸣器,这就刚好是500毫秒时间了。

这样的好处就是蜂鸣器的工作过程与按键扫描过程不冲突,就算你按着键不放,蜂鸣器也照样在工作500毫秒之后自动停止。

AVR可以使用它的3个定时器中的一个产生定时中断来获得延迟,这样才能灵活、充分发挥单片机的功能。
若你是初学者,你可以试着使用定时器,双龙应该会提供免费的学习例程。
若不想用定时器,可以将你的500ms的delay程序分为50个10ms的delay程序,这样可以插入50次键盘查询程序,这样也可以解决你的问题。

首先看硬件连接,找一个闲置的外部中断引脚,设置为输入,加内部上拉,或者外部上拉电阻。按键一端接这个引脚,另一端接地。
有这样几个寄存器需要设置,全局中断使能、相应的外部中断使能、设置中断触发方式为下降沿触发。
以MEGA16L为例子:
//IO配置
PORTD|=0X04; //内部上拉PORTD.2引脚
DDRD&=0XFB; //配置PORTD.2为输入
//中断配置
MCUCR|=1<<1; //配置INTO下降沿触发方式
GICR|=1<<6 ; //配置INT0中断使能
SREG=0x80; //全局中断使能

//中断服务程序 codevision下的定义方式
interrupt[2] void KEY()
{
}

需要说明一点,这种触发方式并不实用,在中断里必须要加如按键防抖,否则按键一次会触发N次中断,调试起来稍微有些困难。

不要用DELAY函数,DELAY的时候什么都干不了,用定时器吧。