用两个按钮,一个当启动按钮,一个当停止按纽,按下启动按钮后,红灯亮3秒,黄灯闪烁3秒,绿灯亮3秒,不断循环,按下停止按钮时,交通灯停止工作,串口监视器显示当前交通灯的颜色
时间: 2024-05-06 22:21:31 浏览: 171
好的,这是一个典型的嵌入式系统小项目,可以通过程序设计实现。以下是可能的程序实现方式:
```c
// 定义红、黄、绿三个LED灯的引脚
const int redPin = 2;
const int yellowPin = 3;
const int greenPin = 4;
// 定义启动和停止按钮的引脚
const int startButtonPin = 5;
const int stopButtonPin = 6;
void setup() {
// 初始化相关引脚
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(startButtonPin, INPUT_PULLUP);
pinMode(stopButtonPin, INPUT_PULLUP);
// 初始化串口通信,用于调试信息输出
Serial.begin(9600);
}
void loop() {
// 判断启动按钮是否被按下,如果是则启动交通灯
if (digitalRead(startButtonPin) == LOW) {
// 不断循环,直到停止按钮被按下
while (digitalRead(stopButtonPin) == HIGH) {
// 亮红灯3秒
digitalWrite(redPin, HIGH);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
Serial.println("Red Light");
delay(3000);
// 黄灯闪烁3秒
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, HIGH);
digitalWrite(greenPin, LOW);
Serial.println("Yellow Light");
delay(500);
digitalWrite(yellowPin, LOW);
delay(500);
// 亮绿灯3秒
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, HIGH);
Serial.println("Green Light");
delay(3000);
}
// 停止按钮被按下,停止交通灯
digitalWrite(redPin, LOW);
digitalWrite(yellowPin, LOW);
digitalWrite(greenPin, LOW);
Serial.println("Traffic Light stopped");
}
// 当有未处理的串口输入时,读取并忽略
while (Serial.available()) {
Serial.read();
}
// 给串口监视器发送当前交通灯颜色
if (digitalRead(redPin) == HIGH) {
Serial.println("Current Light: Red");
} else if (digitalRead(yellowPin) == HIGH) {
Serial.println("Current Light: Yellow");
} else if (digitalRead(greenPin) == HIGH) {
Serial.println("Current Light: Green");
} else {
Serial.println("Traffic Light not started");
}
}
```
注意,以上程序中并没有添加 debounce(去抖动)逻辑,启动和停止按钮在实际使用中可能受到机械或电气干扰导致产生 bounce(抖动)信号,需要添加 debounce 程序逻辑以保证按钮的可靠性。
阅读全文