单片机接收光藕计数,控制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