基于单片机的交通灯信号控制器.docx
- 文档编号:25553464
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:17
- 大小:311.83KB
基于单片机的交通灯信号控制器.docx
《基于单片机的交通灯信号控制器.docx》由会员分享,可在线阅读,更多相关《基于单片机的交通灯信号控制器.docx(17页珍藏版)》请在冰豆网上搜索。
基于单片机的交通灯信号控制器
一.任务设计
设计一个基于单片机的交通灯信号控制器。
已知东、西、南、北四个方向各有红黄绿色三个灯,
在东西方向有两个数码管,在南北方向也有两个数码管。
要求交通灯按照表1进行显示和定时切换,
并要求在数码管上分别倒计时显示东西、南北方向各状态的剩余时间。
表1交通灯的状态切换表
二.系统设计
(1)任务分析与整体设计思路
任务要求实现的功能主要包括计时功能、动态扫描以及状态的切换等几部分。
计时功能:
要实现计时功能则需要使用定时器来计时,通过设置定时器的初始值来控制溢出中
断的时间间隔,再利用一个变量记录定时器溢出的次数,达到定时1秒中的功能。
当计时每到1秒
钟后,东西、南北信号灯各状态的暂存剩余时间的变量减1。
当暂存剩余时间的变量减到0时,切
换到下一个状态,同时将下一个状态的初始的倒计时值装载到计时变量中。
开始下一个状态,如此
循环重复执行。
动态扫描:
需要使用4个数码管分别显示东西、南北的倒计时数字,将暂存各状态剩余时间的
数字从变量中提取出“十位”和“个位”,用动态扫描的方式在数码管中显示。
整个程序依据定时器的溢出数来计时,每计时1S则相应状态的剩余时间减1,一直减到0时触发下一个状态的开始。
选用MCS51系列AT89S52单片机作为微控制器,选择两个四联的共阴极数码管组成8位显示模
块,由于AT89S52单片机驱动能力有限,采用两片74HC244实现总线的驱动,一个74HC244完成共阴极数码管位控线的控制和驱动,另一个74HC244完成数码管的7段码输出,在7段码输出口上各
串联一个100欧姆的电阻对7段数码管限流。
用P3口的P3.0-P3.5完成发光二极管的控制,实现
交通灯信号的显示,每个发光二极管串联500欧姆电阻起限流作用。
硬件电路原理图如图3-5所示。
图3-5
(3)程序设计思路,单片机资源分配以及程序流程
①单片机资源分配
单片机P3口的P3.0-P3.1引脚用作输出,控制发光二极管的显示。
在计时模块中,需要定义
两个数组变量(init_sn[3],init_ew[3])来存储东西、南北两个方向在不同状态中倒计时的初始
值,题目中每个方向的交通灯共有3种显示状态,因此数组元素个数为3。
还需要定义两个变量(cnt_
sn,cnt_ew)暂存东西、南北两个方向的倒计时剩余时间。
在状态的切换中,为了明确当前处于哪种状态,东西、南北方向各设置一个状态变量
(state_val_sn,state_val_ew),当倒计时的剩余时间到零时,状态变量增1,表示启动下一个状态,
当该变量增到3时变为0,回到序号为1的状态。
②程序设计思路
在设计中,由于没有键盘功能,因此只涉及定时计数和动态扫描功能。
主程序将变量初始化之
后,设置单片机定时器和中断特殊功能寄存器的初始值,将定时器T1的工作方式设置为8位自动
装载模式,定时器每隔250us产生一次溢出。
在初始化变量与寄存器后,主程序进入一个循环结构,在循环中只做动态扫描的工作,根据东
西、南北两向的剩余时时间进行动态扫描显示。
计时以及状态的切换通过定时器的中断服务程序来实现,在中断服务程序中,每计时到一秒时,
则各方向当前状态的剩余时间减1,一直减到0时触发下一个状态的开始,改变交通灯的指示。
(4)软硬件调试方案
软件调试方案:
伟福软件中,在“文件\新建文件”中,新建C语言源程序文件,编写相
程序。
在“文件\新建项目”的菜单中,新建项目并将C语言源程序文件包括在项目文件中。
在“项目\编译”菜单中将C源文件编译,检查语法错误及逻辑错误。
在编译成功后,以“*.hex”和“*.bin”后缀的目标文件。
硬件调试方案:
在设计平台中,将单片机的P3.0-P3.5分别与独立式键盘的相应位通过插线连接起来。
在伟福中将程序文件编译成目标文件后,运行“MCU下载程序”,选择相应的flash数据文
点击“编程”按钮,将程序文件下载到单片机的Flash中。
然后,上电重新启动单片机,检查所编写的程序是否达到题目的要求,是否全面完整地完成了试题的内容。
三.系统硬件概述
※AT89S52单片机简介
AT89S52为ATMEL所生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flsah存储器。
(一)、AT89S52主要功能列举如下:
1、拥有灵巧的8位CPU和在系统可编程Flash
2、晶片内部具时钟振荡器(传统最高工作频率可至12MHz)
3、内部程序存储器(ROM)为8KB
4、内部数据存储器(RAM)为256字节
5、32个可编程I/O口线
6、8个中断向量源
7、三个16位定时器/计数器
8、三级加密程序存储器
9、全双工UART串行通道
(二)、AT89S52各引脚功能介绍:
VCC:
AT89S52电源正端输入,接+5V。
VSS:
电源地端。
XTAL1:
单芯片系统时钟的反相放大器输入端。
XTAL2:
系统时钟的反相放大器输出端,一般在设计上只要在XTAL1和XTAL2上接上一只石英振荡晶体系统就可以动作了,此外可以在两引脚与地之间加入一20PF的小电容,可以使系统更稳定,避免噪声干扰而死机。
RESET:
AT89S52的重置引脚,高电平动作,当要对晶片重置时,只要对此引脚电平提升至高电平并保持两个机器周期以上的时间,AT89S51便能完成系统重置的各项动作,使得内部特殊功能寄存器之内容均被设成已知状态,并且至地址0000H处开始读入程序代码而执行程序。
EA/Vpp:
"EA"为英文"ExternalAccess"的缩写,表示存取外部程序代码之意,低电平动作,也就是说当此引脚接低电平后,系统会取用外部的程序代码(存于外部EPROM中)来执行程序。
因此在8031及8032中,EA引脚必须接低电平,因为其内部无程序存储器空间。
如果是使用8751内部程序空间时,此引脚要接成高电平。
此外,在将程序代码烧录至8751内部EPROM时,可以利用此引脚来输入21V的烧录高压(Vpp)。
ALE/PROG:
ALE是英文"AddressLatchEnable"的缩写,表示地址锁存器启用信号。
AT89S52可以利用这支引脚来触发外部的8位锁存器(如74LS373),将端口0的地址总线(A0~A7)锁进锁存器中,因为AT89S52是以多工的方式送出地址及数据。
平时在程序执行时ALE引脚的输出频率约是系统工作频率的1/6,因此可以用来驱动其他周边晶片的时基输入。
此外在烧录8751程序代码时,此引脚会被当成程序规划的特殊功能来使用。
PSEN:
此为"ProgramStoreEnable"的缩写,其意为程序储存启用,当8051被设成为读取外部程序代码工作模式时(EA=0),会送出此信号以便取得程序代码,通常这支脚是接到EPROM的OE脚。
AT89S52可以利用PSEN及RD引脚分别启用存在外部的RAM与EPROM,使得数据存储器与程序存储器可以合并在一起而共用64K的定址范围。
PORT0(P0.0~P0.7):
端口0是一个8位宽的开路汲极(OpenDrain)双向输出入端口,共有8个位,P0.0表示位0,P0.1表示位1,依此类推。
其他三个I/O端口(P1、P2、P3)则不具有此电路组态,而是内部有一提升电路,P0在当做I/O用时可以推动8个LS的TTL负载。
如果当EA引脚为低电平时(即取用外部程序代码或数据存储器),P0就以多工方式提供地址总线(A0~A7)及数据总线(D0~D7)。
设计者必须外加一锁存器将端口0送出的地址栓锁住成为A0~A7,再配合端口2所送出的A8~A15合成一完整的16位地址总线,而定址到64K的外部存储器空间。
PORT2(P2.0~P2.7):
端口2是具有内部提升电路的双向I/O端口,每一个引脚可以推动4个LS的TTL负载,若将端口2的输出设为高电平时,此端口便能当成输入端口来使用。
P2除了当做一般I/O端口使用外,若是在AT89S52扩充外接程序存储器或数据存储器时,也提供地址总线的高字节A8~A15,这个时候P2便不能当做I/O来使用了。
PORT1(P1.0~P1.7):
端口1也是具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个LSTTL负载,同样地若将端口1的输出设为高电平,便是由此端口来输入数据。
如果是使用8052或是8032的话,P1.0又当做定时器2的外部脉冲输入脚,而P1.1可以有T2EX功能,可以做外部中断输入的触发脚位。
PORT3(P3.0~P3.7):
端口3也具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个TTL负载,同时还多工具有其他的额外特殊功能,包括串行通信、外部中断控制、计时计数控制及外部数据存储器内容的读取或写入控制等功能。
其引脚分配如下:
P3.0:
RXD,串行通信输入。
P3.1:
TXD,串行通信输出。
P3.2:
INT0,外部中断0输入。
P3.3:
INT1,外部中断1输入。
P3.4:
T0,计时计数器0输入。
P3.5:
T1,计时计数器1输入。
P3.6:
WR:
外部数据存储器的写入信号。
P3.7:
RD,外部数据存储器的读取信号。
RST:
复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/PROG:
当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。
在FLASH编程期间,此引脚用于输入编程脉冲。
在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。
因此它可用作对外部输出的脉冲或用于定时目的。
然而要注意的是:
每当用作外部数据存储器时,将跳过一个ALE脉冲。
如想禁止ALE的输出可在SFR8EH地址上置0。
此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。
另外,该引脚被略微拉高。
如果微处理器在外部执行状态ALE禁止,置位无效。
/PSEN:
外部程序存储器的选通信号。
在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。
但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。
/EA/VPP:
当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。
注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。
在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。
XTAL1:
反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:
来自反向振荡器的输出。
※74HC244简介
74HC244芯片的功能
如果输入的数据可以保持比较长的时间(比如键盘),简单输入接口扩展通常使用的典型芯片为74HC244,由该芯片可构成三态数据缓冲器。
74HC244芯片的引脚排列如图1所示。
74HC244芯片内部共有两个四位三态缓冲器,使用时可分别以1C和2G作为它们的选通工作信号。
当1C和2G都为低电平时,输出端Y和输入端A状态相同;当1G和2G都为高电平时,输出呈高阻态。
八同相三态缓冲器/线驱动器
74HC244芯片的功能
如果输入的数据可以保持比较长的时间(比如键盘),简单输入接口扩展通常使用的典型芯片为74HC244,由该芯片可构成三态数据缓冲器。
74HC244芯片的引脚排列如图1所示。
74HC244芯片的引脚
74HC244芯片内部共有两个四位三态缓冲器,使用时可分别以1C和2G作为它们的选通工作信号。
当1/OE和2/OE都为低电平时,输出端Y和输入端A状态相同;当1/OE和2/OE都为高电平时,输出呈高阻态。
※数码管简介
内部的四个数码管共用a~dp这8根数据线,为人们的使用提供了方便,因为里面有四个数码管,所以它有四个公共端,加上a~dp,共有12个引脚,下面便是一个共阴的四位数码管的内部结构图(共阳的与之相反)。
引脚排列依然是从左下角的那个脚(1脚)开始,以逆时针方向依次为1~12脚,下图中的数字与之一一对应。
四.程序设计
//晶振:
11.0592MT1-250微秒溢出一次
/*变量的定义:
show_val_sn,show_val_ew:
显示的值0-59
state_val_sn,state_val_ew:
状态值南北方向0-绿灯亮;1-黄灯亮;2-红灯亮
T1_cnt:
定时器计数溢出数
cnt_sn,cnt_ew:
倒计时的数值
init_sn[3],init_ew[3]倒计时
led_seg_code:
数码管7段码
*/
#include"reg51.h"
sbitSN_green=P3^2;//南北方向绿灯
sbitSN_yellow=P3^1;//南北方向黄灯
sbitSN_red=P3^0;//南北方向红灯
sbitEW_green=P3^5;//东西方向绿灯
sbitEW_yellow=P3^4;//东西方向黄灯
sbitEW_red=P3^3;//东西方向红灯
unsignedchardatacnt_sn,cnt_ew;
unsignedintdataT1_cnt;
unsignedchardatastate_val_sn,state_val_ew;
charcodeled_seg_code[10]={0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
charcodeinit_sn[3]={24,4,29};
charcodeinit_ew[3]={29,24,4};
//------------------------
voiddelay(unsignedinti)//延时
{
while(--i);
}
//------------------------
voidled_show(unsignedintu,unsignedintv)
{
unsignedchari;
i=u%10;//暂存个位
P0=led_seg_code[i];
P2=0xbf;delay(100);//延时
i=u%100/10;//暂存十位
P0=led_seg_code[i];
P2=0x7f;
delay(100);//延时
i=v%10;//暂存个位
P0=led_seg_code[i];
P2=0xfe;
delay(100);//延时
i=v%100/10;//暂存十位
P0=led_seg_code[i];
P2=0xfd;
delay(100);//延时
}
//-------------------------
voidtimer1()interrupt3//T1中断
{
T1_cnt++;
if(T1_cnt>3999)//如果计数>3999,计时1s
{
T1_cnt=0;
if(cnt_sn!
=0)//南北方向计时
{
cnt_sn--;
}
else
{
state_val_sn++;
if(state_val_sn>2)state_val_sn=0;
cnt_sn=init_sn[state_val_sn];
switch(state_val_sn)//根据状态值,刷新各信号灯的状态
{
case0:
SN_green=0;//南北方向绿灯
SN_yellow=1;//南北方向黄灯
SN_red=1;//南北方向红灯
break;
case1:
SN_green=1;//南北方向绿灯
SN_yellow=0;//南北方向黄灯
SN_red=1;//南北方向红灯
break;
case2:
SN_green=1;//南北方向绿灯
SN_yellow=1;//南北方向黄灯
SN_red=0;//南北方向红灯
break;
}
}
if(cnt_ew!
=0)//东西方向计时
{
cnt_ew--;
}
else
{
state_val_ew++;if(state_val_ew>2)state_val_ew=0;
cnt_ew=init_ew[state_val_ew];
switch(state_val_ew)//根据状态值,刷新各信号灯的状态
{
case0:
EW_green=1;//东西方向绿灯
EW_yellow=1;//东西方向黄灯
EW_red=0;//东西方向红灯
break;
case1:
EW_green=0;//东西方向绿灯
EW_yellow=1;//东西方向黄灯
EW_red=1;//东西方向红灯
break;
case2:
EW_green=1;//东西方向绿灯
EW_yellow=0;//东西方向黄灯
EW_red=1;//东西方向红灯
break;
}
}
}
}
//-------------------------
main()
{
//初始化各变量
cnt_sn=init_sn[0];
cnt_ew=init_ew[0];
T1_cnt=0;
state_val_sn=0;//启动后,默认工作在序号为1的状态
state_val_ew=0;
//初始化各灯的状态
SN_green=0;//南北方向绿灯亮
SN_yellow=1;//南北方向黄灯灭
SN_red=1;//南北方向红灯灭
EW_green=1;//东西方向绿灯灭
EW_yellow=1;//东西方向黄灯灭
EW_red=0;//东西方向红灯亮
//初始化51的寄存器
TMOD=0x20;//用T1计时8位自动装载定时模式
TH1=0x19;//0x4b;//500微秒溢出一次;250=(256-x)*12/11.0592->x=230.4
TL1=0x19;
EA=1;//开中断
ET1=1;
TR1=1;//开定时器T1
while
(1)
{
led_show(cnt_sn,cnt_ew);
}
}//主程序结束
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 交通灯 信号 控制器