单片机计算定时的汇编程序解析说明。

单片机接收光藕计数,控制LED灯和继电器,并计算定时的汇编程序解析说明。
程序如下:帮忙完整解析下我自己解析的部分有可能不对。
SHUZHI EQU 58H ;把58H命名为SHUZHI

ORG 0000H

AJMP MAIN ;跳到程序开始
ORG 0030H ;51单片机程序一般要从地址0030H开始往下执行
MAIN: MOV P1,#0FFH ;代表的数值,offh意思是让P1口输出高电平
MOV P3,#0FFH ;代表的数值,offh意思是让P3口输出高电平
MOV SP,#60H ;将堆栈SP置为01100000,这个应该是用于控制硬件连接的语句。根实际的硬件相关。
CLR EA ;使用ds1820 一定要禁止任何中断产生
CLR ES ;禁止串口中断
MOV R6,#10 ;赋R6 #10
MOV R7,#20 ;赋R7 #20
MOV P3,#0C0H ;第二行的第一个位置
MOV R0,#00H ;00H让R0口输出低电平0.
MOV R1,#00H ;00H让R1口输出低电平0.
MOV A,#00H ;00H让 A口输出低电平0.
MOV SHUZHI,#00H
MOV DPTR,#TABLE
LOOP:JNB P1.0 ,JIAYI
AJMP LOOP
JIAYI:JNB P1.0,$ ;jnb p1.0,$ ;如果p1.0口为0,就继续检测 ;P1.0无断开,继续查询。
LCALL DELAY ;延长时间一次,调用延长子程序

;(这两个是否多余的,暂时屏蔽) JNB P1.0,$
;是否多余的,暂时屏蔽 LCALL DELAY

MOV A,SHUZHI
INC A ;是寄存器A中的内容增加1
MOV SHUZHI,A

MOVC A ,@A+DPTR ;把A传送显示
MOV P3,A
CLR P1.1 ;打开B继电器。
CLR P1.3 ;开B灯。
MOV TMOD,#00000001B ;定时/计数器0工作于方式1
FENZHONG: MOV R7,#20 ;赋R7 #20
CONGLAI: MOV TH0,#3CH ;定时器0高8位赋初值
MOV TL0,#0B0H ;低8位赋初值
SETB TR0 ;开启定时中断
LOOP1: JNB P1.0,JIXU_XIANSHI
JBC TF0,YICHU_PANDUAN ;TF0溢出标志,检测PXX(还没定)是否有负跳变。只要输入一次,就可以触发溢出。
AJMP LOOP1
YICHU_PANDUAN:DJNZ R7,CONGLAI
DJNZ R6,FENZHONG
CLR TR0
AJMP MAIN

JIXU_XIANSHI:CLR TR0
CLR TF0
JNB P1.0 ,JIAYI2
AJMP JIXU_XIANSHI
JIAYI2:JNB P1.0,$
LCALL DELAY

;(这两个是否多余的,暂时屏蔽) JNB P1.0,$
;是否多余的,暂时屏蔽 LCALL DELAY

MOV A,SHUZHI
INC A
MOV SHUZHI,A
MOVC A ,@A+DPTR
MOV P3,A
MOV A, SHUZHI
CJNE A,#04H,JIXU_XIANSHI
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY

CLR P1.2 ;打开A继电器。
CLR P1.4 ; 开A灯。
LCALL DELAY
LCALL DELAY
LCALL DELAY
SETB P1.1 ;关闭B继电器。
SETB P1.3 ;关闭B灯
AJMP $ ;AMJP $和SJMP $都表示跳转到本行,就是一个死循环,使程序停在这里。
DELAY: MOV R0,#255 ; ----- 延时子程序 -----
TURN: MOV R1,#255
DJNZ R1,$
DJNZ R0,TURN
RET
TABLE: DB 0C0H,0F9H,24H,30H,19H ;七段显示器数据定义 DB 0C0H, 0F9H, 0A4H, 0B0H, 99H ; 01234

END

SHUZHI EQU 58H ;把58H命名为SHUZHI

ORG 0000H

AJMP MAIN ;程序跳转到MAIN
ORG 0030H ;51单片机程序一般要从地址0030H开始往下执行
MAIN: MOV P1,#0FFH ;初始化,将P1,P3口都置为高电平(这和单片机I/O口的保护有关);将SP指向60H
MOV P3,#0FFH ;
MOV SP,#60H ;
CLR EA ;关总中断
CLR ES ;禁止串口中断
MOV R6,#10 ;赋R6 #10
MOV R7,#20 ;赋R7 #20
MOV P3,#0C0H ;置P3口为C0H,P3好象是和显示有关(因为没有硬件图),那就是初始显示的内容
MOV R0,#00H ;赋R0为00H
MOV R1,#00H ;赋R0为00H
MOV A,#00H ;赋累加器A为00H(上面3句都是在初始化寄存器)
MOV SHUZHI,#00H;赋58H为00H (58H应该计数用的)
MOV DPTR,#TABLE;送#TABLE到DPTR,即指向表格,为后面的MOVC A,@A+DPRT。调用表格作初始。
LOOP:JNB P1.0 ,JIAYI ;判断P1.0不等于1跳转,等于1就继续判断。(这里应该是个开关类的东西,按下后为0,就跳转了)
AJMP LOOP
JIAYI:JNB P1.0,$ ;判断P1.0不等于1就继续判断,等于0就延时,继续下面程序(这里意义在判断有没有放开这个开关)
LCALL DELAY ;延长时间一次,调用延长子程序
MOV A,SHUZHI ;送58H到A
INC A ;是寄存器A中的内容增加1
MOV SHUZHI,A;A送回58H,(这里的意义是表示计数加1了)

MOVC A ,@A+DPTR ;第一次按开关就是A=01H,那么就是送C0H给A
MOV P3,A ;送C0H给P3口,应该是显示什么内容
CLR P1.1 ;打开B继电器。
CLR P1.3 ;开B灯。
MOV TMOD,#00000001B ;定时/计数器0工作于方式1
FENZHONG: MOV R7,#20 ;赋R7 #20
CONGLAI: MOV TH0,#3CH ;定时器0高8位赋初值
MOV TL0,#0B0H ;低8位赋初值
SETB TR0 ;开启定时中断
LOOP1: JNB P1.0,JIXU_XIANSHI ;判断P1。0,不等于1,就跳转关定时器0,等于1就判断定时定时器有没有溢出
JBC TF0,YICHU_PANDUAN ;判断定时器0有没有溢出,没有就重新判断P1。0,溢出就跳转到YICHU_PANDUAN重新初始。
AJMP LOOP1
YICHU_PANDUAN:DJNZ R7,CONGLAI ;(下面就重新循环上面的作用)
DJNZ R6,FENZHONG
CLR TR0
AJMP MAIN

JIXU_XIANSHI:CLR TR0
CLR TF0
JNB P1.0 ,JIAYI2
AJMP JIXU_XIANSHI
JIAYI2:JNB P1.0,$
LCALL DELAY

JNB P1.0,$
LCALL DELAY

MOV A,SHUZHI
INC A
MOV SHUZHI,A
MOVC A ,@A+DPTR
MOV P3,A
MOV A, SHUZHI
CJNE A,#04H,JIXU_XIANSHI
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY

CLR P1.2 ;打开A继电器。
CLR P1.4 ; 开A灯。
LCALL DELAY
LCALL DELAY
LCALL DELAY
SETB P1.1 ;关闭B继电器。
SETB P1.3 ;关闭B灯
AJMP $ ;AMJP $和SJMP $都表示跳转到本行,就是一个死循环,使程序停在这里。
DELAY: MOV R0,#255 ; ----- 延时子程序 -----
TURN: MOV R1,#255
DJNZ R1,$
DJNZ R0,TURN
RET
TABLE: DB 0C0H,0F9H,24H,30H,19H ;七段显示器数据定义 DB 0C0H, 0F9H, 0A4H, 0B0H, 99H ; 01234

END
温馨提示:答案为网友推荐,仅供参考
相似回答