资源描述
目 录
一、 设计任务…………………………………………3
二、 设计要求…………………………………………3
三、 总体设计…………………………………………4
四、 硬件模块…………………………………………5
4.1主控系统……………………………………..5
4.2数码管显示时间电路……………………….7
4.3交通灯输出控制电路……………………….8
五、 程序模块………………………………………....11
5.1主程序设计…………………………………..11
5.2数码管显示子程序…………………………..11
5.3 LED灯显示子程序………………………….12
5.4紧急状况中断子程序………………………...16
5.5定时/计数子程序……………………………..16
六、 系统调试………………………………………….16
七、 元件清单………………………………………….17
八、 学习心得………………………………………….18
九、 参考文献………………………………………….19
一、设计任务
设计并制作一个城市交道口交通灯控制糸统
二、基本要求
(1) 在1平方米左右木板上制作交道口模型,装上交通灯。交道口模型如图所示。
(2) 交通灯控制规则如下:
1)每个街口有左拐、右拐、直行及行人四种指示灯。每个灯有红、绿两种颜色。自行车与汽车共用左拐、右拐和直行灯。
2)共有四种通行方式:
① 车辆南北直行、各路右拐,南北向行人通行。南北向通行时间为1分钟,各路右拐比直行滞后10秒钟开放。
② 南北向左拐、各路右拐,行人禁行。通行时间为1分钟。
③ 东西向直行、各路右拐,东西向行人通行。东西向通行时间为1分钟,各路右拐比直行滞后10秒钟开放。
④ 东西向左拐、各路右拐。行人禁行。通行时间为1分钟。
3)在通行结束前10秒钟,绿灯闪烁直至结束。
(3)不必自制电源。
发挥部分:有倒计时时间显示;若交道口出现紧急情况,交警可将糸统设置成手动:全路口车辆禁行、行人通行。紧急情况结束后再转成自动状态。
三、总体设计
整个系统采用AT89C51单片机系统为核心,使用LED发光二极管代表各个路口的交通灯,用7SEG-MPX2-CC数码管对转换时间进行倒时.
电源
复位电路
AT89C51单片机
手动控制
LED灯显示
数码显示管
图3.1 总体设计框图
图3.2 硬件电路设计仿真图
四、硬件模块
4.1主控系统
整个系统采用AT89C51单片机为核心,P1口控制交通灯的亮、灭,P0口为倒数计时器显示控制端,P2口是显示器公共端的扫描口,P3.2为外部中断,当紧急情况下课按下开关,此时所有红灯亮,禁止所有车辆和行人通行。使用LED发光二极管代表各个路口的各种交通灯,用7SEG-MPX2-CC数码管对转换时间进行倒时。
AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C51 提供以下标准功能:4k 字节Flash 闪速存储器,128字节内部RAM,32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
主要管脚说明:
P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。
P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为低八位地址接收。
P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
P3口也可作为AT89C51的一些特殊功能口,如下所示:
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(外部数据存储器读选通)
P3口同时为闪烁编程和编程校验接收一些控制信号。
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:来自反向振荡器的输出。
振荡器特性:
XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。
图4.1 AT89C51外形图及引脚图
4.2数码管显示时间电路:
动态显示方式是指一位一位地轮流点亮每位显示器(称为扫描),即每个数码管的位选被轮流选中,多个数码管公用一组段选,段选数据仅对位选选中的数码管有效。对于每一位显示器来说,每隔一段时间点亮一次。显示器的亮度既与导通电流有关,也与点亮时间和间隔时间的比例有关。通过调整电流和时间参数,可以既保证亮度,又保证显示。若显示器的位数不大于8位,则显示器的公共端只需一个8位I/O口进行动态扫描(称为扫描口),控制每位显示器所显示的字形也需一个8位口(称为段码输出)。
图4.2.1 7SEG-MPX2-CC数码管
图4.2.2 数码管显示时间电路
4.3 交通灯输出控制电路:
道口交通灯采用LED二极管,左拐、直行、右拐、行人各一个。当发光电流为6mA时,按公式R=(5V-1.8V)/0.006计算,限流电阻应为510欧,以保护单片机输出端口。(仿真图未接电阻)
显示状态流程如下:
00-10车辆南北向直行、南北向行人通行
10-50,车辆南北直行、各路右拐,南北向行人通行
50-60后,车辆南北直行、各路右拐,南北向行人通行,路灯闪烁
00-50南北向左拐、各路右拐,行人禁行
50-60南北向左拐、各路右拐,行人禁行,路灯闪烁
00-10东西向直行,东西向行人通行
10-50东西向直行、各路右拐,东西向行人通行
50-60东西向直行、各路右拐,东西向行人通行,路灯闪烁
00-50东西向左拐、各路右拐。行人禁行。
50-60东西向左拐、各路右拐,行人禁行,路灯闪烁
五、程序模块
5.1主程序设计
首先程序初始化,包括定时器初始化。然后进入子程序ST1状态1。在状态1中又调用显示子程序,由于状态已不用闪烁因此不用调用闪烁子程序。状态1只用显示10s,所以判断A是否等于50H,不等于则继续执行ST1语句,等于则跳转到ST2中。同时(50H)加1。在ST2中雨ST1不同的是ST2中最后10s,灯要闪烁。因此先判断A是否等于10,如果是则同时调用显示子程序和SHANSHUO1子程序,将(50H)的值和01H比较,若等于则跳转到ST3,同时(50H)加1。在ST3中判断A是否等于10H,等于则同时调用显示子程序和SHANSHUO2子程序,将(50H)的值和02H比较,若等于则跳转到ST4中。其他状态同理。
考虑到有紧急状况发生,程序设计了一个外部中断INT0,当紧急状况发生时,按下开关,给P3.2口一个低电平,触发外部中断,进入中断服务程序。撤销中断时,程序继续执行。
主程序:
ORG 1000H
MAIN: MOV R6,#100 ;主程序;
SETB EX0
CLR IT0
MOV 50H,#00H
MOV TMOD,#10H ;初始化
MOV TH1,#0D8H
MOV TL1,#0F0H
MOV IE,#8DH
MOV 22H,#60H ;60s;
SETB TR1
5.2数码管显示子程序
显示程序如下:它将显示缓冲区4个字节数据依次读出,每一字节数据分两次分别对应显示到数码管上(读一字节显示两位,直到四个数码管显示完毕)
DISP: MOV A,R2 ;显示子程序。
ANL A,#0F0H
SWAP A
MOV 60H,A
MOV A,R2
ANL A,#0FH
MOV 61H,A
MOV A,R3
ANL A,#0F0H
SWAP A
MOV 62H,A
MOV A,R3
ANL A,#0FH
MOV 63H,A
MOV 40H,#04H
MOV R5,#0FEH
MOV R0,#60H
LLP: MOV A,@R0
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A
MOV A,R5
MOV P2,A
LCALL DELAY1
MOV P2, #0FFH;
RL A
MOV R5,A
INC R0
DJNZ 40H,LLP
RET
DELAY1: ;延时子程序
MOV R4,#02H
DL2: MOV R7,#0FFH
DJNZ R7,$
DJNZ R4,DL2
RET
TABLE:DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH,00H
END
5.3 LED灯显示子程序
状态1:车辆南北直行,南北向行人通行10s。
子程序:
ZT1: MOV P1,#0FAH ;第一个状态,南北直行,行人通行;
MOV R2,22H
MOV R3,22H
LCALL DISP ;调用显示子程序。
MOV A,22H
CJNE A,#50H,ZT1
状态2:车辆南北直行、各路右拐,南北向行人通行50s。通行结束前10s闪烁。
子程序:
ZT2: MOV P1,#0D8H ;第二个状态,南北直行,各路右拐50s;
MOV R2,22H
MOV R3,22H
LCALL DISP ;调用显示子程序。
MOV A,22H
CJNE A,#10H,ZT2
SHANSHUO1:
MOV P1,#0D8H
MOV R1,#100
LIANG1:
MOV R2,22H
MOV R3,22H
LCALL DISP
MOV A,22H
JZ CASE1
DJNZ R1, LIANG1
MOV R1,#100
MIE1:
MOV P1,#0DDH ;闪烁灭
MOV R2,22H
MOV R3,22H
LCALL DISP
MOV A,22H
JZ CASE1
DJNZ R1,MIE1
MOV A,50H
CASE1:
CJNE A,#01H,SHANSHUO1 ;闪烁10s结束
状态3: 南北向左拐、各路右拐,行人禁行。通行时间为1分钟。
子程序:
ZT3: MOV P1,#0D5H ;第三个状态,南北左拐,各路右拐60s;
MOV R2,22H
MOV R3,22H
LCALL DISP ;调用显示子程序。
MOV A,22H
CJNE A,#10H,ZT3
SHANSHUO2:
MOV P1,#0D5H
MOV R1,#100
LIANG2:
MOV R2,22H
MOV R3,22H
LCALL DISP
MOV A,22H
JZ CASE2
DJNZ R1,LIANG2
MOV R1,#100
MIE2:
MOV P1,#0FFH
MOV R2,22H
MOV R3,22H
LCALL DISP
MOV A,22H
JZ CASE2
DJNZ R1, MIE2
MOV A,50H
CASE2:
CJNE A,#02H,SHANSHUO2
状态4:车辆东西直行,东西向行人通行10s。
子程序:
ZT4: MOV P1,#0AFH ;第四个状态,东西直行;
MOV R2,22H
MOV R3,22H
LCALL DISP ;调用显示子程序。
MOV A,22H
CJNE A,#50H,ZT4
状态5:车辆东西直行、各路右拐,东西向行人通行50s。通行结束前10s闪烁。
子程序:
ZT5: MOV P1,#08DH ;第五个状态,东西直行,各路右拐50s;
MOV R2,22H
MOV R3,22H
LCALL DISP ;调用显示子程序。
MOV A,22H
CJNE A,#10H,ZT5
SHANSHUO3:
MOV P1,#08DH
MOV R1,#100
LIANG3:
MOV R2,22H
MOV R3,22H
LCALL DISP
MOV A,22H
JZ CASE3
DJNZ R1,LIANG3
MOV R1,#100
MIE3:
MOV P1,#0DDH
MOV R2,22H
MOV R3,22H
LCALL DISP
MOV A,22H
JZ CASE3
DJNZ R1,MIE3
MOV A,50H
CASE3:
CJNE A,#03H,SHANSHUO3
状态6: 东西向左拐、各路右拐,行人禁行。通行时间为1分钟。
子程序:
ZT6: MOV P1,#5DH ;第六个状态,东西左拐,各路右拐60s;
MOV R2,22H
MOV R3,22H
LCALL DISP ;调用显示子程序。
MOV A,22H
CJNE A,#10H,ZT6
SHANSHUO4:
MOV P1,#5DH
MOV R1,#100
LIANG4:
MOV R2,22H
MOV R3,22H
LCALL DISP
MOV A,22H
JZ CASE4
DJNZ R1,LIANG4
MOV P1,#0FFH
MOV R1,#100
MIE4:
MOV R2,22H
MOV R3,22H
LCALL DISP
MOV A,22H
JZ CASE4
DJNZ R1,MIE4
MOV A,50H
CASE4:
CJNE A,#00H,SHANSHUO4
5.4紧急状况中断子程序
中断设置为外部中断INTT0。当手动按下开关,进入中断程序,首先将显示程序缓冲口中的数据压入堆栈保护起来,全部红灯亮,计数器停止计数。中断结束后,继续中断前的工作。
INTT0: ;外部中断0
PUSH ACC ;保护显示程序,中断结束后继续显示
MOV A,R2
PUSH ACC
MOV A,R3
PUSH ACC
MOV P1,#0FFH ;全部红灯亮
CLR TR1
JINJI:
MOV R2,22H ;若交道口出现紧急情况,交警可将糸统设置成手动,全路口禁止车辆、行人通行。紧急情况结束后再转成自动状态。
MOV R3,22H
LCALL DISP
JNB P3.2,JINJI
SETB TR1
POP ACC
MOV R3,A
POP ACC
MOV R2,A
POP ACC
RETI
5.5定时/计数子程序
定时器采用T1定时器,定时10ms,循环100次刚好为1s,
TT1: MOV TH1,#0D8H ;定时器1,定时10ms
MOV TL1,#0F0H
DJNZ R6,EXIT
MOV R6,#100 ;定时器定时100次
六、系统调试
6.1仿真调试
本次我们使用Keil uVision4与Proteus 6 professional连接仿真调试,因为整个系统含有很多个子程序,所以调试时把各个子程序分别调试,成功后进行整体调试。在调试过程中发现了一些错误,加了修改。
问题1,在中断服务程序中必须将与主函数中共用的变量进行堆栈,如果不堆栈程序执行结果将无法想象。
问题2,开始直接将22H的内容用来倒计时,做减一的工作,但在调试时发现当它减到0时与闪烁退出程序发生冲突,于是又用了一个寄存器50H,闪烁程序每次与(50H)的值比较判断。
综合仿真调试成功。
6.2 硬件调试
焊接电路完毕后,使用AT89C51最小系统驱动控制。逐步调试了LED灯闪烁电路,数码管倒计时显示电路,紧急情况手动控制电路,各个模块均无问题。但连接整个电路时发现单片机驱动不了,于是在数码管上加传输门实现电流放大。将程序写入烧录器,连接硬件,硬件运行正常,基本达到预计功能。
硬件调试成功。
七、元件清单
元件名称
数量
AT89C51(单片机)
1
RESPACK—8(排阻)
1
7SEG—MPX2—CC(数码管)
4
CAP(0.1UF)(电容)
4
LED_GREEN
16
单控开关
2
按钮(自动复位)
1
RES(0.51K)
16
RES(10K)
1
烧录器
1
底板
1
74LS04
2
八、学习心得
专业知识方面:通过本次课程设计,设为加深了对单片机的理解,并且熟悉了单片机系统的设计流程,收获丰硕,也对以后的单片机学习铺垫了道路。两外,我们学会了Keil uVision4与Proteus 6 professional两个软件,想必在以后的学习单片机编程和仿真中大有裨益。本次设计比较粗糙,基本能满足要求,但是总还是有一些欠缺,比如没有加入红灯而是直接将绿灯灭了就看做红灯,导致在闪烁的时候有异议。如果需更满足需要,则在硬件电路中加入电压比较器,将红灯和绿灯并联在电路中。还有,由于时间紧迫,我们的发挥部分方案,比如超速监测等没有应用到硬件部分。
个人素质方面:经历了这次课程设计,使我们认识了自己在专业课程方面的欠缺和漏洞,比如程序方面,由于平时对Keil uVision4与Proteus 6 professional两个软件不是很熟悉,但为了要先做出仿真电路图,我们用了近两天的时间来熟悉软件、编程调试、修改方案。硬件方面,之前我们没有焊接过电路板,这次我们要从零学起,开始我们要两人配合才能焊接一个灯,后来慢慢熟悉,一个人就可以焊接;中间我们还要多次调试,失败了很多次,但我们从不气馁,一直坚持。实验期间,我们还查阅了大量的资料,向老师和同学求教,使我们意识到不能只停留在书本知识上,要把学到的东西用到实践中去,这样才能学以致用、举一反三。
团队合作方面:经过4天的设计学习,我们觉得个人的能力是有限的,但团队的力量是强大的。我们团结一致,共同克服困难。我们有明确的分工,以提高工作效率;我们制定了严密的工作计划,一定的时间段里完成规定的任务,丝毫不懈怠。在合作实验过程中,很多我看不出的问题,队友却能看出来;一个人想不出的办法,两个人就能想出来,真的应验了“团结力量大”的古话。
九、参考文献
《MCS-51系列单片机系统及其应用》(第二版),高等教育出版社
百度百科
新浪爱问
附件1:
软件程序:
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INTT0
ORG 001BH
LJMP TT1
ORG 0100H
TT1: MOV TH1,#0D8H ;定时器1,定时10ms
MOV TL1,#0F0H
DJNZ R6,EXIT
MOV R6,#100 ;定时器定时100次
PUSH ACC
MOV A,22H
JNZ WANG
INC 50H
MOV A,50H
CJNE A,#04H,WANG
MOV 50H,#00H
WANG: MOV A,22H
JNZ JIANYI
MOV A,#60H
JIANYI: ;显示计数器减一;
ADD A,#99H
DA A
MOV 22H,A
POP ACC
EXIT: RETI
INTT0: ;外部中断0
PUSH ACC ;保护显示程序,中断结束后继续显示
MOV A,R2
PUSH ACC
MOV A,R3
PUSH ACC
MOV P1,#0FFH ;全部红灯亮
CLR TR1
JINJI:
MOV R2,22H;若交道口出现紧急情况,交警可将糸统设置成手动:全路口禁止车辆、行人通行。紧急情况结束后再转成自动状态。
MOV R3,22H
LCALL DISP
JNB P3.2,JINJI
SETB TR1
POP ACC
MOV R3,A
POP ACC
MOV R2,A
POP ACC
RETI
ORG 1000H
MAIN: MOV R6,#100 ;主程序;
SETB EX0
CLR IT0
MOV 50H,#00H
MOV TMOD,#10H ;初始化
MOV TH1,#0D8H
MOV TL1,#0F0H
MOV IE,#8DH
MOV 22H,#60H ;60s;
SETB TR1
ZT1: MOV P1,#0FAH ;第一个状态,南北直行,行人通行;
MOV R2,22H
MOV R3,22H
LCALL DISP ;调用显示子程序。
MOV A,22H
CJNE A,#50H,ZT1
ZT2: MOV P1,#0D8H ;第二个状态,南北直行,各路右拐50s;
MOV R2,22H
MOV R3,22H
LCALL DISP ;调用显示子程序。
MOV A,22H
CJNE A,#10H,ZT2
SHANSHUO1:
MOV P1,#0D8H
MOV R1,#100
LIANG1:
MOV R2,22H
MOV R3,22H
LCALL DISP
MOV A,22H
JZ CASE1
DJNZ R1, LIANG1
MOV R1,#100
MIE1:
MOV P1,#0DDH ;闪烁灭
MOV R2,22H
MOV R3,22H
LCALL DISP
MOV A,22H
JZ CASE1
DJNZ R1,MIE1
MOV A,50H
CASE1:
CJNE A,#01H,SHANSHUO1 ;闪烁10s结束
ZT3: MOV P1,#0D5H ;第三个状态,南北左拐,各路右拐60s;
MOV R2,22H
MOV R3,22H
LCALL DISP ;调用显示子程序。
MOV A,22H
CJNE A,#10H,ZT3
SHANSHUO2:
MOV P1,#0D5H
MOV R1,#100
LIANG2:
MOV R2,22H
MOV R3,22H
LCALL DISP
MOV A,22H
JZ CASE2
DJNZ R1,LIANG2
MOV R1,#100
MIE2:
MOV P1,#0FFH
MOV R2,22H
MOV R3,22H
LCALL DISP
MOV A,22H
JZ CASE2
DJNZ R1, MIE2
MOV A,50H
CASE2:
CJNE A,#02H,SHANSHUO2
ZT4: MOV P1,#0AFH ;第四个状态,东西直行;
MOV R2,22H
MOV R3,22H
LCALL DISP ;调用显示子程序。
MOV A,22H
CJNE A,#50H,ZT4
ZT5: MOV P1,#08DH ;第五个状态,东西直行,各路右拐50s;
MOV R2,22H
MOV R3,22H
LCALL DISP ;调用显示子程序。
MOV A,22H
CJNE A,#10H,ZT5
SHANSHUO3:
MOV P1,#08DH
MOV R1,#100
LIANG3:
MOV R2,22H
MOV R3,22H
LCALL DISP
MOV A,22H
JZ CASE3
DJNZ R1,LIANG3
MOV R1,#100
MIE3:
MOV P1,#0DDH
MOV R2,22H
MOV R3,22H
LCALL DISP
MOV A,22H
JZ CASE3
DJNZ R1,MIE3
MOV A,50H
CASE3: CJNE A,#03H,SHANSHUO3
ZT6: MOV P1,#5DH ;第六个状态,东西左拐,各路右拐60s;
MOV R2,22H
MOV R3,22H
LCALL DISP ;调用显示子程序。
MOV A,22H
CJNE A,#10H,ZT6
展开阅读全文