📄 jieshou.asm
字号:
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP WAIBU
ORG 000BH
LJMP DS0
ORG 0040H
MAIN:
MOV TMOD,#11H
MOV TH0,#0FFH
MOV TL0,#09BH
SETB ET0
SETB IT0
SETB EX0
SETB EA
SETB TR0
MOV P2,#0FFH
MOV P1,#0
MOV R0,#1FH //接收过来的9个(起始码和结果码+8位的数据)脉冲值(没有解码之前是9个不同的时间,比如两个下降沿之间的时间差是1.5ms同,则代表数据0)存放在20H-28H里,R0用于取这些寄存器的地址
MOV R2,#0 //R2用于计时,即判断接收过来的波形两连续下降沿之间的时间差,在DS0内每自增一次的时间是100us
MOV R3,#0 //R3相当于开门的钥匙,它只能取0和1,详细解释请看用到R3时的解释
MOV R4,#0 //R4用于存储解码出来的数据
LJMP $
WAIBU:
CLR EA
CLR TR0
CLR C
CJNE R3,#1,K0 //如果R3等于1,就顺序执行,即进入正题(取码值和解码),否则进入K0子程序
MOV TH0,#0FFH
MOV TL0,#09BH
CJNE R0,#28H,START //R0是从20H(寄存器地址)开始的,要计9个(起始码和结果码+8位的数据)R2的值,所以是28H
MOV R0,#20H //跳完了9次START后,数据的采集就完成了,所以给R0赋回初值
MOV R3,#0 //跳完了9次START后,也意味着下次该先进K0子程序,所以这里要“关门”
LJMP JIEMA
START: //START程序用于把每次R2所计到的时间存放到R0所代表的地址里。
MOV A,R2
MOV @R0,A
INC R0
MOV R2,#0 //给R2清零,以便下记此时到下一个下降沿来时之间的时间差
SETB TR0
SETB EA
RETI
K0: //K0这一段程序是为了除去每一个接收过来的数据(包括起始码、结果码和8位的数据)的第一个下降沿前面的时间(R2)。这段程序虽不能明显的看出“除去”之意,其实暗含没有采集第一个R2。
MOV R3,#1 //给R3赋1,就是让下一次外部中断程序执行时,不要再执行K0程序了,而是去执行取码和解码。相当于“开门”。
MOV TH0,#0FFH
MOV TL0,#09BH
MOV R2,#0 //给R2清零,开始计此时到下一个下降沿到来之间的时间差。
SETB EA
SETB TR0
RETI
DS0: //定时器0中断服务子程序,R2自增1,则计到时间100us
INC R2
MOV TH0,#0FFH
MOV TL0,#09BH
RETI
JIEMA:
CLR C
MOV A,1FH
CJNE A,#100,X1
X1:
JC X2
CJNE A,#200,X3
X2:
LJMP MAIN
X3:
JNC X2
LJMP JIEMA1
JIEMA1:
CJNE R0,#28H,L0 //判断9次解码是不是完成,若没完成,则跳到L0里面继续解码工作,若完成,则顺序执行下面的DONE程序
LJMP DONE
L0:
CLR C
CJNE @R0,#25,L1 //这里的20是2ms的意思,因为R2自增1,所代表的时间100us
L1:
JNC L3 //65行到68行语句是为了判断C的值,即判断R0所指向的地址里的时间与2ms相比是大于还是小于,小于就顺序执行,继续判断解0的条件
MOV A,R4
RL A //每一次都是把取出来的码值放入R4寄存器里的最低位,所以得向左移位
ANL A,#0FEH //取0这个码值,到了这里就把0这个码值取出来了
MOV R4,A //72行到75行语句的目的是为了把取出来的码值放入R4寄存器内
INC R0
LJMP JIEMA1 //解完0这个码值则返回JIEMA,继续解下一个码值
L3: //L3和L4是为了取1这个码值
CLR C
CJNE @R0,#45,L4 //同上理,这里的40是4ms的意思
L4:
JNC L5 //82到84行语句是为了判断C的值,加上前面对2ms的判断,就构成判断R0所指向的地址里的数是不是在“2ms-4ms”之间了
CLR C
MOV A,R4
RL A //每一次都是把取出来的码值放入R4寄存器里的最低位,所以得向左移位
ORL A,#01H //取1这个码值,到了这里就把0这个码值取出来了
MOV R4,A //86行到89行语句的目的是为了把取出来的码值放入R4寄存器内
L5:
INC R0
LJMP JIEMA1 //解完1这个码值则返回JIEMA,继续解下一个码值
DONE:
MOV P2,R4
SETB EA
SETB TR0
MOV R4,#0
MOV R0,#20H
RETI
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -