基于MSP430的交通灯控制系统复习过程.doc
Good is good, but better carries it.精益求精,善益求善。基于MSP430的交通灯控制系统-2012-2013学年第二学期山东科技大学电工电子实验教学中心创新性实验研究报告实验项目名称用MSP430单片机实现的交通灯控制组长姓名孟鹏学号联系电话E-mail成员姓名郑阳学号成员姓名学号专业自动化班级指导教师及职称2013年6月20日-一、实验摘要一个好的交通灯控制系统,将给道路拥挤、违章控制等方面给予技术革新。随着大规模集成电路及计算机技术的迅速发展,以及人工智能在控制技术方面的广泛运用,智能设备有了很大的发展,是现代科技发展的主流方向。基于MSP430单片机的交通控制系统以MSP430F149单片机为路口控制核心、LED作为显示、驱动电路与部分模拟器件构成的一种电子产品。MSP430F149单片机为控制核心,能实时的进行控制;由于LED有高节能、安全性高、寿命长、快速响应、运行成本低等优点,所以用作显示很合理;74HC164驱动电路用于对LED及数码管的驱动;此系统可以长时间稳定的运行,可用于各种十字路口,进行自动的交通控制,由于留有其它接口,可以很方便的进行升级扩展。本设计实现的功能为:直行、左转及右转三个方向的交通灯控制;交通灯的时间显示;绿灯将结束时的闪烁控制;当有违章车辆是输出信号通知电子警察,拍下其车牌号等违章处理。可以看出其功能是较为复杂的。二、实验目的通过设计交通灯系统从而加深对汇编语言的理解以及对单片机原理英及接口技术的了解和深入应用,单片机硬件操作调试及程序烧录方法等。通过设计初步了解MSP430单片机的工作原理及指令集。了解Proteus及IARFOR430(EW430)软件的应用。深入了解交通灯系统的设计。三、实验场地及仪器、设备和材料:材料清单:MSP430F149单片机最小系统版×1七段共阴数码管0.56英寸×8双面PCB板9x15cm×1单排针×43mmLED(红黄绿)×36杜邦线×1074HC164×1274LS04×1电阻电容若干实验器材:示波器,万用表,PC机实验软件:Proteus,IARFor430,SF_BSL430四、实验内容1、实验原理1)硬件电路在硬件上,为了简洁,做成模块化。十字路口的交通灯,在前后左右四个方向上有一个模块,显示本方向上对车辆通行的允许状态。每个模块上有两个数码管显示当前允许或禁止车辆通行的时间(单位S);有9盏交通灯,分别控制本方向上的三个细分方向,如本方向为朝东,则三个细分方向为向东方向(直行)、向东北方向(右转弯方向)及向东南方向(左转弯方向),每个细分方向有3盏灯,红绿黄,所以每个模块有9盏灯。四个方向上的四个模块是完全相同的。MSP430有输出口线相当丰富的系列器件,如MSP430F13/14系列有6×8=48条I/O口线,而MSP430F43/44除了有6×8=48条I/O口线外,还有160段液晶模块的所有输出端在不驱动液晶时,也可以用于普通输出。这样完全有条件直接使用MSP430的口线与所有的显示器连接(当然需要驱动)。但这样,不便于模块化,因为每个模块将有很多连线与处理器相连,此方案不可行。应改为使用74HC164串行输出与所有显示器连接。整个交通灯设计如下图所示。对于每个交通灯模块,电路见上图。所有74HC164的时钟端连在一起,使用MSP430的一条I/O口线驱动。用两片74HC164驱动两位数码管,显示时间。而交通灯有9盏,剩下的一片74HC164只能输出驱动8盏,还有一盏不能驱动。可以发现:交通灯的数码显示没有使用小数点,那么就利用任意一片74HC164的最后一位驱动剩下的第9盏灯。74HC164之间的级联在前面已经有讲述。图二中的“显示地控制”信号的作用是每个模块的显示器(数码管与灯)的地线都连在一起,没有直接与地相连,而是通过一个三极管由处理器控制。因为在操作74HC164移位时,如果所有的显示器都接地,则在74HC164将数据位一位一位地移动过程中,导致所有的显示器都被点亮(包括本来不该亮的)。如果交通灯是这样的话,那么在这一瞬间,红、绿、黄全亮,会给交通带来麻烦。为了解决这个问题,控制显示器的地线,在操作74HC164进行数据移位时输出控制显示器的地线为高电平,则显示器不显示(被关闭)。由于操作的时间不长,眼睛的暂留作用将不会认为灯的熄灭。相反如果灯不该亮而亮,则人眼睛会看到、等对74HC164操作完毕,再打开显示器,地线为低电平。违章检测的工作原理是,在真实的交通灯中一般使用压力传感器,当在禁行方向有车辆通过压力传感器时,传感器给处理器一个信号,告知有违章车辆通过。而在这里使用简单的光电传感器:红外对管。红外线发射管一直发射红外线,接收管一直接受红外线。当在禁行时段检测到没有红外线(被车辆挡住了)时,则认为有违章车辆通过。并告知处理器,处理器输出信号给在照相机。模块间的级联问题。由其中一个模块与处理器模块相连。然后连接下一模块等(如图1所示)、所有的74HC164时钟线连在一起,数据线由前一模块的最高位输出,所有显示器的地线连在一起与处理器模块连接。处理器使用MSP430F149.下图为仿真中的一个模块。2)MSP430最小系统图3MSP430单片机最小系统如图3所示,MSP430最小系统由复位电路、晶振电路、JTAG等组成。MSP430单片机的64个引脚大致可分为4类:电源、时钟、控制和I/O引脚。MSP430系列单片机的中断源较多,并且可以任意嵌套,使用时灵活方便。当系统处于省电的备用状态时,用中断请求讲它唤醒只有6us。超低功耗MSP430单片机之所以有超低的功耗,是因为其在降低芯片的电源电压及灵活而可控的运行时钟方面都有其独到之处。首先,MSP430系列单片机的电源电压采用的是1.83.6V电压。因而可使其在1MHz的时钟条件下运行时,芯片的电流会在200400uA左右,时钟关断模式的最低功耗只有0.1uA。其次,独特的时钟系统设计,在MSP430系列中有两个不同的系统时钟系统:基本时钟系统和锁频(FLL和FLL+)时钟系统或DCO数字振荡器时钟系统。有的使用一个晶体振荡器(32768Hz),有的使用两个晶体振荡器。由系统时钟系统产生CPU和各功能所需的时钟,并且这些时钟可以在指令的控制下,打开和关闭,从而实现对总体功耗的控制。3)IARFOR430简介IARSystems是全球领先的嵌入式系统开发工具和服务的供应商。公司成立于1983年,迄今已有27年,提供的产品和服务涉及到嵌入式系统的设计、开发和测试的每一个阶段,包括:带有C/C+编译器和调试器的集成开发环境、实时操作系统和中间件、开发套件、硬件仿真器以及状态机建模工具。国内普及的MSP430开发软件种类不多,主要有IAR公司的EmbeddedWorkbenchforMSP430(简称EW430)和AQ430。目前IAR的用户居多。IAREW430软件提供了工程管理,程序编辑,代码下载,调试等所有功能,并且软件界面和操作方法与IAREWforARM等开发软件一致,因此,学会了IAREW430,就可以很顺利的过度到另一种新处理器的开发工作。4)Proteus仿真软件简介Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。a互动的电路仿真用户甚至可以实时采用诸如RAM,ROM,键盘,马达,LED,LCD,AD/DA,部分SPI器件,部分IIC器件。b仿真处理器及其外围电路可以仿真51系列、AVR、PIC、ARM、等常用主流单片机。还可以直接在基于原理图的虚拟原型上编程,再配合显示及输出,能看到运行后输入输出的效果。配合系统配置的虚拟逻辑分析仪、示波器等,Proteus建立了完备的电子设计开发环境。22、实验内容1)系统主程序的设计系统使用低能耗方式,在主程序中主要完成必须的设置工作,而大部分事情如:定时刷新显示和定时运行交通灯等,在定时器A中断中完成。使用P1.2口中断进行违章车辆的检测。系统主程序如下:ORG01000h;msp430f149FLASHSTARTRESETmov.w#300h,SP;InitializestackpointerStopWDTmov.w#WDTPW+WDTHOLD,&WDTCTL;StopWDTSetupTAmov.w#TASSEL1+TACLR,&TACTL;SMCLK,clearTARSetupC0mov.w#CCIE,&CCTL0;CCR0interruptenabledmov.w#35000,&CCR0;SetupP1bis.b#001h,&P1DIR;P1.0outputbis.w#MC1,&TACTL;StartTimer_aincontinousmodeMOV.B#0FFH,&P2DIR;P2.0为数据输出端,P2.1为时钟输出端CALL#INIT_RAMCALL#INIT_P1eintMJMPM2)初始化P1.0用于输出闪光灯,P1.2用于检测是否有违章车辆,为中断输入口。3)定时器A中断程序当主程序初始化之后,处理器将进入低功耗状态。那么,除了有PI口检测违章车辆之外,其余功能都由定时器来完成。定时器A应该实现一个走时时钟,作为交通灯的时间基准的基础上运行。定时器的时间间隔为0.1秒,则走时时钟以秒为单位,每十次中断增加1.真个过程为106s(在交通灯的运行部分会详细讲述)。在每一秒钟都要完成:交通灯的运行:交通灯计时器的减1计数:显示缓存的刷新。而每次进入中断(0.1s之后,都要完成:送显示缓存的数据到显示器;判断是否绿灯闪烁(将后面绿灯的闪烁部分详细讲解,当驴等接近尾声时,绿灯闪烁,提醒驾驶员减速行驶)。4)显示程序的设计显示子程序中要将所有的显示数据送到显示器,同事,在松鼠之前先关显示器。数据送完后,再打开显示器。下面的程序为送12个数据到显示器。5)交通灯的运行运行的交通灯因实际情况的不同而千差万别,。如有的道路为单行道,有的方向上允许通行的时间较少,有的通行时间多。有的路口“丁”字路等。导致实际的交通灯运行很不一样,但多半是运行的参数不同。本示例的交通灯为控制较为全面的南京中山东路和解放路十字路口交通灯的真实写照。因为交通灯前后两模式的运行显示是完全相同的(有的例外),足有两模块的运行显示也是完全相同的。所以下面的交通灯的实际运行状况只描述前面的模块与左面的模块。如图5.46所示。从图中可看出整个交通灯的运行时间是104s一个循环,在程序的编写上,直接按照图将交通灯与倒计时数据等送达各个模块即可。在图中,定义了交通灯在各个时间段的运行状态。在各个状态里,灯有固定的显示,计数器有固定的技术范围。在理解图5.46的基础上,在一个循环时间内,各运行状态的时间分配如图所示。为了程序编写方便,下面先编写交通灯的显示码。其中前8位为一个字节,最后一位单独表示,放在某个特定单元。在后面要讲到的有关闪烁问题,也需要编写显示码。是你说主要是绿灯闪烁,闪烁的原理是:每隔0.1s进入一次中断,即可间隔0.1s让绿灯亮,再隔0.1s让绿灯灭。这里将绿灯熄灭的相应显示码也编好,后面可直接使用。显示码表如表5.6所列。当基准时钟进行到5.47所指示的时刻时,赋予交通灯以各个状态与相应的倒计时起点。对于交通灯的状态,可以将各相应的显示编码直接写入对应的显示缓存。6.交通灯的运行6)计数器减1计数如果只有前面的交通灯运行程序,则交通灯的显示能完全符合需要,但数码管的显示只有在各个状态转换的时刻所发生的改变,而没有倒计时显示。倒计时实质为十进制的减1计数。在MSP430的指令系统中,提供了二进制加法、十进制加法及二进制减法,而没有十进制减法。其实办法很简单,用十进制数加上99,则十进制加法的结果相当于十进制的减1s的到来运行下而的程序,实现4个灯模块的减1计数。8绿灯的闪烁实际的交通灯运行中当绿灯结束后,显示黄灯,黄灯之后,为红灯。在黄灯期间,过线的车辆继续前进,线内的车辆则不能行驶。所以一般都在绿灯要结束时闪烁显示,提醒驾驶员要减速准备停车等红灯。绿灯的闪烁其实并不麻烦。首先要判断在什么时间内可以闪烁,然后在可以闪烁的时间内每到中断时,奇数次两次中断绿灯显示,偶数次两次中断绿灯不显示,就达到了绿灯闪烁的效果。闪烁23s闪烁频率为每秒2.5次。首先要确定闪烁的时间段。这里以1104s的时间基准为依据。由圈5.46和图5.47可看出:4547s前后路直行绿灯闪烁;6164s前后路左右转弯绿灯闪烁,同时左右路右转弯绿灯也闪烁;7881s左右路直行绿灯闪烁。使用减法操作确定是否在所需的时间段内;设置一中断计数器用于确定是否满足闪烁频率的要求。3、实验步骤(1)利用IARFor430进行程序的汇编与调试。打开IAR软件,建立MSP430工程,建立xxx.asm文件,编写xxx.asm代码,点击页面中的project,在下拉菜单中选择options,在弹出的对话框左侧选择Linker选项,右侧选择Output。在源文件菜单下选择添加源代码,选择目标处理器和代码生成工具。选择源文件并编辑(用汇编语言加后缀名为ASM)。然后在同一菜单下选择“全部编译”。编译通过后自动生成后缀名为HEX格式的文件。同时在extraoutput中选择额外生成.txt格式的文件,用于后面的程序烧录。(2)利用Proteus软件进行电路仿真打开Proteus软件,点击ISIS软件模块,进入原理图设计仿真界面。通过对象选择按钮PickDevice, 利用其搜索引擎, 将所需元器件加入到对象选择器窗口.元件清单:元件名称型号数量Proteus中的名称单片机芯片MSP430F2491 MSP430F249移位寄存器74HC16412 74HC164数码管 8 7SEG-MPX1-CC发光二极管 36 LED-GREEN等三极管90122N5551 放置元器件至图形编辑窗口, 并调整到合适位置。放置总线至图形编辑窗口。 完成元器件之间以及元器件与总线的连线。给与总线连接的导线贴标签, 以便于系统识别。Proteus 与IAR联合仿真,先通过IAR编辑、修改、编译源程序并生成.HEX单片机能识别的文件,然后再运行Proteus将HEX文件与原理图中的单片机系统进行仿真。连着联合仿真的优点在于,可以一边修改程序一边进行电路仿真。在EW430中修改好文件电机编译连接,在Proteus中立马就可以重新点击运行进行新的仿真(因为.Hex文件的路径是不变的)。Proteus 软件中绘制仿真电路,然后选中单片机芯片,将生成的HEX格式的文件加载,最后按左下方的开始按钮即可运行仿真,查看实验效果。 (2)单片机源程序的烧录将单片机通过USB下载线与PFC机连接,打开SF_BSL430或MspFet下载软件将之前生成的.txt文件烧录到单片机上。如下图 (3)在万用板上进行实物电路的连接仿真无误后,按照仿真电路图将实验所需芯片及电气元件在万用板上布局,添加必要的限流电阻,并仿照电路图进行焊接通过杜邦线及针口实现单片机与实验板的连接。打开开关,运行程序,观察信号灯的点亮顺序及数码管显示情况五、实验结果与分析1、实验现象、数据记录整个交通灯运行的状态循环如下图所示:交通灯系统按照如图所示的状态循环正确运行。3、关键点:“显示地控制”的处理:其上信号的作用是每个模块的显示器(数码管与灯)的地线都连在一起,没有直接与地相连,而是通过一个三极管由处理器控制。因为在操作74HC164移位时,如果所有的显示器都接地,则在74HC164将数据位一位一位地移动过程中,导致所有的显示器都被点亮(包括本来不该亮的)。如果交通灯是这样的话,那么在这一瞬间,红、绿、黄全亮,会给交通带来麻烦。为了解决这个问题,控制显示器的地线,在操作74HC164进行数据移位时输出控制显示器的地线为高电平,则显示器不显示(被关闭)。由于操作的时间不长,眼睛的暂留作用将不会认为灯的熄灭。相反如果灯不该亮而亮,则人眼睛会看到、等对74HC164操作完毕,再打开显示器,地线为低电平。四个完全相同的模块之间的级联以及与单片机的连接:注意四个模块所有的clock都串联在一起连接430的clock输出,430的数据输出接入第一个模块的个位74HC164芯片的两个数据输入端的任意一个,另个置高电平,然后该模块的十位164芯片的Q7端进位到下一个模块的数据输入端。六、实验结论通过近三周的努力,我们终于基本完成了用MSP430单片机实现的交通灯控制的设计与实现。从接受到这个课题到逐步的完成,每一步的完成对我来说都有着新的体会。大学两年以来,这是给我的一个很大的挑战。从拿到这个题目开始,到收集这方面的资料,一步一步的逐步完善自己的方案设计,在这个过程中可以说自己收获了很多,同时也发现了自身知识的不足,我们必须具备一定的专业基础知识,才能成功的设计出一件合格的东西。当然最重要的是学到了关于基本MSP430的一些基本应用,同时也加深了对一些常用电路的了解及设计方法。同时也第一次初步掌握了EW430软件以及Proteus软件的应用。其中遇到的困难巨大,因为之前并未接触过单片机单片机,现在着手做MSP430的芯片,这是一个很有难度和挑战性的设计,所以很多的内容都是需要自己去从零开始自学的,比如有些MSP430的芯片和引脚问题不懂的时候就可以试着去参考51单片机的,两者相比较一下,一些问题就能迎刃而解,这也是一种很好的学习方法。通过这一阶段的设计,我受益匪浅,不仅锻炼了良好的逻辑思维能力,而且培养了弃而不舍的求学精神和严谨作风。回顾此次创新实验设计,宝贵之处并不在于结果与学分而在于过程与其中所需到的知识与能力。七、指导老师评语及得分:签名:年月日交通灯程序清单:;用164驱动所有灯以及数码管的显示;149为中央控制器;RAM使用情况:;显示缓存为200H开始以后的12字节,;200H202H为第一块显示模块的显示数据;203H205H为第二块显示模块的显示数据;206H208H为第三块显示模块的显示数据;209H20BH为第四块显示模块的显示数据;220H为秒计时单元,221H为0.1秒计时单元;222H为第一块灯模块的时间显示数据,;223H为第二,224H为第三,225H为第四;226H为交通灯运行状态标志(一共有9个模块的灯与数码管显示运行状态);红绿红34H红绿绿24H+1绿红绿48H+1红红红70H;红红绿60H+1红黄绿21H+1黄红黄C2H红红黄E0H;红黄红31H;灯的显示码;4个显示模块,每一个的9盏灯中都有一盏接在第二片164的Q0上;所以在灯的显示上可能有“+1”,则这个1加在第二片164的Q0上;4个单元来保存是否+1:20CH,20DH,20EH,20FH分别对应4个显示模块;每当绿灯方向计数值减到3时,绿灯闪烁;用以提醒司机朋友注意;227H为0.75秒计数器,228H为0.3秒计数器,用于绿灯闪烁;使用红外线检测是否有无违章车辆,使用端口1(P1.2)下降沿中断;如果有,则输出超高亮度的发光管点亮,示意打开闪光灯拍摄违章车牌号#include"msp430x14x.h"ORG01000h;msp430f149FLASHSTARTRESETmov.w#300h,SP;InitializestackpointerStopWDTmov.w#WDTPW+WDTHOLD,&WDTCTL;StopWDTSetupTAmov.w#TASSEL1+TACLR,&TACTL;SMCLK,clearTARSetupC0mov.w#CCIE,&CCTL0;CCR0interruptenabledmov.w#35000,&CCR0;SetupP1bis.b#001h,&P1DIR;P1.0outputbis.w#MC1,&TACTL;StartTimer_aincontinousmodeMOV.B#0FFH,&P2DIR;P2.0为数据输出端,P2.1为时钟输出端CALL#INIT_RAMCALL#INIT_P1eintMJMPM;定时器中断服务程序TA0_ISRCALL#DIS_12INC.B&221HCMP.B#12,&221H;0.075秒INC12JNZTA0ENDMOV.B#0,&221H;1秒CALL#TR_CONTCALL#TR_RUNCALL#DATA_TO_DISINC.B&220H;加1,220H的内容作为交通灯运行的时间参考CMP.B#106,&220H;整个过程为106秒JNZTA0ENDMOV.B#0,&220HTA0ENDCALL#FLASH_TOadd.w#60000,&CCR0;AddOffsettoCCR0reti;P1口中断服务程序,在非绿灯时间段内,如果有车通过,则开闪光灯P1_INTBIC.B#04H,&P1IFGPUSH.B&226HDINTPUSHR15MOV#500,R15P1_INTLOOP1DECR15;延时消除抖动JNZP1_INTLOOP1POPR15BIT.B#04H,&P1INJZP1_INTENDCLRC;判断是否为禁止通行时段SUB.B#2,&226H;运行状态标志小于5时允许通行,其他时间不能通行JNCP1_INTENDBIC.B#01H,&P1OUTBIC.B#02H,&P1OUTPUSHR15MOV#25000,R15P1_INTLOOP2DECR15JNZP1_INTLOOP2POPR15NOPBIS.B#02H,&P1OUTBIS.B#1,&P1OUTP1_INTENDADD.B#2,&226HPOP.B&226HEINTRETIFLASH_TONOPPUSH.B&220HCLRCSUB.B#44,&220H;4547秒为前后直行绿灯闪烁时间JNCFLASH_TO1POP.B&220HPUSH.B&220HCLRCSUB.B#46,&220HJNCFLASH_TO1;是否小于47CMP.B#1,&226H;是否为运行状态1JNZFLASH_TO1BIT.B#2,&221H;是否为0.4秒JNZFLASH_END1;如果都不是则跳转MOV.B#29H,&206H;如果条件满足,则闪烁MOV.B#29H,&200H;先写入绿灯不亮的显示码JMPFLASH_TO1FLASH_END1MOV.B#21H,&200HMOV.B#21H,&206H;再写入绿灯亮的显示码JMPFLASH_TO1FLASH_TO1POP.B&220HPUSH.B&220HCLRCSUB.B#61,&220H;6164秒为前后路左右转弯绿灯闪烁时间JNCFLASH_TO2;同时也是左右路右转弯绿灯闪烁时间POP.B&220HPUSH.B&220HCLRCSUB.B#64,&220HJNCFLASH_TO2;是否小于64CMP.B#4,&226H;是否为运行状态4JNZFLASH_TO2BIT.B#2,&221H;是否为0.4秒JNZFLASH_END2;如果都不是则跳转MOV.B#2BH,&203HMOV.B#2BH,&209H;MOV.B#0,&20DH;如果条件满足,则闪烁MOV.B#0,&20FH;先写入绿灯不亮的显示码MOV.B#2AH,&206HMOV.B#2AH,&200HMOV.B#0,&20CHMOV.B#0,&20EHJMPFLASH_TO2FLASH_END2MOV.B#22H,&200H;再写入绿灯亮的显示码MOV.B#22H,&206HMOV.B#1,&20CHMOV.B#1,&20EHMOV.B#1,&20DHMOV.B#1,&20FHJMPFLASH_TO2FLASH_TO2POP.B&220HPUSH.B&220HCLRCSUB.B#78,&220H;7881秒为左右路直行绿灯闪烁时间JNCFLASH_TO3POP.B&220HPUSH.B&220HCLRCSUB.B#81,&220HJNCFLASH_TO3;是否小于81CMP.B#6,&226H;是否为运行状态6JNZFLASH_TO3BIT.B#2,&221H;是否为0.4秒JNZFLASH_END3;如果都不是则跳转MOV.B#2CH,&203H;先写入绿灯不亮的显示码MOV.B#2CH,&209HJMPFLASH_TO3FLASH_END3MOV.B#20H,&203HMOV.B#20H,&209H;再写入绿灯亮的显示码JMPFLASH_TO3FLASH_TO3POP.B&220HRETTR_CONTCLRC;所有模块上的计数器减一计数DADD.B#99H,&222HCLRCDADD.B#99H,&223HCLRCDADD.B#99H,&224HCLRCDADD.B#99H,&225HRET;交通灯的运行TR_RUNCMP.B#0,&220H;进行了47秒之后JNZTR_RUN1MOV.B#20H,&200H;第一模块8灯显示值:红绿红MOV.B#47H,&222H;时间计数值MOV.B#0,&20CH;第9灯显示值MOV.B#23H,&203H;第二模块:红红红MOV.B#67H,&223HMOV.B#0,&20dHMOV.B#20H,&206H;红绿红MOV.B#47H,&224HMOV.B#0,&20eHMOV.B#23H,&209H;红红红MOV.B#67H,&225HMOV.B#0,&20fHMOV.B#0,&226HTR_RUN1CMP.B#27,&220H;进行了47秒之后JNZTR_RUN2MOV.B#21H,&200H;第一模块8灯显示值:红绿绿MOV.B#47H,&222H;时间计数值不变,延续MOV.B#1,&20CH;第9灯显示值MOV.B#24H,&203H;第二模块:红绿绿MOV.B#67H,&223HMOV.B#1,&20dHMOV.B#21H,&206H;第三模块:红红绿MOV.B#47H,&224HMOV.B#1,&20eHMOV.B#24H,&209H;第四模块:红红绿MOV.B#67H,&225HMOV.B#01,&20fHMOV.B#1,&226HTR_RUN2CMP.B#47,&220H;进行了47秒之后JNZTR_RUN3MOV.B#25H,&200H;第一模块8灯显示值:红黄绿MOV.B#2H,&222H;时间计数值黄灯显示时间MOV.B#1,&20CH;第9灯显示值MOV.B#24H,&203H;第二模块:红红绿MOV.B#67H,&223HMOV.B#1,&20dHMOV.B#25H,&206H;第三模块:红黄绿MOV.B#2H,&224HMOV.B#1,&20eHMOV.B#24H,&209H;第四模块MOV.B#67H,&225HMOV.B#01,&20fHMOV.B#2,&226HTR_RUN3TR_RUN4CMP.B#49,&220H;进行了47秒之后JNZTR_RUN5MOV.B#22H,&200H;第一模块8灯显示值:绿红绿MOV.B#16H,&222H;时间计数值黄灯显示时间MOV.B#1,&20CH;第9灯显示值MOV.B#24H,&203H;第二模块:红红绿MOV.B#67H,&223HMOV.B#1,&20dHMOV.B#22H,&206H;第三模块:绿红绿MOV.B#16H,&224HMOV.B#1,&20eHMOV.B#24H,&209H;第四模块MOV.B#67H,&225HMOV.B#01,&20fHMOV.B#4,&226HTR_RUN5CMP.B#65,&220H;进行了65秒之后JNZTR_RUN6MOV.B#26H,&200H;第一模块8灯显示值:黄红黄MOV.B#2H,&222H;时间计数值黄灯显示时间MOV.B#0,&20CH;第9灯显示值MOV.B#27H,&203H;第二模块:红红黄MOV.B#67H,&223HMOV.B#1,&20dHMOV.B#26H,&206H;第三模块MOV.B#2H,&224HMOV.B#0,&20eHMOV.B#27H,&209H;第四模块:红红黄MOV.B#67H,&225HMOV.B#01,&20fHMOV.B#5,&226HTR_RUN6CMP.B#67,&220H;进行了67秒之后JNZTR_RUN7MOV.B#23H,&200H;第一模块8灯显示值:红红红MOV.B#37H,&222H;时间计数值黄灯显示时间MOV.B#0,&20CH;第9灯显示值MOV.B#20H,&203H;第二模块:红绿红MOV.B#15H,&223HMOV.B#0,&20dHMOV.B#23H,&206H;第三模块MOV.B#37H,&224HMOV.B#0,&20eHMOV.B#20H,&209H;第四模块MOV.B#15H,&225HMOV.B#0,&20fHMOV.B#6,&226HTR_RUN7CMP.B#82,&220H;进行了82秒之后JNZTR_RUN8MOV.B#23H,&200H;第一模块8灯显示值:红红红MOV.B#37H,&222H;时间计数值黄灯显示时间MOV.B#0,&20CH;第9灯显示值(亮与熄)MOV.B#28H,&203H;第二模块:红黄红MOV.B#2H,&223HMOV.B#0,&20dHMOV.B#23H,&206H;第三模块MOV.B#37H,&224HMOV.B#0,&20eHMOV.B#28H,&209H;第四模块MOV.B#2H,&225HMOV.B#0,&20fHMOV.B#7,&226HTR_RUN8CMP.B#84,&220H;进行了84秒之后JNZTR_RUN9MOV.B#24H,&200H;第一模块8灯显示值:红红绿MOV.B#37H,&222H;时间计数值黄灯显示时间MOV.B#1,&20CH;第9灯显示值MOV.B#22H,&203H;第二模块:绿红绿MOV.B#20H,&223HMOV.B#1,&20dHMOV.B#24H,&206H;第三模块MOV.B#37H,&224HMOV.B#1,&20eHMOV.B#22H,&209H;第四模块MOV.B#20H,&225HMOV.B#1,&20fHMOV.B#8,&226HTR_RUN9CMP.B#104,&220H;进行了86秒之后JNZTR_RUNENDMOV.B#0FFH,&220H;220H复位MOV.B#0,&226HTR_RUNENDRET;P1.0用于输出闪光灯,P1.2用于检测是否有违章车辆,为输入INIT_P1MOV.B#02,&P1DIR;P1.0输出,P1.2输入MOV.B#02,&P1OUT;平常不闪光,为高电平BIC.B#04H,&P1IES;P1.2上升沿中断BIS.B#04H,&P1IE;P1.2允许中断RET;RAM单元初始化INIT_RAMMOV.B#0,&220H;秒计数单元MOV.B#0,&221H;0.75秒计数单元MOV.B#0,&227HMOV.B#0,&228H;0.3秒MOV.B#0,&226H;交通灯工作(运行)状态标志单元MOV.B#20H,&200H;第一模块8灯显示值MOV.B#47H,&222H;时间计数值MOV.B#0,&20CH;第9灯显示值;*MOV.B#23H,&203H;第二模块MOV.B#67H,&223HMOV.B#0,&20DH;*MOV.B#20H,&206H;第三模块MOV.B#47H,&224HMOV.B#0,&20EH;*MOV.B#23H,&209H;第四模块MOV.B#67H,&225HMOV.B#0,&20FHRETDIS_12PUSHR4;显示12个数据到显示器PUSHR5BIC.B#04H,&P2OUT;先不让灯亮,以免不该亮的灯被164扫亮BIC.B#08H,&P2OUT;分别用P22,P23,P24,P25控制BIC.B#010H,&P2OUT;4个模块的灯与数码管的显示BIC.B#020H,&P2OUT;高电平有效,用三极管反向驱动MOV.B#12,R5DIS_121MOV.B1FFH(R5),R4CALL#DIS_1DEC.BR5JNZDIS_121BIS.B#04H,&P2OUTBIS.B#08H,&P2OUTBIS.B#010H,&P2OUTBIS.B#020H,&P2OUTPOPR5POPR4RETDIS_1PUSHR5PUSHR4MOV#8,R5;显示一个数字MOV.BDIS_TAB(R4),R4LOOP:RLC.BR4JCLOOP1;C=1JMPP2.0=1BIC.B#1,&P2OUTJMPLOOP2LOOP1BIS.B#1,&P2OUTLOOP2CALL#CLK164DECR5JNZLOOPPOPR4POPR5RET;下面的子程序将每个显示模块的计数值拆分为两个显示数据,十位和个位;同时要判断十位数据是否要将小数点输出用于第9盏交通灯的显示;如果要,则对应数据加10,