单片机课程设计(十字路口交通灯)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、题目及要求
题目:设计一个十字路口交通灯控制系统。

要求:1、观察一个装有交通灯的十字路口,根据东西南北方向红黄绿灯的变化规律画出运行时序图;
2、设置开关S1、S2,分别开启和关闭整个系统;
3、红黄绿灯用LED小灯表示,同时伴有数码管显示倒数;
4、黄灯倒数时,伴随有提示音(用蜂鸣器);
二、任务及目的
首先根据课程设计所要求完成的功能确定系统的总体设计方案,接着进行相应的软件程序编制和硬件系统设计,然后在硬件电路和软件程序的相互配合下完成系统的仿真与调试,通过调试发现系统硬件与软件存在的问题,解决问题直至完全调试成功。

通过本次单片机课程设计掌握课堂学习的理论知识,掌握基本实践技能,并能进行一定的综合应用和探索。

通过课程设计,掌握分析问题、解决问题的方法,培养较强的动手能力和一定的单片机应用系统的设计和调试能力。

通过本次课程设计,学习与掌握单片机的定时、中断、键盘接口、动态显示数码管等电路的原理与使用方法。

同时培养团队合作能力,并能根据自己的实际情况取长补短。

三、思路及原理
1、设计思路:假设十字路口东西方向的车流量大于南北方向的车流量,两个方向的通行时间不同,即东西方向通行时,东西方向绿灯亮15s,然后黄灯亮5s ——南北方向红灯亮20s;之后南北方向绿灯亮10s,黄灯亮5s ——东西方向红灯亮15s 。

然后依此循环。

黄灯倒数时,发出警告音,用以提示行人注意安全。

用两个开关分别开启和关闭系统。

各灯亮灭时序图如下:
2、工作原理:此为单片机的模拟交通灯设计,系统以A T89C51芯片为核心,在硬件方面,除了CPU外,使用四个七段LED数码管显示,数码管采用的是动态扫描显示。

通过调试能够较准确显示倒数秒数。

两个简单的按键实现系统的开启与关闭。

软件方面采用C51单片机汇编语言编程。

晶振频率选12MHz。

关于本次设计的数字钟中的动态显示驱动电路:数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是哪个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的位选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。

通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。

在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感。

(1)试验箱中为共阴极数码管。

本设计将单片机的P0口连接数码管的位码,通过P0.0、P0.1、P0.4、P0.5选中四位数码管,反别显示南北方向倒计时的十位、个位,东西方向的十位、个位。

将单片机的P2口连接数码管的断码,通过事先设置的显示代码的顺序及各个位不同的延时向各位送去不同的显示。

(2)按键防抖原理:
(3)蜂鸣器原理:
声音是由振动产生的。

本设计通过定时器T1产生周期为250us的方波(采用方式0),从P1.6输出,连接到蜂鸣器,蜂鸣器发出“啪”声,在主程序中适时调用定时器子程序,使蜂鸣器在黄灯闪烁的时候发声。

四、电路图
五、程序流程图
六、程序调试
调试程序采用Keil uVision4,首先启动keil软件的集成开发环境,点击“Project —>New Project”建立新的工程,选择AT89C51作为目标芯片。

建立新的源文件,将程序输入并将源文件添加到工程中。

将C51单片机仿真器与综合试验箱相接,并按照电路图正确连好电路。

编译程序并改正程序中的错误,当程序没错误后点击“Debug—> Start/Stop Debug ”进入程序动态调试状态,按run键进行仿真,按要求按下启动系统键,观察实验
现象,验证程序是否正确执行。

若现象不正常则检查电路连接是否有误,若无误则修改源程序,重新调试。

七、遇到的问题及解决方法
1、在确定设计的大体功能时,希望可以随开随关,要达到在任何时候都能做出响应的目的,就想到了中断。

想要中断响应后使系统开或关,就设置标志位。

2、最困难的是将分工实现的不同功能填入主程序的过程。

虽然在各自调试后,各个功能可以分别实现,但是用想当然的方法作为子程序,利用调子加入主程序后,很难一步就能实现。

我们就将小程序的一个小部分拿出来,放入主程序,屏蔽掉不需要的部分,来进行调试。

等一小部分可以成功之后,再将类似的部分添入并进行调试。

进行加入的时候,光想是没有用的,一定要写下并调试,分步分析,才能找到问题并解决。

八、源程序
START BIT 00H ;S1键按下置位,S2键松开时清0
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP INTRP ;进入判断S1是否真正按下
ORG 0013H
AJMP EXIT ;进入判断S2是否真正按下
ORG 0100H
MAIN: MOV P1,#0FFH ;P1口输出0,灯均不亮
SETB EX0 ;允许外0中断
SETB IT0 ;允许中断0为边沿触发方式
SETB EX1 ;允许外1中断
SETB IT1 ;允许中断1为边沿触发方式
SETB EA ;中断开放
CLR START ;清START标志位
MAIN1: MOV 55H,#15
MOV R0,#00H ;设初值供TAB1查询使用
MOV R7,#20
MOV R4,#00H ;设初值供TAB2查询使用
MOV R5,#0FH
MOV R6,#50
LOOP: MOV P0,#00H
JNB START ,$ ;START=0 时等待
MOV P1 ,#33H ;选LED东西绿灯、南北红灯亮位置
L4: LCALL WEIMA
DJNZ R6,L4 ;循环1s
INC R0
INC R7
INC R4
INC R5
MOV R6,#50
DJNZ 55H,L4
MOV R0,#06H ;再次设初值供TAB1查询使用MOV R7,#0FH
MOV R4,#06H ;再次设初值供TAB2查询使用MOV R5,#0FH
MOV 58H,#05H
MOV P1 ,#35H ;选东西黄灯、南北红灯亮位置
L4_0: LCALL WEIMA
CJNE R6,#25,L4_2
SETB P1.1
L4_2: CJNE R6,#01H,L4_1
CLR P1.1
L4_1: DJNZ R6,L4_0
ACALL VOICE ;声音伴随
INC R0
INC R7
INC R4
INC R5
MOV R6,#50
DJNZ 58H,L4_0
MOV P1,#1EH ;东西红灯、南北绿灯亮10s
L5_0: MOV R0,#0AH
MOV R7,#20
MOV R4,#00H
MOV R5,#15
MOV 56H,#10
L5: LCALL WEIMA
DJNZ R6,L5
INC R0
INC R7
INC R4
INC R5
MOV R6,#50
DJNZ 56H,L5
MOV 90H ,#2EH ;东西红灯、南北黄灯亮5s MOV R0,#0BH
MOV R7,#25
MOV R4,#06H
MOV R5,#15
MOV 57H,#5
L6: LCALL WEIMA
CJNE R6,#25,L6_2
SETB P1.4
L6_2: CJNE R6,#01H,L6_1
CLR P1.4
L6_1: DJNZ R6,L6
LCALL VOICE
INC R0
INC R7
INC R4
INC R5
MOV R6,#50
DJNZ 57H,L6
AJMP MAIN1 ;交通灯无限循环
DELAY0_5: MOV R1, #5 ;延时0.5s
LOOP3: MOV R2, #200
LOOP4: MOV R3, #248
DJNZ R3, $
DJNZ R2, LOOP4
DJNZ R1, LOOP3
RET
INTRP: ACALL K_CLOSE
JNZ LK1 ;有键按下则去延时
ACALL DELAY
AJMP INTRP
LK1: ACALL DELAY
ACALL DELAY
ACALL K_CLOSE
JNZ BEGIN ;真正有键按下则置位
ACALL DELAY
AJMP INTRP
BEGIN: SETB START ;S1键按下时,置位START RETI
EXIT: ACALL K_CLOSE1
JNZ LK2 ;有键按下则去延时
ACALL DELAY
AJMP EXIT
LK2: ACALL DELAY
ACALL DELAY
ACALL K_CLOSE1
JNZ BEGIN1 ;真正有键按下则置位
ACALL DELAY
AJMP EXIT
BEGIN1: MOV P1, #0FFH ;S1键按下时,所有灯灭 CLR START ;START清0
POP 70H
POP 70H
MOV DPTR, #MAIN1 ;MAIN1地址压栈
PUSH DPL ;中断强制返回至MAIN1处 PUSH DPH
RETI
VOICE: MOV TMOD,#00H ;产生方波(定时器方式0) MOV TH1,#0FCH
MOV TL1,#03H
SETB TR1 ;启动定时器1
LP: JBC TF1,LL ;计数溢出
AJMP LP
LL: MOV TH1,#0FCH ;重新置初值
MOV TL1,#03H
CPL P1.6
RET
K_CLOSE: MOV DPH ,#00H
MOV DPL ,#03H
MOVX A, @DPTR
RET
K_CLOSE1: MOV DPH ,#00H
MOV DPL ,#13H
MOVX A, @DPTR
RET
DELAY: MOV R1, #1 ;延时5ms
LOOP6: MOV R2, #20
LOOP7: MOV R3, #124
DJNZ R3, $
DJNZ R2, LOOP7
DJNZ R1, LOOP6
RET
WEIMA: MOV P0,#20H ;选位码左边的十位 MOV A,R0
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV P2,A ;输出显示
LCALL DELAY
MOV P0,#10H ;选位码左边的个位 MOV A,R7
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV P2,A ;输出显示
LCALL DELAY
MOV P0,#02H ;选位码右边的十位 MOV A,R4
MOV DPTR,#TAB2
MOVC A,@A+DPTR
MOV P2,A ;输出显示
LCALL DELAY
MOV P0,#01H ;选位码右边的个位
MOV A,R5
MOV DPTR,#TAB2
MOVC A,@A+DPTR
MOV P2,A ;输出显示
LCALL DELAY
RET
TAB1:DB 5BH,06H,06H,06H,06H,06H,06H,06H,06H,06H
DB 06H,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH
DB 3FH,6FH,7FH,07H,7DH,6DH,66H,4FH,5BH,06H
DB 3FH,6FH,7FH,07H,7DH,6DH,66H,4FH,5BH,06H
TAB2:DB 06H,06H,06H,06H,06H,06H,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH,3FH DB 6DH,66H,4FH,5BH,06H,3FH,6FH,7FH,07H,7DH,6DH,66H,4FH,5BH,06H
END。

相关文档
最新文档