失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 【Proteus仿真】51单片机汇编数显大型交通灯控制

【Proteus仿真】51单片机汇编数显大型交通灯控制

时间:2023-11-16 22:37:21

相关推荐

【Proteus仿真】51单片机汇编数显大型交通灯控制

【Proteus仿真】51单片机汇编数显大型交通灯控制

Proteus仿真

学汇编的人虽然 不多,但是还是有的,分享一个汇编的案例,给需要的人予以参考学习,有些时候我们还是需要懂一些汇编指令比较好。

汇编代码(.asm)

;------------------------------------;程序实现功能;西南北路口直行与转弯交替通行,数码管显示直行通行倒计时,红绿黄灯显示包括人行道在内的道路交通状态。;某一方向道路拥挤时,可以人工控制调节东西南北方向通行时间。;紧急情况时,各路口交通灯显示红灯,数码管保持数据不变。;工作寄存器及存储单元分配;1.工作寄存器;R2设置为定时器定时中断次数,R6、R7用于延时程序中的寄存器;2.片内存储单元;30H、31H作为两组数码管显示数据存储单元;32H、33H作为交通灯初始状态存储单元;40H、41H作为交通灯显示数据存储单元;3.标志位;00H:南北通行标志位 ; 01H:东西通行标志位;02H:紧急事件标志位 ;-----------------------------------SNF EQU 00H ;;;南北通行标志位EWF EQU 01H ;;;东西通行标志位URF EQU 02H ;;;紧急事件标志位ORG 0000HLJMP MAIN ;;;上电转主程序ORG 000BH;;;定时中断入口LJMP DSZDORG 0003H;;;紧急中断入口LJMP URZDORG 0030H MAIN: LCALL INIT ;;;调用初始化子程序LOOP: LCALL DIS ;;;循环执行显示子程序AJMP LOOP;///初始化程序INIT: SETB SNF SETB EWF SETB URF MOV R2,#20 ;;;定时器中断20次为1sMOV TMOD,#01H;;;初始化定时器MOV TL0,#0B0HMOV TH0,#3CHSETB EA ;;;开定时中断与紧急中断SETB ET0SETB TR0SETB EX0SETB IT0 ;;;设置中断程控方式MOV DPTR,#TAB;;;数值首地址放入DPTR中MOV 40H,#40 ;;;东南西北通行时间设置MOV 41H,#40MOV 30H,#40 ;;;通行时间初始化MOV 31H,#60MOV P0,#4CH ;;;初始化时南北通行并把交通灯状态分别放在32H和33H中MOV 32H,#4CHMOV P2,#15HMOV 33H,#15HRET;显示子程序DIS: MOV P3,#0DFH ;;;选中南北方向的十位数码管MOV A,30H;;;把显示数据送人数码管显示MOV B,#10DIV ABMOVC A,@A+DPTRMOV P1,A ;;;LCALL D1MSMOV P3,#0EFH ;;;选中南北方向的个位数码管MOV A,B ;;;送入数码管显示MOVC A,@A+DPTRMOV P1,ALCALL D1MSMOV P3,#7FH ;;;选中第东西方向的十位数码管MOV A,31H;;;送入数码管显示MOV B,#10DIV ABMOVC A,@A+DPTRMOV P1,ALCALL D1MSMOV P3,#0BFH ;;;选中第东西方向的个位数码管MOV A,BMOVC A,@A+DPTRMOV P1,ALCALL D1MSSETB P3.0SETB P3.1JNB P3.0,DIS_S;;;查询是否第一个按键按下JNB P3.1,DIS_E;;;查询是否第二个按键按下AJMP DIS_R;;;没有键按下则返回DIS_S:LCALL D5MS ;;;按键去抖JNB P3.0,DIS_SNAJMP DIS_R DIS_SN:MOV 40H,#50 ;;;对通行时间从新分配,南北通行时间加长MOV 41H,#30AJMP DIS_RDIS_E:LCALL D5MS ;;;按键去抖JNB P3.1,DIS_EW AJMP DIS_RDIS_EW:MOV 40H,#30 ;;;东西通行时间加长MOV 41H,#50DIS_R:RET ;///定时中断处理程序DS_C: LJMP DS_R ;;;接力跳转DSZD: PUSH ACC ;;;保护现场PUSH PSWCLR TR0 ;;;关定时器及中断标志位并重新赋值CLR TF0MOV TL0,#0B0HMOV TH0,#3CHDJNZ R2,DS_C ;;;判断1m时间是否到达MOV R2,#20 ;;;到达重新赋值DEC 30H ;;;南北方向通行时间减一MOV A,30H;;;把减一后的时间送入显示存储单元;;;;;;;南北通行到达最后4秒时黄灯闪烁DS_10:CJNE A,#4,DS_11;;;如果通行时间剩余4秒JNB SNF,DS_11;;;判断是否是南北通行MOV P0,#8AH MOV 32H, #8AH;;;把交通灯状态存入存储单元(后面类似)DS_11:CJNE A,#3,DS_12;;;不是剩余3秒,返回JNB SNF,DS_12;;;不是南北通行时间,返回MOV P0,#88HMOV 32H, #88HDS_12:CJNE A,#2,DS_13JNB SNF,DS_13MOV P0,#8AHMOV 32H, #8AH DS_13:CJNE A,#1,DS_14JNB SNF,DS_14MOV P0,#88HMOV 32H, #88H;------------------------DS_14:JNZ DS_NE;;;通行时间没有结束转向改变东西方向的数码管CPL SNF ;;;如果通行时间结束则对标志位取反JNB SNF,DS_1 ;;;判断是否南北通行MOV 30H,40H ;;;是,点亮相应的交通灯MOV P0,#4CHMOV 32H,#4CH ;;;存储交通灯状态MOV P2,#15HMOV 33H, #15H;;;存储交通灯状态DS_NE:DEC 31H ;;;东西方向通行时间减一MOV A,31H;;;把通行剩余时间送入显示存储单元;;;;;;;;东西方向通行时间剩余4秒钟黄灯闪烁(程序注释与南北方向类似 略)DS_20:CJNE A,#4,DS_21 JB EWF,DS_21MOV P0,#51HMOV 32H, #51HDS_21:CJNE A,#3,DS_22JB EWF,DS_22MOV P0,#41HMOV 32H, #41HDS_22:CJNE A,#2,DS_23JB EWF,DS_23MOV P0,#51HMOV 32H, #51HDS_23:CJNE A,#1,DS_24JB EWF,DS_24MOV P0,#41HMOV 32H, #41H;-----------------------------DS_24:JNZ DS_R ;;;东西方向时间没有结束,返回CPL EWF ;;;对通行状态取反JNB EWF,DS_2 ;;;东西方向通行时间到来,跳转MOV 31H,#80;;;东西方向通行结束,重新显示时间MOV P0,#89H;;;点亮相应的交通灯MOV 32H, #89HMOV P2,#29HMOV 33H, #29HAJMP DS_RDS_1: MOV 30H,#80;;;南北通行时间结束,重新对显示存储单元赋值MOV P0,#89H;;;执行转弯状态1MOV 32H, #89HMOV P2,#26HMOV 33H, #26HAJMP DS_NE DS_2: MOV 31H,41H ;;;东西方向开始通行,赋值予显示存储单元MOV P0,#61H ;;;点亮相应的交通灯MOV 32H, #61HMOV P2,#15HMOV 33H, #15HDS_R: SETB TR0 POP PSW ;;;恢复现场POP ACCRETI;/紧急中断处理程序URZD: PUSH ACC ;;;保护现场PUSH PSWCLR IE0 ;;;清除中断标志位CLR TR0 ;;;关定时器CPL URF ;;;紧急事件标志位JB URF,UR_CON;;;紧急结束;跳转MOV P0,#49H ;;;各路口灯全显示红灯亮MOV P2,#15HAJMP UR_RUR_CON:SETB TR0 ;;;恢复正常交通MOV A,32HMOV P0,AMOV A,33HMOV P2,AUR_R: POP PSW ;;;恢复现场POP ACCRETI;查表指令0,1,2,3,4,5,6,7,8,9TAB: DB 3FH, 06H, 5BH, 4FH, 66H, 6DHDB 7DH, 07H, 7FH, 6FH;//延时5ms与1msD5MS: MOV R7,#5D1MS: MOV R7,#10MOV R6,#50 L1: DJNZ R6,$DJNZ R7,L1RETEND

程序源码和仿真资源

链接:/s/1-WNOVGuLaWNsNddi-PxUnw 提取码:awrt

如果觉得《【Proteus仿真】51单片机汇编数显大型交通灯控制》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。