交通灯设计1中南大学微机课程设计报告题目交通灯设计专业班级姓名学号指导老师林立新老师交通灯设计2目录1.课程设计题目、功能、目的……………………………………..22.系统分析与设计…………………………………………………………32.1系统所用芯片分析…………………………………………………………..32.2所选用芯片的简要介绍……………………………………………………42.3系统框图…………………………………………………………………………..63.程序设计………….…………………………………………………………73.1十字路口交通灯状态转换表……………………………………………73.2主程序流程图……………………………………………………………………73.3中断子程序流程图…………………………………………………………..83.4数码管码表……………………………………………………………………..83.5各芯片初始化说明………………………………………………………….94.运行情况………….………………………………………………………105.具体源代码及注释……………………………………………………116.心得体会………….………………………………………………………16交通灯设计3一、课程设计题目、功能、目的1.课程设计题目--------------交通灯设计2.本设计所实现功能1)实现十字路口交通灯各种状态的转换;2)各种状态转换的时间可进行灵活设置;3)采用中断的方法对状态转换进行控制,提高处理器效率;4)在各个状态转换的同时实现倒计时提醒。3.本次课程设计目的1)通过《微机原理与接口》课程设计,使学生能够进一步了解微型计算机工作原理,微型计算机的硬件结构及微型计算机软件编程。2)要求学生根据接口电路的硬件要求进行计算机的汇编语言程序设计,使学生的软件编程能力得到加强,对接口电路的综合应用能力有较大提高。交通灯设计4二、系统分析与设计1.系统所用芯片分析1)首先本个系统需要一个中央处理器来负责对整个系统进行控制管理,因为《微机原理与接口技术》这门课上介绍了8086芯片,所以可以采用8086作为本系统的中央处理器。2)由于本次的课程设计的题目是交通灯,而根据十字路口处的交通灯南北和东西方向各有红、绿、黄三种颜色的灯,因此可用8255来控制6个LED灯的实现模拟的南北和东西方向上的交通灯。3)而交通灯的状态转换时间要由中断方式来控制,所以很容易想到了可以用8259作为中断芯片,与8086芯片相连。4)交通灯的状态转换时间可灵活设置,于是想到了可以采用一块8253或8254芯片和一个脉冲源相连,8253对脉冲源送来的脉冲进行分频,然后将输出送到8259作为中断源,而8253采用不用的计数初值其输出脉冲的频率就不一样,因此实现了交通类状态转换时间的灵活设置。5)最后关于交通灯状态转换的倒计时功能,可由一个七段数码管来显示倒计时,而本次课程设计的实验箱没有提供单个数码管,而是提供了一个八位一体七段数码管,所以还需一块8279芯片来对数码管进行控制。交通灯设计52.所选用芯片的简要介绍8255是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O口。具有3个通道3种工作方式的可编程并行接口芯片(40引脚)。其各口功能可由软件选择,使用灵活,通用性强。8255可作为单片机与多种外设连接时的中间接口电路。8255作为主机与外设的连接芯片,必须提供与主机相连的3个总线接口,即数据线、地址线、控制线接口。同时必须具有与外设连接的接口A、B、C口。由于8255可编程,所以必须具有逻辑控制部分,因而8255内部结构分为3个部分:与CPU连接部分、与外设连接部分、控制部分。intel8253是NMOS工艺制成的可编程计数器/定时器,有几种芯片型号,外形引脚及功能都是兼容的,只是工作的最高计数速率有所差异,例如8253(2.6MHz),8253-5(5MHz)8253内部有三个计数器,分别称为计数器0、计数器1和计数器2,他们的机构完全相同。每个计数器的输入和输出都决定于设置在控制寄存器中的控制字,互相之间工作完全独立。每个计数器通过三个引脚和外部联系,一个为时钟输入端CLK,一个为门控信号输入端GATE,另一个为输出端OUT。每个计数器内部有一个8位的控制寄存器,还有一个16位的计数初值寄存器CR、一个计数执行部件CE和一个输出锁存器OL。执行部件实际上是一个16位的减法计数器,它的起始值就是初值寄存器的值,而初始值寄存器的值是通过程序设置的。输出锁存器的值是通过程序设置的。输出锁存器OL用来锁存计数执行部件CE的内容,从而使CPU可以对此进行读操作。顺便提一下,CR、CE和OL都是16位寄存器,但是也可以作8位寄存器来用。交通灯设计6Intel8086拥有四个16位的通用寄存器,也能够当作八个8位寄存器来存取,以及四个16位索引寄存器(包含了堆栈指标)。资料寄存器通常由指令隐含地使用,针对暂存值需要复杂的寄存器配置。它提供64K8位元的输出输入(或32K16位元),以及固定的向量中断。大部分的指令只能够存取一个内存位址,所以其中一个操作数必须是一个寄存器。运算结果会储存在操作数中的一个寄存器。Intel8086有四个内存区段(segment)寄存器,可以从索引寄存器来设定。区段寄存器可以让CPU利用特殊的方式存取1MB内存。8086把段地址左移4位然后把它加上偏移地址。大部分的人都认为这是一个很不好的设计,因为这样的结果是会让各分段有重叠。尽管这样对组合语言而言大部分被接受(也甚至有用),可以完全地控制分段,,使在编程中使用指针(如C编程语言)变得困难。它导致指针的高效率表示变得困难,且有可能产生两个指向同一个地方的指针拥有不同的地址。更坏的是,这种方式产生要让内存扩充到大于1MB的困难。而8086的寻址方式改变让内存扩充较有效率。8086处理器的时钟频率介于4.77MHz(在原先的IBMPC频率)和10MHz之间。8086没有包含浮点指令部分(FPU),但是可以通过外接数学辅助处理器来增强浮点计算能力。交通灯设计73.系统框图交通灯设计8三、程序设计1.十字路口交通灯状态转换表:南北方向东西方向十六进制代码红绿黄红绿黄0010001022H0010000121H0001010014H000011000CH2.主程序流程图:交通灯设计93.中断子程序流程图:4.共阴数码管码表:数字01234编码0x3F0x060x5B0x4F0x66数字56789编码0x6D0x7D0x070x7F0x90交通灯设计105.8259初始化说明MOVAL,13H;写ICW1,需要ICW4、单片工作、边沿触发方式MOVDX,INTPORT1OUTDX,ALMOVAL,08H;写ICW2,设置中断向量号MOVDX,INTPORT2OUTDX,ALMOVAL,09H;写ICW4,普通全嵌套方式、采用缓冲方式OUTDX,ALMOVAL,0F7H;写OCW1,只开IR3中断请求,其余屏蔽OUTDX,AL6.8253初始化说明MOVDX,TCONTROMOVAL,10110100B;采用二进制计数方式,工作方式二,十六们计数,计数器二OUTDX,ALMOVDX,TCON2MOVAL,0AH;计数初值为10,即1S中断一次OUTDX,ALMOVAL,00HOUTDX,AL7.8255初始化说明MOVAL,80H;PA、PB、PC口都设定为输出工作方式MOVDX,IOCONPTOUTDX,AL交通灯设计11四、运行情况经多次调试后,系统运行良好,实现了要求和设想中的全部功能,如上图为实际运行时的图片。交通灯设计12五、具体代码及注释CODESEGMENTASSUMECS:CODEINTPORT1EQU0020HINTPORT2EQU0021HINTQ3EQUINTREEUP3;8259CONTPORTEQU00DFHDATAPORTEQU00DEH;8279TCONTROEQU004BH;8253TCON2EQU004AHIOCONPTEQU0073H所用芯片端口地址初始化IOCPTEQU0072HIOBPTEQU0071H;8255DATA0EQU0580HDATA1EQU0500HDATA2EQU0508HDATA3EQU0518HDATA4EQU0520HORG1000HSTART:JMPTint1Tint1:CLIMOVAX,0HMOVDS,AXMOVDX,CONTPORTMOVAL,00HOUTDX,ALMOVAL,2AHOUTDX,ALMOVAL,0d0hOUTDX,ALMOVAL,90hOUTDX,ALMOVAL,80HMOVDX,IOCONPT8279初始化及工作方式的设定8255初始化及工作方式的设定交通灯设计13OUTDX,ALMOVDX,TCONTROMOVAL,10110100BOUTDX,ALMOVDX,TCON2MOVAL,0AHOUTDX,ALMOVAL,00HOUTDX,ALCALLFORMATCLIMOVDI,DATA0MOVCX,08HXORAX,AXREPSTOSWMOVSI,DATA3CALLLEDDISP;数码管显示初始图案“-------”MOVAX,0HMOVDS,AXCALLWRINTVER;调用子程序,设置中断地址向量表MOVAL,13HMOVDX,INTPORT1OUTDX,ALMOVAL,08HMOVDX,INTPORT2OUTDX,ALMOVAL,09HOUTDX,ALMOVAL,0F7HOUTDX,ALMOVBYTEPTRDS:[0601H],03HMOVBYTEPTRDS:[0602H],00HSTI;开中断WATING:JMPWATING;等待中断,无限循环WRINTVER:MOVAX,0HMOVES,AXMOVDI,002CHLEAAX,INTQ3STOSWMOVAX,CSSTOSWRET8253初始化及工作方式的设定设置中断地址向量表子程序8259初始化及工作方式的设定交通灯设计14INTREEUP3:;中断子程序CLIMOVAL,DS:[0601H]CALLCONVERSMOVSI,DATA0CALLLEDDISPCMPBYTEPTRDS:[0601H],03HJNZNEXTMOVDX,IOBPTCOMP:CMPBYTEPTRDS:[0602H],00HJZSI0CMPBYTEPTRDS:[0602H],01HJZSI1CMPBYTEPTRDS:[0602H],02HJZSI2CMPBYTEPTRDS:[0602H],03HJZSI3SI0:MOVAL,22HADDBYTEPTRDS:[0602H],01HJMPPUTSI1:MOVAL,21HADDBYTEPTRDS:[0602H],01HJMPPUTSI2:MOVAL,14HADDBYTEPTRDS:[0602H],01HJMPPUTSI3:MOVAL,0CHMOVBYTEPTRDS:[0602H],00HJMPPUTPUT:MOVDX,IOBPTOUTDX,ALNEXT:MOVAL,20HMOVDX,INTPORT1OUTDX,ALSUBBYTEPTRDS:[0601H],01HCMPBYTEPTRDS:[0601H],00HJZINTRE1JMPEXCONVERS:MOVBH,0H判断DS:[0602H]里面的值,并跟据结果来进行对应的转换交通灯设计15ANDAL,0FHMOVBL,ALMOVAL,CS:[BX+DATA2]MOVBX,DATA0MOVDS:[BX],ALRETINTRE1:MOVBYTEPTRDS:[0601H],03HEX:MOVAL,20HMOVDX,INTPORT1OUTDX,ALSTIIRETLEDDISP:MOVAL,90HMOVDX,CONTPORTOUTDX,ALMOVBYTEPTRDS:[0600H],00LED1:CMPBYTEPTRDS:[0600H],07HJALED2MOVBL,DS:[0600H]MO