目录
一、主要功能
默认南北绿灯20S,东西红灯25S,绿灯过后南北黄灯5秒
然后切换东西绿灯30S,南北红灯35S,绿灯过后南北黄灯3秒
主要功能如下:
1、东西南北红黄绿灯控制
2、交通灯时间设置
3、数码管显示
4、突发状况交通灯控制
二、使用步骤
本项目使用Proteus8仿真
包含:程序,仿真,文档等
三、硬件资源
1、51单片机核心模块
2、按键模块
3、数码管显示模块
4、指示灯模块
四、软件设计
#include <reg52.h> //调用单片机头文件
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
//数码管段选定义 0 1 2 3 4 5 6 7 8 9 A B
uchar smg_du[]={0x40,0x75,0x0c,0x14,0x31,0x12,0x02,0x74,0x00,0x10,0x20,0x03,}; //断码
uchar dis_smg[4] = {0}; //数码管显示数组的缓冲区
//数码管位选定义
sbit smg_we1 = P2^0; //数码管位选IO口定义
sbit smg_we2 = P2^1; //数码管位选IO口定义
sbit smg_we3 = P3^6; //数码管位选IO口定义
sbit smg_we4 = P3^7; //数码管位选IO口定义
sbit key1 = P1^0; //按键IO口定义
sbit key2 = P1^1; //按键IO口定义
sbit key3 = P1^2; //按键IO口定义
sbit key4 = P1^3; //按键IO口定义
uchar menu_1; //设置不同参数的变量
char dx_s = 0,nb_s = 0; //东西 南北 倒计时变量
sbit dx_red = P2^7; //东西红灯IO口定义
sbit dx_green = P2^6; //东西绿灯IO口定义
sbit dx_yellow = P2^5; //东西黄灯IO口定义
sbit nb_red = P2^4; //南北红灯IO口定义
sbit nb_green = P2^3; //南北绿灯IO口定义
sbit nb_yellow = P2^2; //南北黄灯IO口定义
bit flag_1s = 0; //1秒的变量
bit flag_500ms; //500毫秒的变量
bit flag_dx_nb = 0; //东西南北模式
uchar dx_time = 30,nb_time = 20; //东西、南北的时间设置的时间
uchar flag_jdgz ; //交通管制
/***********************数码位选函数*****************************/
void smg_we_switch(uchar i)
{
switch(i)
{
case 0: smg_we1 = 0; smg_we2 = 1; smg_we3 = 1; smg_we4 = 1; break;
case 1: smg_we1 = 1; smg_we2 = 0; smg_we3 = 1; smg_we4 = 1; break;
case 2: smg_we1 = 1; smg_we2 = 1; smg_we3 = 0; smg_we4 = 1; break;
case 3: smg_we1 = 1; smg_we2 = 1; smg_we3 = 1; smg_we4 = 0; break;
}
}
/********************************************************************
* 名称 : delay_1ms()
* 功能 : 延时1ms函数
* 输入 : q
* 输出 : 无
***********************************************************************/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<120;j++);
}
uchar i;
/********************************************************************
* 名称 : display()
* 功能 : 数码管显示
* 输入 : 无
* 输出 : 无
***********************************************************************/
void display()
{
for(i=0;i<4;i++)
{
P0 = 0xff; //消隐
smg_we_switch(i); //位选
P0 = dis_smg[i]; //段选
delay_1ms(3); //延时
}
}
/*********************定时器0初始化******************/
void time0_init()
{
EA = 1; //开总中断
TMOD = 0X01; //定时器0工作方式1
ET0 = 1; //开定时器0中断
TR0 = 1; //允许定时器0定时
TH0 = 0x3c;
TL0 = 0xb0; //50ms
}
/*********************交通灯处理函数*********************************/
void jiaotongdeng_dis()
{
if(flag_1s == 1) //1秒执行一次里面的程序
{
flag_1s = 0;
if(flag_dx_nb == 0) //南北绿灯时间
{
dx_s --; //东西倒计时时间减1
nb_s --; //南北倒计时时间减1
if(dx_s == 5)
nb_s = 5;
}
if(flag_dx_nb == 1) //东西绿灯时间
{
dx_s --; //南北倒计时时间减1
nb_s --; //东西倒计时时间减1
if(nb_s == 5)
dx_s = 5;
}
if(dx_s <= 0) //倒计时时间为0切换东西 南北绿灯时间
{
flag_dx_nb = ~flag_dx_nb;
if(flag_dx_nb == 1) //东西时间
{
dx_s = dx_time;
nb_s = dx_time + 5;
}
else //南北时间
{
dx_s = nb_time + 5;
nb_s = nb_time;
}
}
}
dis_smg[0] = smg_du[dx_s % 10] ; //显示东西倒计时 时间
dis_smg[1] = smg_du[dx_s / 10] ;
dis_smg[2] = smg_du[nb_s % 10] ; //显示南北倒计时 时间
dis_smg[3] = smg_du[nb_s / 10] ;
/***********************南北时间绿灯时间*********************************/
if(flag_dx_nb == 0)
{
if(dx_s > 5)
{
dx_red = 0; //东西红灯亮
dx_green = 1; //东西绿灯灭
dx_yellow = 1; //东西黄灯灭
nb_red = 1; //南北红灯灭
nb_green = 0; //南北绿灯亮
nb_yellow = 1; //南北黄灯灭
}else if(dx_s <= 5) //当小于5秒时 黄灯要闪了
{
dx_red = 0; //东西红灯灭
dx_green = 1; //东西绿灯灭
dx_yellow = 1; //东西黄灯灭
nb_red = 1; //南北红灯灭
nb_green = 1; //南北绿灯灭
if(flag_500ms == 0) //黄灯闪烁
{
nb_yellow = 0; //亮
}
else
{
nb_yellow = 1; //灭
}
}
}
/***********************东西时间绿灯时间*********************************/
if(flag_dx_nb == 1)
{
if(nb_s > 5)
{
dx_red = 1; //东西红灯灭
dx_green = 0; //东西绿灯亮
dx_yellow = 1; //东西黄灯灭
nb_red = 0; //南北红灯亮
nb_green = 1; //南北绿灯灭
nb_yellow = 1; //南北黄灯灭
}else if(nb_s <= 5) //当小于5秒时 黄灯要闪了
{
dx_red = 1; //东西红灯灭
dx_green = 1; //东西绿灯灭
nb_red = 0; //南北红灯亮
nb_green = 1; //南北绿灯灭
nb_yellow = 1; //南北黄灯灭
if(flag_500ms == 0) //黄灯闪烁
{
dx_yellow = 0;//东西黄灯亮
}
else
{
dx_yellow = 1;//东西黄灯灭
}
}
}
}
五、实验现象
联系作者
作者B站链接:https://space.bilibili.com/3493294220773802
专注于51单片机、STM32、Proteus、物联网软件开发,PCB设计。