51单片机定时器按键消抖程序
时间: 2023-05-11 14:02:21 浏览: 311
以下是一个简单的 51 单片机定时器按键消抖程序:
#include <reg51.h>
sbit key = P1^0; // 定义按键引脚
sbit led = P1^1; // 定义 LED 引脚
void delay(unsigned int t) // 延时函数
{
unsigned int i, j;
for (i = 0; i < t; i++)
for (j = 0; j < 125; j++);
}
void main()
{
unsigned char key_state = 0; // 按键状态
unsigned char key_count = 0; // 按键计数器
unsigned char key_press = 0; // 按键按下标志
TMOD = 0x01; // 定时器 0 工作在模式 1
TH0 = 0xFC; // 定时器 0 计数初值
TL0 = 0x67;
TR0 = 1; // 启动定时器 0
while (1)
{
if (key == 0) // 检测按键是否按下
{
key_count++; // 按键计数器加 1
if (key_count >= 10) // 如果按键计数器大于等于 10
{
key_count = 10; // 按键计数器置为 10
key_press = 1; // 按键按下标志置为 1
}
}
else
{
if (key_count > 0) // 如果按键计数器大于 0
key_count--; // 按键计数器减 1
}
if (TF0 == 1) // 检测定时器 0 是否溢出
{
TF0 = 0; // 定时器 0 溢出标志清零
TH0 = 0xFC; // 定时器 0 计数初值
TL0 = 0x67;
if (key_press == 1) // 如果按键按下
{
key_press = 0; // 按键按下标志清零
key_state = !key_state; // 按键状态取反
led = key_state; // LED 状态与按键状态相同
}
}
delay(1); // 延时 1ms
}
}
这个程序使用了定时器 0 来实现按键消抖,当按键按下时,按键计数器加 1,如果按键计数器大于等于 10,则认为按键已经按下,按键按下标志置为 1;当按键松开时,按键计数器减 1;定时器 0 溢出时,检测按键按下标志,如果为 1,则将按键按下标志清零,按键状态取反,LED 状态与按键状态相同。
阅读全文