基于51单片机的交通灯显示系统

第一章 绪论

1.1 设计目的

本次课程目的是加深学生对单片机软硬件技术和相关理论知识的理解,进一步熟悉51单片机系统设计的基本理论、方法和技能,掌握工程应用的基本内容和要求,力争做到理论与实际的统一,同时培养学生分析问题、解决问题的能力和独立完成系统设计的能力,并按要求编写相关的技术文档和设计报告等。

1.2 设计任务

设计内容:基于单片机的交通灯显示系统

具体要求如下:

(1)东西方向、南北方向均有红、黄、绿三种信号灯。

(2)带紧急制动按钮,按钮按下,所有方向亮红灯;再次按下,恢复正常显示。

(3)夜间模式按钮按下,所有方向显示黄灯闪烁。

(4)实时提醒绿灯亮的剩余时间。

创新:(5)能自定义设置当前状态东西方向和南北方向的红绿灯持续时间。

第二章 总体设计

2.1 总体设计及功能描述

本设计以单片机 AT89C51为控制核心, 采用模块化设计, 共分以下几个功能模块:单片机控制系统模块、电源模块、时钟模块、复位模块、按键控制模块、 显示模块等。 

交通灯显示系统主要有日常模式、紧急模式和夜间模式三种模式,能实时显示当前状态南北和东西方向红绿灯状态及倒计时时间,还有自定义设置红绿灯时间的功能。

系统结构框图如下图2-1所示: 

图2-1 系统整体框图

各模块功能如下:

1.AT89C51单片机:洗衣机控制系统的核心控制器件。

2.时钟电路模块:产生时钟信号驱动单片机工作。

3.复位电路模块:将单片机的寄存器重定,使程序指针回到最初位置。以便于系统运行时,程序从最初位置开始执行。

4.显示模块:显示模块电路采用3个 LED 和3个电阻以及LCD液晶显示屏与单片机相连,利用 C 语言程序设计实现洗衣机自动化显示功能。

5.按键模块:可以通过按键自定义设置加减当前红绿灯东西和南北方向的持续时间以及切换到夜间、管制模式。

2.2 系统硬件设计

(1) 单片机控制模块的设计

AT89C51单片机是一种高效微控制器, 也是低功耗高性能单片机。 单片机是本设计的核心主要起控制作用, 采用 40 引脚双列直插封装形式, 32 个外部双向输入/输 出(I/O)埠, 同时内含 2 个外中断口, 2 个 16 位可程序设计定时计数器, 2 个全双工串行通信口,因为受引脚数目 的限制, 所以有不少引脚具有第二功能。外形及引脚排列如图 2-2 所示。

AT89C51单片机的主要管脚功能:

VCC: 供电电压。

 GND: 接地。

 P0 口: P0 口为一个 8 位漏级开路双向 I/O 口, 每脚可吸收 8TTL 门电流。 当 P1 口的管脚第一次写 1 时, 被定义为高阻输入。 P0 能够用于外部程序数据存储器, 它可以被定义为数据/地址的第八位。

P1 口: P1 口是一个内部提供上拉电阻的 8 位双向 I/O 口, P1 口缓冲器能接收输出4TTL 门电流。 P1 口管脚写入 1 后, 被内部上拉为高, 可用作输入, P1 口被外部下拉为低电平时, 将输出电流, 这是由于内部上拉的缘故。

 P2 口: P2 口为一个内部上拉电阻的 8 位双向 I/O 口, P2 口缓冲器可接收, 输出 4个 TTL 门电流, 当 P2 口被写 1 时, 其管脚被内部上拉电阻拉高, 且作为输入。 并因此作为输入时, P2 口的管脚被外部拉低, 将输出电流。

P3 口: P3 口是 8 个带内部上拉电阻的双向 I/O 口, 可接收输出 4 个 TTL 门电流。当 P3 口写入 1 后, 它们被内部上拉为高电平, 并用作输入。 作为输入, 由于外部下拉为低电平, P3 口将输出电流(ILL) 这是由于上拉的缘故。 RST: 复位输入。 当振荡器复位器件时, 要保持 RST 脚两个机器周期的高电平时间。

ALE/PROG: 当访问外部内存时, 地址锁存允许的输出电平用于锁存地址的地位字节。 在 FLASH 程序设计期间, 此引脚用于输入程序设计脉冲。 在平时, ALE 端以不变的频率周期输出正脉冲信号, 此频率为振荡器频率的 1/6。 因此它可用作对外部输出的脉冲或用于定时目的。

PSEN : 外部程序内存的选通信号。 在由外部程序内存取指期间, 每个机器周期两次 PSEN 有效。 但在访问外部数据存储器时, 这两次有效的 PSEN 信号将不出现。

 EA/VPP: 当 EA保持低电平时, 则在此期间外部程序内存(0000H-FFFFH), 不 管是否有内部程序内存。 注意加密方式 1 时, EA将内部锁定为 RESET; 当 EA端保持高电平时, 此间内部程序内存。在 FLASH 程序设计期间, 此引脚也用于施加 12V 程序设计电源 (VPP)。               

图 2-2 AT89C51 单片机的管脚图

 电源、 时钟信号以及复位电路是单片机工作的基本条件,缺一不可。 AT89C51 单片机系统的基本工作电路包括电源电路、时钟电路、复位电路。其组成方框图如图 2-3 所示。

图 2-3 单片机控制最小系统基本硬件组成方框图

(2)时钟电路模块设计

电源电路模块为系统电路和其他模块提供+5V 电源。 供电电源可由开关电源提供。

时钟电路模块的设计:

   由于 AT89C51单片机芯片内有时钟振荡电路, 因此本系统单片机采用内部时钟方式,只要在单片机的 XTAL1和 XTAL2引脚外接石英晶体和微调电容, 就构成了自激振荡器并在单片机内部产生时钟脉冲信号,具体电路设计如图 2-4 所示。  

工作原理:时钟信号通常用两种电路形式得到:内部振荡和外部振荡。 在 XTAL1 和 XTAL2 引脚上外接定时组件,就能构成自激振荡电路。定时组件通常采用石英晶体和电容组成的并联谐振电路。一般电容 C4 和 C5 主要起频率微调作用,电容值可选取为 30pF 左右或 40pF左右;晶体振荡器,简称晶振,其晶振频率(fosc) 范围为 1. 2MHz~12MHz, 本设计中选择12MHz。晶体振荡频率越高,系统的时钟频率也越高,单片机的运行速率就越快。

以晶振12MHZ为例,定时器0工作方式1为例,可以得到:

TMOD=0x01;

TL0=0xb0;

TH0=0x3c;

12M晶振每秒可产生1M个机器周期,1M个机器周期就是1000000个机器周期。一个机器周期为1us, 50ms就需要50000个机器周期,定时器在方式1工作,为16位,最大值为65536,所以需设初值为65536-50000=15536;

15536转化为16进制得3cb0;故高位TH0=0x3c;TL0=0xb0;

图 2-4 时钟振荡电路

(3)复位电路模块设计

复位电路使单片机或系统中的其他部件处于某种确定的状态。 当在 MCS-51 系列单片的 RST 引脚处引入高电平并保持 2 个机器周期, 单片机内部就执行复位操作。 复位操作有两种基本形式:一种是上电复位, 另一位是按键复位。 本设计采用按键复位方式。 如图 2-5 所示。

工作原理:当按下按键时, RST 直接与 VCC 相连,出现 2 个以上的高电平形成复位,同时电解电容被短路放电;按键松开时,电容充电,电流流过电阻,RST 为高电平,仍然是复位,充电完成后,电容相当于开路,RST 为低电平,正常工作。

图 2-5 复位电路

(4)按键控制电路设计

单片机设计中, 重要的一个模块是按键的设计。 常见的单片机按键设计分为独立式和行列式(矩阵式)。独立式按键设计简单, 但占用 I/O 口较多;行列式按键设计相对复杂,占用 I/O 口较少。

因为只有日常、紧急和夜间三种模式,需要的按键较少,因此本次设计采用的是独立按键式,直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O口线,每个按键的工作不会影响其他I/O口线的状态。

独立按键的软件常采用查询式结构。先逐位查询没跟I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。其优点是电路配置灵活,软件结构简单,可根据实际需要灵活编码,可以直接读取,检测占用时间较少,不受其它因素影响,如图 2-6 所示。

如图 2-6 按键控制电路设计

 上图为独立式按键控制电路,为方便使用,设计了五个独立式按键,分别为自定义设置、(时间)加、(时间)减、夜间和紧急。

设置:按下K1键自定义设置当前绿灯东西和南北方向倒计时时间;

加:按下K2键增加红绿灯倒计时时间;

减:按下K3键减少红绿灯倒计时时间;

夜间:按下K4键进入夜间模式,所有方向黄灯闪烁;再次按下,恢复正常显示。

紧急:按下K5键进入紧急模式,所有方向亮红灯;再次按下,恢复正常显示。

(5)显示电路设计

在单片机应用系统中,对于系统的运行状态和运行结果,通常都需要直观显示出来。本设计采用的是12个共阳极发光二极管和四个两位八段数码管显示,显示电路如图 2-8 所示。 

12个共阳极发光二极管由12个LED 和12个电阻构成,每个电阻都为 100 欧姆, 在电路中,电阻的目的是起限流保护作用,防止 LED 被烧坏。12个 LED 是共阳级,当输入低电平时 LED 点亮,当输入高电平时 LED 熄灭。LED灯实时显示各个方向的红绿灯状态。

图 2-8 显示电路(数码管和LED灯)

本次设计采用的共阳极两位八段数码管接法。四个方向的数码管实时显示当前方向交通灯的持续时间倒计时,以便切换状态。初始状态即为日常状态时,设东西和南北方向的红灯持续时间为10s,绿灯持续时间为6s,黄灯闪烁时间为3s;紧急状态所有方向都变为红灯,解除紧急状态红绿灯恢复正常;夜间模式,所有方向变为黄灯闪烁,解除夜间模式红绿灯恢复正常。

这是一个数码管内部电路原理图,a~h每个数字代表一个发光二极管,v是公共端,可以接地或者电源,对应共阳极和共阳极接法。a~g段数码管用来显示数字,h显示小数点。为了便于封装,数码管的外部一共10个引脚,5和10连在一起接公共端,其余各对应一个发光二极管:

例如,如果我们想显示数字“0”,那么就需要a~f这六个数码管亮;如果显示数字“1”,那么就需要b、c两个数码管点亮,以此类推,如下图所示,其中为0时亮为1时不亮。

共阳数码管是数码管中所有的正极连接在一起,这个端口被称之为位选端口;

其余的数码管引脚 a-h 都为段选端口。

本次设计共阳极数码管的编码(CA)为:

char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9

2.3 硬件仿真电路图

如图2-10所示

图2-10 硬件仿真电路图

第 3 章 系统软件设计

软件在硬件平台上构筑,完成各部分硬件的控制和协调。系统功能是由软硬件共同实现的, 由于软件的可伸缩性,最终实现的系统功能可强可弱,差别可能很大。 软件采用模块化设计方法, 不仅易于程序设计和调试, 也可减小软件故障率和提高软件的可靠性。同时, 对软件进行全面测试也是检验错误排除故障的重要手段。 由于程序设计多涉及到数值运算, 比较复杂, 还有 LCD 灯的显示设计都是需要多重选择判断,用我们平时常用的汇编程序设计是很难实现的,这里我们选用了移值性好、结构清晰、能进行复杂运算的 C语言来实现程序设计。

3.1软件主要程序流程

整个系统的功能是由硬件电路配合软件来实现的, 当硬件基本定型的时候软件也基本定下了, 从软件的功能不同, 可以分为两的类: 一是监控软件(主程序) 它是整个软件的核心, 专门用来协调各个执行模块和操作者的联系。 二是执行软件(子程序) 它是用来完成各种实质性的工作的, 如测量、 计算、 显示、 通讯等。 每一个执行软件就是一个小的执行模块, 这里将每一个模块一一列出来, 并为每个执行模块进行功能定义和接口定义。 各执行模块规划好以后, 就可以规划监控软件了。 首先要根据系统的总体功能选择一种最合适的监控程序结构, 然后根据实时性的条件, 合理安排监控软件和执行软件之间的调度关系。

交通灯通电之后单片机首先进行程序的初始化包括定时器0、外部中断0、数码管的初始化以及各参数初值的设定。接着进行按键检测,默认模式为日常模式:东西南北方向红灯持续10秒,绿灯持续6秒,绿灯切换为红灯之前黄灯闪烁3秒,然后形成一个闭环循环,有序工作。然后扫描按键的状态,检测是否自定义修改日常模式绿灯持续时间和是否切换为夜间或紧急模式。

当发现K5紧急键按下交通灯从日常状态进入紧急状态,所有方向的LED灯都变为红灯,再次按下,恢复到日常状态显示;当发现K4夜间键按下交通灯从日常状态进入夜间状态,所有方向的LED灯都变为黄灯闪烁,再次按下,恢复到日常状态显示;当按下K1设置键,可按下加K2或K3键实现东西和南北方向的绿灯持续时间的自定义加减,再按下K1键回到修改之后的日常状态。

主要流程图如下图3-1

图3-1

3.2.主要子程序

主要子程序包括控制初始路灯子程序,模式切换子程序,自定义时间子程序,定时器中断服务子程序等。

3.2.1控制初始路灯程序设计

首先设置南北红灯亮、东西红灯亮、南北黄灯亮、东西黄灯亮的初始时间,然后在数码管上显示红绿灯时间。

流程图如下图3-2-1

图3-2-1

程序如下:

void control()//控制路灯
{
	switch(mode)
		{
			case 0:red1=0;yellow1=1;green1=1;red2=1;yellow2=1;green2=0;//南北红灯亮
				south=east_green+5;east=east_green+1;//设置初始时间
				break;
			case 1:red1=0;yellow1=1;green1=1;red2=1;yellow2=0;green2=1;//东西黄灯亮
				east=4;south=4;
				break;
			case 2:red1=1;yellow1=1;green1=0;red2=0;yellow2=1;green2=1;//东西红灯亮
				south=south_green+1;east=south_green+5;//设置初始时间
				break;
			case 3:red1=1;yellow1=0;green1=1;red2=0;yellow2=1;green2=1;//南北黄灯亮
				south=4;east=4;
		}
}

void display() //显示各路口时间
{
	P0=tabel[south/10];//南北
	smg1=1;
	delay(100);
	smg1=0;
	P0=tabel[south%10];
	smg2=1;
	delay(100);
	smg2=0;
	P0=tabel[east/10];//东西
	smg3=1;
	delay(100);
	smg3=0;
	P0=tabel[east%10];
	smg4=1;
	delay(100);
	smg4=0;
}

3.2.2模式切换子程序设计

K5紧急键按下交通灯从日常状态进入紧急状态,所有方向的LED灯都变为红灯,再次按下,恢复到日常状态显示;当发现K4夜间键按下交通灯从日常状态进入夜间状态,所有方向的LED灯都变为黄灯闪烁,再次按下,恢复到日常状态显示。流程图如下图3-2-2所示:

程序如下:

略。

3.2.3自定义时间子程序设计

首先进入初始化界面即日常状态,然后按下K1设置键自定义修改当前绿灯南北方向倒计时时间,可通过K2进行加或者K3进行减操作;再按下K1键修改当前绿灯东西方向倒计时时间,可通过K2进行加或者K3进行减操作;最后按下K1返回修改之后的日常状态。流程图如下图3-2-3所示:

程序如下:

if(pattern==0)
			display();//显示
		if(!k1)
		{				 //模式切换
			if(pattern<2)
				pattern++;
			else
				pattern=0;
			while(!k1);
		}
		if(pattern==1)//调节南北时间
		{
			if(!k2)
			{
				if(south_green<99)
					south_green++;
				while(!k2);
			}
			if(!k3)
			{
				if(south_green>1)
					south_green--;
				while(!k3);
			}
			P0=tabel[south_green/10];//南北
			smg1=1;
			delay(100);
			smg1=0;
			P0=tabel[south_green%10];
			smg2=1;
			delay(100);
			smg2=0;
		}
		if(pattern==2)//调节东西时间
		{
			if(!k2)
			{
				if(east_green<99)
					east_green++;
				while(!k2);
			}
			if(!k3)
			{
				if(east_green>1)
					east_green--;
				while(!k3);
			}
			P0=tabel[east_green/10];//东西
			smg3=1;
			delay(100);
			smg3=0;
			P0=tabel[east_green%10];
			smg4=1;
			delay(100);
			smg4=0;
		}

3.2.4定时器中断服务子程序

该子程序运用定时器T0中断,该子程序的主要作用是使时间达到1秒时,令1秒标志为真,返回到主函数运行时间减1,1秒标志为假,再调用到该子程序以此实现每秒显示时间减1。日常状态下,50ms*20=1s,在东西和南北方向红绿灯闭环交替循环的过程中实现秒递减;夜间模式下,50ms*10=0.5s,黄灯亮0.5s熄灭0.5s实现黄灯闪烁功能,中断流程图如下。

程序如下:

略。

第4章 系统仿真

4.1 Protoeus8.9keil μVision5

本设计用Proteus 8.9软件作图,C语言对单片机进行控制操作,易读好懂,用Keil μVision5软件进行了调试。

4.2调试中遇到的问题

当编译通过,但⼀点下Debug功能时,可以进去调试界⾯,马上就崩溃了,路径名中有中⽂字符,计算机⽤户名称是中⽂。

解决办法:换个深度浅⼀点的路径。更换路径之后,要全部重新编译,否则调试的时侯MDK还会找旧路径的源代码;换个别的路径,路径中不带中⽂就好;更改计算机⽤户名称。此计算机:右键->管理->本地⽤户和组->⽤户。右键点击->重命名。

修改并重新编译后编译结果如下图4-1所示:

图4-1 Keil μVision5调试结果

4.3 模拟图

在Keil中生成.hex文件之后,在proteus里打开原理图,将生成的档加载到单片机中,经过反复调试,得到日常、夜间、紧急三种状态模式方式如下图4-2、4-3-1、4-3-2、4-3-3、4-4-1、4-4-2所示:

(1)日常状态模拟图:

南北方向为红灯10秒,东西方向为绿灯6秒,绿灯结束后变为黄灯3秒,然后东西方向变为红灯10秒,南北方向变为为绿灯6秒,绿灯结束后变为黄灯3秒,形成闭环循环,有序进行。

图4-2-1南北方向为红灯,东西方向为绿灯

图4-2-2 南北方向为红灯,东西方向为黄灯

图4-2-3东西方向为红灯,南北方向为绿灯

图4-2-4东西方向为红灯,南北方向为黄灯

(2)夜间模式模拟图:

按下K4键进入夜间模式,所有方向黄灯闪烁;再次按下,恢复正常显示。

图4-3所有方向黄灯闪烁

(3)紧急模式模拟图:

按下K5键进入紧急模式,所有方向亮红灯;再次按下,恢复正常显示。

图4-4 所有方向亮红灯

(4)自定义时间模拟图:

按下K1键自定义设置当前东西和南北方向交通灯倒计时时间。

图4-5-1 修改南北方向红灯时间

图4-5-2 修改东西方向绿灯时间

第五章 总结

1.通过最后的硬件和软件的模拟调试,本课题的研究工作已经达到预期的要求,归纳起来有以下几点:

(1)本课题实现了交通灯显示系统的自动化。

(2)系统硬件设计使用的有芯片AT89C51,电容,晶振,电阻,八段数码管,LED灯,按钮等。

(3)系统软件设计包括主要子程序包括控制初始路灯子程序,模式切换子程序,自定义时间子程序,定时器中断服务子程序等,完成了交通灯显示系统的自动化。

(4)实现了东西方向、南北方向均有红、黄、绿三种信号灯、紧急制动按钮,按钮按下,所有方向亮红灯;再次按下,恢复正常显示。夜间模式按钮按下,所有方向显示黄灯闪烁。实时提醒绿灯亮的剩余时间。能自定义设置当前状态东西方向和南北方向的红绿灯持续时间等功能。

2.本次设计主要是以 AT89C51单片机为核心的, 对交通灯显示系统进行了简单的设计与阐述。 本次设计可以说是软硬结合,又以硬件为主,软件为辅。 当今科技发展迅速,单片机嵌入式开发有着光明的前景。 由于单片机具有经济实用、开发简便等特点, 所以依然在工业控制、 家电等领域占据广泛的市场。由于我以前对 51 单片机的 C 语言没有认真钻研过,所以感觉课程设计的任务十分紧迫。 通过对本系统的设计, 我学习到了硬件开发和软件开发的基本流程并有了一定的驾御此开发过程的能力。 通过实际的程序设计和不断的调试过程,我更加熟练地掌握了单片机相关程序的程序设计方法,在不断的设计过程中,我对单片机系统有了更深刻的认识,进一步熟悉和掌握了单片机的结构以及它的工作原理,对定时、中断程序等有了更深地认识,学到了如何熟练使用仿真软件Proteus8.9和程序设计软件Keil uVision5。程序设计的过程中, 虽然不乏辛苦,但更多的是程序调试成功后的喜悦。

总之, 这次课程设计对我来说是一次比较全面的、富有创造性和探索性的锻炼,完成了我选题时的心愿。令我深有感触, 对于我今后的学习、工作和生活都将是受益非浅的!

第六章 源代码完整版

私信可获取完整源代码。

参考文献

[1]李珍,石梅香. 单片机原理与应用技术(第2版)[M].清华大学出版社,2010年12月.

[2]陈连坤. 单片机原理及接口技术(C语言版)[M]. 清华大学出版社,2010.

[3]赖忠喜,林君焕,陶东娅. Proteus和Keil软件在单片机项目式教学中的应用[J]. 电子设计工程,2013年06期.

[4]张新 陈跃琴.AVR单片机应用开发24例(C语言版)[M]电子工业出版社,2014

[5]丁有军 段中兴 何波 花新峰 周芳晓 丁莉.单片机原理及应用教程(C语言)》人民邮电出版社,2018年9月.

[6]郭天祥.新概念51单片机C语言教程,电子工业出版社,2009年1月 

[7]徐爱钧.单片机高级语言C51应用程序设计,电子工业出版社,2005年5月

[8]丁有军.单片机原理及应用教程(C语言).人民邮电出版社,2018

[9]张志良. 80C51单片机实验实训100例:基于Keil C和Proteus.北京航空航天学出版社.2015.1

[10]李海滨等.单片机技术课程设计与项目实例.中国电力出版社,2009

以及与51系列单片机相关的文献及教材。

  • 19
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值