一、设计题目 ----------------------------------------------------2
二、课程设计的性质和目的 ------------------------------------2
三、设计任务 ----------------------------------------------------2
四、方案选择比较及方案方框图--------------------------------2
五、元件清单 ----------------------------------------------------4
六、硬件电路图 --------------------------------------------------4
1、单片机主电路 --------------------------------------------------4
2、交通灯二极管点亮电路 ------------------------------------------5
3、交通灯数码管显示电路-------------------------------------------5
七、软件设计 ----------------------------------------------------6
1、程序流程图 ----------------------------------------------------6
2、各功能模块程序清单 --------------------------------------------8
八、设计心得 ----------------------------------------------------11
九、整体电路原理图 ----------------------------------------------12
十、附:主程序 --------------------------------------------------13
参考文献 ----------------------------------------------------------20
一、设计题目:交通灯模拟控制系统
二、课程设计的性质和目的
本课程设计的主要目的是通过对电子技术及单片机原理的学习,综合掌握电子电路综合设计的过程,设计要求和具体的设计方法。通过设计更好的复习、理解模拟电子、数字电子和单片机灯课程内容,使得理论和实际相结合,加强学生的动手能力以及查阅相关资料解决实际问题的能力,培养学生从事设计工作的整体概念。
三、设计任务
1、完成交通灯的变化规律,即一个十字路口为东西向和南北向,四个路口均有红黄绿三灯和两个LED数码显示管。交通灯上电以后进入初始状态即东西红灯,南北红灯。5s后转状态1:南北绿灯亮通车,东西红灯亮,禁止通行,持续30s;30s后转状态2:南北绿灯灭转黄灯闪亮,延时5秒,东西仍然红灯;5s后转状态3:东西绿灯亮通车,南北转红灯,持续30s;30s后转状态4:东西绿灯灭转亮黄闪灯,延时5秒,南北仍然红灯。最后循环至状态1。
2、用8个LED数码管(各个方向均有两个LED数码管,分别表示个位是和十位)显示倒计时。倒计时用于提醒驾驶员或行人信号灯发生改变的时间,以便他们在“停止”和“通行”两者作出合适的选择。
3、在紧急状态下,通过K1键手动设置,将所有路口的灯变为红灯。
四、方案选择比较及方案方框图
利用单片机模拟交通灯控制系统是单片机中较为经典的设计,其设计方案、种类及使用语言多种多样。本设计中用红绿黄灯表示禁行,通行和等待的信号发生。利用数码管倒计数显示间隔。利用键盘控制来处理紧急情况。编程语言使用的是汇编语言。
首先在单片机类型的选择上,单片机自20世纪70年代问世以来,发展迅速,各种类型的单片机层出不穷。经过比较及仿真软件的使用范围,我选择了Atmel公司的ATC51单片机。然后为其添加了单片机外围电路,包括复位电路,晶振电路。晶振选择了6MHz的频率,晶振电路的作用是产生单片机工作所需要的时钟脉冲序列。然后就是本设计的三大重要模块,包括紧急按键电路,交通灯二极管点亮电路,交通灯数码管倒计时显示电路。
紧急按键电路中使用的按键是闸刀式,相比按键式键盘在中断处理过程中,处理程序简单,易于操作。此电路接入了外部中断0,使用中断方式,减少CPU工作量,程序设计简单。
交通灯二极管点亮电路使用了外接上拉电阻的方式,要实现对四个方向三种颜色的灯光控制,可选用12只单色LED发光二极管作为交通灯,因为东西南北方向发光二极管的显示状态总是保持一致,因此可使南北方向红灯与红灯,黄灯与黄灯,绿灯与绿灯相串联的方式,东西亦如此。采用这种方式的目的是为了节省单片机的I/O口,这样的接法只使用了六个I/O口,就完成了交通灯二极管红绿灯点亮的要求。
交通灯数码管倒计时显示电路中,因为东西方向时间显示相同,南北方向显示相同,故东南西北四个方向使用的是两个在一块的共阴极数码管,南北共接入P0口,东西共接入P2口,并都使用了上拉电阻,在显示过程中,采用了数码管按位动态显示,工作原理是:首先给数码管的个位位选口输出低电平,选中个位,显示数字,然后在极短的延时时间后,给数码管的十位位选输出低电平,选中十位,显示数字,然后依次循环上述操作。采用这样的电路方案,这样做第一可以节省单片机的I/O口,第二,增加了驱动能力。第三,在程序设计方面简单,易于实现。
整体方案完成的功能是当单片机上电后,系统进入正常工作状态,执行交通灯状态显示控制,同时将时间数据倒计时输入到LED数码管上实时显示。在此过程中可随时调用急停按键中断。并在中断处理结束后再次按下按键重新返回原态继续执行。整体方案方框图如下图示。
图表 1基于ATC51单片机交通灯模拟控制系统组成方框图
五、元件清单
表格 1单片机交通灯模拟控制系统元件清单
| 元件名称 | 型号 | 数量 | 作用 |
| 单片机 | ATC51 | 1 | 核心控制 |
| 交通灯 | 红绿黄三色二极管 | 红3绿3黄3 | 红绿黄灯显示 |
| 晶振 | 6MHz | 1 | 晶振电路 |
| 电容 | 22pF | 2 | 晶振电路 |
| 电解电容 | 10uF | 1 | 复位电路 |
| 排阻 | 7位10K排阻 | 3 | 上拉电阻 |
| 数码管 | 2位共阴 | 4 | 显示电路 |
| 按键 | 按钮 | 1 | 复位电路 |
| 按键 | 闸刀 | 1 | 按键电路 |
| 电源 | +5V | 5 | 提供+5V电源 |
| 电阻 | 10k | 3 | |
| 电阻 | 240k | 1 |
1、单片机主电路:
图表 2单片机交通灯模拟控制系统主电路
2、交通灯二极管点亮电路:
图表 3 7位一体的上拉排阻 图表 4 二极管点亮串联电路
东西南北各状态二极管点亮时P1口各位的状态如下表格(P1.7与P1.6的状态与二极管点亮无关,故没有列出):
其中0表示该位输出低电平,对应二极管点亮。
表格 2东西南北各状态时二极管点亮情况
P1口
| 方向状态 | P1.7 | P1.6 | P1.5 | P1.4 | P1.3 | P1.2 | P1.1 | P1.0 | 时间 |
| 东西南北全红 | - | - | 1 | 1 | 0 | 1 | 1 | 0 | 5s |
| 东西红南北绿 | - | - | 1 | 1 | 0 | 0 | 1 | 1 | 30s |
| 东西红南北黄 | - | - | 1 | 1 | 0 | 1 | 0 | 1 | 5s |
| 东西绿南北红 | - | - | 0 | 1 | 1 | 1 | 1 | 0 | 30s |
| 东西黄南北红 | - | - | 1 | 0 | 1 | 1 | 1 | 0 | 5s |
图表 5 东西南北两个7位一体上拉排阻
图表 6数码管倒计时显示模块
七、软件设计:
1、程序流程图:
程序主要分为主程序和中断程序两大部分,其中主程序包括了堆栈指针的设置,定时器与外部中断的开中断,以及各状态实时显示的部分。中断程序主要包括定时器中断处理程序与紧急情况时外部中断处理的程序。程序采用了汇编语言进行编写。具体流程见程序流程图及各功能模块程序清单。
2、各功能模块程序清单
定时器赋初值:这里定时器主要是用来为交通灯计时,本设计中,采用定时器T0,并使其工作在方式1,因为晶振采用的是6MHz,方式0最长可定时16.384ms,方式1最长定时131.072ms,方式2最长定时512us,所以采用方式1,每隔100ms中断一次,中断10次为1s。计算初值X:(2^16-X)*2*10^(-6)=10^(-1),得初值为X=15536=3CB0H,因此TH0=3CH,TL0=B0H。定时器赋初值模块采用了子程序方法,使各状态在刚开始容易调用
T0DE :MOV B,#0AH MOV TH0,#3CH
MOV TMOD,#01H RET
MOV TL0,#0B0H
定时器中断处理模块:中断响应时,定时器产生的是1s延时,因此需要再次赋初值,进行下一秒的中断延时,并在中断产生时,将状态标志位置一,以供数码管显示程序查询是否1s延时已到,然后判断应执行那一步操作。
IT0P :MOV TL0,#0B0H SETB F0
MOV TH0,#3CH DEC R6
DJNZ B,RTURN RTURN :RETI
外部中断0中断处理模块(即紧急状况下按键后单片机处理程序):外部中断处理是为在紧急状况下,处理紧急事务所设计的。在按键按下后,按键会保持按下状态,给P3.2持续的低电平,使外部中断0一直处于中断状态。此时所有红的亮,数码管显示全8。只有当紧急事务处理完毕,方可把按键按起跳出中断,恢复中断前状态继续执行。
KEYIN :CLR IE0 MOV P0,#0FFH
MOV P1,#36H MOV P2,#0FFH
CLR P3.6 RETI
CLR P3.7
初始态赋值模块:此时交通灯初次使用,首先将各路口所有红灯点亮,然后是初始状态的赋值操作:开定时器中断,外部中断,外部中断方式设置为电平触发,然后调用定时器赋初值子程序,进而执行下一步操作。
MAIN :MOV P1,#0F6H
MOV SP,#60H
MOV R6,#05H
SETB ET0
SETB EX0
CLR IT0
SETB EA
SETB TR0
LCALL T0DE
数码管倒计时5s显示模块:数码管倒计时5s显示模块较倒计时30s简单。此时首先赋计时次数5给累加器A,经过基址加变址寄存器间接寻址的方式通过查表查找要给数码管显示的数字。由于十位只显示0,所以十位的显示简单,不用查表。显示采用扫描的方式,个位与十位显示之间须有有瞬间延时,否则会在显示过程中出现乱码。
HERE :MOV A,R6 SETB P3.7
MOV DPTR,#SEGTAB LCALL DELY
MOVC A,@A+DPTR SETB P3.6
MOV P0,A MOV P2,#3FH
MOV P1,#76H CLR P3.7
LCALL DELY LCALL DELY
MOV P1,#0F6H SETB P3.7
MOV P0,#3FH JB F0,N1
MOV P1,#0B6H CJNE R6,#00H,HERE
LCALL DELY SJMP STAT1
MOV P1,#0F6H N1 :LCALL T0DE
MOV P2,A CLR F0
CLR P3.6 CJNE R6,#00H,HERE
数码管倒计时30秒显示模块:数码管倒计时30s显示使用了两个寄存器,一个存放个位,另一个存放十位。个位显示原理与5s倒计时显示一样,十位就采用了与个位显示方法一样的显示方法。
STAT1 :MOV P1,#0F3H MOVC A,@A+DPTR
CLR F0 MOV P0,A
LCALL T0DE ;接下页 MOV P2,A
MOV R7,#03H MOV P1,#0B3H
LOOPR6:MOV R6,#0AH CLR P3.7
HERE1 :MOV A,R6 LCALL DELY
MOV DPTR,#SEGTAB MOV P1,#0F3H
MOVC A,@A+DPTR SETB P3.7
MOV P0,A JB F0,N2
MOV P2,A CJNE R6,#00H,HERE1
MOV P1,#73H CJNE R7,#00H,LOOPR6
CLR P3.6 LJMP STAT2
SETB P3.7 N2 :LCALL T0DE
LCALL DELY CLR F0
MOV P1,#0F3H CJNE R6,#09H,HERE1
SETB P3.6 DEC R7
MOV A,R7 ;转上页 LJMP HERE1
八、设计心得
交通信号灯模拟控制系统是单片机设计中比较经典的设计案例,这次的单片机设计,我收获颇多。在硬件上,对复位电路,晶振电路的连接更加熟悉,二极管及数码管的外围连接上,其驱动能力,单片机各I/O口带载能力都加深了印象,本次设计参考了许多资料后,采用较为简单的设计思想,各外围电路都是直接接在单片机I/O口上。在整体电路图的布局与设计方面自己也感觉有了提高。
其次也是重点,就是程序的编写,这个学期,学单片机的同时学习了汇编语言,因此在程序编写时用了汇编。由于整体思路及大部分程序都是自己编写,所以深刻感受到程序编写的不易。首先必须要做的是程序流程图,只有在一个清晰的流程图下,程序编写过程才不会乱,才会有条不紊。
整个的设计查阅了一些相关资料,并且在实际操作与编程过程中,与同学进行讨论,感到了无比的充实。尤其是在程序的书写上面,充分的调用大脑,完全陷入编程中。通过这次的单片机交通灯模拟系统的设计,也使我深刻的感受到自己知识的不足,电路知识,编程技术等都有欠缺,熟练度不高。不过我相信今后多加练习,多动手多动脑一定可以做的更好。
九、整体电路原理图
十、附:主程序
ORG 0000H ;程序运行入口
LJMP MAIN ;跳向主程序入口
ORG 0003H ;外部中断0的入口
LJMP KEYIN ;外部中断处理程序入口
ORG 000BH ;T0的中断入口
LJMP IT0P ;T0中断处理程序入口
ORG 0600H ;数码管显示数字表入口
SEGTAB:DB 3FH,06H,5BH,4FH,66H,6DH
DB 7DH,07H,7FH,6FH,3FH
MAIN :MOV P1,#0F6H ;四方向红灯全亮
MOV SP,#60H ;设置堆栈指针
MOV R6,#05H ;倒计时次数
SETB ET0 ;允许T0中断
SETB EX0 ;允许外部中断0中断
CLR IT0 ;中断请求为电平触发方式
SETB EA ;总中断允许
SETB TR0 ;启动T0
LCALL T0DE ;调用定时器赋值语句
HERE :MOV A,R6 ;将倒计时次数送累加器A
MOV DPTR,#SEGTAB ;将表的首地址送DPTR
MOVC A,@A+DPTR ;通过基址加变址寄存器间接寻址查表
MOV P0,A ;将查表结果送数码管显示
MOV P1,#76H ;开个位位选
LCALL DELY ;调延时程序
MOV P1,#0F6H ;关位选
MOV P0,#3FH ;将0送数码管显示
MOV P1,#0B6H ;开十位位选
LCALL DELY ;调延时程序
MOV P1,#0F6H ;关位选
MOV P2,A ;东西向数码管显示过程同南北向
CLR P3.6
SETB P3.7
LCALL DELY
SETB P3.6
MOV P2,#3FH
CLR P3.7
LCALL DELY
SETB P3.7
JB F0,N1 ;判断一秒是否到,到转向N1,否继续
CJNE R6,#00H,HERE
;判断倒计时次数是否减为0,是跳下一个状态,否则继续显示
SJMP STAT1
N1 :LCALL T0DE ;1s已到,调用定时器赋值语句
CLR F0 ;标志位清零
CJNE R6,#00H,HERE
;判断倒计时次数是否减为0,是跳下一个状态,否则继续显示
STAT1 :MOV P1,#0F3H ;东西红灯,南北绿灯
CLR F0 ;1s标志位清零
LCALL T0DE ;调用定时器赋值语句
MOV R7,#03H ;数码管十位计数次数送R7
LOOPR6:MOV R6,#0AH ;数码管个位计数次数送R6
HERE1 :MOV A,R6
MOV DPTR,#SEGTAB
MOVC A,@A+DPTR
MOV P0,A
MOV P2,A
MOV P1,#73H
CLR P3.6
SETB P3.7
LCALL DELY
MOV P1,#0F3H
SETB P3.6
MOV A,R7
MOVC A,@A+DPTR
MOV P0,A
MOV P2,A
MOV P1,#0B3H
CLR P3.7
LCALL DELY
MOV P1,#0F3H
SETB P3.7
JB F0,N2 ;判断一秒是否到,到转向N2,否继续
CJNE R6,#00H,HERE1;判断个位是否减为0,否继续显示,是判断十位状态
CJNE R7,#00H,LOOPR6;判断十位是否减为0,否跳到LOOP6,是转状态2
LJMP STAT2
N2 :LCALL T0DE ;1s已到,调用定时器赋值语句
CLR F0 ;标志位清零
CJNE R6,#09H,HERE1;判断个位是否为9,是则十位减一,否则继续显示
DEC R7 ;十位减一
LJMP HERE1 ;跳向HERE1继续显示
;T0中断处理程序
IT0P :MOV TL0,#0B0H ;重新赋初值
MOV TH0,#3CH
DJNZ B,RTURN ;B减一是否为0,否返回,是则一秒到
SETB F0 ;一秒到,标志位置一
DEC R6 ;倒计时次数减一
RTURN :RETI
;定时器赋初值语句
T0DE :MOV B,#0AH ;中断次数10,完成一秒延时
MOV TMOD,#01H ;T0工作在方式1
MOV TL0,#0B0H
MOV TH0,#3CH
RET
;个位十位显示之间的短暂延时
DELY :MOV R3,#01H
D1 :MOV R4,#028H
D12 :MOV R5,#05AH
D2 :DJNZ R5,D2
DJNZ R4,D12
DJNZ R3,D1
RET
STAT2 :MOV P1,#0F5H ;东西红灯亮,南北黄灯闪烁
MOV R6,#05H
CLR F0
LCALL T0DE
HERE2 :MOV A,R6
MOV DPTR,#SEGTAB
MOVC A,@A+DPTR
MOV P0,A
CLR P1.7
SETB P1.6
LCALL DELY
SETB P1.7
MOV P0,#3FH
CLR P1.6
LCALL DELY
SETB P1.6
MOV P2,A
CLR P3.6
SETB P3.7
LCALL DELY
SETB P3.6
MOV P2,#3FH
CLR P3.7
LCALL DELY
SETB P3.7
JB F0,N3
CJNE R6,#00H,DELY1;倒计时次数是否减为0,否调用闪烁延时,是转状态3
LJMP STAT3
N3 :LCALL T0DE
CLR F0
CJNE R6,#00H,DELY1;倒计时次数是否减为0,否调用闪烁延时
;闪烁延时子程序
DELY1 :MOV TMOD,#11H ;使定时器T1工作在方式1
MOV TL1,#0B0H ;赋初值
MOV TH1,#3CH
SETB TR1 ;启动T1
LOOP :JNB TF1,LOOP ;定时器1溢出标志位为0,转移
CLR TR1 ;关T1
CPL P1.1 ;南北黄灯灭
LJMP HERE2 ;转HERE2,即状态2处
STAT3 :MOV P1,#0DEH ;东西绿灯亮,南北红灯亮
CLR F0
LCALL T0DE
MOV R7,#03H
LOOPR61:MOV R6,#0AH
HERE3 :MOV A,R6
MOV DPTR,#SEGTAB
MOVC A,@A+DPTR
MOV P0,A
MOV P2,A
MOV P1,#5EH
CLR P3.6
SETB P3.7
LCALL DELY
MOV P1,#0DEH
SETB P3.6
MOV A,R7
MOVC A,@A+DPTR
MOV P0,A
MOV P2,A
MOV P1,#9EH
CLR P3.7
LCALL DELY
MOV P1,#0DEH
SETB P3.7
JB F0,N4
CJNE R6,#00H,HERE3
CJNE R7,#00H,LOOPR61
LJMP STAT4
N4 :LCALL T0DE
CLR F0
CJNE R6,#09H,HERE3
DEC R7
LJMP HERE3
STAT4 :MOV P1,#0EEH ;东西黄灯闪烁,南北红灯亮
MOV R6,#05H
CLR F0
LCALL T0DE
HERE4 :MOV A,R6
MOV DPTR,#SEGTAB
MOVC A,@A+DPTR
MOV P0,A
CLR P1.7
SETB P1.6
LCALL DELY
SETB P1.7
MOV P0,#3FH
CLR P1.6
LCALL DELY
SETB P1.6
MOV P2,A
CLR P3.6
SETB P3.7
LCALL DELY
SETB P3.6
MOV P2,#3FH
CLR P3.7
LCALL DELY
SETB P3.7
JB F0,N5
CJNE R6,#00H,DELY2
LJMP STAT1
N5 :LCALL T0DE
CLR F0
CJNE R6,#00H,DELY2
DELY2 :MOV TMOD,#11H
MOV TL1,#0B0H
MOV TH1,#3CH
SETB TR1
LOOP1 :JNB TF1,LOOP1
CLR TR1
CPL P1.4
LJMP HERE4
;外部中断0中断处理程序
KEYIN :CLR IE0 ;清中断标志位
MOV P1,#36H;四个方向全红灯并把南北数码管个十位位选打开
CLR P3.6 ;把东西数码管个十位位选打开
CLR P3.7
MOV P0,#0FFH;使数码管显示全8
MOV P2,#0FFH
RETI
END
-------------------------------------------------------------------------
参考文献
作者1:张毅刚、彭喜元、彭宇编著.《单片机原理及应用》.第二版.北京:高等教育出版社出版.
2010年5月.总354页
作者2:杨居义.主编;杨尧、杨晓晴、王益斌.副主编.《单片机课程设计指导》.第一版.北京:清华大学出版社出版.2009年9月.总305页
作者3:刘同法、陈忠平、眭仁武编著.《单片机基础与最小系统实践》.第一版.北京:北京航空航天大学出版社出版.2007年6月.总346页下载本文