基于STC89C52RC的交通灯设计

原理图:

PCB:

关键代码: 

#include <reg52.h>
#include "oled.h"
#include "led.h"
u16 state;
u8 main_road_time,secondary_road_time,main_green_straight_cnt=30,yellow_cnt=5,sec_green_straight_cnt=20,green_left_cnt=15;
u8 sn_ge,sn_shi,ew_ge,ew_shi;
u8 code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7C,0x39,0x5E,0x79,0x71};
void Delay(u8 i)
{
  u8 j,k; 
  for(j=i;j>0;j--)
    for(k=125;k>0;k--);
}

//紧急暂停函数
void stop(){
    //当按钮接受到低电平的时候,停止倒计时,所有路口变成红灯
    if(btn==0){
        Delay(1000);     //取消抖动
                    OLED_ShowChar(88,3,' ',16);
                    OLED_ShowChar(104,3,' ',16);
                    OLED_ShowChar(88,5,' ',16);
                    OLED_ShowChar(104,5,' ',16);
                    OLED_ShowChinese(88,3,19,16);
                    OLED_ShowChinese(104,3,20,16);
                    OLED_ShowChinese(88,5,19,16);
                    OLED_ShowChinese(104,5,20,16);    
        TR0=~TR0;           //停止倒计时
        SN_RED = 0;SN_YELLOW = 1;SN_GREEN = 1; SN_LEFT=1;
        EW_RED = 0;EW_YELLOW = 1;EW_GREEN = 1; EW_LEFT=1;
    //    while(stop_flag%2==0);
    }
}
void oled_display()
{
    OLED_ShowChinese(16,0,4,16);
    OLED_ShowChinese(32,0,6,16);
    OLED_ShowChinese(48,0,15,16);
    OLED_ShowChinese(64,0,16,16);
    OLED_ShowChinese(80,0,17,16);
    OLED_ShowChinese(96,0,18,16);//红绿灯指示屏
    
    OLED_ShowChinese(8,3,0,16);//南北道路
    OLED_ShowChinese(24,3,1,16);
    OLED_ShowChinese(40,3,13,16);
    OLED_ShowChinese(56,3,14,16);
    OLED_ShowChar(72,3,':',16);

    
    OLED_ShowChinese(8,5,2,16);//东西道路
    OLED_ShowChinese(24,5,3,16);
    OLED_ShowChinese(40,5,13,16);
    OLED_ShowChinese(56,5,14,16);
    OLED_ShowChar(72,5,':',16);

}
void seg_display()
{
  
   P0=table[sn_shi];
   P2_0 = 0;
   Delay(5);
   P2_0 = 1;

   P0=table[sn_ge];
   P2_1 = 0;
   Delay(5);
   P2_1 = 1;

   P0=table[ew_shi];
   P2_2 = 0;
   Delay(5);
   P2_2 = 1;

    P0=table[ew_ge];
   P2_3 = 0;
   Delay(5);
   P2_3 = 1;
}

void led_display()
{
      if(main_road_time==0 || secondary_road_time==0)//当南北方向或者东西方向倒数到0,切换状态。
        //这一段程序只有倒计时为0才执行一次,执行完一次等下一次倒计时为0才再执行一次
   {
            switch(state)//改变红绿灯的状态
            {
                case 0:
                {
                    state=1;//下次切换到下一个模式
                    main_road_time=main_green_straight_cnt;//南北方向直行绿灯通行时间
                    secondary_road_time=main_green_straight_cnt;//东西方向红灯时间
                    SN_RED = 1;SN_YELLOW = 1;SN_GREEN = 0; SN_LEFT=1;//南北道路通行21,东西道路红禁行19
                    EW_RED = 0;EW_YELLOW = 1;EW_GREEN = 1; EW_LEFT=1;
                    OLED_ShowChar(88,3,' ',16);
                    OLED_ShowChar(104,3,' ',16);
                    OLED_ShowChar(88,5,' ',16);
                    OLED_ShowChar(104,5,' ',16);
                    OLED_ShowChinese(88,3,21,16);
                    OLED_ShowChinese(104,3,20,16);
                    OLED_ShowChinese(88,5,19,16);
                    OLED_ShowChinese(104,5,20,16);                    
                }break;
                case 1:
                {
                    state=2;
                     //南北方向直行黄灯时间
                    main_road_time=yellow_cnt;
                    secondary_road_time =yellow_cnt;
                SN_RED = 1;SN_YELLOW = 0;    SN_GREEN = 1; SN_LEFT=1; //东西黄灯,南北黄灯22 23
                EW_RED = 1; EW_YELLOW = 0; EW_GREEN=1; EW_LEFT=1;
                    OLED_ShowChar(88,3,' ',16);
                    OLED_ShowChar(104,3,' ',16);
                    OLED_ShowChar(88,5,' ',16);
                    OLED_ShowChar(104,5,' ',16);
                    OLED_ShowChinese(88,3,22,16);
                    OLED_ShowChinese(104,3,23,16);
                    OLED_ShowChinese(88,5,22,16);
                    OLED_ShowChinese(104,5,23,16);    
                }break;
                case 2:
                {
                    state=3;
                    main_road_time=sec_green_straight_cnt;
                    secondary_road_time=sec_green_straight_cnt;
                    SN_RED = 0;SN_YELLOW = 1;SN_GREEN = 1; SN_LEFT=1;     //南北红,东西绿
                    EW_RED = 1;EW_YELLOW = 1;EW_GREEN = 0; EW_LEFT=1;
                    OLED_ShowChar(88,3,' ',16);
                    OLED_ShowChar(104,3,' ',16);
                    OLED_ShowChar(88,5,' ',16);
                    OLED_ShowChar(104,5,' ',16);
                    OLED_ShowChinese(88,3,19,16);
                    OLED_ShowChinese(104,3,20,16);
                    OLED_ShowChinese(88,5,21,16);
                    OLED_ShowChinese(104,5,20,16);    
                }break;
                case 3:
                {
                    state=4;
                    //sn黄灯时间
                    main_road_time=yellow_cnt;
                    secondary_road_time=yellow_cnt;
                    SN_RED =1;SN_YELLOW = 0;    SN_GREEN = 1; SN_LEFT=1; //东西黄灯,南北黄灯
                    EW_RED = 1; EW_YELLOW = 0; EW_GREEN=1; EW_LEFT=1;
                   OLED_ShowChar(88,3,' ',16);
                    OLED_ShowChar(104,3,' ',16);
                    OLED_ShowChar(88,5,' ',16);
                    OLED_ShowChar(104,5,' ',16);
                    OLED_ShowChinese(88,3,22,16);
                    OLED_ShowChinese(104,3,23,16);
                    OLED_ShowChinese(88,5,22,16);
                    OLED_ShowChinese(104,5,23,16);    
                }break;
                case 4:
                {
                    state=0;
                    main_road_time=green_left_cnt;
                    secondary_road_time=green_left_cnt;
                    SN_RED =1;SN_YELLOW =1 ;    SN_GREEN = 1; SN_LEFT=0; //左转绿灯
                    EW_RED = 1; EW_YELLOW = 1; EW_GREEN=1; EW_LEFT=0;
                    OLED_ShowChar(88,3,' ',16);
                    OLED_ShowChar(104,3,' ',16);
                    OLED_ShowChar(88,5,' ',16);
                    OLED_ShowChar(104,5,' ',16);
                    OLED_ShowChinese(88,3,7,16);
                    OLED_ShowChinese(104,3,8,16);
                    OLED_ShowChinese(88,5,7,16);
                    OLED_ShowChinese(104,5,8,16);    
                }break;                
                default:break;
            }
      
        }
        sn_shi=main_road_time/10;//显示数码管 时刻刷新
        sn_ge=main_road_time%10;//显示数码管
        ew_shi=secondary_road_time/10;//显示数码管
        ew_ge=secondary_road_time%10;//显示数码管
}

作品功能:

1、红灯和绿灯相互转换经过黄灯,黄灯亮灯 5 秒。
2、南北道路方向通行 30 秒,东西道路通行 20 秒,单独左转信号 15 秒,先直行信
号,后左转信号。
3、设置自动、手动、特殊情况三种方式。自动模式下自动显示各种状态的倒计时,
红绿灯自动切换;手动模式下可以根据道路车流量情况手动调节红灯绿灯相应时间;
紧急情况下所有路口红灯亮,以便 120、110 等及时通行。
4、使用红绿灯指示屏实时刷新道路通行状况。

作品实物:

 

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
stc89c52rc是一种51系列单片机,可以用于设计和制作电子钟。基于stc89c52rc的电子钟可以具有多种功能,如显示时间、日期、温度等。 首先,我们需要通过外部晶振或者RTC(实时时钟)芯片来获取当前的时间。然后,利用LCD显示模块来显示时间和日期。stc89c52rc具有的I/O口可以轻松地与LCD模块连接,以便控制显示内容。我们可以使用I2C或SPI协议通过软件来驱动LCD模块。 此外,stc89c52rc还可以与DS18B20温度传感器连接。DS18B20是一种数字温度传感器,可以将当前的环境温度以数字形式输出。通过与stc89c52rc的通信,我们可以实时获取温度数据,并在LCD屏幕上显示出来。 除了时间和温度,电子钟还可以设计其它功能,如闹钟、定时器等。我们可以通过按键来设置闹钟时间,当到达设定时间时,可以发出蜂鸣器的声音作为提醒。同样,我们也可以利用stc89c52rc的计时器功能来实现定时器功能。 另外,stc89c52rc还具有串口通信功能,我们可以利用这个功能实现电子钟与电脑之间的数据交互。通过串口连接,我们可以进行时钟校准、数据备份等操作。 最后,为了保证电子钟的稳定性和精度,我们可以使用电池供电以备份时间和设置参数。同时,还可以设计一些斯利奇(校时)、自动亮度调节等功能来增加电子钟的使用体验。 基于stc89c52rc的电子钟具有强大的功能和灵活性,同时也具备低成本、简单可靠的特点,可以广泛应用于家庭、办公室等场所。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值