AI创作问答(高级版)
下按键,LED2保持亮,计时器暂停,再次按下按键,LED2灭,计时器继续计时,计时120秒后LED2灭,回到初始状态。
以下是51单片机的代码实现:
```c
#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; // 按键状态变为未按下
}
}
}
```