急急急!!谁能帮我分析一下这个单片机汇编语言程序,写出每步的作用。急急急!!

2024-11-09 01:53:29
推荐回答(2个)
回答1:

虽然没有楼上动作快,但既然也做了就发上来参考吧,应该比楼上的更具体写,比如P1.5干嘛啊。 :)
__________________________________________________________________
整体描述:同时在P1.0 和 P1.1输出反相的占空可调的方波
占空比调整通过修改变量M 来设定,变量AS用来做内部循环量,范围0-M
P1.5使用闪烁的方式来显示对于M设定的占空比值的非法告警
调整占空比设定M通过int0 和P1.2来 进行加一和减一的设定 ,通过int1 和P1.2来 进行加五和减五的设定
设定的M值通过连接在P0,P2口的两个LED来显示,方式10进制单位显示
COUNT EQU 30H //没用的变量
AS EQU 30H //timer1内占空比计数
M EQU 35H //占空比计数上限设定
ORG 0000H
LJMP START
ORG 0003H //int0中断服务入口 占空比1步进
LJMP INT00
ORG 0013H //int1中断服务入口 占空比5步进
LJMP INT11
START: SETB EX0 //初始化开始
SETB PX0
SETB IT0
SETB EX1
CLR PX1
SETB IT1
SETB EA
CLR P1.5 //P1.5显示设定占空比数字非法时闪烁告警
MOV TMOD,#21H //使用timer0 模式1和timer1 模式2
MOV TH1,#38H //timer1做占空部分控制,即高低电平时间控制
MOV TH0,#0B1H //timer0做方波周期
MOV TL0,#0E0H
SETB TR0
SETB TR1
MOV DPTR,#TABLE //LED段码地址
MOV M,#50 //占空比上限初值
MOV P0,#3FH //占空比10进低位 LED段码
MOV P2,#6DH //占空比10进高位 LED段码
MOV AS,#0 //占空比计数变量
TOP:SETB TR1 //**新的一个方波周期从这里开始**
SETB P1.0 //P1.0和P1.1分别输出反相的等周期方波
CLR P1.1 //
MOV TH0,#0B1H //timer0计数值、即方波周期值设定
MOV TL0,#0E0H
MOV AS,#0 //高电平时间计数变量初值每个timer1溢出加一(最大等于M)
MOV B,#10 //没用
MOV A,M
MOV B,#100
DIV AB
JZ TIME1 //如果设定的M值在01-99(可以理解为可接受的值,占空比最少1:99最多99:1)
MOV B,#10
CLERK:SETB P1.5 //设定的占空比值非法,则闪烁P1.5告警
LCALL DELAY
CLR P1.5
LCALL DELAY
SETB P1.5
LCALL DELAY
CLR P1.5
MOV M,#50 //自动重新设定默认占空比
LCALL SHOW //LED显示M,即当前设定占空比的值
LJMP TOP //重新 开始新懂得方波周期
TIME1:JBC TF1,NEXT //等待timer1 溢出标志
SJMP TIME1
NEXT:INC AS //每次溢出变量AS加一,
MOV A,M
CJNE A,AS,TIME1 //直到AS=M ,即占空计数达到,
CLR P1.0 //波形反相
SETB P1.1
CLR TR1 //关闭timer1,波形在timer0控制的一个周期内不再变化
TIME0:JBC TF0,TOP
SJMP TIME0 //timer0溢出,开始下一个周期波形
INT00:JNB P1.2,LOOP1 //外部中断0中断处理
INC M //当int0 为低电平且P1.2为高则M增加1,每次机器响应int0都加一,直到int0消失
LCALL SHOW //LED显示M,即当前设定占空比的值
RETI
LOOP1:DEC M //当int0 为低电平且P1.2为低则M减1,每次机器响应int0都减一,直到int0消失
LCALL SHOW //LED显示M
RETI
INT11:JNB P1.2,LOOP //外部中断1中断处理
MOV A,M
ADD A,#5 //当int1 为低电平且P1.2为高则M增加5,每次机器响应int0都加五,直到int0消失
MOV M,A
LCALL SHOW //LED显示M
RETI
LOOP:MOV A,M
SUBB A,#5 //当int1 为低电平且P1.2为高则M减少5,每次机器响应int0都减五,直到int0消失
MOV M,A
LCALL SHOW //LED显示M
RETI
SHOW:MOV A,M //M /10 AB 内分别是商和余数
MOV B,#10
DIV AB
MOVC A,@A+DPTR //查表显示余数
MOV P2,A
MOV A,B
MOVC A,@A+DPTR //查表显示商
MOV P0,A
MOV B,#10 //没用
RET
DELAY:MOV R6,#0FFH //延时函数
DEY1:MOV R7,#0FFH
DEY2:MOV R5,#3
DJNZ R5,$
DJNZ R7,DEY2
DJNZ R6,DEY1
RET //延时结束
TABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH //LED段码表
END

回答2:

COUNT EQU 30H
AS EQU 30H
M EQU 35H 地址35H定义为变量M
ORG 0000H ORG 后跟地址,表示下面的指令所在地址
LJMP START 即此跳转指令在 0000H地址出,为系统开机第一条
ORG 0003H 同理,另外0003H为中断入口地址,对应的是什么中断暂时不记得了
LJMP INT00
ORG 0013H
LJMP INT11
START: SETB EX0 中断与定时器的初始化
SETB PX0
SETB IT0
SETB EX1
CLR PX1
SETB IT1
SETB EA 打开中断总开关
CLR P1.5
MOV TMOD,#21H 设置定时器/计数器的工作模式(参阅51单片机书)
MOV TH1,#38H 设置定时器0的初始值
MOV TH0,#0B1H
MOV TL0,#0E0H 设置定时器1的初始值
SETB TR0
SETB TR1
MOV DPTR,#TABLE 把显示字符表的首地址给DPTR
MOV M,#50
MOV P0,#3FH P0所接数码管显示0
MOV P2,#6DH P2所接数码管显示5 应该是显示50
MOV AS,#0
TOP:SETB TR1 打开定时器1
SETB P1.0
CLR P1.1
MOV TH0,#0B1H 设置定时器0的初始值
MOV TL0,#0E0H
MOV AS,#0
MOV B,#10 B=10
MOV A,M A=M=50
MOV B,#100
DIV AB A除上B
JZ TIME1 跳转到TIME1函数
MOV B,#10
CLERK:SETB P1.5 P1.5 ---- ----
LCALL DELAY ---- ----
CLR P1.5 这段设置p1.5引脚产生方波
LCALL DELAY
SETB P1.5
LCALL DELAY
CLR P1.5
MOV M,#50 M=50
LCALL SHOW 显示50
LJMP TOP
TIME1:JBC TF1,NEXT 判断定时器1 定时时间是否到,没到循环等待,到了跳转到NEXT
SJMP TIME1
NEXT:INC AS AS加一
MOV A,M
CJNE A,AS,TIME1 判断A-AS是否为零 这个是方波占空比可调的关键,根据不同的M值这里循环延时的时间不一样
CLR P1.0
SETB P1.1
CLR TR1
TIME0:JBC TF0,TOP 判断定时器0 定时时间是否到,没到循环等待,到了跳转到TOP从新开始
SJMP TIME0
INT00:JNB P1.2,LOOP1 中断INT0产生,判断P1.2,为0调用LOOP1 M-1后显示
INC M 否则M+1显示
LCALL SHOW
RETI
LOOP1:DEC M
LCALL SHOW
RETI
INT11:JNB P1.2,LOOP 中断INT1产生,判断P1.2,为0调用LOOP M-5后显示
MOV A,M 否则M+5显示
ADD A,#5
MOV M,A
LCALL SHOW
RETI
LOOP:MOV A,M
SUBB A,#5
MOV M,A 把要显示的数存于M
LCALL SHOW 调用显示子函数
RETI
SHOW:MOV A,M 这一段是显示子函数 M为一个两位数,除10后得到 十位和各位
MOV B,#10
DIV AB
MOVC A,@A+DPTR DPTR指向的是下面的TABLE,如果A=0,就把3FH给A,如果A=9,就把6FH给A
MOV P2,A 把A给P2,P2接的是数码管的位选。
MOV A,B
MOVC A,@A+DPTR
MOV P0,A 看这个 你的硬件应该是P2接一个数码管,P0接一个数码管
MOV B,#10
RET
DELAY:MOV R6,#0FFH 这一段为延时程序,就是通过循环执行指令达到延时的效果
DEY1:MOV R7,#0FFH
DEY2:MOV R5,#3
DJNZ R5,$
DJNZ R7,DEY2
DJNZ R6,DEY1
RET
TABLE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH 用的应该是数码管,这对应的是0-9
END

由于缺少51单片机书,有些记得不太清楚,如果你手里有,就算不太会用51单片机。有上面的注释应该可以看的懂这段程序了。
祝你好运。 LJMP INT11