信息与电气工程学院
1403计算机(CDIO)
基于单片机交通灯设计
项目
(2015 /2016 学年第 二 学期)
软件总体设计
姓名: ......
学号: ………….
成绩:
2016年6月
目录
1 课程设计目的 1
2 设计任务与要求 1
3 软件总体设计 2
3.1系统软件设计的分析 2
3.2 软件设计 3
3.3 程序流程图 4
3.4 程序清单 5
4 项目设计心得与体会 7
参考文献 7
附录(源代码): 8
1 项目设计目的
目的1:加深对单片机课程的全面认识和掌握,对单片机课程的应用做进一步的了解。
目的2:掌握串口进行数据传输的应用。
目的3:通过此次项目设计将单片机软硬件结合起来对程序进行编辑,校验,锻炼实践能力和理论联系实际的能力。
目的4:锻炼团队分工合作与协调能力,通过自学和探讨的方式解决实际问题的能力。
2 项目设计任务与要求
任务:设计一个能够控制十二盏交通信号灯的模拟系统。包括:硬件电路及控制软件。
要求:
(1)系统工作受开关控制,开关ON,则系统工作;开关OFF,则系统停止工作。
(2)控制对象:
东西方向红灯两个,南北方向红灯两个;
东西方向黄灯两个,南北方向黄灯两个;
东西方向绿灯两个,南北方向绿灯两个。
由控制对象组成视图如下图1-1
图1-1 控制对象组成视图
要求:十字路口东西方向和南北方向各装有直行(包括右拐弯)控制红、黄、绿交通信号灯。还有时间显示器,显示器用于显示相应方向直行控制当前点亮信号灯还要持续的时间(即剩余时间)。系统中有两个按钮-启动和停止,启动按钮按下后信号灯系统开始工作,并周而复始地循环;停止按钮按下,所有信号灯都熄灭。信号灯的控制规律如表1-1所示。即系统启动后,东西方向先绿灯亮25s,然后绿灯闪烁3s,最后黄灯亮2s,与此同时南北方向红灯亮30s。南北方向红灯亮30s后转为先绿灯亮25s,然后绿灯闪烁3s,最后黄灯亮2s,东西向红灯亮30s。由此周而复始地循环。要求采用单片机实现交通灯的控制规律。
3 软件总体设计
3.1系统软件设计的分析
主程序采用查询方式定时,调用0.5S延时子程序的次数,从而获取交通灯的各种时间。子程序采用定时器1方式1查询式定时,定时器定时100ms,确定100ms循环10次,从而获得1S的延时时间。
有车车道的放行的中断服务程序首先要保护现场,因而需用到延时子程序,子程序采用定时器0方式1查询式定时,定时器定时100ms,确定100ms循环10次,从而获得1S的延时时间,保护现场时还需关中断,以防止高优先级中断(紧急车辆通过所产生的中断)出现导致程序混乱。
开中断,由软件查询外中断1,判别哪一道有车,再根据查询情况执行相应的服务。待交通灯信号出现后,保持10S的延时,然后,关中断,恢复现场,再开中断返回主程序。
3.2 软件设计
表1-1 信号灯的控制规律
东西方向
信号
绿灯亮
绿灯闪烁
黄灯亮
红灯亮
时间
25s
3s
2s
30s
南北方向
信号
红灯亮
绿灯亮
绿灯闪烁
黄灯亮
时间
30s
25s
3s
2s
3.3 程序流程图
图1-2 程序流程图
3.4 程序清单
(1)倒计时程序:倒计时程序采用的是两个循环嵌套,大循环控制十位显示,小循环控制个位显示。当倒计时完成为零时,程序继续返回初始化并执行。具体代码如下:
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
MOV P0,#00H
SETB P2.6 ;P2.6高电平
SETB P2.7 ;P2.7高电平
MOV R0,#09H ;存放个位
MOV R1,#05H ;存放十位
MOV R2,#888
MOV R3,#0AH ;初始个位控制字,最大可以到几,此处设为10-1。
MOV R4,#06H ;十位控制字,最大可以到几,此处设为10-1。
MOV DPTR,#TABLE
L0:
MOV A,R0 ;将r0中存放的个位数给A
MOVC A,@A+DPTR ;查表
MOV P2,#040H ;p2.7(个位)高电平,其他低;
MOV P0,A ;将a中的数组送至p0口显示
ACALL DELAY
MOV A,R1 ;将R1中存放的十位数给A
MOVC A,@A+DPTR
MOV P2,#80H ;P2.6(十位)高电位,其他低;
MOV P0,A ;A中的数据送至P0口显示
ACALL DELAY
DJNZ R2,L0 ;R2-1不为零时跳转到L0,否则继续执行。
DEC R0 ;R0减一
MOV R2,#888
DJNZ R3,L0 ;R3-1不为零时跳转到L0,否则继续执行。
MOV R0,#09H ;将个位重置为9;
MOV R3,#0AH
DEC R1 ;R1减一
DJNZ R4,L0 ;R4-1不为零时跳转到L0,否则继续执行。
AJMP MAIN
DELAY: ;误差 -0.868055555556us
MOV R6,#0FBH
DL0:
MOV R5,#04H
DJNZ R5,$
DJNZ R6,DL0
RET
TABLE: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H
END
(2)按键程序:当按键按下时对应的口为低电位,程序判断对应的端口是不是低电位,如果是低电位的话,就执行相应的程序模块。代码如下:
KEY1:
JNB P2.0,DIS_S1
JNB P2.1, DIS_S2
JNB P2.2, DIS_S3 ;;;查询是否第一个按键按下
AJMP DIS_R1 ;;;没有键按下则返回
DIS_S1:LCALL D5MS1 ;;;按键去抖
JNB P2.0,DIS_SN1
AJMP DIS_R1
DIS_SN1: ACALL MAIN
AJMP DIS_R1
RET
D5MS1: MOV R7,#5
DIS_R1: RET
4 项目设计心得与体会
(1)、在编写软件中,在此过程中我更为熟练得掌握汇编语言各种指令的使用方法,掌握了keil软件的使用。
(2)、在程序的编写和开发过程中,让我认识到了底层硬件的复杂。让我对计算机产生了一种敬意。调试程序过程中遇到了很多很多的问题,比如端口不对应,低电平和高电平弄反了等等一些错误。其中也有一些儿难题,但是在我们组的共同努力下,解决了难题,这说明了团队协作的重要性。
(3)、通过这次项目设计,我们掌握了用单片机设计交通灯的基体方法,增强了我们寻找问题,解决问题的能力。培养了我们的设计思维,此次项目设计的成功不仅帮助我们更好地掌握
本知识,尤其重要的是培养了我们独立思考的能力。
总之,这次的项目设计让我受益匪浅。深刻的明白了在项目设计中如何能够不断的发现问题并改善问题,如何能够更好的提高团队与自身的工作效率,如何能够更好地完善现有的工作流程、工作方式及配合协调各成员的工作,这些都是我在今后的工作中需要加倍努力及奋斗的目标!这次的课程设计让我受益匪浅。深深认识到,要学好一门学科,没有刻苦钻研的精神是不行的,只有在不断的尝试中,经历失败,从失败中
经验,然后再不断的尝试,才能获得成功,。
最后还要感谢我们小组成员,感谢我们的吴老师,在我们的团结协作,共同努力,在老师的精心指导下,我们才能顺利完成本次课设。
参考文献
[1]张毅刚,彭喜元,彭宇.单片机原理及应用,高等教育出版社,2010。
[2]康华光.电子技术基础 模拟部分(第五版),高等教育出版社,2009。
附录(源代码):
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
MOV P0,#00H
SETB P3.2
SETB P3.3
MOV p3,#0FFH
MOV R0,#00H ;存放个位
MOV R1,#03H ;存放十位
MOV R2,#1220
MOV R3,#01H ;初始个位控制字,最大可以到几,此处设为10-1。
MOV R4,#04H ;十位控制字,最大可以到几,此处设为3-1。
;MOV R8,#00H
MOV DPTR,#TABLE
ACALL STAGE
RET
;30秒倒计时;
STAGE:
MOV P2,#0FFH
SETB P3.6
SETB P3.7
L0:
CLR P2.4
CLR P2.7
MOV A,R0 ;将r0中存放的个位数给A
MOVC A,@A+DPTR ;查表
MOV P3,#0D7H ;p3.3/3.5(个位)低电平;
;MOV P2,#040H
MOV P1,A ;将a中的数组送至p1口显示(南北)
MOV P0,A ;将a中的数组送至p0口显示(东西)
ACALL DELAY
MOV A,R1 ;将R1中存放的十位数给A
MOVC A,@A+DPTR
MOV P3,#0EBH ;P3.2/3.4(十位)低电平;
;MOV P2,#80H
MOV P1,A ;A中的数据送至P1口显示(南北)
MOV P0,A ;A中的数据送至P1口显示(东西)
ACALL DELAY
DJNZ R2,L0 ;R2-1不为零时跳转到L0,否则继续执行。
DEC R0 ;R0减一
MOV R2,#1220
MOV A,R1
XRL A,#00H
JZ TEST
L0_A: DJNZ R3,L0 ;R3-1不为零时跳转到L0,否则继续执行。
MOV R0,#09H ;将个位重置为9;
MOV R3,#0AH
DEC R1 ;R1减一
DJNZ R4,L0 ;R4-1不为零时跳转到L0,否则继续执行。
RET
TEST:
MOV A,R0
XRL A,#03H
JZ TEST2
ACALL L0_A
TEST2:
MOV P2,#0FFH
SETB P3.6
SETB P3.7
CLR P2.5
CLR P3.6
MOV R2,#1220
TEST23: MOV A,#03H ;将r0中存放的个位数给A
MOVC A,@A+DPTR ;查表
MOV P3,#097H ;p3.3/3.5/3.6(个位)低电平;
;MOV P2,#040H
MOV P1,A ;将a中的数组送至p1口显示(南北)
MOV P0,A ;将a中的数组送至p0口显示(东西)
ACALL DELAY
MOV A,#00H ;将R1中存放的十位数给A
MOVC A,@A+DPTR
MOV P3,#0ABH ;P3.2/3.4/3.6(十位)低电平;
;MOV P2,#80H
MOV P1,A ;A中的数据送至P1口显示(南北)
MOV P0,A ;A中的数据送至P1口显示(东西)
DJNZ R2,TEST23;R2-1不为零时跳转到L0,否则继续执行。
MOV R2,#1220
SETB P2.5
SETB P3.6
TEST22: MOV A,#02H ;将r0中存放的个位数给A
MOVC A,@A+DPTR ;查表
MOV P3,#0D7H ;p3.3/3.5(个位)低电平;
;MOV P2,#040H
MOV P1,A ;将a中的数组送至p1口显示(南北)
MOV P0,A ;将a中的数组送至p0口显示(东西)
ACALL DELAY
MOV A,#00H ;将R1中存放的十位数给A
MOVC A,@A+DPTR
MOV P3,#0EBH ;P3.2/3.4(十位)低电平;
;MOV P2,#80H
MOV P1,A ;A中的数据送至P1口显示(南北)
MOV P0,A ;A中的数据送至P1口显示(东西)
DJNZ R2,TEST22;R2-1不为零时跳转到L0,否则继续执行。
CLR P2.5
CLR P3.6
MOV R2,#1220
TEST21: MOV A,#01H ;将r0中存放的个位数给A
MOVC A,@A+DPTR ;查表
MOV P3,#097H ;p3.3/3.5/3.6(个位)低电平;
;MOV P2,#040H
MOV P1,A ;将a中的数组送至p1口显示(南北)
MOV P0,A ;将a中的数组送至p0口显示(东西)
ACALL DELAY
MOV A,#00H ;将R1中存放的十位数给A
MOVC A,@A+DPTR
MOV P3,#0ABH ;P3.2/3.4/3.6(十位)低电平;
;MOV P2,#80H
MOV P1,A ;A中的数据送至P1口显示(南北)
MOV P0,A ;A中的数据送至P1口显示(东西)
DJNZ R2,TEST21;R2-1不为零时跳转到L0,否则继续执行。
MOV R2,#1220
SETB P2.5
SETB P3.6
TEST20: MOV A,#00H ;将r0中存放的个位数给A
MOVC A,@A+DPTR ;查表
MOV P3,#0D7H ;p3.3/3.5(个位)低电平;
;MOV P2,#040H
MOV P1,A ;将a中的数组送至p1口显示(南北)
MOV P0,A ;将a中的数组送至p0口显示(东西)
ACALL DELAY
MOV A,#00H ;将R1中存放的十位数给A
MOVC A,@A+DPTR
MOV P3,#0EBH ;P3.2/3.4(十位)低电平;
;MOV P2,#80H
MOV P1,A ;A中的数据送至P1口显示(南北)
MOV P0,A ;A中的数据送至P1口显示(东西)
DJNZ R2,TEST20;R2-1不为零时跳转到L0,否则继续执行。
ACALL STAGE2
STAGE2:
MOV P0,#00H
SETB P3.2
SETB P3.3
mov p3,#0FFH
MOV R0,#00H ;存放个位
MOV R1,#03H ;存放十位
MOV R2,#1220
MOV R3,#01H ;初始个位控制字,最大可以到几,此处设为10-1。
MOV R4,#04H ;十位控制字,最大可以到几,此处设为3-1。
;MOV R8,#00H
MOV P2,#0FFH
SETB P3.6
SETB P3.7
CLR P2.6
CLR P3.7
L20:
;;//////////南北方向
MOV A,R0 ;将r0中存放的个位数给A
MOVC A,@A+DPTR ;查表
MOV P3,#057H ;p3.3/3.5(个位)低电平;
;MOV P2,#040H
MOV P1,A ;将a中的数组送至p1口显示(南北)
MOV P0,A ;将a中的数组送至p0口显示(东西)
ACALL DELAY
MOV A,R1 ;将R1中存放的十位数给A
MOVC A,@A+DPTR
MOV P3,#06BH ;P3.2/3.4(十位)低电平;
CLR P3.7
;MOV P2,#80H
MOV P1,A ;A中的数据送至P1口显示(南北)
MOV P0,A ;A中的数据送至P1口显示(东西)
ACALL DELAY
DJNZ R2,L20 ;R2-1不为零时跳转到L20,否则继续执行。
DEC R0 ;R0减一
MOV R2,#1220
MOV A,R1
XRL A,#00H
JZ TEST_L2
L20_A: DJNZ R3,L20 ;R3-1不为零时跳转到L20,否则继续执行。
MOV R0,#09H ;将个位重置为9;
MOV R3,#0AH
DEC R1 ;R1减一
DJNZ R4,L20 ;R4-1不为零时跳转到L20,否则继续执行。
RET
TEST_L2:
MOV A,R0
XRL A,#03H
JZ TEST_L2_2
ACALL L20_A
TEST_L2_2:
MOV P2,#0FFH
SETB P3.6
SETB P3.7
CLR P2.5
CLR P3.6
MOV R2,#1220
TEST_L2_23: MOV A,#03H ;将r0中存放的个位数给A
MOVC A,@A+DPTR ;查表
MOV P3,#097H ;p3.3/3.5/3.6(个位)低电平;
;MOV P2,#040H
MOV P1,A ;将a中的数组送至p1口显示(南北)
MOV P0,A ;将a中的数组送至p0口显示(东西)
ACALL DELAY
MOV A,#00H ;将R1中存放的十位数给A
MOVC A,@A+DPTR
MOV P3,#0ABH ;P3.2/3.4/3.6(十位)低电平;
;MOV P2,#80H
MOV P1,A ;A中的数据送至P1口显示(南北)
MOV P0,A ;A中的数据送至P1口显示(东西)
DJNZ R2,TEST_L2_23;R2-1不为零时跳转到L0,否则继续执行。
MOV R2,#1220
SETB P2.5
SETB P3.6
TEST_L2_22: MOV A,#02H ;将r0中存放的个位数给A
MOVC A,@A+DPTR ;查表
MOV P3,#0D7H ;p3.3/3.5(个位)低电平;
;MOV P2,#040H
MOV P1,A ;将a中的数组送至p1口显示(南北)
MOV P0,A ;将a中的数组送至p0口显示(东西)
ACALL DELAY
MOV A,#00H ;将R1中存放的十位数给A
MOVC A,@A+DPTR
MOV P3,#0EBH ;P3.2/3.4(十位)低电平;
;MOV P2,#80H
MOV P1,A ;A中的数据送至P1口显示(南北)
MOV P0,A ;A中的数据送至P1口显示(东西)
DJNZ R2,TEST_L2_22;R2-1不为零时跳转到L0,否则继续执行。
CLR P2.5
CLR P3.6
MOV R2,#1220
TEST_L2_21: MOV A,#01H ;将r0中存放的个位数给A
MOVC A,@A+DPTR ;查表
MOV P3,#097H ;p3.3/3.5/3.6(个位)低电平;
;MOV P2,#040H
MOV P1,A ;将a中的数组送至p1口显示(南北)
MOV P0,A ;将a中的数组送至p0口显示(东西)
ACALL DELAY
MOV A,#00H ;将R1中存放的十位数给A
MOVC A,@A+DPTR
MOV P3,#0ABH ;P3.2/3.4/3.6(十位)低电平;
;MOV P2,#80H
MOV P1,A ;A中的数据送至P1口显示(南北)
MOV P0,A ;A中的数据送至P1口显示(东西)
DJNZ R2,TEST_L2_21;R2-1不为零时跳转到L0,否则继续执行。
MOV R2,#1220
SETB P2.5
SETB P3.6
TEST_L2_20: MOV A,#00H ;将r0中存放的个位数给A
MOVC A,@A+DPTR ;查表
MOV P3,#0D7H ;p3.3/3.5(个位)低电平;
;MOV P2,#040H
MOV P1,A ;将a中的数组送至p1口显示(南北)
MOV P0,A ;将a中的数组送至p0口显示(东西)
ACALL DELAY
MOV A,#00H ;将R1中存放的十位数给A
MOVC A,@A+DPTR
MOV P3,#0EBH ;P3.2/3.4(十位)低电平;
;MOV P2,#80H
MOV P1,A ;A中的数据送至P1口显示(南北)
MOV P0,A ;A中的数据送至P1口显示(东西)
DJNZ R2,TEST_L2_20;R2-1不为零时跳转到L0,否则继续执行。
ACALL MAIN
DELAY: ;误差 -0.868055555556us
ACALL KEY1
MOV R6,#0FBH
DL0:
MOV R5,#04H
DJNZ R5,$
DJNZ R6,DL0
RET
DELAY_NK: ;误差 -0.868055555556us
;ACALL KEY1
MOV R6,#0FBH
DL0_NK:
MOV R5,#04H
DJNZ R5,$
DJNZ R6,DL0
RET
TABLE: DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H
KEY1:
JNB P2.0,DIS_S1
JNB P2.1, DIS_S2
JNB P2.2, DIS_S3 ;;;查询是否第一个按键按下
AJMP DIS_R1 ;;;没有键按下则返回
DIS_S1:LCALL D5MS1 ;;;按键去抖
JNB P2.0,DIS_SN1
AJMP DIS_R1
DIS_SN1: ACALL MAIN
AJMP DIS_R1
RET
D5MS1: MOV R7,#5
DIS_R1: RET
;------------------------------------
KEY2:
JNB P2.1,DIS_S2 ;;;查询是否第一个按键按下
AJMP DIS_R2 ;;;没有键按下则返回
DIS_S2:LCALL D5MS2 ;;;按键去抖
JNB P2.1,DIS_SN2
AJMP DIS_R2
DIS_SN2: ACALL STAGE2
AJMP DIS_R2
RET
D5MS2: MOV R7,#5
DIS_R2: RET
;------------------------------------
KEY3:
JNB P2.2,DIS_S3 ;;;查询是否第一个按键按下
AJMP DIS_R3 ;;;没有键按下则返回
DIS_S3:LCALL D5MS3 ;;;按键去抖
JNB P2.2,DIS_SN3
AJMP DIS_R3
DIS_SN3: ACALL STAGE3
AJMP DIS_R3
RET
D5MS3: MOV R7,#5
DIS_R3: RET
STAGE3:
MOV P0,#0FFH
MOV P1,#0FFH
SETB P2.4
SETB P2.5
SETB P2.6
SETB P2.7
SETB P3.6
SETB P3.7
CLR P2.6
CLR P2.7
MOV R2,#1220
STAGE3_L:
ACALL DELAY_NK
DJNZ R2,STAGE3_L
ACALL DELAY
ACALL STAGE3
END
项目设计
评 语
项目设计
成 绩
指导教师
(签字)
年 月 日