2301_81272774 2024-04-09 14:59 采纳率: 81%
浏览 8
已结题

人行信号灯51单片机

img


仿真按键式人行横道信号灯:上电时(横行道不可行)红色LED灯处于点亮状态,绿色LED灯处于熄灭状态,数码管不显示;按下按键,绿色LED灯点亮、红色LED灯熄灭(横行道可行),同时数码管进行30秒倒计时,从29显示到0,每次停留1秒;当数码管显示完0之后,红色LED灯点亮、绿色LED灯熄灭,数
码管不显示,恢复横行道不可行。
2.两次按键间隔时间需大于60秒。

  • 写回答

5条回答 默认 最新

  • GISer Liu 2024-04-09 15:26
    关注

    该回答引用自GPT-3.5,由博主GISer Liu编写:

    根据你的描述,这个问题涉及到单片机的按键输入、LED的控制以及数码管的显示。我会提供一种基于51单片机的解决思路和解决方案。

    解决思路:

    1. 初始化设置 :上电时,红色LED点亮,绿色LED熄灭,数码管不显示。
    2. 按键检测 :检测按键是否按下,如果按下,则进行相应操作。
    3. 倒计时 :按键按下后,绿色LED点亮,红色LED熄灭,数码管显示30秒倒计时,每秒减一。
    4. 超时处理 :倒计时结束后,红色LED点亮,绿色LED熄灭,数码管不显示。
    5. 按键间隔检测 :记录上次按键时间,防止按键间隔小于60秒。

      解决方案:

      cCopy code
      #include <reg51.h>
      sbit Red_LED = P1^0;   // 红色LED连接到P1.0
      sbit Green_LED = P1^1; // 绿色LED连接到P1.1
      sbit Button = P3^2;    // 按键连接到P3.2
      sbit Digit1 = P2^0;    // 数码管第一位
      sbit Digit2 = P2^1;    // 数码管第二位
      sbit Digit3 = P2^2;    // 数码管第三位
      sbit Digit4 = P2^3;    // 数码管第四位
      void delay(unsigned int count) {
      unsigned int i, j;
      for (i = 0; i < count; i++)
      for (j = 0; j < 120; j++);
      }
      void display(unsigned char num) {
      P0 = num;         // 显示数字
      Digit1 = 1;       // 打开第一位数码管
      Digit2 = 0;
      Digit3 = 0;
      Digit4 = 0;
      delay(1);         // 延时1ms
      Digit1 = 0;       // 关闭第一位数码管
      Digit2 = 1;       // 打开第二位数码管
      delay(1);
      Digit2 = 0;
      Digit3 = 1;
      delay(1);
      Digit3 = 0;
      Digit4 = 1;
      delay(1);
      }
      void main() {
      unsigned char counter = 30;  // 初始化倒计时计数器为30
      unsigned char last_press = 0; // 上次按键时间
      Red_LED = 1;                  // 红色LED点亮
      Green_LED = 0;                // 绿色LED熄灭
      while(1) {
      if(Button == 0 && (last_press == 0 || (TH0 - last_press) >= 36000)) {
      // 如果按键按下且上次按键时间距离当前时间大于60秒
      last_press = TH0;  // 更新按键按下时间
      Green_LED = 1;     // 绿色LED点亮
      Red_LED = 0;       // 红色LED熄灭
      while(counter > 0) {
      display(counter); // 显示倒计时
      delay(1000);      // 延时1秒
      counter--;        // 计数器减一
      }
      Red_LED = 1;         // 倒计时结束,红色LED点亮
      Green_LED = 0;       // 绿色LED熄灭
      counter = 30;        // 重置倒计时计数器
      }
      }
      }
      
      这段代码实现了按键式人行横道信号灯的功能。在按键按下后,绿色LED点亮,红色LED熄灭,数码管进行30秒倒计时,每秒更新一次数字,倒计时结束后,红色LED点亮,绿色LED熄灭,数码管不显示。同时,代码中通过记录上次按键时间来确保两次按键间隔大于60秒。
      如果你有任何疑问或者需要进一步解释,请随时告诉我。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 5月6日
  • 已采纳回答 4月28日
  • 创建了问题 4月9日