【Proteus仿真】【51单片机】基于51单片机交通灯

目录

一、主要功能

二、使用步骤

三、硬件资源

四、软件设计

五、实验现象

一、主要功能

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

}

五、实验现象

演示视频: