
这段汇编语言 求解释~ 20
*****************************************SECEQU36H;秒DEDAEQU37H;毫秒ORG0000HSJMPSTARTORG...
*****************************************
SEC EQU 36H ;秒
DEDA EQU 37H ;毫秒
ORG 0000H
SJMP START
ORG 0BH ;T0中断入口
JMP TIM0
ORG 30H
START:
MOV SP,#46H
MOV A,#0FFH
MOV P1,A
MOV A,#0
MOV P0,A
MOV P2,A
MOV P3,A
MOV DEDA,#0
MOV SEC,#0
MOV TMOD,#11H
MOV TL0,#0B0H
MOV TH0,#3CH
SETB EA
SETB ET0
SETB TR0
START1:
NOP
NOP
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
MOV A,#11101101B
MOV P1,A ;双方向黄灯亮3秒
BK1:
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
MOV A,SEC ;S
NOP
NOP
CJNE A,#3,BK1 ;
MOV A,DEDA ;MS
NOP
NOP
CJNE A,#19,BK1
MOV A,#10110011B
MOV P1,A ;主干道绿灯亮、次干道红亮
MOV DEDA,#0
MOV SEC,#0
BK2:
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
MOV A,SEC
NOPNOP
CJNE A,#41,BK2 ;CPL P1.2
MOV R0,#8 ;
BK3:
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
MOV A,DEDA
NOPNOP
CJNE A,#10,BK3CPL P1.2
MOV DEDA,#0
DJNZ R0,BK3
MOV A,#11101101B
MOV P1,A ;双方向黄灯亮3秒MOV DEDA,#0
MOV SEC,#0
BK4:
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
MOV A,SECNOPNOPCJNE A,#3,BK4 ;
MOV A,DEDA
NOPNOP
CJNE A,#19,BK4
MOV A,#01011110B
MOV P1,A ;主干道红灯亮、次干绿道亮
MOV DEDA,#0
MOV SEC,#0
BK5:
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
MOV A,SEC
NOPNOP
CJNE A,#27,BK5CPL P1.5
MOV R0,#8 ;
BK6:
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
MOV A,DEDA
NOPNOP
CJNE A,#10,BK6CPL P1.5
MOV DEDA,#0
DJNZ R0,BK6
MOV DEDA,#0
MOV SEC,#0
JMP START1
TIM0:PUSH ACC ;T0中断子程序
PUSH PSW
MOV TL0,#0B0H
MOV TH0,#3CH
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
INC DEDA ;MS
MOV A,DEDA
NOPNOP
CJNE A,#14H,TT1
MOV DEDA,#0
INC SEC ;
STT1:
POP PSW
POP ACC
RETI
NOPNOPNOP
AJMP START1
SJMP $
END 展开
SEC EQU 36H ;秒
DEDA EQU 37H ;毫秒
ORG 0000H
SJMP START
ORG 0BH ;T0中断入口
JMP TIM0
ORG 30H
START:
MOV SP,#46H
MOV A,#0FFH
MOV P1,A
MOV A,#0
MOV P0,A
MOV P2,A
MOV P3,A
MOV DEDA,#0
MOV SEC,#0
MOV TMOD,#11H
MOV TL0,#0B0H
MOV TH0,#3CH
SETB EA
SETB ET0
SETB TR0
START1:
NOP
NOP
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
MOV A,#11101101B
MOV P1,A ;双方向黄灯亮3秒
BK1:
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
MOV A,SEC ;S
NOP
NOP
CJNE A,#3,BK1 ;
MOV A,DEDA ;MS
NOP
NOP
CJNE A,#19,BK1
MOV A,#10110011B
MOV P1,A ;主干道绿灯亮、次干道红亮
MOV DEDA,#0
MOV SEC,#0
BK2:
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
MOV A,SEC
NOPNOP
CJNE A,#41,BK2 ;CPL P1.2
MOV R0,#8 ;
BK3:
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
MOV A,DEDA
NOPNOP
CJNE A,#10,BK3CPL P1.2
MOV DEDA,#0
DJNZ R0,BK3
MOV A,#11101101B
MOV P1,A ;双方向黄灯亮3秒MOV DEDA,#0
MOV SEC,#0
BK4:
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
MOV A,SECNOPNOPCJNE A,#3,BK4 ;
MOV A,DEDA
NOPNOP
CJNE A,#19,BK4
MOV A,#01011110B
MOV P1,A ;主干道红灯亮、次干绿道亮
MOV DEDA,#0
MOV SEC,#0
BK5:
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
MOV A,SEC
NOPNOP
CJNE A,#27,BK5CPL P1.5
MOV R0,#8 ;
BK6:
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
MOV A,DEDA
NOPNOP
CJNE A,#10,BK6CPL P1.5
MOV DEDA,#0
DJNZ R0,BK6
MOV DEDA,#0
MOV SEC,#0
JMP START1
TIM0:PUSH ACC ;T0中断子程序
PUSH PSW
MOV TL0,#0B0H
MOV TH0,#3CH
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
INC DEDA ;MS
MOV A,DEDA
NOPNOP
CJNE A,#14H,TT1
MOV DEDA,#0
INC SEC ;
STT1:
POP PSW
POP ACC
RETI
NOPNOPNOP
AJMP START1
SJMP $
END 展开
3个回答
展开全部
是一段路口信号灯控制程序。
给你解释这么多,才20分,太不值了。
////////////////////////////////////////////////////////////////////
开始预定义了两个变量名,秒和毫秒
SEC EQU 36H ;秒
DEDA EQU 37H ;毫秒
这里是51程序入口地址,这里只能放跳转语句,因为后面是中断向量表,跳转到主程序,start标号
ORG 0000H
SJMP START
这里是T0中断入口,跳转到TIM0中断服务程序。
ORG 0BH ;T0中断入口
JMP TIM0
/////////////////////////////////////////////////////////////////////////////
////这一段是主程序,开始做一些初始化工作,就进入主循环,是个死循环,一直循环干活。////
ORG 30H
START:
设置堆栈地址。
MOV SP,#46H
设置P1口为输出高电平,后面程序看出,P1口对应的是信号灯开关,设成高电平表示所有灯全部关
闭
MOV A,#0FFH
MOV P1,A
这里设置P0、P2、P3口全部为低电平输出
MOV A,#0
MOV P0,A
MOV P2,A
MOV P3,A
初始化秒跟毫秒两个内存变量为0.从0开始计时
MOV DEDA,#0
MOV SEC,#0
配置定时器工作方式,中断时间,后面看来这个定时器时间常数应该是50ms中断的,这个常数要根
据晶振频率来计算的。
MOV TMOD,#11H
MOV TL0,#0B0H
MOV TH0,#3CH
开启中断、开启T0中断,
SETB EA
SETB ET0
SETB TR0
这里是主循环入口,就是后面的程序都运行完了要跳回这里,不是跳到主程序开头,否则就又关灯清
零了
START1:
NOP
NOP
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
双向黄灯亮三秒,这两句就是点亮黄灯,看出来P1.4是一个方向的黄灯,P1.1是另一个方向黄灯。
MOV A,#11101101B
MOV P1,A ;双方向黄灯亮3秒
这一段原地循环,检查秒是不是到3,到三就继续,不到三就原地等待。
BK1:
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
MOV A,SEC ;S
NOP
NOP
CJNE A,#3,BK1 ;
这几行再检查毫秒计数是不是到19,毫秒计数的单位应该是50毫秒记一个,这样就是又等了一秒。
MOV A,DEDA ;MS
NOP
NOP
CJNE A,#19,BK1
这里点亮主干道绿灯,次干道红灯,看来P1.2是主干道绿灯,P1.3是主干道红灯。
MOV A,#10110011B
MOV P1,A ;主干道绿灯亮、次干道红亮
清零秒和毫秒的计数
MOV DEDA,#0
MOV SEC,#0
这一段就是要等41秒,不到就原地等待,维持主干道绿灯,次干道红灯亮
BK2:
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
MOV A,SEC
NOPNOP
CJNE A,#41,BK2 ;
到了40秒,关闭主干道绿灯,是结合这个关闭动作看出来这里是主干绿灯的。
CPL P1.2
这一段就是绿灯反复闪烁4次点亮,4次熄灭,共八次翻转P1.2的操作。每次10×50ms=0.5秒
MOV R0,#8 ;
BK3:
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
MOV A,DEDA
NOPNOP
CJNE A,#10,BK3
CPL P1.2
MOV DEDA,#0
DJNZ R0,BK3
然后双向黄灯亮起,秒计数毫秒计数清零,再等三秒,同前面三秒双向黄灯亮一样的程序
MOV A,#11101101B
MOV P1,A ;双方向黄灯亮3秒
MOV DEDA,#0
MOV SEC,#0
BK4:
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
MOV A,SEC
NOP
NOP
CJNE A,#3,BK4 ;
MOV A,DEDA
NOPNOP
CJNE A,#19,BK4
以下主干道红灯亮,次干道绿灯亮,这个时间是27秒,次干道放行时间短些,程序跟主干道绿灯一
样的
MOV A,#01011110B
MOV P1,A ;主干道红灯亮、次干绿道亮
MOV DEDA,#0
MOV SEC,#0
BK5:
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
MOV A,SEC
NOP
NOP
CJNE A,#27,BK5
CPL P1.5
次干道绿灯结束后,次干道绿灯闪烁4次,每次亮半秒、灭半秒,同主干道一样
MOV R0,#8 ;
BK6:
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
MOV A,DEDA
NOPNOP
CJNE A,#10,BK6
CPL P1.5
MOV DEDA,#0
DJNZ R0,BK6
秒计数清零,毫秒计数清零,跳回主循环,又重新点亮黄灯三秒,开启下一个循环
MOV DEDA,#0
MOV SEC,#0
JMP START1
///////////////////////////////////////////////////////////
这一段是定时器T0中断服务程序
TIM0:
保存现场,ACC和程序状态字保存
PUSH ACC ;T0中断子程序
PUSH PSW
重置时间常数,下次定时中断仍然是50ms以后到来
MOV TL0,#0B0H
MOV TH0,#3CH
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
毫秒计数加1
INC DEDA ;MS
MOV A,DEDA
NOP
NOP
如果毫秒计数不到14H,就是不到20,跳到服务程序结束。
CJNE A,#14H,TT1
如果毫秒计数到了20,清零毫秒计数,秒计数加1。
MOV DEDA,#0
INC SEC ;
TT1: 服务程序结束处理
恢复现场,返回
POP PSW
POP ACC
RETI
后面的程序是没有意义的,正常跑的话不会到这里,意外到了这里就会跳回主循环。
NOP
NOP
NOP
AJMP START1
SJMP $
END
给你解释这么多,才20分,太不值了。
////////////////////////////////////////////////////////////////////
开始预定义了两个变量名,秒和毫秒
SEC EQU 36H ;秒
DEDA EQU 37H ;毫秒
这里是51程序入口地址,这里只能放跳转语句,因为后面是中断向量表,跳转到主程序,start标号
ORG 0000H
SJMP START
这里是T0中断入口,跳转到TIM0中断服务程序。
ORG 0BH ;T0中断入口
JMP TIM0
/////////////////////////////////////////////////////////////////////////////
////这一段是主程序,开始做一些初始化工作,就进入主循环,是个死循环,一直循环干活。////
ORG 30H
START:
设置堆栈地址。
MOV SP,#46H
设置P1口为输出高电平,后面程序看出,P1口对应的是信号灯开关,设成高电平表示所有灯全部关
闭
MOV A,#0FFH
MOV P1,A
这里设置P0、P2、P3口全部为低电平输出
MOV A,#0
MOV P0,A
MOV P2,A
MOV P3,A
初始化秒跟毫秒两个内存变量为0.从0开始计时
MOV DEDA,#0
MOV SEC,#0
配置定时器工作方式,中断时间,后面看来这个定时器时间常数应该是50ms中断的,这个常数要根
据晶振频率来计算的。
MOV TMOD,#11H
MOV TL0,#0B0H
MOV TH0,#3CH
开启中断、开启T0中断,
SETB EA
SETB ET0
SETB TR0
这里是主循环入口,就是后面的程序都运行完了要跳回这里,不是跳到主程序开头,否则就又关灯清
零了
START1:
NOP
NOP
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
双向黄灯亮三秒,这两句就是点亮黄灯,看出来P1.4是一个方向的黄灯,P1.1是另一个方向黄灯。
MOV A,#11101101B
MOV P1,A ;双方向黄灯亮3秒
这一段原地循环,检查秒是不是到3,到三就继续,不到三就原地等待。
BK1:
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
MOV A,SEC ;S
NOP
NOP
CJNE A,#3,BK1 ;
这几行再检查毫秒计数是不是到19,毫秒计数的单位应该是50毫秒记一个,这样就是又等了一秒。
MOV A,DEDA ;MS
NOP
NOP
CJNE A,#19,BK1
这里点亮主干道绿灯,次干道红灯,看来P1.2是主干道绿灯,P1.3是主干道红灯。
MOV A,#10110011B
MOV P1,A ;主干道绿灯亮、次干道红亮
清零秒和毫秒的计数
MOV DEDA,#0
MOV SEC,#0
这一段就是要等41秒,不到就原地等待,维持主干道绿灯,次干道红灯亮
BK2:
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
MOV A,SEC
NOPNOP
CJNE A,#41,BK2 ;
到了40秒,关闭主干道绿灯,是结合这个关闭动作看出来这里是主干绿灯的。
CPL P1.2
这一段就是绿灯反复闪烁4次点亮,4次熄灭,共八次翻转P1.2的操作。每次10×50ms=0.5秒
MOV R0,#8 ;
BK3:
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
MOV A,DEDA
NOPNOP
CJNE A,#10,BK3
CPL P1.2
MOV DEDA,#0
DJNZ R0,BK3
然后双向黄灯亮起,秒计数毫秒计数清零,再等三秒,同前面三秒双向黄灯亮一样的程序
MOV A,#11101101B
MOV P1,A ;双方向黄灯亮3秒
MOV DEDA,#0
MOV SEC,#0
BK4:
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
MOV A,SEC
NOP
NOP
CJNE A,#3,BK4 ;
MOV A,DEDA
NOPNOP
CJNE A,#19,BK4
以下主干道红灯亮,次干道绿灯亮,这个时间是27秒,次干道放行时间短些,程序跟主干道绿灯一
样的
MOV A,#01011110B
MOV P1,A ;主干道红灯亮、次干绿道亮
MOV DEDA,#0
MOV SEC,#0
BK5:
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
MOV A,SEC
NOP
NOP
CJNE A,#27,BK5
CPL P1.5
次干道绿灯结束后,次干道绿灯闪烁4次,每次亮半秒、灭半秒,同主干道一样
MOV R0,#8 ;
BK6:
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
MOV A,DEDA
NOPNOP
CJNE A,#10,BK6
CPL P1.5
MOV DEDA,#0
DJNZ R0,BK6
秒计数清零,毫秒计数清零,跳回主循环,又重新点亮黄灯三秒,开启下一个循环
MOV DEDA,#0
MOV SEC,#0
JMP START1
///////////////////////////////////////////////////////////
这一段是定时器T0中断服务程序
TIM0:
保存现场,ACC和程序状态字保存
PUSH ACC ;T0中断子程序
PUSH PSW
重置时间常数,下次定时中断仍然是50ms以后到来
MOV TL0,#0B0H
MOV TH0,#3CH
MOV 0A6H,#01EH ;看门狗
MOV 0A6H,#0E1H ;看门狗
毫秒计数加1
INC DEDA ;MS
MOV A,DEDA
NOP
NOP
如果毫秒计数不到14H,就是不到20,跳到服务程序结束。
CJNE A,#14H,TT1
如果毫秒计数到了20,清零毫秒计数,秒计数加1。
MOV DEDA,#0
INC SEC ;
TT1: 服务程序结束处理
恢复现场,返回
POP PSW
POP ACC
RETI
后面的程序是没有意义的,正常跑的话不会到这里,意外到了这里就会跳回主循环。
NOP
NOP
NOP
AJMP START1
SJMP $
END
展开全部
数据段定义的数据段
MAX DB 100;伪代码定义 LETH DB的最大数量的;保留字节的数据
BUFF DB 100 DUP(?)和它上面的 BR />数据结束的数据段结束
CODE另一个矩形的代码段
假设DS:DATA,CS:CODE伪代码确定各分部
BGN:MOV AX ,DATA
MOV DS,AX;这两个是数据段地址的DS
LEA DX,MAX,MAX在数据段中的偏移地址
MOV AH,0AH; /> INT 21H;及以上和合作产生的OA号中断(字符串输入)
MOV CL LETH LETH存储的数据在CL,(但你似乎没有定义它)
LEA BX,BUFF的偏移地址
LEA SI,BUFF获取的buff,去浅黄色的偏移地址的源地址
LOOP1:
MOV AL,[BX]; BX寄存器中的数据
CMP AL,'0';与
JB FALSE的字符0;跳转到FALSE
CMP AL当AL是小于0,'9',用于比较与字符9 BR /> JA FALSE;当A大于9跳转到FALSE
INC BX,BX增加了一个点到下一个内存地址
DEC CL,CL数据从负一
JNZ LOOP1; CL数据继续LOOP1周期
JMP L2是不为零;无条件L2
FALSE跳转到:
CMP BX,SI,SI寄存器中的数据比较BX BR /> JE L1;零跳L1
MOV DI,SI;
MOV AH存储数据的SI,DI,SI],SI寄存器中的数据点,以解决存在AH BR /> MOV [SI],AL,AL SI点的地址中存储的数据
L3:INC DI,DI,因为增加了
MOV AL,[DI]
MOV [ DI],AH存储的数据
CMP DI,BX
JE L1,结果是零跳L1
MOV AH,AL
JMP L3无条件跳转到L3 BR /> MOV [BX] AH
L1:INC SI
DEC,INC BX CL
JNZ LOOP1,结果不为0跳转到LOOP1(CL变量,)
L2:MOV BYTE PTR [BX],'$';美元存款的地址
BX点,MOV DL ,0DH单个字符构成的两个中断DL存储的数据
MOV AH,02H INT 21H,
MOV DL,0AH;下构成中断输入字符串
INT 21H
LEA DX,BUFF - 接下来的两个字符串构成中断。 DX存档字符串的第一个字符偏移地址
MOV AH,09H
INT 21H
MOV AH,07H;这是又一个戏剧中断,中断== 7,,,,
INT 21H BR /> CODE ENDS END BGN结束
MAX DB 100;伪代码定义 LETH DB的最大数量的;保留字节的数据
BUFF DB 100 DUP(?)和它上面的 BR />数据结束的数据段结束
CODE另一个矩形的代码段
假设DS:DATA,CS:CODE伪代码确定各分部
BGN:MOV AX ,DATA
MOV DS,AX;这两个是数据段地址的DS
LEA DX,MAX,MAX在数据段中的偏移地址
MOV AH,0AH; /> INT 21H;及以上和合作产生的OA号中断(字符串输入)
MOV CL LETH LETH存储的数据在CL,(但你似乎没有定义它)
LEA BX,BUFF的偏移地址
LEA SI,BUFF获取的buff,去浅黄色的偏移地址的源地址
LOOP1:
MOV AL,[BX]; BX寄存器中的数据
CMP AL,'0';与
JB FALSE的字符0;跳转到FALSE
CMP AL当AL是小于0,'9',用于比较与字符9 BR /> JA FALSE;当A大于9跳转到FALSE
INC BX,BX增加了一个点到下一个内存地址
DEC CL,CL数据从负一
JNZ LOOP1; CL数据继续LOOP1周期
JMP L2是不为零;无条件L2
FALSE跳转到:
CMP BX,SI,SI寄存器中的数据比较BX BR /> JE L1;零跳L1
MOV DI,SI;
MOV AH存储数据的SI,DI,SI],SI寄存器中的数据点,以解决存在AH BR /> MOV [SI],AL,AL SI点的地址中存储的数据
L3:INC DI,DI,因为增加了
MOV AL,[DI]
MOV [ DI],AH存储的数据
CMP DI,BX
JE L1,结果是零跳L1
MOV AH,AL
JMP L3无条件跳转到L3 BR /> MOV [BX] AH
L1:INC SI
DEC,INC BX CL
JNZ LOOP1,结果不为0跳转到LOOP1(CL变量,)
L2:MOV BYTE PTR [BX],'$';美元存款的地址
BX点,MOV DL ,0DH单个字符构成的两个中断DL存储的数据
MOV AH,02H INT 21H,
MOV DL,0AH;下构成中断输入字符串
INT 21H
LEA DX,BUFF - 接下来的两个字符串构成中断。 DX存档字符串的第一个字符偏移地址
MOV AH,09H
INT 21H
MOV AH,07H;这是又一个戏剧中断,中断== 7,,,,
INT 21H BR /> CODE ENDS END BGN结束
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询