单片机计算定时的汇编程序解析说明。
发布网友
发布时间:2022-11-18 10:45
我来回答
共1个回答
热心网友
时间:2024-12-12 07:22
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