编号:
微机综合实践说明书
题 目: 交通灯控制系统
学 院: 机电工程学院
专 业: 机械设计制造及其自动化
学生姓名: 李 雷 盛
学 号: 1100110710
指导教师单位:
姓
名:
2013年12月8日
目录
摘要
前言
一、单片机简介………………………………………………………………………………… 1
1.1单片机的发展历程………………………………………………………………………1
1.2单片机的特点 ………………………………………………………………………… 1
1.3 MCS—51单片机内部结构有8大部分 ………………………………………………1
1.4单片机的内部结构图 ……………………………………………………………………2
二、方案拟定 ……………………………………………………………………………………… 3
2.1方案选择………………………………………………………………………………………………3
2.2方案确立………………………………………………………………………………………………3
三、电路原理图设计………………………………………………………………………… 4
3.1画原理图及pcb图…………………………………………………………………………………4
3.2制版主要工具及流程……………………………………………………………………………… 5
3.3 通行灯显示模块……………………………………………………………………………………6
3.4 时间显示模块…………………………………………………………………………………………7 3.5原件清单…………………………………………………………………………………………………8
3.6 成品……………………………………………………………………………………………………8
四、程序设计…………………………………………………………………………………………8
4.1控制芯片介绍…………………………………………………………………………………………9
4.2程序设计流程……………………………………………………………………………………… 11
4.3相应程序代码……………………………………………………………………………………… 12
五、仿真调试………………………………………………………………………………………15
六、总结………………………………………………………………………………………………17
参考文献……………………………………………………………………………………………………19 附录一………………………………………………………………………………………………………20
摘要:交通信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。为了实现交通道路的管理,力求交通管理先进性、科学化。用MCS-51系列单片机实现交通灯管制的控制系统,以及该系统软、硬件设计方法,实验证明该系统实现简单、经济,能够有效地疏导交通,提高交通路口的通行能力。
本系统采用MSC-51系列单片机ATSC51和可编程并行I/O接口芯片80C51为中心器件来设计交通灯控制器,实现了AT89S51芯片的P1口设置红、绿灯燃亮时间的功能;红绿灯循环点亮,倒计时剩秒时黄灯闪烁警示。本系统实用性强、操作简单、扩展功能强。
关键词:交通灯、MCS-51系列单片机、设计、AT89S51芯片
前言
本次所设计的系统功能为:以MCS-51系列单片机作为控制核心,在东西南北四个方向设置左拐、右拐、直行及行人4种通行指示灯,用计时器显示路口通行转换剩余时间。在出现紧急情况时,可以由交警手动实现全路口车辆禁行而行人通行状态,在特种车辆如119、120通过路口时,系统可自动转为特种车辆放行,其他车辆禁止通行状态。
交通信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。绿灯是通行信号,面对绿灯的车辆可以直行,左转弯和右转弯,除非另一种标志禁止某一种转向。左右转弯车辆都必须让合法地正在路口内行驶的车辆和过人行横道的行人优先通行。红灯是禁行信号,面对红灯的车辆必须在交叉路口的停车线后停车。黄灯是警告信号,面对黄灯的车辆不能越过停车线,但车辆已十分接近停车线而不能安全停车时可以进入交叉路口。
随着经济的发展,交通运输中出现了一些传统方法难以解决的问题。道路拥挤现象日趋严重,造成的经济损失越来越大,并一直保持大比例的增长。现在交通系统已不能满足经济发展的需求。由于生活水平的提高,人们对交通运输的安全性及服务水平提出了更高的要求。在交通中管理引入单片机交通灯控制代替交管人员在交叉路口服务,有助于提高交通运输的安全性、提高交通管理的服务质量。并在一定程度上尽可能的降低由道路拥挤造成的经济损失,同时也减小了工作人员的劳动强度。
中国车辆数量不断增加,交通控制在未来的交通管理中起着越来越重要的作用。交通灯的管理比重修一条马路无论在经济、交通运行速率上都有很好的效益、更加节约资源。使交管人员有更多的精力投入到管理整个城市交通控制,带来更大的经济和社会效益,为创造美好的城市交通形象发挥更多的作用。
一、单片机简介
1.1单片机的发展历程
单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。单片机微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。
在MCS-51系列单片机中,有两个子系列:51子系列和52子系列。每个子系列有诺干中型号。51系列有8051、8751和8031三个型号,后来经过改进产生了80c51、87c51、80c31三个型号;52系列有5021、8752、8032三个型号,改进后的型号是80c52/87c52、80c32。改进后的型号更加省电。52系列比对应的51系列增加了定时器T2并将内部程序存贮器增加到8KB。Inter公司停止生产MCS-51系列单片机之后将生产权转让给了许多其他公司,于是出现了许多与Mcs-51兼容的单片机。现在生产mcs-51兼容单片机的公司对其进行了不同程度的改进和提高。我们现在使用比较的多的是AT89C51/AT89s51等。
通常,单片机由单块集成电路芯片构成,内部包含有计算机的基本功能部件:中央处理器、存储器和I/O接口电路等。因此,单片机只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。
单片机经过1、2、3、3代的发展,目前单片机正朝着高性能和多品种方向发展,它们的CPU功能在增强,内部资源在增多,引角的多功能化,以及低电压底功耗。
1.2单片机的特点
(1)性价比高,开发周期短,易于产品化,
(2)集成度高,可靠性好,抗干扰性强,
(3)功能完善,接口多样,
(4)低功耗、低电压
一般电源供电电压在5~3V范围内单片机都能正常工作,供电的下限可达1~2V。
(5)总线多样,易于扩展
单片机外部的典型三总线结构,方便系统构扩展,构成各种规模的应用系统。外部总线增加了I2C及SPI等串行总线方式, 可根据需要进行并行或者串行扩展。
1.3 MCS—51单片机内部结构有8大部分
①.一个8 位的中央处理器 CPU(又称为微处理器)
中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。
②有 128字节的片内数据存储器RAM
8051内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。
③.4KB片内 程序存储器ROM或EPROM
8051共有4096个8位掩膜ROM,用于存放用户程序,原始数据
④.片内 18个 特殊功能寄存器(SFR)
⑤.4个8位 的并行输入输出I/O口(PIO)
8051共有4组8位I/O口(P0、 P1、P2或P3),用于对外部数据的传输
P0口 P0.0~P0.7 输入与输出 分时的传送地址低8位与数据线
P1口 P1.0~P1.7 输入与输出 无第二功能
P2口 P2.0~P2.7 输入与输出 传送地址的高8位
P3口 P3.0~P3.7 输入与输出 P3.0—RXD:串行口输入端
P3.1—TXD:串行口输出端
P3.1—TXD:串行口输出端
P3.2—:外部中断0中断请求输入端
P3.3—:外部中断1中断请求输入端
P3.4—T0:定时器/计数器0外部输入端
P3.5—T1:定时器/计数器1外部输入端
P3.6—:外部数据存储器写选通信号
P3.7—:外部数据存储器读选通信号
⑥.1个 串行口I/O(SIO/UART)完成单片机与其他微机的之间的串行通信
⑦.2/3个16位 定时器/计数器(TIMER/COUNTER)
⑧.可处理 5个中断源,两级可程序优先级的中断系统
其中含有MCS-51指令集含 111条指令,按照指令操作功能话费有五类:
数据传送指令(28)
算术运算指令(24)
逻辑运算及转移指令(25)
控制转移指令(22)
位操作指令(12)
1.4单片机的内部结构图
除去图中的存储电路和I/O部件,剩下的是CPU,它可以分为运算器和控制器两部分。运算器功能部件包括算术逻辑运算单元ALU、累加器ACC、寄存器B、暂存寄存器TMP1、TMP2、程序状态字寄存器PSW等。控制器功能部件包括程序计数器PC、指令寄存器IR、指令译码器ID、定时控制逻辑电路CU、数据指针寄存器DPTR、堆栈指针SP及时钟电路等。
图1-1单片机内部结构图
二、方案拟定
2.1方案选择
1)、显示模块
方案一:采用4个1位数码管显示。
方案二:用液晶屏显示。
方案三:用点阵屏显示。
2)、指示模块
方案一:用四组红绿灯在四个路口显示。
方案二:用4个可变彩灯在四个路口,控制其显示颜色进行显示。
方案三:用字体显示
3)、控制模块
选用at89s51或者stc89s51
4)、时间控制
方案一:用软件延时。
方案二:用单片机内部定时器定时50ms计数20次为1s
2.2方案确立
由于只显示0-8,所以选用4个1位数码管,液晶屏价格比较高编程复杂,点阵屏占用io资源比较多,为了更加明显显示我们采用了每个路口3个灯,分别为红绿黄,方便控制,三色彩灯价格比较高,控制不方便,字体显示比较复杂,价格比较贵。软件延时误差比较大,用单片机定时器精度高方便控制。
最终选型为,用3个单色灯在每个路口显示,用数码管显示倒计时。采用静态显示,采用单片机定时器计数。
设在十字路口,分为东西向和南北向,在任一时刻只有一个方向通行,另一方向禁行,持续一定时间,经过短暂的过渡时间,将通行禁行方向对换。其具体状态如下图所示。说明:黑色表示亮,白色表示灭。交通状态从状态0开始变换,直至状态7然后循环至状0,周而复始,即如图(图2-1)所示:直至状态7然后循环至状态0,通过具体的路口交通灯状态的演示分析我们可以把这四个状态归纳如下:
图2-1交通状态
※东西方向绿灯亮5S,南北红灯亮5S。此状态下,东西向允许通行,南北向禁止通行。 ※东西黄灯亮3S.南北红灯亮3S。此状态下,除了已经正在通行中的其他所以车辆都需等待状态转换。
※东西红灯亮5S,南北绿灯亮5S。此状态下,东西向禁止通行,南北向允许通行。 ※东西红灯亮3S,南北黄灯亮3S。此状态下,除了已经正在通行中的其他所以车辆都需等待状态转换。
三、电路原理图设计
3.1画原理图3-1及pcb图3-2
图 3-1
图
3-2
转印到铜板
打印pcb,效果如图3-3
图3-3
3.2制版主要工具及流程 腐蚀液
图3-4腐蚀液
铜板转印机
图3-5铜板转印机
打孔机及洛铁
图3-6打孔机及老铁
3.3 通行灯显示模块
通行灯显示模块如图3-7所示。二极管每个路口三个,用102排阻驱动,用P2控制,
图3-7
3.4 时间显示模块
通行剩余时间显示模块如图3-8所示
路口通行剩余时间采用高亮红色7段共阴LED发光数码管显示。用排阻驱动电路图如下
图3-8
数码管的使用方法与发光二极管没什么区别,只是把七或八只发光二极管组合在一个模件上组成了个8字和小数点,用以显示数字。为了减少管脚,把各个发光管的其中同一个极接在一起作为共用点,因此就产生了共阳极和共阴极数码之说。共阳管就是把各个发光管的正极接在一起,而共阴管就刚好相反。见下图3-9:
图
图3-11 成品
四、程序设计
4.1控制芯片介绍
AT89S51 为 ATMEL 所生产的可电气烧录清洗的 8051 相容单芯片,其内部程序代码容量为4KB (一)、AT89S51主要功能列举如下: 1、为一般控制应用的 8 位单芯片
2、晶片内部具时钟振荡器(传统最高工作频率可至 12MHz) 3、内部程式存储器(ROM)为 4KB 4、内部数据存储器(RAM)为 128B 5、外部程序存储器可扩充至 64KB 6、外部数据存储器可扩充至 64KB
7、32 条双向输入输出线,且每条均可以单独做 I/O 的控制 8、5 个中断向量源
9、2 组独立的 16 位定时器 10、1 个全多工串行通信端口
11、8751 及 8752 单芯片具有数据保密的功能 12、单芯片提供位逻辑运算指令
(二)、AT89S51各引脚功能介绍:
VCC:AT89S51 电源正端输入,接+5V。 VSS:电源地端。
XTAL1:单芯片系统时钟的反相放大器输入端。
XTAL2:系统时钟的反相放大器输出端,一般在设计上只要在 XTAL1 和 XTAL2 上接上一只石英振荡晶体系统就可以动作了,此外可以在两引脚与地之间加入一 20PF 的小电容,可以使系统更稳定,避免噪声干扰而死机。
RESET:AT89S51的重置引脚,高电平动作,当要对晶片重置时,只要对此引脚电平提升至高电平并保持两个机器周期以上的时间,AT89S51便能完成系统重置的各项动作,使得内部特殊功能寄存器之内容均被设成已知状态,并且至地址0000H处开始读入程序代码而执行程序。 EA/Vpp:
"EA"为英文"External Access"的缩写,表示存取外部程序代码之意,低电平动作,也就是说当此引脚接低电平后,系统会取用外部的程序代码(存于外部EPROM中)来执行程序。因此在8031及8032中,EA引脚必须接低电平,因为其内部无程序存储器空间。如果是使用 8751 内部程序空间时,此引脚要接成高电平。此外,在将程序代码烧录至8751内部EPROM时,可以利用此引脚来输入21V的烧录高压(Vpp)。 ALE/PROG:
ALE是英文"Address Latch Enable"的缩写,表示地址锁存器启用信号。AT89S51可以利用这支引脚来触发外部的8位锁存器(如74LS373),将端口0的地址总线(A0~A7)锁进锁存器中,因为AT89S51是以多工的方式送出地址及数据。平时在程序执行时ALE引脚的输出频率约是系统工作频率的1/6,因此可以用来驱动其他周边晶片的时基输入。此外在烧录8751程序代码时,此引脚会被当成程序规划的特殊功能来使用。 PSEN:
此为"Program Store Enable"的缩写,其意为程序储存启用,当8051被设成为读取外部程序代码工作模式时(EA=0),会送出此信号以便取得程序代码,通常这支脚是接到EPROM的OE脚。AT89S51可以利用PSEN及RD引脚分别启用存在外部的RAM与EPROM,使得数据存储器与程序存储器可以合并在一起而共用64K的定址范围。 PORT0(P0.0~P0.7):
端口0是一个8位宽的开路汲极(Open Drain)双向输出入端口,共有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端口使用外,若是在AT89S51扩充外接程序存储器或数据存储器时,也提供地址总线的高字节A8~A15,这个时候P2便不能当做I/O来使用了。 PORT1(P1.0~P1.7):
端口1也是具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个LS TTL负载,同样地若将端口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,外部数据存储器的读取信号。 4.2程序设计流程
(1)全部控制程序实际上分为若干模块:按键设置处理程序,状态灯控制程序,LED显示程序,中断服务子程序,红绿灯时间调整程序等。
整个软件程序方面主要分两大部分:按键处理程序和50ms扫描程序。流程图如图4-1:
图4-1主程序流程图
交通管理定时功能程序如图4-2:
定时器工作时必须给计数器送计数器初值,这个值是送到TH和TL中的。他是以加法记数的,并能从全1到全0时自动产生溢出中断请求。因此,我们可以把计数器记满为零所需的计数值设定为C和计数初值设定为TC 可得到如下计算通式: TC=M-C
式中,M为计数器模值,该值和计数器工作方式有关。在方式0时M为213 ;在方式1时M的值为216;在方式2和3为28 ;
算法公式:T=(M-TC)T计数 或TC=M-T/T计数
T计数是单片机时钟周期TCLK的12倍;TC为定时初值 如单片机的主脉冲频率为TCLK12MHZ ,经过12分频 方式0 TMAX=213 ×1微秒=8.192毫秒 方式1 TMAX=216 ×1微秒=65.536毫秒
显然1秒钟已经超过了计数器的最大定时间,所以我们只有采用定时器和软件相结合的办法才能解决这个问题.
实现1秒的方法:我们采用在主程序中设定一个初值为20的软件计数器和使T1定时50毫秒。这样每当T1到50毫秒时CPU就响应它的溢出中断请求,进入他的中断服务子程
序。在中断服务子程序中,CPU先使软件计数器减1,然后判断它是否为零。为0表示1秒已到可以返回到输出时间显示程序。
在本设计中,实行自动控制的灯只有6个,即:东西红灯,东西绿灯,东西黄灯,南北红灯,南北绿灯,南北黄灯。定义IO端口如下,其中均是低电平有效。 P22 BIT P2.2 //控制南北绿灯 P23 BIT P2.3 //控制南北黄灯 P24 BIT P2.4 //控制南北红灯 P25 BIT P2.5 //控制东西红灯 P26 BIT P2.6 //控制东西黄灯 P27 BIT P2.7 //控制东西绿灯 (1)定时器的设置
定时器需定时50毫秒,故T1工作于方式1。50ms初值计算采用软件取值如图4-3,函数如下:
START: MOV DPTR,#TABLE
MOV LED8,#00H //数码管清空 MOV TMOD,#01H //模式一 MOV TH0 ,#4CH
MOV TL0 ,#00H //50ms初值 MOV IE ,#82H //开中断 SETB TR0
MOV R2,#00H //计数初始化
MOV R1,#00H //数码管显示初始化 MOV P2 ,#00H //led清零
图4-3
(2)定时器中断服务子程序 1)手动控制程序
N10: MOV P2,#00H //led清零 JNB KEY2 , N15 //判断key2是否按下(没有按下p11=1执行n15红灯亮) CJNE R1 ,#01H,N11 SETB P23 //key1按下执行手动控制 SETB P26 //黄灯亮 SJMP LOOP //结束中断
N11: CLR P23 //黄灯灭 CLR P26 SJMP LOOP //结束中断 N15: MOV P2,#00H //led全灭 MOV R1,#00H //显示清零 SETB P24 //红灯亮 SETB P27 //红灯亮 JNB KEY2, LOOP 2)自动控制程序
N20: JB DAB0 , N25
MOV P2 ,#00H //自动控制
CJNE R1,#03H,N21 //判断是否到达3秒 N21: JC N22 //
SETB P26 //黄灯亮
SETB P24 //红灯继续亮 CLR P25 //绿灯灭 SJMP LOOP
N25: MOV P2 ,#00H //自动控制
CJNE R1,#03H,N31 //判断是否到达3秒 N31: JC N32 //
SETB P23 //黄灯亮
SETB P27 //红灯继续亮 CLR P22 //绿灯灭 SJMP LOOP 3)定时器程序
INT_T0: MOV TL0 ,#00H //50ms初值 MOV TH0 ,#4CH //
INC R2 //计数++
CJNE R2,#14H, LOOP1 //不到时间不执行 MOV R2 ,#00H //计数清零 DEC R1 //R1--
CJNE R1,#0FFH ,LOOP1 //判断-1
JB KEY1,IN1 //判断key1=1执行in1 MOV R1,#08H //按下直接赋值8 CPL DAB0 //取反 SJMP LOOP1 //判断key IN1: JB KEY2 , IN2 //判断是否按下key2
SJMP LOOP1
IN2: MOV R1,#01H SJMP LOOP1
LOOP1: JB KEY1, N10 //判断按键1没有按下 手动控制 SJMP N20 //判断按键1按下 自动控制 LOOP: RETI
(3)数码管显示函数 MAIN: MOV A,R1 //循环显示 MOV DPTR,#TABLE //数码管地址归零 MOVC A,@A+DPTR //数码管地址 MOV LED8,A //数码管显示 SJMP MAIN //while循环 数码管段显示取值数组
TABLE : DB 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f //// 0123456789
*******源程序在附录一*******
五、仿真调试
仿真软件protues效果如图5-1、图5-2、图5-3、图5-4:
图5-1
图
5-2
图5-3
图5-4
六、总结 本次设计我负责的主要是程序的编写,我体会了其中的艰辛,为写着份报告曾多次去实地取材,并做记录。为把身边最常见的红绿灯原原本本的概述在报告里是件很困难的事情,也为此提前一个星期就开始做准备。设计过程是枯燥而乏味的,程序的修改甚至让我想打退堂鼓。程序重要的是去写,因为每一句程序都有它的意义在。不是看看就能完全理解的。
如今一直在打程序,感觉也是这样,细节处无不体现些美妙的地方,还有一个感觉 就是不要怕长的程序,当你打出一个1K行的程序出来,那么你去看500行的程序就感觉很简单。当你打出一个10K行的程序出来,几K的程序看起来又是那样简单。 程序要尽量做到由各个子程序组成,在有些程序后面最好加注释,这样在程序出错的检查过程中可以更容易查找的到,也更简洁,更明白易懂。 程序要尽量做到由各个子程序组成,在有些程序后面最好加注释,这样在程序出错的检查过程中可以更容易查找的到,也更简洁,更明白易懂。
明白了程序不要光看不写,一定要自己写一次。最开始的时候,啥都不懂,可以抄人家的程序过来,看看每一句是干什么用的,达到什么目的,运行后有什么后果,看明白了之后,就要自己写一次,就会发现,原来看明白别人的程序很容易,但到自己写的时候却一句也写不出来,这就是差距。当自己能写出来的时候,说明自己就真的懂了。
而且必须学会掌握调试程序的方法。不少人写程序,把代码写好了,然后一运行,不是自己想要的结果,就晕了,然后跑到论坛上发个帖子,把程序一贴,问:为什么我的程序不能正常运行?然后就等别人来给自己分析。这是一种很不好的行为,应该自己学会发现问题和学会如何解决问题。这就需要学习调试程序的方法,比如KEIL里,可以下断点啦,查看寄存器内容等等,这些都是调试程序的手段,当你发现你写的程序运行结果和你想象中不一样的时候,你可以单步,也可以下断点,然后跟踪,查看各相关寄存器内容,看看程序运行过中是不是有什么偏差,找出影响结果的地方,改正过来。这一个过程非常重要,
通过程序的排错,可以学到的知识是书上得不到的。
参考文献:
【1】郭天祥.新概念51单片机c语言教程 电子工业出版社2009.12.5
【2】黄冰 黄知超 微机原理及应用(第二版)重庆大学出版社2010.7.5
【3】熊诗波 黄长艺 单片机原理及应用 高等教育出版社 2010.5.6
【4】胡汉才 单片机原理及其接口技术 [M] 清华大学出版,1996
【5】蔡美琴 MCS-51系列单片机系统及其应用 高等教育出版社 2004.2
【6】周立功 增强型80C51单片机速成与实战 北京航空航天大学出版社2004.5
【7】李华 MCS -51系列单片机实用接口技术[M] 北京航空航天大学出版社,1993
【8】吴金戎,沈庆阳 8051单片机实践与应用 [M] 清华大学出版社, 2003.
附录一
/** * ************************************************************** 文件名 : hongludeng.c
* 描述 : 红绿灯的显示,通过数码管显示时间
* 作者 : 李雷,2013年11月28日
***********************************************************************/
LED8 EQU P0 ; //定义数码管
MUN EQU 50H
DAB0 BIT P3.0
KEY1 BIT p1.0 //用于控制程序选择
KEY2 BIT p1.1 //控制红黄灯
P22 BIT P2.2 //控制南北绿灯
P23 BIT P2.3 //控制南北黄灯
P24 BIT P2.4 //控制南北红灯
P25 BIT P2.5 //控制东西红灯
P26 BIT P2.6 //控制东西黄灯
P27 BIT P2.7 //控制东西绿灯
ORG 0000H
LJMP START //主函数
ORG 000BH
LJMP INT_T0 //定时器入口
START: MOV DPTR,#TABLE
MOV LED8,#00H //数码管清空
MOV TMOD,#01H //模式一
MOV TH0 ,#4CH
MOV TL0 ,#00H //50ms初值
MOV IE ,#82H //开中断
SETB TR0
MOV R2,#00H //计数初始化
MOV R1,#00H //数码管显示初始化
MOV P2 ,#00H //led清零
MAIN: MOV A,R1 //循环显示
MOV DPTR,#TABLE //数码管地址归零
MOVC A,@A+DPTR //数码管地址
MOV LED8,A //数码管显示
SJMP MAIN //while循环
/*****************手动控制********************/
N10: MOV P2,#00H //led清零
JNB KEY2 , N15 //判断key2是否按下(没有按下p11=1执行n15红灯亮)
CJNE R1 ,#01H,N11
SETB P23 //key1按下执行手动控制
SETB P26 //黄灯亮
SJMP LOOP //结束中断
N11:
CLR P23 //黄灯灭
CLR P26
SJMP LOOP //结束中断
N15: MOV P2,#00H //led全灭
MOV R1,#00H //显示清零
SETB P24 //红灯亮
SETB P27 //红灯亮
JNB KEY2, LOOP
/*****************自动控制***********************/
N20: JB DAB0 , N25
MOV P2 ,#00H //自动控制
CJNE R1,#03H,N21 //判断是否到达3秒
N21: JC N22 //
SETB P24 //控制南北红灯//南北绿灯亮
SETB P25 //控制东西绿灯//东西红灯亮
SJMP LOOP
N22: MOV P2 ,#00H
SETB P26 //黄灯亮
SETB P24 //红灯继续亮
CLR P25 //绿灯灭
SJMP LOOP
N25: MOV P2 ,#00H //自动控制
CJNE R1,#03H,N31 //判断是否到达3秒
N31: JC N32 //
SETB P22 //南北绿灯亮
SETB P27 //东西红灯亮
SJMP LOOP
N32: MOV P2 ,#00H
SETB P23 //黄灯亮
SETB P27 //红灯继续亮
CLR P22 //绿灯灭
SJMP LOOP
/***************定时函数******************/
INT_T0: MOV TL0 ,#00H //50ms初值
MOV TH0 ,#4CH //
INC R2 //计数++
CJNE R2,#14H, LOOP1 //不到时间不执行
MOV R2 ,#00H //计数清零
DEC R1 //R1--
CJNE R1,#0FFH ,LOOP1 //判断-1
JB KEY1,IN1 //判断key1=1执行in1
MOV R1,#08H //按下直接赋值8
CPL DAB0 //取反
SJMP LOOP1 //判断key
IN1: JB KEY2 , IN2 //判断是否按下key2
SJMP LOOP1
IN2: MOV R1,#01H
SJMP LOOP1
LOOP1: JB KEY1, N10 //判断按键1没有按下 手动控制
SJMP N20 //判断按键1按下 自动控制
LOOP: RETI
TABLE : DB 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f //// 0123456789
END
编号:
微机综合实践说明书
题 目: 交通灯控制系统
学 院: 机电工程学院
专 业: 机械设计制造及其自动化
学生姓名: 李 雷 盛
学 号: 1100110710
指导教师单位:
姓
名:
2013年12月8日
目录
摘要
前言
一、单片机简介………………………………………………………………………………… 1
1.1单片机的发展历程………………………………………………………………………1
1.2单片机的特点 ………………………………………………………………………… 1
1.3 MCS—51单片机内部结构有8大部分 ………………………………………………1
1.4单片机的内部结构图 ……………………………………………………………………2
二、方案拟定 ……………………………………………………………………………………… 3
2.1方案选择………………………………………………………………………………………………3
2.2方案确立………………………………………………………………………………………………3
三、电路原理图设计………………………………………………………………………… 4
3.1画原理图及pcb图…………………………………………………………………………………4
3.2制版主要工具及流程……………………………………………………………………………… 5
3.3 通行灯显示模块……………………………………………………………………………………6
3.4 时间显示模块…………………………………………………………………………………………7 3.5原件清单…………………………………………………………………………………………………8
3.6 成品……………………………………………………………………………………………………8
四、程序设计…………………………………………………………………………………………8
4.1控制芯片介绍…………………………………………………………………………………………9
4.2程序设计流程……………………………………………………………………………………… 11
4.3相应程序代码……………………………………………………………………………………… 12
五、仿真调试………………………………………………………………………………………15
六、总结………………………………………………………………………………………………17
参考文献……………………………………………………………………………………………………19 附录一………………………………………………………………………………………………………20
摘要:交通信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。为了实现交通道路的管理,力求交通管理先进性、科学化。用MCS-51系列单片机实现交通灯管制的控制系统,以及该系统软、硬件设计方法,实验证明该系统实现简单、经济,能够有效地疏导交通,提高交通路口的通行能力。
本系统采用MSC-51系列单片机ATSC51和可编程并行I/O接口芯片80C51为中心器件来设计交通灯控制器,实现了AT89S51芯片的P1口设置红、绿灯燃亮时间的功能;红绿灯循环点亮,倒计时剩秒时黄灯闪烁警示。本系统实用性强、操作简单、扩展功能强。
关键词:交通灯、MCS-51系列单片机、设计、AT89S51芯片
前言
本次所设计的系统功能为:以MCS-51系列单片机作为控制核心,在东西南北四个方向设置左拐、右拐、直行及行人4种通行指示灯,用计时器显示路口通行转换剩余时间。在出现紧急情况时,可以由交警手动实现全路口车辆禁行而行人通行状态,在特种车辆如119、120通过路口时,系统可自动转为特种车辆放行,其他车辆禁止通行状态。
交通信号灯的出现,使交通得以有效管制,对于疏导交通流量、提高道路通行能力,减少交通事故有明显效果。绿灯是通行信号,面对绿灯的车辆可以直行,左转弯和右转弯,除非另一种标志禁止某一种转向。左右转弯车辆都必须让合法地正在路口内行驶的车辆和过人行横道的行人优先通行。红灯是禁行信号,面对红灯的车辆必须在交叉路口的停车线后停车。黄灯是警告信号,面对黄灯的车辆不能越过停车线,但车辆已十分接近停车线而不能安全停车时可以进入交叉路口。
随着经济的发展,交通运输中出现了一些传统方法难以解决的问题。道路拥挤现象日趋严重,造成的经济损失越来越大,并一直保持大比例的增长。现在交通系统已不能满足经济发展的需求。由于生活水平的提高,人们对交通运输的安全性及服务水平提出了更高的要求。在交通中管理引入单片机交通灯控制代替交管人员在交叉路口服务,有助于提高交通运输的安全性、提高交通管理的服务质量。并在一定程度上尽可能的降低由道路拥挤造成的经济损失,同时也减小了工作人员的劳动强度。
中国车辆数量不断增加,交通控制在未来的交通管理中起着越来越重要的作用。交通灯的管理比重修一条马路无论在经济、交通运行速率上都有很好的效益、更加节约资源。使交管人员有更多的精力投入到管理整个城市交通控制,带来更大的经济和社会效益,为创造美好的城市交通形象发挥更多的作用。
一、单片机简介
1.1单片机的发展历程
单片机微型计算机是微型计算机的一个重要分支,也是颇具生命力的机种。单片机微型计算机简称单片机,特别适用于控制领域,故又称为微控制器。
在MCS-51系列单片机中,有两个子系列:51子系列和52子系列。每个子系列有诺干中型号。51系列有8051、8751和8031三个型号,后来经过改进产生了80c51、87c51、80c31三个型号;52系列有5021、8752、8032三个型号,改进后的型号是80c52/87c52、80c32。改进后的型号更加省电。52系列比对应的51系列增加了定时器T2并将内部程序存贮器增加到8KB。Inter公司停止生产MCS-51系列单片机之后将生产权转让给了许多其他公司,于是出现了许多与Mcs-51兼容的单片机。现在生产mcs-51兼容单片机的公司对其进行了不同程度的改进和提高。我们现在使用比较的多的是AT89C51/AT89s51等。
通常,单片机由单块集成电路芯片构成,内部包含有计算机的基本功能部件:中央处理器、存储器和I/O接口电路等。因此,单片机只需要和适当的软件及外部设备相结合,便可成为一个单片机控制系统。
单片机经过1、2、3、3代的发展,目前单片机正朝着高性能和多品种方向发展,它们的CPU功能在增强,内部资源在增多,引角的多功能化,以及低电压底功耗。
1.2单片机的特点
(1)性价比高,开发周期短,易于产品化,
(2)集成度高,可靠性好,抗干扰性强,
(3)功能完善,接口多样,
(4)低功耗、低电压
一般电源供电电压在5~3V范围内单片机都能正常工作,供电的下限可达1~2V。
(5)总线多样,易于扩展
单片机外部的典型三总线结构,方便系统构扩展,构成各种规模的应用系统。外部总线增加了I2C及SPI等串行总线方式, 可根据需要进行并行或者串行扩展。
1.3 MCS—51单片机内部结构有8大部分
①.一个8 位的中央处理器 CPU(又称为微处理器)
中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。
②有 128字节的片内数据存储器RAM
8051内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。
③.4KB片内 程序存储器ROM或EPROM
8051共有4096个8位掩膜ROM,用于存放用户程序,原始数据
④.片内 18个 特殊功能寄存器(SFR)
⑤.4个8位 的并行输入输出I/O口(PIO)
8051共有4组8位I/O口(P0、 P1、P2或P3),用于对外部数据的传输
P0口 P0.0~P0.7 输入与输出 分时的传送地址低8位与数据线
P1口 P1.0~P1.7 输入与输出 无第二功能
P2口 P2.0~P2.7 输入与输出 传送地址的高8位
P3口 P3.0~P3.7 输入与输出 P3.0—RXD:串行口输入端
P3.1—TXD:串行口输出端
P3.1—TXD:串行口输出端
P3.2—:外部中断0中断请求输入端
P3.3—:外部中断1中断请求输入端
P3.4—T0:定时器/计数器0外部输入端
P3.5—T1:定时器/计数器1外部输入端
P3.6—:外部数据存储器写选通信号
P3.7—:外部数据存储器读选通信号
⑥.1个 串行口I/O(SIO/UART)完成单片机与其他微机的之间的串行通信
⑦.2/3个16位 定时器/计数器(TIMER/COUNTER)
⑧.可处理 5个中断源,两级可程序优先级的中断系统
其中含有MCS-51指令集含 111条指令,按照指令操作功能话费有五类:
数据传送指令(28)
算术运算指令(24)
逻辑运算及转移指令(25)
控制转移指令(22)
位操作指令(12)
1.4单片机的内部结构图
除去图中的存储电路和I/O部件,剩下的是CPU,它可以分为运算器和控制器两部分。运算器功能部件包括算术逻辑运算单元ALU、累加器ACC、寄存器B、暂存寄存器TMP1、TMP2、程序状态字寄存器PSW等。控制器功能部件包括程序计数器PC、指令寄存器IR、指令译码器ID、定时控制逻辑电路CU、数据指针寄存器DPTR、堆栈指针SP及时钟电路等。
图1-1单片机内部结构图
二、方案拟定
2.1方案选择
1)、显示模块
方案一:采用4个1位数码管显示。
方案二:用液晶屏显示。
方案三:用点阵屏显示。
2)、指示模块
方案一:用四组红绿灯在四个路口显示。
方案二:用4个可变彩灯在四个路口,控制其显示颜色进行显示。
方案三:用字体显示
3)、控制模块
选用at89s51或者stc89s51
4)、时间控制
方案一:用软件延时。
方案二:用单片机内部定时器定时50ms计数20次为1s
2.2方案确立
由于只显示0-8,所以选用4个1位数码管,液晶屏价格比较高编程复杂,点阵屏占用io资源比较多,为了更加明显显示我们采用了每个路口3个灯,分别为红绿黄,方便控制,三色彩灯价格比较高,控制不方便,字体显示比较复杂,价格比较贵。软件延时误差比较大,用单片机定时器精度高方便控制。
最终选型为,用3个单色灯在每个路口显示,用数码管显示倒计时。采用静态显示,采用单片机定时器计数。
设在十字路口,分为东西向和南北向,在任一时刻只有一个方向通行,另一方向禁行,持续一定时间,经过短暂的过渡时间,将通行禁行方向对换。其具体状态如下图所示。说明:黑色表示亮,白色表示灭。交通状态从状态0开始变换,直至状态7然后循环至状0,周而复始,即如图(图2-1)所示:直至状态7然后循环至状态0,通过具体的路口交通灯状态的演示分析我们可以把这四个状态归纳如下:
图2-1交通状态
※东西方向绿灯亮5S,南北红灯亮5S。此状态下,东西向允许通行,南北向禁止通行。 ※东西黄灯亮3S.南北红灯亮3S。此状态下,除了已经正在通行中的其他所以车辆都需等待状态转换。
※东西红灯亮5S,南北绿灯亮5S。此状态下,东西向禁止通行,南北向允许通行。 ※东西红灯亮3S,南北黄灯亮3S。此状态下,除了已经正在通行中的其他所以车辆都需等待状态转换。
三、电路原理图设计
3.1画原理图3-1及pcb图3-2
图 3-1
图
3-2
转印到铜板
打印pcb,效果如图3-3
图3-3
3.2制版主要工具及流程 腐蚀液
图3-4腐蚀液
铜板转印机
图3-5铜板转印机
打孔机及洛铁
图3-6打孔机及老铁
3.3 通行灯显示模块
通行灯显示模块如图3-7所示。二极管每个路口三个,用102排阻驱动,用P2控制,
图3-7
3.4 时间显示模块
通行剩余时间显示模块如图3-8所示
路口通行剩余时间采用高亮红色7段共阴LED发光数码管显示。用排阻驱动电路图如下
图3-8
数码管的使用方法与发光二极管没什么区别,只是把七或八只发光二极管组合在一个模件上组成了个8字和小数点,用以显示数字。为了减少管脚,把各个发光管的其中同一个极接在一起作为共用点,因此就产生了共阳极和共阴极数码之说。共阳管就是把各个发光管的正极接在一起,而共阴管就刚好相反。见下图3-9:
图
图3-11 成品
四、程序设计
4.1控制芯片介绍
AT89S51 为 ATMEL 所生产的可电气烧录清洗的 8051 相容单芯片,其内部程序代码容量为4KB (一)、AT89S51主要功能列举如下: 1、为一般控制应用的 8 位单芯片
2、晶片内部具时钟振荡器(传统最高工作频率可至 12MHz) 3、内部程式存储器(ROM)为 4KB 4、内部数据存储器(RAM)为 128B 5、外部程序存储器可扩充至 64KB 6、外部数据存储器可扩充至 64KB
7、32 条双向输入输出线,且每条均可以单独做 I/O 的控制 8、5 个中断向量源
9、2 组独立的 16 位定时器 10、1 个全多工串行通信端口
11、8751 及 8752 单芯片具有数据保密的功能 12、单芯片提供位逻辑运算指令
(二)、AT89S51各引脚功能介绍:
VCC:AT89S51 电源正端输入,接+5V。 VSS:电源地端。
XTAL1:单芯片系统时钟的反相放大器输入端。
XTAL2:系统时钟的反相放大器输出端,一般在设计上只要在 XTAL1 和 XTAL2 上接上一只石英振荡晶体系统就可以动作了,此外可以在两引脚与地之间加入一 20PF 的小电容,可以使系统更稳定,避免噪声干扰而死机。
RESET:AT89S51的重置引脚,高电平动作,当要对晶片重置时,只要对此引脚电平提升至高电平并保持两个机器周期以上的时间,AT89S51便能完成系统重置的各项动作,使得内部特殊功能寄存器之内容均被设成已知状态,并且至地址0000H处开始读入程序代码而执行程序。 EA/Vpp:
"EA"为英文"External Access"的缩写,表示存取外部程序代码之意,低电平动作,也就是说当此引脚接低电平后,系统会取用外部的程序代码(存于外部EPROM中)来执行程序。因此在8031及8032中,EA引脚必须接低电平,因为其内部无程序存储器空间。如果是使用 8751 内部程序空间时,此引脚要接成高电平。此外,在将程序代码烧录至8751内部EPROM时,可以利用此引脚来输入21V的烧录高压(Vpp)。 ALE/PROG:
ALE是英文"Address Latch Enable"的缩写,表示地址锁存器启用信号。AT89S51可以利用这支引脚来触发外部的8位锁存器(如74LS373),将端口0的地址总线(A0~A7)锁进锁存器中,因为AT89S51是以多工的方式送出地址及数据。平时在程序执行时ALE引脚的输出频率约是系统工作频率的1/6,因此可以用来驱动其他周边晶片的时基输入。此外在烧录8751程序代码时,此引脚会被当成程序规划的特殊功能来使用。 PSEN:
此为"Program Store Enable"的缩写,其意为程序储存启用,当8051被设成为读取外部程序代码工作模式时(EA=0),会送出此信号以便取得程序代码,通常这支脚是接到EPROM的OE脚。AT89S51可以利用PSEN及RD引脚分别启用存在外部的RAM与EPROM,使得数据存储器与程序存储器可以合并在一起而共用64K的定址范围。 PORT0(P0.0~P0.7):
端口0是一个8位宽的开路汲极(Open Drain)双向输出入端口,共有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端口使用外,若是在AT89S51扩充外接程序存储器或数据存储器时,也提供地址总线的高字节A8~A15,这个时候P2便不能当做I/O来使用了。 PORT1(P1.0~P1.7):
端口1也是具有内部提升电路的双向I/O端口,其输出缓冲器可以推动4个LS TTL负载,同样地若将端口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,外部数据存储器的读取信号。 4.2程序设计流程
(1)全部控制程序实际上分为若干模块:按键设置处理程序,状态灯控制程序,LED显示程序,中断服务子程序,红绿灯时间调整程序等。
整个软件程序方面主要分两大部分:按键处理程序和50ms扫描程序。流程图如图4-1:
图4-1主程序流程图
交通管理定时功能程序如图4-2:
定时器工作时必须给计数器送计数器初值,这个值是送到TH和TL中的。他是以加法记数的,并能从全1到全0时自动产生溢出中断请求。因此,我们可以把计数器记满为零所需的计数值设定为C和计数初值设定为TC 可得到如下计算通式: TC=M-C
式中,M为计数器模值,该值和计数器工作方式有关。在方式0时M为213 ;在方式1时M的值为216;在方式2和3为28 ;
算法公式:T=(M-TC)T计数 或TC=M-T/T计数
T计数是单片机时钟周期TCLK的12倍;TC为定时初值 如单片机的主脉冲频率为TCLK12MHZ ,经过12分频 方式0 TMAX=213 ×1微秒=8.192毫秒 方式1 TMAX=216 ×1微秒=65.536毫秒
显然1秒钟已经超过了计数器的最大定时间,所以我们只有采用定时器和软件相结合的办法才能解决这个问题.
实现1秒的方法:我们采用在主程序中设定一个初值为20的软件计数器和使T1定时50毫秒。这样每当T1到50毫秒时CPU就响应它的溢出中断请求,进入他的中断服务子程
序。在中断服务子程序中,CPU先使软件计数器减1,然后判断它是否为零。为0表示1秒已到可以返回到输出时间显示程序。
在本设计中,实行自动控制的灯只有6个,即:东西红灯,东西绿灯,东西黄灯,南北红灯,南北绿灯,南北黄灯。定义IO端口如下,其中均是低电平有效。 P22 BIT P2.2 //控制南北绿灯 P23 BIT P2.3 //控制南北黄灯 P24 BIT P2.4 //控制南北红灯 P25 BIT P2.5 //控制东西红灯 P26 BIT P2.6 //控制东西黄灯 P27 BIT P2.7 //控制东西绿灯 (1)定时器的设置
定时器需定时50毫秒,故T1工作于方式1。50ms初值计算采用软件取值如图4-3,函数如下:
START: MOV DPTR,#TABLE
MOV LED8,#00H //数码管清空 MOV TMOD,#01H //模式一 MOV TH0 ,#4CH
MOV TL0 ,#00H //50ms初值 MOV IE ,#82H //开中断 SETB TR0
MOV R2,#00H //计数初始化
MOV R1,#00H //数码管显示初始化 MOV P2 ,#00H //led清零
图4-3
(2)定时器中断服务子程序 1)手动控制程序
N10: MOV P2,#00H //led清零 JNB KEY2 , N15 //判断key2是否按下(没有按下p11=1执行n15红灯亮) CJNE R1 ,#01H,N11 SETB P23 //key1按下执行手动控制 SETB P26 //黄灯亮 SJMP LOOP //结束中断
N11: CLR P23 //黄灯灭 CLR P26 SJMP LOOP //结束中断 N15: MOV P2,#00H //led全灭 MOV R1,#00H //显示清零 SETB P24 //红灯亮 SETB P27 //红灯亮 JNB KEY2, LOOP 2)自动控制程序
N20: JB DAB0 , N25
MOV P2 ,#00H //自动控制
CJNE R1,#03H,N21 //判断是否到达3秒 N21: JC N22 //
SETB P26 //黄灯亮
SETB P24 //红灯继续亮 CLR P25 //绿灯灭 SJMP LOOP
N25: MOV P2 ,#00H //自动控制
CJNE R1,#03H,N31 //判断是否到达3秒 N31: JC N32 //
SETB P23 //黄灯亮
SETB P27 //红灯继续亮 CLR P22 //绿灯灭 SJMP LOOP 3)定时器程序
INT_T0: MOV TL0 ,#00H //50ms初值 MOV TH0 ,#4CH //
INC R2 //计数++
CJNE R2,#14H, LOOP1 //不到时间不执行 MOV R2 ,#00H //计数清零 DEC R1 //R1--
CJNE R1,#0FFH ,LOOP1 //判断-1
JB KEY1,IN1 //判断key1=1执行in1 MOV R1,#08H //按下直接赋值8 CPL DAB0 //取反 SJMP LOOP1 //判断key IN1: JB KEY2 , IN2 //判断是否按下key2
SJMP LOOP1
IN2: MOV R1,#01H SJMP LOOP1
LOOP1: JB KEY1, N10 //判断按键1没有按下 手动控制 SJMP N20 //判断按键1按下 自动控制 LOOP: RETI
(3)数码管显示函数 MAIN: MOV A,R1 //循环显示 MOV DPTR,#TABLE //数码管地址归零 MOVC A,@A+DPTR //数码管地址 MOV LED8,A //数码管显示 SJMP MAIN //while循环 数码管段显示取值数组
TABLE : DB 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f //// 0123456789
*******源程序在附录一*******
五、仿真调试
仿真软件protues效果如图5-1、图5-2、图5-3、图5-4:
图5-1
图
5-2
图5-3
图5-4
六、总结 本次设计我负责的主要是程序的编写,我体会了其中的艰辛,为写着份报告曾多次去实地取材,并做记录。为把身边最常见的红绿灯原原本本的概述在报告里是件很困难的事情,也为此提前一个星期就开始做准备。设计过程是枯燥而乏味的,程序的修改甚至让我想打退堂鼓。程序重要的是去写,因为每一句程序都有它的意义在。不是看看就能完全理解的。
如今一直在打程序,感觉也是这样,细节处无不体现些美妙的地方,还有一个感觉 就是不要怕长的程序,当你打出一个1K行的程序出来,那么你去看500行的程序就感觉很简单。当你打出一个10K行的程序出来,几K的程序看起来又是那样简单。 程序要尽量做到由各个子程序组成,在有些程序后面最好加注释,这样在程序出错的检查过程中可以更容易查找的到,也更简洁,更明白易懂。 程序要尽量做到由各个子程序组成,在有些程序后面最好加注释,这样在程序出错的检查过程中可以更容易查找的到,也更简洁,更明白易懂。
明白了程序不要光看不写,一定要自己写一次。最开始的时候,啥都不懂,可以抄人家的程序过来,看看每一句是干什么用的,达到什么目的,运行后有什么后果,看明白了之后,就要自己写一次,就会发现,原来看明白别人的程序很容易,但到自己写的时候却一句也写不出来,这就是差距。当自己能写出来的时候,说明自己就真的懂了。
而且必须学会掌握调试程序的方法。不少人写程序,把代码写好了,然后一运行,不是自己想要的结果,就晕了,然后跑到论坛上发个帖子,把程序一贴,问:为什么我的程序不能正常运行?然后就等别人来给自己分析。这是一种很不好的行为,应该自己学会发现问题和学会如何解决问题。这就需要学习调试程序的方法,比如KEIL里,可以下断点啦,查看寄存器内容等等,这些都是调试程序的手段,当你发现你写的程序运行结果和你想象中不一样的时候,你可以单步,也可以下断点,然后跟踪,查看各相关寄存器内容,看看程序运行过中是不是有什么偏差,找出影响结果的地方,改正过来。这一个过程非常重要,
通过程序的排错,可以学到的知识是书上得不到的。
参考文献:
【1】郭天祥.新概念51单片机c语言教程 电子工业出版社2009.12.5
【2】黄冰 黄知超 微机原理及应用(第二版)重庆大学出版社2010.7.5
【3】熊诗波 黄长艺 单片机原理及应用 高等教育出版社 2010.5.6
【4】胡汉才 单片机原理及其接口技术 [M] 清华大学出版,1996
【5】蔡美琴 MCS-51系列单片机系统及其应用 高等教育出版社 2004.2
【6】周立功 增强型80C51单片机速成与实战 北京航空航天大学出版社2004.5
【7】李华 MCS -51系列单片机实用接口技术[M] 北京航空航天大学出版社,1993
【8】吴金戎,沈庆阳 8051单片机实践与应用 [M] 清华大学出版社, 2003.
附录一
/** * ************************************************************** 文件名 : hongludeng.c
* 描述 : 红绿灯的显示,通过数码管显示时间
* 作者 : 李雷,2013年11月28日
***********************************************************************/
LED8 EQU P0 ; //定义数码管
MUN EQU 50H
DAB0 BIT P3.0
KEY1 BIT p1.0 //用于控制程序选择
KEY2 BIT p1.1 //控制红黄灯
P22 BIT P2.2 //控制南北绿灯
P23 BIT P2.3 //控制南北黄灯
P24 BIT P2.4 //控制南北红灯
P25 BIT P2.5 //控制东西红灯
P26 BIT P2.6 //控制东西黄灯
P27 BIT P2.7 //控制东西绿灯
ORG 0000H
LJMP START //主函数
ORG 000BH
LJMP INT_T0 //定时器入口
START: MOV DPTR,#TABLE
MOV LED8,#00H //数码管清空
MOV TMOD,#01H //模式一
MOV TH0 ,#4CH
MOV TL0 ,#00H //50ms初值
MOV IE ,#82H //开中断
SETB TR0
MOV R2,#00H //计数初始化
MOV R1,#00H //数码管显示初始化
MOV P2 ,#00H //led清零
MAIN: MOV A,R1 //循环显示
MOV DPTR,#TABLE //数码管地址归零
MOVC A,@A+DPTR //数码管地址
MOV LED8,A //数码管显示
SJMP MAIN //while循环
/*****************手动控制********************/
N10: MOV P2,#00H //led清零
JNB KEY2 , N15 //判断key2是否按下(没有按下p11=1执行n15红灯亮)
CJNE R1 ,#01H,N11
SETB P23 //key1按下执行手动控制
SETB P26 //黄灯亮
SJMP LOOP //结束中断
N11:
CLR P23 //黄灯灭
CLR P26
SJMP LOOP //结束中断
N15: MOV P2,#00H //led全灭
MOV R1,#00H //显示清零
SETB P24 //红灯亮
SETB P27 //红灯亮
JNB KEY2, LOOP
/*****************自动控制***********************/
N20: JB DAB0 , N25
MOV P2 ,#00H //自动控制
CJNE R1,#03H,N21 //判断是否到达3秒
N21: JC N22 //
SETB P24 //控制南北红灯//南北绿灯亮
SETB P25 //控制东西绿灯//东西红灯亮
SJMP LOOP
N22: MOV P2 ,#00H
SETB P26 //黄灯亮
SETB P24 //红灯继续亮
CLR P25 //绿灯灭
SJMP LOOP
N25: MOV P2 ,#00H //自动控制
CJNE R1,#03H,N31 //判断是否到达3秒
N31: JC N32 //
SETB P22 //南北绿灯亮
SETB P27 //东西红灯亮
SJMP LOOP
N32: MOV P2 ,#00H
SETB P23 //黄灯亮
SETB P27 //红灯继续亮
CLR P22 //绿灯灭
SJMP LOOP
/***************定时函数******************/
INT_T0: MOV TL0 ,#00H //50ms初值
MOV TH0 ,#4CH //
INC R2 //计数++
CJNE R2,#14H, LOOP1 //不到时间不执行
MOV R2 ,#00H //计数清零
DEC R1 //R1--
CJNE R1,#0FFH ,LOOP1 //判断-1
JB KEY1,IN1 //判断key1=1执行in1
MOV R1,#08H //按下直接赋值8
CPL DAB0 //取反
SJMP LOOP1 //判断key
IN1: JB KEY2 , IN2 //判断是否按下key2
SJMP LOOP1
IN2: MOV R1,#01H
SJMP LOOP1
LOOP1: JB KEY1, N10 //判断按键1没有按下 手动控制
SJMP N20 //判断按键1按下 自动控制
LOOP: RETI
TABLE : DB 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f //// 0123456789
END