aiaiask.com©

开花即结果 提问即答案

51单片机:按键控制LED1和LED2的亮灭与计时功能实现
原始问题:

51单片机:按键控制LED1和LED2的亮灭与计时功能实现

下按键,LED2保持亮,计时器暂停,再次按下按键,LED2灭,计时器继续计时,计时120秒后LED2灭,回到初始状态。

以下是51单片机的代码实现:

#include <reg51.h>

sbit LED1 = P1^0; // LED1控制引脚
sbit LED2 = P1^1; // LED2控制引脚
sbit KEY = P3^2; // 按键输入引脚

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 state = 0; // 状态变量,0表示初始状态,1表示LED1亮,2表示LED2亮
    unsigned char key_state = 0; // 按键状态变量,0表示未按下,1表示按下
    unsigned int timer = 0; // 计时器,单位为秒
    LED1 = 0; // 初始状态LED1灭
    LED2 = 0; // 初始状态LED2灭
    while(1)
    {
        if(KEY == 0) // 检测按键是否按下
        {
            delay(10); // 延时去抖动
            if(KEY == 0) // 再次检测按键是否按下
            {
                key_state = 1; // 按键状态变为按下
                while(KEY == 0); // 等待按键释放
            }
        }
        if(key_state == 1) // 如果按键已经按下
        {
            switch(state)
            {
                case 0: // 初始状态
                    LED1 = 1; // LED1亮
                    state = 1; // 状态变为LED1亮
                    break;
                case 1: // LED1亮状态
                    LED1 = 0; // LED1灭
                    delay(1000); // 计时1秒
                    LED2 = 1; // LED2亮
                    timer = 0; // 计时器清零
                    state = 2; // 状态变为LED2亮
                    break;
                case 2: // LED2亮状态
                    if(timer < 120) // 如果计时器未满120秒
                    {
                        if(KEY == 0) // 检测按键是否按下
                        {
                            delay(10); // 延时去抖动
                            if(KEY == 0) // 再次检测按键是否按下
                            {
                                while(KEY == 0); // 等待按键释放
                                LED2 = 1; // LED2保持亮
                                while(KEY == 1); // 等待按键再次按下
                                LED2 = 0; // LED2灭
                            }
                        }
                        timer++; // 计时器加1
                    }
                    else // 如果计时器满120秒
                    {
                        LED2 = 0; // LED2灭
                        state = 0; // 状态变为初始状态
                    }
                    break;
            }
            key_state = 0; // 按键状态变为未按下
        }
    }
}
51单片机:按键控制LED1和LED2的亮灭与计时功能实现
https://www.aiaiask.com/ask/30217.html
AI / 模型DeepSeek
时间 / DATEJune 2, 2023, 4:37 PM
语言zh-CN
IP / 区域江苏 常州