51单片机设计十字交通灯怎么设计?

用51单片机设计一十字交通灯系统东西路口和南北路口同时用一位数码管显示倒计时,初始态红灯全亮,运行时红灯亮9秒,绿灯亮6秒,黄灯闪烁3秒。当有外部中断信号产生,所有路口黄灯闪烁5秒后,恢复中断前的状态。这个怎么设计?

就在这个网站搜吧,一大把的例子

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7748618
  • 这篇博客也不错, 你可以看下单片机设计一个十字路口交通灯模拟控制系统(51单片机实训)
  • 除此之外, 这篇博客: 基于51单片机数字电压表仿真设计_数码管显示中的 资料清单 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    img

  • 您还可以看一下 黄菊华老师的2021 公开课、选修课报名抢座小程序 毕业设计 毕设 源码 源代码使课程中的 选修课报名小程序-后台系统如何发布小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    解决方案:

    1. 硬件设计: 需要一个51单片机进行控制,其中需要使用数码管进行倒计时显示,同时需要连接红绿黄三色LED灯,需要使用外部中断信号进行控制。

    2. 软件设计: (1)进行初始化:设置管脚方向、三色LED初始状态(红灯亮)、数码管倒计时显示初始值(90秒)、中断输入管脚配置。 (2)控制流程: a. 东西路口:

    3. 红灯亮9秒,绿灯亮6秒,黄灯闪烁3秒;
    4. 完成一次周期后,显示器倒计时减1,继续下一周期。 b. 南北路口:
    5. 红灯亮9秒,绿灯亮6秒,黄灯闪烁3秒;
    6. 完成一次周期后,显示器倒计时减1,继续下一周期。 c. 外部中断信号:
    7. 触发中断后,所有路口的黄灯都闪烁5秒;
    8. 闪烁结束后,恢复到中断之前的状态。

    9. 代码实现:

    //初始化,设置端口以及中断
    void Init()
    {
        // 端口初始化
        P0 = 0xFF;
        P1 = 0xFF;
        P2 = 0xFF;
        P3 = 0xFF;
        // 申请内存空间
        unsigned char *timer = (unsigned char *) malloc (sizeof(unsigned char));
        unsigned char *led_time = (unsigned char *) malloc (sizeof(unsigned char));
        unsigned char *led_state = (unsigned char *) malloc (sizeof(unsigned char));
        //设置中断
        IE = 0x82;
        EA = 1;
        // 初始化倒计时时间和LED灯状态
        *timer = 90;
        *led_time = 0;
        *led_state = 0x01; //红灯亮
    }
    
    void main()
    {
        Init();
        while( 1 )
        {
            // 东西方向
            LED_ew(*led_time, *led_state);
            // 南北方向
            LED_ns(*led_time, *led_state);
    
            //下一秒倒计时
            if(!--*timer){
                *timer = 90;
                *led_time = 0;
            }
            delay_ms( 1000 );
        }   
    }
    
    //东西方向控制
    void LED_ew(unsigned char led_time,unsigned char led_state){
        if (led_state == 0x01){ // 红灯亮
            if(--led_time <= 0){ // 红灯9秒
                led_time = 6;
                led_state = 0x02; // 绿灯亮
            }
        } else if (led_state == 0x02){ // 绿灯亮
            if(--led_time <= 0){ // 绿灯6秒
                led_time = 3;
                led_state = 0x04; // 黄灯闪烁
            }
        } else if (led_state == 0x04){ // 黄灯闪烁
            led_time--;
            if (led_time == 0){
                led_time = 3;
                if (led_state == 0x04)
                    led_state = 0x00;  //灯灭
                else
                    led_state = 0x04;  //黄灯闪烁
            }
        }
        //输出灯的状态
        write_led_state_to_port(led_state);
    }
    
    //南北方向控制
    void LED_ns(unsigned char led_time,unsigned char led_state){
        if (led_state == 0x01){ // 红灯亮
            if(--led_time <= 0){ // 红灯9秒
                led_time = 6;
                led_state = 0x02; // 绿灯亮
            }
        } else if (led_state == 0x02){ // 绿灯亮
            if(--led_time <= 0){ // 绿灯6秒
                led_time = 3;
                led_state = 0x04; // 黄灯闪烁
            }
        } else if (led_state == 0x04){ // 黄灯闪烁
            led_time--;
            if (led_time == 0){
                led_time = 3;
                if (led_state == 0x04)
                    led_state = 0x00;  //灯灭
                else
                    led_state = 0x04;  //黄灯闪烁
            }
        }
        //输出灯的状态
        write_led_state_to_port(led_state);
    }
    
    //再设置一个异步中断
    void ExternalInterrupt() __interrupt 0
    {    
        // 再次申请内存空间
        unsigned char *led_time = (unsigned char *) malloc (sizeof(unsigned char));
        unsigned char *led_state = (unsigned char *) malloc (sizeof(unsigned char));
        unsigned char time = 5;
    
        //恢复正常状态
        *led_time = 0;
        *led_state = 0x01;
    
        while(time--){
            write_led_state_to_port(0x04); //黄灯闪烁
            delay_ms(500);
            write_led_state_to_port(0x00); //灯灭
            delay_ms(500);
        }
    }
    
    //GPIO输出
    void write_led_state_to_port(unsigned char led_state)
    {
        unsigned char led_io = led_state << 4; //LED灯接12, 13, 14
        P1 = led_io;
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^