淡写 ╮青春785 2023-08-26 08:16 采纳率: 0%
浏览 12

51单片机控制的交通信号灯

要求:
1.一个二位数码管显示时间,红黄绿3个LED灯指示通行状态,实现一个路口一个方向三个灯的定时变换,变换时间自行决定。
2.三个按钮设定时间。修改、加、减
例如:按一下修改键,显示及修改绿灯时间(可闪烁显示时间表示其处于编辑状态),再按一下显示及修改黄灯时间,再按一下显示及修改红灯时间,再按一下退出修改模式。

  • 写回答

2条回答 默认 最新

  • 寒意漫彻山川 2023-08-26 09:53
    关注
    
    #include <reg51.h>
    
    #define LED_RED P0_0
    #define LED_YELLOW P0_1
    #define LED_GREEN P0_2
    #define DIGIT_PORT P2
    
    unsigned char digit[] = {
        0xC0,  // 0
        0xF9,  // 1
        0xA4,  // 2
        0xB0,  // 3
        0x99,  // 4
        0x92,  // 5
        0x82,  // 6
        0xF8,  // 7
        0x80,  // 8
        0x90   // 9
    };
    
    void delay(unsigned int ms) {
        unsigned int i, j;
        for (i = 0; i < ms; i++)
            for (j = 0; j < 1000; j++);
    }
    
    void displayDigit(unsigned char num) {
        DIGIT_PORT = digit[num / 10];
        LED_RED = 0;      // 红灯灭
        LED_YELLOW = 0;   // 黄灯灭
        LED_GREEN = 1;    // 绿灯亮
        delay(1000);      // 显示1秒
    
        DIGIT_PORT = digit[num % 10];
        LED_RED = 0;      // 红灯灭
        LED_YELLOW = 1;   // 黄灯亮
        LED_GREEN = 0;    // 绿灯灭
        delay(1000);      // 显示1秒
    }
    
    void main() {
        unsigned char minutes = 3;
        unsigned char seconds = 0;
    
        while (1) {
            displayDigit(minutes);
            displayDigit(seconds);
    
            if (P3_4 == 0) {   // 按钮1按下,修改绿灯时间
                while (P3_4 == 0);  // 等待按钮1松开
                // 绿灯时间修改逻辑
            }
            
            if (P3_5 == 0) {   // 按钮2按下,修改黄灯时间
                while (P3_5 == 0);  // 等待按钮2松开
                // 黄灯时间修改逻辑
            }
            
            if (P3_6 == 0) {   // 按钮3按下,修改红灯时间
                while (P3_6 == 0);  // 等待按钮3松开
                // 红灯时间修改逻辑
            }
            
            seconds++;  // 每秒加一
            if (seconds == 60) {  // 每分钟加一
                minutes++;
                seconds = 0;
            }
    
            if (minutes == 99) {  // 限制最大时间为99分钟
                minutes = 0;
                seconds = 0;
            }
        }
    }
    
    评论

报告相同问题?

问题事件

  • 修改了问题 8月26日
  • 创建了问题 8月26日