目录
一、主要功能
1、四方向数码管设计显示
2、按键从上到下依次为:复位、夜间、紧急、设定、增、减。
3、夜间模式:按下"夜间模式"按键后,四个方向的黄灯闪烁。再次按下则退出。
4、紧急模式:按下"紧急模式"按键,四个方向全部亮红灯,待紧急车辆通过后,再次按键退出。
5、设定时间,按下"设定"键,设定东西方向的倒计时时间,东西方向的两个数码管亮,
再次按下"设定"键,则设定南北方向的倒计时时间,同时南北方向的两个数码管亮,
再次按下则退出设定状态,开始运行。
二、使用步骤
51单片机交通灯控制系统是一种典型的嵌入式应用,通过单片机编程实现对十字路口交通信号的智能化管理。系统以AT89C51/STC89C52等51系列单片机为核心控制器,系统运行后,外围电路实现红黄绿灯控制、数码管倒计时显示和按键模式切换等功能。单片机通过执行存储在程序存储器中的指令工作,接收输入信号、处理数据并输出控制信号。CPU是核心,负责执行所有操作,存储器存储指令和数据,I/O接口与外部设备通信。典型系统包括数码管显示电路、复位电路、时钟电路、发光二极管电路和按键电路等模块。
三、硬件资源
1、51单片机核心模块
2、按键模块
3、数码管模块、led灯
四、软件设计
#include<intrins.h> //包含库文件
sbit smg1=P3^0; //定义南北方向数码管低位
sbit smg2=P3^1; //定义南北方向数码管高位
sbit smg3=P3^2; //定义东西方向数码管低位
sbit smg4=P3^3; //定义东西方向数码管高位
sbit N_green=P2^0; //定义北向绿灯端口
sbit N_red=P2^1; //定义北向红灯端口
sbit N_yellow=P2^2; //定义北向黄灯端口
sbit S_green=P2^7; //定义南向绿灯端口
sbit S_red=P2^6; //定义南向红灯端口
sbit S_yellow=P2^5; //定义南向黄灯端口
sbit W_green=P1^0; //定义西向绿灯端口
sbit W_red=P1^1; //定义西向红灯端口
sbit W_yellow=P1^2; //定义西向黄灯端口
sbit E_green=P1^7; //定义东向绿灯端口
sbit E_red=P1^6; //定义东向红灯端口
sbit E_yellow=P1^5; //定义东向黄灯端口
sbit k0=P3^4; //定义复位按键
sbit k1=P3^5; //定义夜间模式按键
sbit k2=P3^6; //定义紧急模式按键
sbit menu=P3^7; //定义设定时间按键
sbit zj=P1^3; //定义时间加按键
sbit jx=P1^4; //定义时间键按键
int kkk=0,fk=0;
int djs22,js1=0,djs21,flgaa,nbdjs=20,dxdjs=20; //以上为临时变量
int js=0,djs=20,djs1=20; //初始倒计时时间
int table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x40}; //共阴极数码管段值
/************以下为函数声明*************/
void jtd();
void jtda();
void jtdb();
void djsxs();
void yj();
void jj();
void jtday();
void jtdby();
/*****************************************************/
/* 函数名:delayms */
/* 功能:产生毫秒级延时 */
/*****************************************************/
void delayms(int x)
{
char i;
while(x--)
{
for(i=150;i>0;i--);
}
}
/*****************************************************/
/* 函数名:Timer0_init() */
/* 功能:定时器0初始化 */
/*****************************************************/
void Timer0_init()
{
js=0;
TMOD=0x01; //定义定时器0工作模式
TH0=0x4c; //赋初值高位
TL0=0x00; //赋初值低位
TR0=1; //启动定时器
ET0=1; //开中断
EA=1; //开全局中断
}
/*****************************************************/
/* 函数名:timer0() interrupt 1 using 1 */
/* 功能:定时器0中断服务函数 */
/*****************************************************/
void timer0() interrupt 1 using 1
{
TF0=0;
TH0=0x4c;
TL0=0x00; //重新赋高地位初值
js++;
if(js==22)
{ js=0;
djs--;
djs1--;
kkk++; //以上用于产生1S中断
}
}
/*****************************************************/
/* 函数名:djsxs22() */
/* 功能:4个数码管动态显示 */
/*****************************************************/
void djsxs22()
{ int b1,b2;
b1=djs1/10; //将倒计时时间的高位赋予b1
b2=djs1%10; //将倒计时时间的低位赋予b2
P0=table[b1];
smg1=0;
delayms(3);
smg1=1; //显示b1
P0=table[b2];
smg2=0;
delayms(3);
smg2=1; //显示b2
P0=table[b1];
smg3=0;
delayms(3);
smg3=1; //显示b1
P0=table[b2];
smg4=0;
delayms(3);
smg4=1; //显示b2
}
五、实验现象
演示视频: