一、填空题。 (共1题,共100分) 1.主题:智能自助红绿灯(四级) 器件:Atmega328P主控板1块,交通灯模块2个,按键模块1个,蜂鸣器模块1个,超声波传感器1个。以上模块也可使用分立器件结合面包板搭建。 任务要求:自助红绿灯为行人横穿主路时使用,人行道的总通行时间为10秒。为了安全起见,当人行道变为绿灯前,通过超声波检测主路是否有车辆正在通过,如有车辆正在通过则延长主路黄灯的时长。当超声波传感器检测的距离值小于等于5cm时,表示主路有车辆正在通过人行道。具体要求如下: (1) 自助红绿灯未启动时,主路显示为绿灯,人行道显示为红灯,蜂鸣器保持静音; (2) 当人行道按键被按下后,如主路没有车辆通过,主路的绿灯延时1秒后由绿灯经黄灯转换为红灯,黄灯时长2秒; (3) 当人行道按键被按下后,如主路有车辆正在通过,主路的绿灯延时1秒后由绿灯经黄灯转换为红灯,此时黄灯的时长为5秒; (4) 当主路为红灯时,人行道的绿灯点亮并闪烁,闪烁时间间隔为500毫秒,蜂鸣器保持静音; (5) 当人行道的绿灯还剩余4秒时,绿灯快速闪烁,闪烁时间间隔为250毫秒,同时蜂鸣器发出提示音,提醒行人快速通过; (6) 人行道通行时间结束,人行道红灯点亮,主路绿灯点亮,蜂鸣器保持静音; (7) 未作规定处可自行处理,无明显与事实违背即可。

说明:请考生在考试结束前,按照如下要求提交相关文件。 (1) 将程序放在一个文件夹中,压缩为1个“rar或zip”格式文件,并命名为:DJKS4_身份证号,大小5M以下; (2) 将程序文件通过“上传附件”按钮进行上传; (3) 程序编写过程中不得打开其它示例程序,不得使用图形化软件生成代码,如发现,实操成绩按照0分处理。

评分项:

  1. 器件及器件连接(20分)
  2. 功能实现(80分) (1) 实现自助红绿灯未启动时,主路显示为绿灯,人行道显示为红灯,蜂鸣器保持静音;(10分) (2) 实现当人行道按键被按下后,且超声波传感器检测的距离大于5厘米时,主路的绿灯延时1秒后由绿灯经黄灯转换为红灯,黄灯的时长为2秒;(10分) (3) 实现当人行道按键被按下后,且超声波传感器检测的距离不大于5厘米时,主路的绿灯延时1秒后由绿灯经黄灯转换为红灯,黄灯的时长为5秒;(10分) (4) 实现当主路为红灯时,人行道的绿灯点亮并闪烁,闪烁时间间隔为500毫秒,蜂鸣器保持静音;(20分) (5) 实现当人行道的绿灯还剩余4秒时,绿灯快速闪烁,闪烁时间间隔为250毫秒;(20分) (6) 实现当人行道的绿灯还剩余4秒时,蜂鸣器发出提示音。(10分)(100分)

2 条评论

  • @ 2025-6-7 20:00:20
    const int zhuGreen = 2;
    const int zhuRed = 3;
    const int zhuYellow = 4;
    const int renGreen = 5;
    const int renRed = 6;
    const int renYellow = 7;
    const int tonePin = 9;
    const int keyPin = 12;
    // 定义超声波传感器引脚
    const int trigPin = A4;  // 触发引脚,用于发送超声波信号
    const int echoPin = A5;  // 回声引脚,用于接收反射的超声波信号
    
    double dis;  // 存储测量到的距离值
    void setup() {
      for (int i = 2; i <= 7; i++) {
        pinMode(i, OUTPUT);
      }
      //(1) 自助红绿灯未启动时,主路显示为绿灯,人行道显示为红灯,蜂鸣器保持静音;
      //主路显示为绿灯
      digitalWrite(zhuGreen, HIGH);
      //digitalWrite(zhuRed,LOW);
      //digitalWrite(zhuYellow,LOW);
      //人行道显示为红灯
      digitalWrite(renRed, HIGH);
      //digitalWrite(renGreen,LOW);
      //digitalWrite(renYellow,LOW);
      noTone(tonePin);
      pinMode(keyPin, INPUT);
      Serial.begin(9600);
      // 初始化变量和硬件
      dis = 0;                 // 初始化距离变量
      pinMode(trigPin, OUTPUT);  // 设置触发引脚为输出模式
      pinMode(echoPin, INPUT);   // 设置回声引脚为输入模式
      Serial.begin(9600);        // 初始化串口通信,波特率9600
    }
    boolean flag = false;//false表示按键没有按下
    int keyValue;
    
    
    // 函数:测量距离
    float checkdistance() {
      // 触发超声波发送
      digitalWrite(trigPin, LOW);    // 先将触发引脚拉低,确保状态稳定
      delayMicroseconds(2);          // 保持2微秒
      digitalWrite(trigPin, HIGH);   // 发送10微秒的高电平触发脉冲
      delayMicroseconds(10);
      digitalWrite(trigPin, LOW);    // 触发脉冲结束
    
      // 测量回声时间并计算距离
      // pulseIn()函数返回高电平持续时间(微秒),即超声波往返时间
      // 距离计算公式:距离(厘米) = 时间(微秒) / 58.00
      // (声速约340m/s,转换为厘米/微秒:34000/1000000 = 0.034cm/μs
      //  往返距离 = 0.034 * 时间 → 单程距离 = 0.034 * 时间 / 2 ≈ 时间 / 58)
      float distance = pulseIn(echoPin, HIGH) / 58.00;
      delay(10);  // 短暂延时,避免传感器读数冲突
      return distance;  // 返回测量的距离值(厘米)
    }
    
    void loop() {
      //keyValue = digitalRead(keyPin);
      if (digitalRead(keyPin) == HIGH) {
        delay(500);//简单的消抖一下
        flag = !flag;
        Serial.println(flag);
      }
    
      if (flag == true) {
        dis = checkdistance();
        Serial.println(dis);
        if (dis > 5) { //(2) 当人行道按键被按下后,如主路没有车辆通过,主路的绿灯延时1秒后由绿灯经黄灯转换为红灯,黄灯时长2秒;
          digitalWrite(zhuGreen, HIGH);
          delay(1000);
          digitalWrite(zhuGreen, LOW);
          digitalWrite(zhuYellow, HIGH);
          delay(2000);
          digitalWrite(zhuYellow, LOW);
          digitalWrite(zhuRed, HIGH);
        } else { //(3) 当人行道按键被按下后,如主路有车辆正在通过,主路的绿灯延时1秒后由绿灯经黄灯转换为红灯,此时黄灯的时长为5秒;
          digitalWrite(zhuGreen, HIGH);
          delay(1000);
          digitalWrite(zhuGreen, LOW);
          digitalWrite(zhuYellow, HIGH);
          delay(5000);
          digitalWrite(zhuYellow, LOW);
          digitalWrite(zhuRed, HIGH);
        }
        flag = false;
      }
    
    }
    
    
    
    
    
    • @ 2025-6-7 19:59:27

      • 1