单片机程序解释

来源:百度知道 编辑:UC知道 时间:2024/06/23 19:03:29
请逐行解释下这2个程序.
CNTA EQU 30H
COUNT EQU 31H

ORG 00H
LJMP START
ORG 0BH
LJMP T0X
ORG 30H
START: MOV CNTA,#00H
MOV COUNT,#00H
MOV TMOD,#01H
MOV TH0,#(65536-1000) / 256
MOV TL0,#(65536-1000) MOD 256
SETB TR0
SETB ET0
SETB EA
WT: JB P2.0,WT
MOV R6,#5
MOV R7,#248
D1: DJNZ R7,$
DJNZ R6,D1
JB P2.0,WT
INC COUNT
MOV A,COUNT
CJNE A,#03H,NEXT
MOV COUNT,#00H
NEXT: JNB P2.0,$
SJMP WT

T0X: NOP
MOV TH0,#(65536-1000) / 256
MOV TL0,#(65536-1000) MOD 256

CNTA EQU 30H ;定义CNTA为寄存器30H
COUNT EQU 31H ;定义COUNT为寄存器31H

ORG 00H ;程序开始
LJMP START ;开始程序入口
ORG 0BH ;定时器T0中断程序入口地址,不过最好用ORG 000BH
LJMP T0X ;T0中断程序入口
ORG 0030H ;主程序开始地址,初始化开始
START: MOV CNTA,#00H ;
MOV COUNT,#00H
MOV TMOD,#01H ;定时器T0工作方式1
MOV TH0,#(65536-1000) / 256 ;这是C的方式,不知道汇编支持不支持?
MOV TL0,#(65536-1000) MOD 256
SETB TR0 ;T0计时开始
SETB ET0 ;开T0中断
SETB EA ;开总中断(你这边最好按 SETB EA
SETB ET0
SETB TR0的顺序)
WT: JB P2.0,WT ;判断P2.0,如果是高,等待。
MOV R6,#5 ;如果P2.0为低,延时开始
MOV R7,#248 ;这个延时是为了消抖
D1: DJNZ R7,$ ;以防误判
DJNZ R6,D1
JB P2.0,WT ;延时结束,继续判断P2.0的状态,如果不为低,继续等待
INC COUNT ;如果为低,COUNT加1
MOV A,COUNT ;判断COUNT的数值
CJNE A,#03H,NEXT ;如果COUNT不等于3,转到 NEXT执行
MOV COUNT,#00H ;如果是3,清C