基于51单片机控制的交通灯的课程设计.docx
《基于51单片机控制的交通灯的课程设计.docx》由会员分享,可在线阅读,更多相关《基于51单片机控制的交通灯的课程设计.docx(21页珍藏版)》请在冰豆网上搜索。
![基于51单片机控制的交通灯的课程设计.docx](https://file1.bdocx.com/fileroot1/2022-11/22/ac824ede-588e-47c7-8f86-6812cd5fc305/ac824ede-588e-47c7-8f86-6812cd5fc3051.gif)
基于51单片机控制的交通灯的课程设计
电子产品实训报告
基于单片机的交通灯控制
学院:
机电工程学院
专业:
应用电子技术
班级:
09应电1班
摘要:
近年来随着科技的飞速发展,单片机的应用正在不断深入,同时带动传统控制检测技术日益更新。
在实时检测和自动控制的单片机应用系统中,单片机往往作为一个核心部件来使用,仅单片机方面知识是不够的,还应根据具体硬件结构软硬件结合,加以完善。
十字路口车辆穿梭,行人熙攘,车行车道,人行人道,有条不紊。
那么靠什么来实现这井然秩序呢?
靠的就是交通信号灯的自动指挥系统。
交通信号灯控制方式很多。
本系统采用STC-51系列单片机STC89C51来设计交通灯控制器,实现了能根据实际车流量通过8051芯片的P1口设置红、绿灯燃亮时间的功能;红绿灯循环点亮,倒计时剩5秒时黄灯闪烁警示(交通灯信号通过PA口输出,显示时间直接通过8255的PC口输出至双位数码管);车辆闯红灯报警;绿灯时间可检测车流量并可通过双位数码管显示。
本系统实用性强、操作简单、扩展功能强。
关键词:
单片机交通灯电路连接图Proteus仿真图
一.引言
当今,红绿灯安装在各个道口上,已经成为疏导交通车辆最常见和最有效的手段。
信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。
绿灯是通行信号,面对绿灯的车辆可以直行,左转弯和右转弯,除非另一种标志禁止某一种转向。
左右转弯车辆都必须让合法地正在路口内行驶的车辆和过人行横道的行人优先通行。
红灯是禁行信号,面对红灯的车辆必须在交叉路口的停车线后停车。
黄灯是警告信号,面对黄灯的车辆不能越过停车线,但车辆已十分接近停车线而不能安全停车时可以进入交叉路口。
二.单片机概述
1单片机的历史
自1971年美国INTEL公司制造出第一块4位微处理器以来,其发展十分迅猛,到目前为止,大致可分为以下五个阶段[1]。
(1)4位单片机(1971-1974)
(2)低档8位单片机(1974-1978)
(3)高档8位单片机(1978-1982)
(4)16位单片机(1982-1990)
(5)新一代单片机(90年代以来)
2单片机的应用
因单片机具有体积小、重量轻、价格便宜、功耗低、控制功能强及运算速度快等特点,故在国民经济建设、军事及家用电器等领域均得到广泛的应用。
按照单片机的特点,单片机可分为单机应用和多机应用。
在一个应用系统中,只用一个单片机,这是目前应用最多的方式,主要应用领域有:
(1)单机应用:
①测控系统。
用单片机可构成各种工业控制系统、自适应系统、数据采集系统等。
例如,温室人工气候控制、水闸自动控制、电镀生产线自动控制、汽轮机电液调节系统、车辆检测系统、机器人轴处理器等[2]。
②智能仪表。
用单片机改造原有的测量、控制仪表,能迥数字化、智能化、多功能化、综合化、柔性化发展。
如温度、压力、流量、浓度等的测量、显示及仪表控制。
通过采用单片机软件编程技术,使测量仪表中长期存在的误差修正、线性化处理等难题迎刃而解。
③机电一体化产品。
单片机与传统的机械产品结合,使传统机械产品结构简化,控制智能化。
这类产品如:
简易数控机床,电脑绣花机,医疗器械等。
④智能接口。
在计算机控制系统(特别是较大型的工业测控系统)中,普遍采用单片机进行接口的控制与管理,因单片机与主机是并行工作,故能大大提高了系统的运行速度。
例如:
在大型数据采集系统中,用单片机对ADC接口进行控制不仅可提高采集速度,而且还能对数据进行预处理,如数字滤波、线性化处理、误差修正等。
⑤智能民用产品。
在家用电器、玩具、游戏机、声像设备、电子秤、收银机、办公设备、厨房设备等产品中引入单片机,不仅使产品的功能大大增强,而且获得了良好的使用效果。
三.芯片简介
1.STC-51芯片简介
STC-51单片机内部结构,8051是STC-51系列单片机的典型产品,我们以这一代表性的机型进行系统的讲解。
8051单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,现在我们分别加以说明:
中央处理器:
中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。
数据存储器(RAM)
8051内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。
程序存储器(ROM):
8051共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。
定时/计数器(ROM):
8051有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。
并行输入输出(I/O)口:
8051共有4组8位I/O口(P0、P1、P2或P3),用于对外部数据的传输。
全双工串行口:
8051内置一个全双工串行通信口,用于与其它设备间的串行数据传送,该串行口既可以用作异步通信收发器,也可以当同步移位器使用。
中断系统:
8051具备较完善的中断功能,有两个外中断、两个定时/计数器中断和一个串行中断,可满足不同的控制要求,并具有2级的优先级别选择。
时钟电路:
8051内置最高频率达12MHz的时钟电路,用于产生整个单片机运行的脉冲时序,但8051单片机需外置振荡电容。
单片机的结构有两种类型,一种是程序存储器和数据存储器分开的形式,即哈佛(Harvard)结构,另一种是采用通用计算机广泛使用的程序存储器与数据存储器合二为一的结构,即普林斯顿(Princeton)结构。
INTEL的STC-51系列单片机采用的是哈佛结构的形式,而后续产品16位的MCS-96系列单片机则采用普林斯顿结构。
STC-51的引脚说明:
STC-51系列单片机中的8031、8051及8751均采用40Pin封装的双列直接DIP结构,右图是它们的引脚配置,40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。
现在我们对这些引脚的功能加以说明:
STC-51的引脚说明:
STC-51系列单片机中的8031、8051及8751均采用40Pin封装的双列直接DIP结构,右图是它们的引脚配置,40个引脚中,正电源和地线两根,外置石英振荡器的时钟线两根,4组8位共32个I/O口,中断口线与P3口线复用。
现在我们对这些引脚的功能加以说明:
Pin9:
RESET/Vpd复位信号复用脚,当8051通电,时钟电路开始工作,在RESET引脚上出现24个时钟周期以上的高电平,系统即初始复位。
初始化后,程序计数器PC指向0000H,P0-P3输出口全部为高电平,堆栈指针写入07H,其它专用寄存器被清“0”。
RESET由高电平下降为低电平后,系统即从0000H地址开始执行程序。
然而,初始复位不改变RAM(包括工作寄存器R0-R7)的状态,8051的初始态。
8051的复位方式可以是自动复位,也可以是手动复位,见下图4。
此外,RESET/Vpd还是一复用脚,Vcc掉电其间,此脚可接上备用电源,以保证单片机内部RAM的数据不丢失。
Pin30:
ALE/
当访问外部程序器时,ALE(地址锁存)的输出用于锁存地址的低位字节。
而访问内部程序存储器时,ALE端将有一个1/6时钟频率的正脉冲信号,这个信号可以用于识别单片机是否工作,也可以当作一个时钟向外输出。
更有一个特点,当访问外部程序存储器,ALE会跳过一个脉冲。
如果单片机是EPROM,在编程其间,
将用于输入编程脉冲。
Pin29:
当访问外部程序存储器时,此脚输出负脉冲选通信号,PC的16位地址数据将出现在P0和P2口上,外部程序存储器则把指令数据放到P0口上,由CPU读入并执行。
Pin31:
EA/Vpp程序存储器的内外部选通线,8051和8751单片机,内置有4kB的程序存储器,当EA为高电平并且程序地址小于4kB时,读取内部程序存储器指令数据,而超过4kB地址则读取外部指令数据。
如EA为低电平,则不管地址大小,一律读取外部程序存储器指令。
显然,对内部无程序存储器的8031,EA端必须接地。
在编程时,EA/Vpp脚还需加上21V的编程电压。
四.系统硬件设计
.1交通管理的方案论证
东西、南北两干道交于一个十字路口,各干道有一组红、黄、绿三色的指示灯,指挥车辆和行人安全通行。
红灯亮禁止通行,绿灯亮允许通行。
黄灯亮提示人们注意红、绿灯的状态即将切换,且黄灯燃亮时间为东西、南北两干道的公共停车时间。
设东西道比南北道的车流量大,指示灯燃亮的方案如表2。
60S
5S
55S
5S
……
东西道
红灯亮
黄灯亮
绿灯亮
黄灯亮
……
南北道
绿灯亮
黄灯亮
红灯亮
黄灯亮
……
表2
表2说明:
(1)当东西方向为红灯,此道车辆禁止通行,东西道行人可通过;南北道为绿灯,此道车辆通过,行人禁止通行。
时间为60秒。
(2)黄灯闪烁5秒,警示车辆和行人红、绿灯的状态即将切换。
(3)当东西方向为绿灯,此道车辆通行;南北方向为红灯,南北道车辆禁止通过,行人通行。
时间为55秒。
东西方向车流大通行时间长。
(4)这样如上表的时间和红、绿、黄出现的顺序依次出现这样行人和车辆就能安全畅通的通行。
(5)此表可根据车流量动态设定红绿灯初始值。
2.系统硬件设计
STC89C51芯片一个,12M晶振一个,1KΩ排阻2个,10K电阻一个,10uF电解电容一个,22uF电容2个,红黄绿二极管各四个,控制开关7个,数码管2个,电源输入接口一个,数据线一根,导线若干。
3交通灯硬件线路图
4.焊接电路图
5.Proteus仿真图
1.程序仿真前
2.程序仿真过程中
(1)正常运行
(2)黄灯亮
(3)禁止通行
六.程序源代码
#include
#defineucharunsignedchar
#defineuintunsignedint
uchardatabuf[4];
uchardatasec_dx=20;//东西数默认
uchardatasec_nb=30;//南北默认值
uchardataset_timedx=20;
uchardataset_timenb=30;
intn;
uchardatacountt0;//定时器0中断次数
//定义5组开关
sbitk4=P3^7;//切换方向
sbitk1=P3^5;//时间加
sbitk2=P3^6;//时间减
sbitk3=P3^4;//确认
sbitk5=P3^1;//禁止
//P3^2//只允许东西方向通行,中断0
//P3^3//只允许南北方向通行,中断1
sbitRed_nb=P2^5;//南北黄灯标志
sbitRed_dx=P2^2;//东西黄灯标志
sbitGreen_nb=P2^4;//南北绿灯标志
sbitGreen_dx=P2^1;//东西绿灯标志
sbitBuzz=P3^0;
bitBuzzer_Indicate;
bittime=0;//灯状态循环标志
bitset=1;//调时方向切换键标志
ucharcodetable[11]={//共阴极字型码
0x3f,//--0
0x06,//--1
0x5b,//--2
0x4f,//--3
0x66,//--4
0x6d,//--5
0x7d,//--6
0x07,//--7
0x7f,//--8
0x6f,//--9
0x00//--NULL
};
//函数的声明部分
voiddelay(intms);//延时子程序
voidkey();//按键扫描子程序
voidkey_to1();//键处理子程序
voidkey_to2();
voidkey_to3();
voiddisplay();//显示子程序
voidlogo();//开机LOGO
voidBuzzer();
//主程序
voidmain()
{
TMOD=0X11;//定时器设置
TH0=0X3C;//定时器0置初值0.05S
TL0=0XB0;
EA=1;//开总中断
ET0=1;//定时器0中断开启
TR0=1;//启动定时0
EX0=1;//开外部中断0
EX1=1;//开外部中断1
logo();
P2=0Xc3;//开始默认状态,东西绿灯,南北黄灯
sec_nb=sec_dx+5;//默认南北通行时间比东西多5秒
while
(1)
{
key();//调用按键扫描程序
display();//调用显示程序
Buzzer();
}
}
//函数的定义部分
voidkey()//按键扫描子程序
{
if(k1!
=1)//时间加按下时
{
delay(10);//延时消抖
if(k1!
=1)
{
while(k1!
=1)//当按键未弹起时,一直执行
{
key_to1();//调用按键1功能
for(n=0;n<40;n++)//调用40次显示,用于延时
{display();}
}
}
}
if(k2!
=1)//当K2按键按下时
{
delay(10);//延时消抖
if(k2!
=1)
{
while(k2!
=1)//按键按下未弹起时一直执行
{
key_to2();//调用key2功能
for(n=0;n<40;n++)//调用40次显示,用于延时
{display();}
}
}
}
if(k3!
=1)//当K3(确认)键按下时
{
TR0=1;//启动定时器
Buzzer_Indicate=0;
sec_nb=set_timenb;//从中断回复,仍显示设置过的数值
sec_dx=set_timedx;//显示设置过的时间
if(set==1)//时间倒时到0时
{
P2=0X99;//东西红灯,南北绿灯
sec_nb=sec_dx+5;//回到初值
}
else
{
P2=0xC3;//东西绿灯,南北红灯
sec_dx=sec_nb+5;
}
}
if(k4!
=1)//当K4(切换)键按下
{
delay(5);//延时消抖
if(k4!
=1)
{
while(k4!
=1);
set=!
set;//取反set标志位,以切换调节方向
}
}
if(k5!
=1)//当K5(禁止)键按下时
{
delay(5);//延时消抖
if(k5!
=1)
{
while(k5!
=1)
key_to3();
}
}
}
voiddisplay()//显示子程序
{
buf[1]=sec_dx/10;//第1位东西秒十位
buf[2]=sec_dx%10;//第2位东西秒个位
buf[3]=sec_nb/10;//第3位南北秒十位
buf[0]=sec_nb%10;//第4位南北秒个位
P1=0xff;//初始灯为灭的
P0=0x00;
P1=0xfe;//片选LED1
P0=table[buf[1]];//送东西时间十位的数码管编码
delay
(1);//延时
P1=0xff;//关显示
P0=0x00;
P1=0xfd;//片选LED2
P0=table[buf[2]];
delay
(1);
P1=0xff;
P0=0x00;
P1=0Xfb;//片选LED3
P0=table[buf[3]];
delay
(1);
P1=0xff;
P0=0x00;
P1=0Xf7;
P0=table[buf[0]];//片选LED4
delay
(1);
}
voidtime0(void)interrupt1using1//定时中断子程序
{
TH0=0X3C;//重赋初值
TL0=0XB0;
TR0=1;//重新启动定时器
countt0++;//软件计数加1
if(countt0==20)//定时器中断次数=20时(即1秒时)
{countt0=0;//清零计数器
sec_dx--;//东西时间减1
sec_nb--;//南北时间减1
if(sec_nb<=5&&time==0)//东西黄灯闪
{
Green_dx=0;
Red_dx=!
Red_dx;
}
if(sec_dx<=5&&time==1)//南北黄灯闪
{
Green_nb=0;
Red_nb=!
Red_nb;
}
if(sec_dx==0&&sec_nb==5)//当东西倒计时到0时,重置5秒,用于黄灯闪烁时间
sec_dx=5;
if(sec_nb==0&&sec_dx==5)//当南北倒计时到0时,重置5秒,用于黄灯闪烁时间
sec_nb=5;
if(time==0&&sec_nb==0)//当黄灯闪烁时间倒计时到0时,
{
P2=0x99;//重置东西南背方向的红绿灯
time=!
time;
sec_nb=set_timenb;//重赋南北方向的起始值
sec_dx=set_timenb+5;//重赋东西方向的起始值
}
if(time==1&&sec_dx==0)//当黄灯闪烁时间到
{
P2=0Xc3;//重置东西南北的红绿灯状态
time=!
time;
sec_dx=set_timedx;//重赋东西方向的起始值
sec_nb=set_timedx+5;}//重赋南北方向的起始值
}
}
voidkey_to1()//键盘处理子程序之+
{
TR0=0;//关定时器
if(set==0)
set_timenb++;//南北加1S
else
set_timedx++;//东西加1S
if(set_timenb==100)
set_timenb=1;
if(set_timedx==100)
set_timedx=1;//加到100置1
sec_nb=set_timenb;//设置的数值赋给东西南北
sec_dx=set_timedx;//
}
voidkey_to2()//键盘处理子程序之-
{
TR0=0;//关定时器
if(set==0)
set_timenb--;//南北减1S
else
set_timedx--;//东西减1S
if(set_timenb==0)
set_timenb=99;
if(set_timedx==0)
set_timedx=99;//减到1重置99
sec_nb=set_timenb;//设置的数值赋给东西南北
sec_dx=set_timedx;
}
voidkey_to3()//键盘处理之紧急车通行
{
TR0=0;//关定时器
P2=0Xc9;//全部置红灯
sec_dx=00;//四个方向的时间都为00
sec_nb=00;
Buzzer_Indicate=1;
}
//外部中断0
voidint0(void)interrupt0using1//只允许东西通行
{
TR0=0;//关定时器
P2=0Xc3;//东西方向置绿灯
Buzzer_Indicate=0;
sec_dx=00;//四个方向的时间都为00
sec_nb=00;
}
//外部中断1
voidint1(void)interrupt2using1//只允许南北通行
{
TR0=0;//关定时器
P2=0X99;//置南北方向为绿灯
Buzzer_Indicate=0;
sec_nb=00;//四个方向的时间都为00
sec_dx=00;
}
voidlogo()//开机的Logo"----"
{
for(n=0;n<50;n++)
{
P0=0x40;
P1=0xfe;
delay
(1);
P1=0xfd;
delay
(1);
P1=0Xfb;
delay
(1);
P1=0Xf7;
delay
(1);
P1=0xff;
}
}
voidBuzzer()
{
if(Buzzer_Indicate==1)
Buzz=!
Buzz;
elseBuzz=0;
}
voiddelay(intms)//延时子程序
{
uintj,k;
for(j=0;jfor(k=0;k<124;k++);//大约1毫秒的延时
}
七.总结
此次课程设计历时一个月,在此期间查阅了出课本以外的很多资料,当然了也包括对课本的全面复习,是我对这两年多以来所学的知识有了一个系统的连贯、全面的复习。
很多以前不太了解的知识都得到了进一步的理解和认知。
通过这次长达一个月的电子产品课程设计,使我得到了一次用专业知识、专业技能分析和解决问题全面系统锻炼的机会。
使我在单片机的基本原理、单片机应用系统开发过程,单片机控制过程以及在常用编程设计思路技巧(特别是汇编语言)的掌握方面和Proteus程序仿真都向前迈了一大步,这件为我的成长注入更大的活力,