• 机器人等级考试
  • 【2503】CIE机器人五级实操一位数码管1.主题:串口交互红绿灯倒计时牌仿真

  • @ 2025-8-9 19:41:48

【2503】CIE机器人五级实操

总分:100分题数:1

一、填空题。 (共1题,共100分) 1.主题:串口交互红绿灯倒计时牌仿真 器件:ESP32主控板、按键模块、一位数码管、74HC595移位寄存器芯片(或模块)及相关器件。以上模块也可以采用分立器件结合面包板进行搭设。 任务要求:通过一位数码管模拟交通路口红绿灯的倒计时牌,路口的通行时长通过串口监视器输入设定,时间单位为秒。具体要求如下: (1) 装置通电启动后,一位数码管循环显示0~9,时间间隔400毫秒; (2) 第一次点击按键后,循环显示停止,装置进入工作状态,一位数码管为黑屏; (3) 通过串口监视器设置倒计时的时长为9秒,输入完毕,在一位数码管上显示9; (4) 再次点击按键后,一位数码管从9开始倒计时显示通行时长,倒计时时间间隔为1秒; (5) 当通行时长还剩下4秒时,一位数码管开始闪烁显示,闪烁时间间隔为200毫秒; (6) 倒计时结束(显示数字为0)后,数码管黑屏,保持2秒;然后一位数码管恢复显示当前的通行时长; (7) 重复任务3~任务6,可输入新的通行时长; (8) 一位数码管必须使用74HC595移位寄存器芯片驱动显示,如采用其他方式,本实操成绩得0分; (9) 程序采用Arduino C/C++代码编写,不得使用外部库调用; (10) 未作规定处可自行处理,无明显与事实违背即可。

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

参考资料:数组NUM[] 保存的是0~9和'.'十六进制形式的数码管显示的段位信息。编程时可参考使用。 // 保存0~9 byte NUM[] = {0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xF6};

评分项:

  1. 器件及器件连接(20分)
  2. 功能实现(80分) (1) 实现装置通电启动后,一位数码管循环显示0~9,时间间隔400毫秒;(10分) (2) 实现第一次点击按键后,循环显示立即停止,装置进入工作状态;(10分,如果点击按键后,循环显示没有立即停止,而是稍后停止,本评分项得0分) (3) 实现循环显示停止后,一位数码管黑屏;(5分) (4) 实现通过串口监视器输入时长9,输入完毕,在一位数码管上显示9;(10分) (5) 实现点击按键,一位数码管从9开始倒计时显示通行时长,倒计时时间间隔为1秒;(10分) (6) 实现当通行时长还剩下4秒时,一位数码管开始闪烁显示,闪烁时间间隔为200毫秒;(10分) (7) 实现倒计时结束(显示数字为0)后,数码管黑屏,保持2秒;(5分) (8) 实现一位数码管黑屏后,恢复显示当前的通行时长;(10分) (9) 测评老师通过语音通知考生输入6~8间的任一数字,重复实现上述步骤。(10分)

(100分)

2 条评论

  • @ 2025-8-9 20:01:45
    #define dataPin 2
    #define clockPin 3
    #define latchPin 4
    #define buttonPin 27
    byte disNum[15] = {0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110,
                       0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111,
                       0b10000000,  //显示小数点 10
                       0b00000000,  //熄灭      11
                       0b11111111   //全亮      12
                      };
    void disPlayNumber(int number) {
      shiftOut(dataPin, clockPin, LSBFIRST, ~disNum[number]);
      digitalWrite(latchPin, LOW);
      digitalWrite(latchPin, HIGH);
    }
    void setup() {
      pinMode(dataPin, OUTPUT);
      pinMode(clockPin, OUTPUT);
      pinMode(latchPin, OUTPUT);
      pinMode(buttonPin, INPUT);
      Serial.begin(115200);
      bool f = false;//表示未按下按键
      while (1) {
        //一位数码管循环显示0~9,时间间隔400毫秒;
        for (int i = 0; i <= 9; i++) {
          disPlayNumber(i);
          delay(400);
          if (digitalRead(buttonPin) == LOW) {//(2) 第一次点击按键后,循环显示停止,装置进入工作状态,一位数码管为黑屏;
            f = true;//表示按下按键
            break;
          }
        }
        if (f == true) {
          break;
        }
      }
      delay(2000);//按键消抖
      disPlayNumber(11);//(2) 第一次点击按键后,循环显示停止,装置进入工作状态,一位数码管为黑屏;
    }
    int val;
    void loop() {
      //disPlayNumber(7);
      if (Serial.available() > 0) {//(3) 通过串口监视器设置倒计时的时长为9秒,输入完毕,在一位数码管上显示9;
        val = Serial.parseInt();//读取第一个整数
        Serial.println(val);//测试一下
        disPlayNumber(val);
      }
      //(4) 再次点击按键后,一位数码管从9开始倒计时显示通行时长,倒计时时间间隔为1秒;
      if (digitalRead(buttonPin) == LOW) {
        for (int i = val; i >= 4; i--) {
          disPlayNumber(i);
          delay(1000);
        }
        //(5) 当通行时长还剩下4秒时,一位数码管开始闪烁显示,闪烁时间间隔为200毫秒;
        for (int i = 4; i >= 0; i--) {
          disPlayNumber(i);
          delay(200);
        }
        disPlayNumber(11);//(6) 倒计时结束(显示数字为0)后,数码管黑屏,保持2秒;然后一位数码管恢复显示当前的通行时长;
        delay(2000);
        disPlayNumber(val);
      }
    
    }
    
    
    
    
    
    • @ 2025-8-9 19:42:11
      #define dataPin 2
      #define clockPin 3
      #define latchPin 4
      
      byte disNum[15] = {0b00111111, 0b00000110, 0b01011011, 0b01001111, 0b01100110,
                         0b01101101, 0b01111101, 0b00000111, 0b01111111, 0b01101111, 0b00000001, 0b0, 0b11111111
                        };
      void disPlayNumber(int number) {
        shiftOut(dataPin, clockPin, LSBFIRST, ~disNum[number]);
        digitalWrite(latchPin, LOW);
        digitalWrite(latchPin, HIGH);
      }
      void setup() {
        pinMode(dataPin, OUTPUT);
        pinMode(clockPin, OUTPUT);
        pinMode(latchPin, OUTPUT);
        pinMode(buttonPin, INPUT);
        Serial.begin(115200);
        while (1) {
          //一位数码管循环显示0~9,时间间隔400毫秒;
          for (int i = 0; i <= 9; i++) {
            disPlayNumber(i);
            delay(400);
          }
        }
      
      }
      
      void loop() {
        //disPlayNumber(7);
        if (Serial.available() > 0) {
        }
      }
      
      • 1