单片机课程设计示例
交通灯控制系统设计
一、总体设计
1、设计要求:
交通灯的任务要求为:模拟十字路口的交通灯的亮、灭及闪烁
基本工作原理:根据交通灯的亮灭情况,可以分为四种状态,利用定时计数器每20秒产生一次中断,每产生一次中断后由是否有特殊情况决定交通灯的状态变换。
2、 硬件和软件功能的划分
本课题要求实现的功能比较简单。由单片机的定时/计数器产生八分之一秒的定时时间,通过软件的方式实现20秒的定时时间。交通灯的亮灭由8255A控制,PA口控制东西向,PB口控制南北向。
3、 交通灯状态划分
十字路口交通灯如下图所示,将12个交通灯进行编号
这12个交通灯共有四个状态:
状态1(S1):东西红灯(4、10)亮,南北绿灯(3、9)亮
状态2(S2):南北绿灯(3、9)灭,黄灯(2、8)闪烁,东西仍为红灯(4、10)亮
状态3(S3):南北红灯(1、7)亮,东西绿灯(6、12)亮
状态4(S4):东西绿灯(6、12)灭,黄灯(5、11)闪烁,南北仍为红灯(1、7)亮
当东西向(或南北向)有特殊情况,开关K0为低电平则应使交通灯处于S3(东西绿灯、南北),开关K1为低电平则应使交通灯处于S1(南北向绿灯、东西向红灯),当K0、K1均为低电平则取消特殊情况,返回正常显示情况。
二、硬件设计
根据总体设计要求,确定系统扩展与功能接口,设计出系统的电路原理图。
1、 系统扩展
最小系统,由8031、地址锁存器和程序存储器组成。根据课题要求,在此基础上进行扩展。地址锁存器选74LS373,程序程序器选2764(8K),尽管本系统程序不长,但考虑以后扩展方便,选用2764。
考虑到交通灯数量比较多,控制信号比较多,对单片机的I/O口进行扩展,使用通用I/O接口芯片8255A来对单片机I/O口进行扩展。
2、 功能接口
所谓接口是CPU与外界的连接部件,以实现CPU与外部设备的最佳耦合和匹配。本课题只要求显示接口。显示设备为2位七段数码管。要使用七段数码管可以利用8031的串行口、可以利用可编程并行I/O扩展芯片8155或8255。由于仿真系统的限制选用8155。
2个共阴极数码管自左至右以两位数的形式显示秒数。为了保证数码管的亮度,必须保证输入电流的大小,因此,选用74LS244作为驱动放大器(实验系统内部已经做好)。
3、 系统的组成及统一编址
I/O端口是CPU与I/O设备直接通信的地址。单片机系统对I/O端口是采用端口地址与存储器地址统一编址的方式,即存储器映射方式。编址技术分线选法和译码法。由于涉及外围芯片很少,所以采用线选法。系统简图如下:
由于是线选法,因此芯片地址不是唯一的。而8155与外部数据存储器统一编址,可以与程序程序器重叠编址。因此,我们取它们的地址如下:
2764:0000H~1FFFH 存储程序
8155:命令/状态口 7F80H
PA口 7F81H 输出扫描码(字选码)
PB口 7F82H 输出字形码
PC口 7F83H 接收回复码
定时器低8位7F84H 没用
定时器高8位7F85H 没用
RAM 3F00H~3FFFH没用
工作方式为:定时器不工作,禁止PA、PB中断,PC口为输入方式(方式0),PA口、PB口为输出方式。因此,工作方式字为03H。
4、 汇集各芯片及数码管的技术资料,绘制系统原理图。
将8031、74LS373、2764、8155、数码管(包括为保证其驱动电流而添加的驱动器74LS244)等资料汇集起来,熟悉各芯片的引脚的功能及连接方法,绘制系统原理图。
三、软件设计
1、系统定义
1.1、各种数据类型的定义。
秒采用采用BCD码,八分之一秒计数采用16进制。
1.2、定义和分配存储空间、定义标志位。
堆栈区安放在片内RAM的高端60H~7FH;
0区为工作寄存器;
1区为显示程序的工作寄存器;
地址为3AH的存储单元内存放LED显示的数据,以压缩BCD码形式存放
设计一个标志单元,地址为3CH,用来标示当前交通灯的状态,共四种状态,00H带表状态1,01H代表状态2,02H代表状态3,03代表状态4
存储单元列表如下:
位标志在设计过程中,根据需要再添加。
2、 软件结构设计
程序总体执行过程是:上电后系统自动进行初始化,定时/计数器开始工作,检测标志单元3CH,根据3CH单元中的内容让交通灯处于对应的状态, 然后调用显示子程序,将3AH和3BH地址内的数据在七段数码管上显示出来。接着循环检测3CH单元中的内容以及特殊情况控制信号和调用显示子程序,让交通灯处于对应的状态,将3AH地址内的数据送七段数码管上显示出来,在整个过程中定时/计数器中断始终打开等待定时/计数器中断。中断服务程序完成状态的变换(3CH的值的改变)以及LED显示内容(3AH)的改变。
主程序的框图都如图所示:
3、 模块设计
根据主程序框图,定义如下几个模块:
初始化模块、状态1显示子程序、状态2显示子程序、状态3显示子程序、状态4显示子程序、出错处理程序、LED显示程序、中断服务程序。由于在程序运行过程中多次出现需要延时的情况,这里将延时程序也作为一个模块。
3.1、初始化模块
功能:完成变量初始化、8155初始化、定时器初始化和中断初始化。初始化的框图如图所示。
根据框图写出如下程序:(注意:后面我们要经常对以下程序进行补充和修改,利用它对其它模块或子程序进行调试。因此,要随时保存不同的版本。为方便起见,以下程序我们称版本1.0)
ORG 0000H
AJMP START
ORG 000BH ;T0中断入口地址
AJMP INT0 ;中断服务程序
ORG 0030H
START: MOV SP,#60H ;置堆栈顶指针
MOV 3AH,#20H;时间存储区单元初始化
MOV 3CH,#00H
MOV R3,00H
MOV R2,00H
MOV A,#80H ;8255A初始化,置工作方式
MOV DPTR,#0FF2BH
MOVX @DPTR,A
MOV A,#03H ;置8155命令格式
MOV DPTR,#0FF20H ;指向命令口
MOVX @DPTR,A
MOV TMOD,#01H ;置T0为定时器,工作方式1
MOV TH0,0BH
MOV TL0,0DCH
SETB EA ;中断初始化
SETB ET0
SETB TR0
程序中的时间常数是从要求一秒中断一次,但8051单片机的最大定时时间达不到1秒,所以选择1/8秒作为定时时间。DVCC的晶振频率为6MHz,则机器周期为2μs。设时间初值为X,工作方式1时定时器为16位,最大计数值为216=65536,则:
1/8=(65536-X)×2×10-6
解得X=3036D=0BDCH
则TH0 =0BH,TL0 =0DCH。
3.2状态1显示程序模块
功能:交通灯处于状态1
状态1(S1)为东西红灯(4、10)亮,南北绿灯(3、9)亮,所以本程序模块即为将3、4、9、10号灯点亮
3.2.1、程序
由于本模块的程序比较简单,只是简单的将4个高电平打到对应的端口就可以了,所以程序框图略,在这里直接给出程序:
DISP1: MOV DPTR,#0FF29H
MOV A,#00H
MOVX @DPTR,A
INC DPTR
MOV A,00H ;让所有灯熄灭
MOVX @DPTR,A
MOV DPTR,#0FF29H
MOV A,#03H
MOVX @DPTR,A
INC DPTR
MOV A,0CH
MOVX @DPTR,A ;东西红灯亮,南北绿灯亮
RET
3.3状态2显示程序
状态2(S2)为东西红灯(4、10)亮,南北黄灯黄灯(2、8)闪烁,本程序模块比状态1显示程序稍稍复杂一点,除了要将高电平打入对应的端口外还要控制黄灯的闪烁,黄灯的闪烁采用软件延时的办法实现,即黄灯亮后延时一段时间再灭,然后再延时一段时间再亮。
3.3.1程序
程序框图如下:
程序如下:
DISP2: MOV DPTR,#0FF29H
MOV A,#00H
MOVX @DPTR,A
INC DPTR
MOV A,00H ;让所有灯熄灭
MOVX @DPTR,A
MOV DPTR,#0FF29H
MOV A,#02H
MOVX @DPTR,A
INC DPTR
MOV A,8AH
MOVX @DPTR,A ;东西红灯亮,南北黄灯亮
ACALL DELAY ;延时1秒
MOV A,08H
MOVX @DPTR,A ;南北黄灯灭
ACALL DELAY ;延时1秒
RET
3.4状态3显示程序及状态4显示程序
状态3显示程序与状态1显示程序类似,状态4显示程序与状态2显示程序类似,请同学们参照状态1和状态2显示程序自行完成状态3和状态4显示程序,这里就不详细叙述了。
3.5出错处程序
出错处理程序指的是状态标志字节中的数据超过了正常范围(00H~03H)时的处理程序,正常情况下一般不会出现。当系统出现故障时,出现这种情况应该将所有红灯变亮。
其程序与框图与状态1类似。
3.6延时程序
延时程序用来实现延时1秒的功能,采用软件延时的方式。显然延时程序要用循环结构来实现,由于延时1秒是一个比较长时间的延时所以要采用三重循环来实现。延时程序是一个比较简单的纯粹的循环程序,结构比较简单,框图就省略,这里直接给出程序。
3.6.1延时程序
DEALY: MOV R7,#02H
LOOP1: MOV R6,#0FFH
LOOP2: MOV R5,0FFH
LOOP3: NOP
DJNZ R5,LOOP3
DJNZ R6,LOOP2
DJNZ R7,LOOP1
RET
当然,采用软件延时由于存在中断以及其它因素的影响,不可能达到精确的1秒,这里的延时程序大概延时0.9秒,如果需要更加精确请同学们自己调整每层循环的循环次数。在实际的应用过成中由于LED显示的需要,LED显示程序调用的间隔时间不能太长,所以在实际应用中我们常常将上述延时程序改为如下程序:
DELAY: MOV R7,#0FFH
LOOP1: MOV R6,0FFH
LOOP2: ACALL DISP
DJNZ R6,LOOP2
DJNZ R7,LOOP1
RET
3.7 LED显示程序
LED显示程序就是将3AH单元的内容在两个LED显示器上显示出来。由于3AH单元内存储的是压缩BCD码,所以必须在显示前对其进行拆字,即将一个字节压缩BCD码拆成两个单字节BCD码,如图所示:
3.7.1拆字程序
子程序名:CZ
功能:将将3AH单元存储的压缩BCD码拆成单字节BCD码,存储到显示存储区3DH、3EH中。
入口条件:3AH
出口条件:3DH、3EH
程序框图如右:
程序清单如下:
CZ: MOV R0,#3AH
MOV R1,#3DH
CZ1: MOV A,@R0
ANL A,#0FH
MOV @R1,A ;存个位
INC R1
MOV A,@R0
ANL A,#0F0H
SWAP A
MOV @R1,A ;存十位
RET
用下列程序调试:
MOV 3AH,#12H
ACALL CZ
SJMP $
单步执行观察3DH、3EH的值是否为02H和01H。调试成功后保存子程序CZ备用。
3.7.2、显示子程序
显示的原理如下:从最左边数码管开始,由PA口输出字选码(在这里为00100000B,即20H),由8155的PB口输出欲显示的字形码(如字符“0”,共阴极的字形码为“0C0H”),则在最左边的数码管显示字符“0”。然后,由PA口输出字选码(在这里为00010000B,即40H),由8155的PB口输出欲显示的字形码,则在下一个数码管显示相应字符。40H可以由对20H循环移位得到。共循环2次,则2个数码管自左至右顺序显示一次,调整好中间的间隔时间(用延时程序实现),利用人的视觉暂留,得到同时显示的效果。
由于字形码无规律可寻,编程不方便,因此,将字形码按0、1、……,9,A,……,F的顺序排列,其它字符如H、_、空字符(熄灭)排在其后,构成字形表。在LED5~LED0存放欲显示字符在表中的序号,通过查表程序得到相应的字形码,由PB口输出。如显示“0”时,在LED5中不是字形码为“0C0H”,而是“00H”,因为字形码“0C0H”在字形表中的序号是“0”,16进制表示为“00H”。
由此,可绘制程序框图如右图所示。
显示子程序名:DISP
功能:将3DH~3EH中的内容在数码管上显示出来。
入口条件:3DH、3EH
出口条件:无
DISP: SETB RS0 ;置工作寄存器1区
MOV R1,#3EH ;指向3EH
MOV R4,#02H ;扫描码00000010B从最左边开始
MOV DPTR,#DTAB;字形码表首地址送DPTR
MOV A,@R1
MOVC A,@A+DPTR ;查表得字形码
MOV DPTR,#0FF22H
MOVX @DPTR,A ;PB口送字形码
MOV DPTR,#0FF21H
MOV A,R4
MOVX @DPTR,A ;PA口送扫描码
MOV R5,#30H
DISP1: NOP
DJNZ R5,DISP2 ;延时
DEC R1 ;指下一显示存储单元
MOV A,R4 ;扫描码循环右移
RR A
MOV R4,A
CLR RS0 ;返回工作寄存器0区
RET ;返回
DTAB: DB 0C0H,0F9H,0A4H,0B0H ;字形码表
DB 99H,92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H
DB 8EH,0FFH,0C7H,89H
DB 0FFH,0C0H,0C7H,0C7H,86H,89H
注意要根据实际情况调整两个LED显示之间的时间间隔。
3.8中断服务程序
这个程序是整个设计过程中最复杂的一个程序,它实现的功能非常多。定时/计数器每1/8秒产生一次中断,而我们实际需要的是每1秒钟LED显示器上的数字减1,每20秒交通灯变换一个状态,所以在中断服务程序中还需要用软件的方式产生1秒和20秒的定时。
3.8.1中断服务程序
程序框图如下图所示:
程序如下:
INT0: CLR TR0
INC R2
CJNE R2,#08H,END1
MOV R2,#00H
MOV A,3AH
CJNE A,#00H,LOOP1
MOV 3AH,#20H
INC R3
CJNE R3,#01H,LP1
MOV 3CH,#01H
SJMP END1
LP1: CJNE R3,02H,LP2
MOV 3CH,#02H
SJMP END1
LP2: CJNE R3,03H,LP3
MOV 3CH,#03H
SJMP END1
LP3: CJNE R3,04H,LP4
MOV 3CH,#04H
MOV R3,#00H
SJMP END1
LP4: MOV R3,#00H
ACALL ERROR
SJMP END1
LOOP1: CJNE A,#20H,LOOP2
CLR CY
SUBB A,#07H
SJMP END1
LOOP2: CJNE A,#10H,LOOP3
CLR CY
SUBB A,#07H
SJMP END1
LOOP3: DEC 3AH
END1: MOV TH0,0BH
MOV TL0,0DCH
SETB TR0
RETI
机械与车辆学院单片机课程设计报告20xx20xx学年第一学期课程设计题目水塔水位控制系统姓名学号班级指导老师职称时间成绩单片机课程…
物理与机电学院课程设计报告课程名称:单片机课程设计系部:物理与机电工程学院专业班级:07级电子信息工程(1)班完成时间:20XX年…
成绩单片机原理及应用课程设计课程名ltlt单片机原理及应用gtgt学部专业学号姓名指导教师日期20xx年06月一设计任务与要求1任…
井冈山大学机电工程学院单片机课程设计报告课程名称单片机设计题目流水灯姓名覃家应陈东阳专业生物医学工程班级10级医工本一班学号100…
单片机课程设计示例交通灯控制系统设计一总体设计1设计要求交通灯的任务要求为模拟十字路口的交通灯的亮灭及闪烁基本工作原理根据交通灯的…
单片机课程设计报告格式要求统一的A4纸打印。每页约44行,每行约34字;打印正文用宋体小四号字;版面页边距上空2.5cm,下空2c…
湖州师范学院求真学院课程设计总结报告课程名称单片机应用系统设计设计题目基于STC89C51的数字电子钟设计专业电子科学与技术班级0…
单片机接口技术与实验课程总结现代数字系统设计课程总结姓名学号年级专业20xx年秋季学期每个实验都应该包含以下内容实验一三号字宋体居…
西南科技大学20xx级微机原理与接口技术课题名称姓名学号系部专业指导教师课程设计报告微机原理与接口技术制造科学与工程学院20xx年…
韶关学院课程设计说明书论文设计题目基于单片机控制的智能交通灯设计课程名称微机原理与应用实训学生姓名学号院系物理与机电工程学院汽车系…
单片机课程设计心得体会:这个学期的单片机课已经早早的上完了,但是理论纯属理论,没有与实践的结合总让我们学的不踏实,感觉没有达到学以…