基于MSP430的交通灯控制系统
- 格式:doc
- 大小:315.50 KB
- 文档页数:21
2012-2013学年第二学期山东科技大学电工电子实验教学中心创新性实验研究报告实验项目名称用MSP430单片机实现的交通灯控制组长姓名孟鹏学号联系电话E-mail成员姓名郑阳学号成员姓名学号专业自动化班级指导教师及职称2013年6月20日四、实验内容交通灯程序清单:;用164驱动所有灯以及数码管的显示;149为中央控制器;RAM使用情况:;显示缓存为200H开始以后的12字节,;200H~202H为第一块显示模块的显示数据;203H~205H为第二块显示模块的显示数据;206H~208H为第三块显示模块的显示数据;209H~20BH为第四块显示模块的显示数据;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"ORG 01000h ;msp430f149 FLASH STARTRESET mov.w #300h,SP ; Initialize stackpointerStopWDT mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop WDTSetupTA mov.w #TASSEL1+TACLR,&TACTL ; SMCLK, clear TARSetupC0 mov.w #CCIE,&CCTL0 ; CCR0 interrupt enabledmov.w #35000,&CCR0 ;SetupP1 bis.b #001h,&P1DIR ; P1.0 outputbis.w #MC1,&TACTL ; Start Timer_a in continous modeMOV.B #0FFH,&P2DIR ;P2.0为数据输出端,P2.1为时钟输出端 CALL #INIT_RAMCALL #INIT_P1eintM JMP M;定时器中断服务程序TA0_ISR CALL #DIS_12INC.B &221HCMP.B #12,&221H ;0.075秒 INC 12JNZ TA0ENDMOV.B #0,&221H ;1秒CALL #TR_CONTCALL #TR_RUNCALL #DATA_TO_DISINC.B &220H ;加1,220H的内容作为交通灯运行的时间参考CMP.B #106,&220H ;整个过程为106秒JNZ TA0ENDMOV.B #0,&220HTA0END CALL #FLASH_TOadd.w #60000,&CCR0 ; Add Offset to CCR0reti;P1口中断服务程序,在非绿灯时间段内,如果有车通过,则开闪光灯P1_INT BIC.B #04H,&P1IFGPUSH.B &226HDINTPUSH R15MOV #500,R15P1_INTLOOP1 DEC R15 ;延时消除抖动JNZ P1_INTLOOP1POP R15BIT.B #04H,&P1INJZ P1_INTENDCLRC ;判断是否为禁止通行时段SUB.B #2,&226H ;运行状态标志小于 5 时允许通行,其他时间不能通行 JNC P1_INTENDBIC.B #01H,&P1OUTBIC.B #02H,&P1OUTPUSH R15MOV #25000,R15P1_INTLOOP2 DEC R15JNZ P1_INTLOOP2POP R15NOPBIS.B #02H,&P1OUTBIS.B #1,&P1OUTP1_INTEND ADD.B #2,&226HPOP.B &226HEINTRETIFLASH_TO NOPPUSH.B &220HCLRCSUB.B #44,&220H ;45~47秒为前后直行绿灯闪烁时间JNC FLASH_TO1POP.B &220HPUSH.B &220HCLRCSUB.B #46,&220HJNC FLASH_TO1 ;是否小于47CMP.B #1,&226H ;是否为运行状态1JNZ FLASH_TO1BIT.B #2,&221H ;是否为0.4秒JNZ FLASH_END1 ;如果都不是则跳转MOV.B #29H,&206H ;如果条件满足,则闪烁MOV.B #29H,&200H ;先写入绿灯不亮的显示码JMP FLASH_TO1FLASH_END1 MOV.B #21H,&200HMOV.B #21H,&206H ;再写入绿灯亮的显示码JMP FLASH_TO1FLASH_TO1 POP.B &220HPUSH.B &220HCLRCSUB.B #61,&220H ;61~64秒为前后路左右转弯绿灯闪烁时间 JNC FLASH_TO2 ;同时也是左右路右转弯绿灯闪烁时间POP.B &220HPUSH.B &220HCLRCSUB.B #64,&220HJNC FLASH_TO2 ;是否小于64CMP.B #4,&226H ;是否为运行状态4BIT.B #2,&221H ;是否为0.4秒JNZ FLASH_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,&20EHJMP FLASH_TO2FLASH_END2 MOV.B #22H,&200H ;再写入绿灯亮的显示码MOV.B #22H,&206HMOV.B #1,&20CHMOV.B #1,&20EHMOV.B #1,&20DHMOV.B #1,&20FHJMP FLASH_TO2FLASH_TO2 POP.B &220HPUSH.B &220HCLRCSUB.B #78,&220H ;78~81秒为左右路直行绿灯闪烁时间 JNC FLASH_TO3POP.B &220HPUSH.B &220HCLRCSUB.B #81,&220HJNC FLASH_TO3 ;是否小于81CMP.B #6,&226H ;是否为运行状态6JNZ FLASH_TO3BIT.B #2,&221H ;是否为0.4秒JNZ FLASH_END3 ;如果都不是则跳转MOV.B #2CH,&203H ;先写入绿灯不亮的显示码MOV.B #2CH,&209HJMP FLASH_TO3FLASH_END3 MOV.B #20H,&203HMOV.B #20H,&209H ;再写入绿灯亮的显示码FLASH_TO3 POP.B &220HRETTR_CONT CLRC ;所有模块上的计数器减一计数 DADD.B #99H,&222HCLRCDADD.B #99H,&223HCLRCDADD.B #99H,&224HCLRCDADD.B #99H,&225HRET;交通灯的运行TR_RUN CMP.B #0,&220H ;进行了47秒之后JNZ TR_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_RUN1 CMP.B #27,&220H ;进行了47秒之后JNZ TR_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 #24H,&209H ;第四模块:红红绿MOV.B #67H,&225HMOV.B #01,&20fHMOV.B #1,&226HTR_RUN2 CMP.B #47,&220H ;进行了47秒之后JNZ TR_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_RUN4 CMP.B #49,&220H ;进行了47秒之后JNZ TR_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_RUN5 CMP.B #65,&220H ;进行了65秒之后JNZ TR_RUN6MOV.B #26H,&200H ;第一模块8灯显示值:黄红黄 MOV.B #2H,&222H ;时间计数值黄灯显示时间MOV.B #0,&20CH ; 第9灯显示值MOV.B #27H,&203H ;第二模块: 红红黄MOV.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_RUN6 CMP.B #67,&220H ;进行了67秒之后JNZ TR_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_RUN7 CMP.B #82,&220H ;进行了82秒之后JNZ TR_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_RUN8 CMP.B #84,&220H ;进行了84秒之后JNZ TR_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_RUN9 CMP.B #104,&220H ;进行了86秒之后JNZ TR_RUNENDMOV.B #0FFH,&220H ;220H复位MOV.B #0,&226HTR_RUNEND RET;P1.0用于输出闪光灯, P1.2用于检测是否有违章车辆,为输入INIT_P1 MOV.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_RAM MOV.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_12 PUSH R4 ;显示12个数据到显示器PUSH R5BIC.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_121 MOV.B 1FFH(R5),R4CALL #DIS_1DEC.B R5JNZ DIS_121BIS.B #04H,&P2OUTBIS.B #08H,&P2OUTBIS.B #010H,&P2OUTBIS.B #020H,&P2OUTPOP R5POP R4RETDIS_1 PUSH R5PUSH R4MOV #8,R5 ;显示一个数字MOV.B DIS_TAB(R4),R4LOOP: RLC.B R4JC LOOP1 ;C=1 JMP P2.0=1BIC.B #1,&P2OUTJMP LOOP2LOOP1 BIS.B #1,&P2OUTLOOP2 CALL #CLK164DEC R5JNZ LOOPPOP R4POP R5RET;下面的子程序将每个显示模块的计数值拆分为两个显示数据,十位和个位;同时要判断十位数据是否要将小数点输出用于第9盏交通灯的显示;如果要,则对应数据加10,因为在显示段码表中,;0~9为对应的数字段码,10~19有小数点输出DATA_TO_DIS MOV.B &222H,&201H ;200H~202H为第一块显示模块的显示数据MOV.B &222H,202HAND.B #0FH,&202HRRA.B &201HRRA.B &201HRRA.B &201HRRA.B &201HAND.B #0FH,&201HTST.B &20CH ;测试第9盏灯是否显示,如果要显示,则+10到201H JZ DATA_TO_D1ADD.B #10,&201HDATA_TO_D1 MOV.B &223H,&205H ;203H~205H为第二块显示模块的显示数据MOV.B &223H,204HAND.B #0FH,&205HRRA.B &204HRRA.B &204HRRA.B &204HRRA.B &204HAND.B #0FH,&204HTST.B &20DHJZ DATA_TO_D2ADD.B #10,&204HDATA_TO_D2 MOV.B &224H,&207H ;206H~208H为第三块显示模块的显示数据MOV.B &224H,208HAND.B #0FH,&208HRRA.B &207HRRA.B &207HRRA.B &207HRRA.B &207HAND.B #0FH,&207HTST.B &20EHJZ DATA_TO_D3ADD.B #10,&207HDATA_TO_D3 MOV.B &225H,&20BH ;209H~20BH为第四块显示模块的显示数据MOV.B &225H,20AHAND.B #0FH,&20BH山东科技大学电工电子实验教学中心创新性实验研究报告RRA.B &20AHRRA.B &20AHRRA.B &20AHRRA.B &20AHAND.B #0FH,&20AHTST.B &20FHJZ DATA_TO_D4ADD.B #10,&20AHDATA_TO_D4 RETCLK164 BIS.B #2,&P2OUT ;1BIC.B #2,&P2OUT ;0RET;LED与164的连接 : a-Q6,;b-Q7,;c_Q1,;d-Q2,;e-Q3,;f-Q5,;g-Q4,;h-Q0DIS_TAB DB 0EEH,082H,0DCH,0D6H,0B2H ;0~4DB 076H,07EH,0C2H,0FEH,0F6H ;5~9DB 0EFH,083H,0DDH,0D7H,0B3H ;0.~4.DB 077H,07FH,0C3H,0FFH,0F7H ;5.~9.(0...~14H)DB 0,0,0,0,0,0,0,0,0,0,0,0 ;(15H~1FH)DB 34H,24H,48H,70H,60H ;(20H~24H) 0,1,1,0,1;交通灯显示码:红绿红,红绿绿,绿红绿,红红红,红红绿DB 21H,0C2H,0E0H,31H ;(25H~28H) 1,0,0,0;交通灯显示码:红黄绿,黄红黄,红红黄,红黄红DB 20H,40H,60H,30H ;(29H~2CH) 1,0,0,0;以上4个灯码在闪烁时使用,为绿灯不亮的灯码ORG 0FFFEh ; MSP430 RESET VectorDW RESET ;ORG 0FFF2h ; Timer_A0 VectorDW TA0_ISR ;ORG 0FFE4HDW P1_INTEND。