|
如题你们要的汇编版本
几年没碰过汇编了,有些生疏。写了三种形式的,程序有不足的地方请见谅,话也不多说
直接 ~giao 啊!!!不对 直接上程序、仿真
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- /**************************第一种**************************************************
- RED_A EQU P0.0
- YELLO_A EQU P0.1
- GREE_A EQU P0.2
- RED_B EQU P0.3
- YELLO_B EQU P0.4
- GREE_B EQU P0.5
- ORG 0000H
- AJMP START
- ORG 0030H
- AJMP MAIN
- START:MOV P0,#0FFH
- CLR RED_A //东西 南北方向红灯亮
- CLR RED_B
- LCALL DELAY2S
- MOV P0,#0F7H //消影
- MAIN:MOV R3,#3 //闪烁次数设置为3
-
- LOOP1:CLR GREE_A //东西方向绿灯亮
- CLR RED_B //南北方向红灯亮
- LCALL DELAY10S
- MOV P0,#0F5H
- TOP1:CLR YELLO_A //东西方向黄灯亮
- LCALL DELAY100MS //调用100ms延时
- SETB YELLO_A //东西方向黄灯灭
- LCALL DELAY100MS
- DJNZ R3,TOP1
- MOV P0,#0DEH //南北绿灯亮 东西红灯亮
- LOOP2:CLR GREE_B //南北方向绿灯亮
- CLR RED_A //东西方向红灯亮
- LCALL DELAY10S
- MOV R3,#3 //赋值南北方向黄灯闪烁次数
- MOV P0,#0FEH
- TOP2:CLR YELLO_B //南北方向黄灯亮
- LCALL DELAY100MS //调用延时
- SETB YELLO_B //南北方向黄灯灭
- LCALL DELAY100MS //
- DJNZ R3,TOP2 //R3减1若不等于0跳转至TOP2处执行,执行3次从而达到闪烁
- //R3减1等于0则顺序执行
- MOV P0,#0F7H //东西方向绿灯 南北方向红灯
- LJMP MAIN //跳转至MAIN处循环执行
- DELAY100MS:MOV R5,#4 //定时100ms @11.0592MHz
- MOV R6,#93
- MOV R7,#152
- NEXT:DJNZ R7,NEXT
- DJNZ R6,NEXT
- DJNZ R5,NEXT
- RET
- DELAY2S:MOV R7,#20 //延时2S子程序
- MOV R6,#200
- MOV R5,#248
- B1:DJNZ R5,B1
- DJNZ R6,B1
- DJNZ R7,B1
- RET
- DELAY10S:MOV R5,#81 //延时10S
- MOV R6,#47
- MOV R7,#121
- D1:DJNZ R7,D1
- DJNZ R6,D1
- DJNZ R5,D1
- RET
- END
- ****************************************************************************************/
-
- /*****************************第二种********************/
- ORG 0100H //预留空间
- START:MOV A, #0F6H //初始化
- MOV P0, A //东西南北全红(P0口地址)
- LCALL DELAY //鉴于空间的大小,这里选用LCALL作为调用函数
- LOOP:MOV P0,#0F3H //东西绿灯亮 南北红的亮
- ACALL DTIME //进入定时器中断
- MOV R0,#3 //闪烁次数 3
- LOOP1:MOV P0,#0F5H //东西黄灯闪烁,南北红灯
- ACALL DTIME1 // ||
- MOV P0,#0F7H // ||
- ACALL DTIME1 //
- DJNZ R0,LOOP1 //判断是否闪烁了3次,满足则执行下一条指令,反之回到LOOP1处继续执行
- MOV P0,#0DEH //南北绿灯,东西红灯
- ACALL DTIME
-
- MOV R0,#3
- LOOP2:MOV P0,#0EEH //南北黄灯闪,东西红灯
- ACALL DTIME1
- MOV P0,#0FEH
- ACALL DTIME1
- DJNZ R0,LOOP2
- JMP LOOP
-
- DTIME1:MOV TMOD,#01H //定时器T0工作在方式1 @11.0592MHz
- MOV TH0,#3CH //定时器高四位
- MOV TL0,#0B0H //定时器低四位
- MOV R6,#10 //定时0.5S R6赋值20表示1S 10*50ms=500ms=0.5s
- SETB TR0 //启动定时0 20*50ms=1000ms=1s
- WM:JBC TF0,NEXT1 //判断中断溢出位为1则清零,并跳转到NEXT1
- AJMP WM
- NEXT1:DJNZ R6,NEXT2 //定时0.5S,时间到则返回进入前位置继续执行
- RET
- NEXT2:MOV TH0,#3CH //重装定时器初值
- MOV TL0,#0B0H
- AJMP WM
- RET
- DTIME:MOV TMOD,#01H //定时器T0工作在方式1
- MOV TH0,#3CH //定时初值
- MOV TL0,#0B0H //定时时间 50ms
- MOV R6,#20 //1s时间到
- MOV R7,#2 //为了方便调试 绿灯亮2S 35s定时则为MOV R7,#35
- SETB TR0 //20*500ms*2=2s
- LM:JBC TF0,NEXT //判断中断溢出位为1则清零,并跳转到NEXT
- AJMP LM //检测50ms是否到
- NEXT: DJNZ R6,NEXT4
- DJNZ R7,NEXT3
- AJMP JS
- NEXT3:MOV R6,#20 //重装定时器初值
- NEXT4:MOV TH0,#3CH
- MOV TL0,#0B0H
- AJMP LM //检测50ms是否到
- JS:RET
- DELAY: MOV R7,#50 //延时5S子程序
- DL1:MOV R6,#200
- DL2:MOV R5,#248
- DJNZ R5,$
- DJNZ R6,DL2
- DJNZ R7,DL1
- RET
- END
- /**************************第二种*****************************************************
- ORG 0000H
- LJMP START
- ORG 0030H
- START:
- MOV A, #0F6H
- MOV P0, A ;东西南北全红(P0口地址)
- LCALL DELAY ;鉴于空间的大小,这里选用LCALL作为调用函数
- MAIN:
- MOV A,#11110011B ;东西车道绿灯亮,通行;南北车道红灯亮,禁止通行
- MOV P0, A ;CPU中断
- LCALL DELAY2 ;调用延时子程序
- MOV R1,#3
- LOOP1:
- MOV A,#11110101B ;东西车道黄灯闪烁,南北车道红灯亮,禁止通行
- MOV P0, A
- LCALL DELAY1 ;CPU中断,调用函数
- MOV A,#11110111B
- MOV P0, A
- LCALL DELAY1
- DJNZ R1,LOOP1
- MOV A,#11011110B ;东西车道红灯亮,禁止通行,南北车道绿灯亮,通行
- MOV P0, A
- LCALL DELAY2
- MOV R2,#3
- LOOP2:
- MOV A,#11101110B ;东西车道红灯亮,禁止通行,南北车道黄灯闪烁
- MOV P0, A
- LCALL DELAY1
- MOV A,#11111110B
- MOV P0, A
- LCALL DELAY1
- DJNZ R2,LOOP2
- LJMP MAIN ;跳转程序
- DELAY: MOV R7,#20 ;延时2S子程序
- DL1:MOV R6,#200
- DL2:MOV R5,#248
- DJNZ R5,$
- DJNZ R6,DL2
- DJNZ R7,DL1
- RET
- DELAY1: MOV R5, #3 ;黄灯闪烁3次程序
- Y1: MOV R6, #200
- Y2: MOV R7, #248
- X1: DJNZ R7, X1
- DJNZ R6, Y2
- DJNZ R5, Y1
- RET
- DELAY2: MOV R5, #50 ;绿灯通行延时程序
- D1: MOV R6, #200
- D2: MOV R7, #248
- D3:
- DJNZ R7, D3
- DJNZ R6, D2
- DJNZ R5, D1
- RET
- END
- */
复制代码
所有资料51hei提供下载:
交通灯.7z
(132.36 KB, 下载次数: 46)
|
评分
-
查看全部评分
|