原理图:
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;//显示数码管
}
作品功能:
作品实物: