上次给大家在单片机论坛发了一个51单片机c语言做的小旋磁美容仪程序,这次再来一个汇编的,在实际应用中这个版本的程序运行起来更稳定,请大家多多指教。
ORG 0000h
AJMP MAIN
ORG 0003H
RETI
ORG 000BH
AJMP TIME0
ORG 0013H
RETI
ORG 001BH
AJMP TIME1
HOTOUT BIT P3.7
XUANOUT BIT P1.0 ;输出发热与旋磁引脚定义
XUANKEY BIT P3.0
HOTKEY BIT P3.1 ;定义两个按键的引脚端口
HOT_LED1 BIT P1.3
HOT_LED2 BIT P1.4
XUAN_LED1 BIT P1.5
XUAN_LED2 BIT P1.6
;--------------------以上都为外接引脚的定义.
OPENBIT BIT 01H ;01H位寻址做为开关机标志位的标识,此值存于可以实现位寻址20H单元处,20.1位。
HOTBIT BIT 02H
XUANBIT BIT 03H
MIN EQU 22H ;时间分钟值为存于22H单元中,可以实现位寻址
SEC EQU 23H ;JIA累加至20次为1秒钟,即分钟值自加1
JIA EQU 29H ;50ms每中断一次累加1
HOTDW EQU 24H
XUANDW EQU 25H ;将档位标志寄存器定义,存一至四档用。
HOTON EQU 26H
HOTON1 EQU 27H ;存发热占空比上升延时间值及待装值。
HOTOFF EQU 28H
XUANON EQU 2AH ;存旋转占空比上升延值及待装值。
XUANON1 EQU 2BH
XUANOFF EQU 2CH ;存旋转占空比下延值及待装值。
;运行过程中的各种变量进行处理 位寻址单元剩21H、2EH与2FH
;-------------------以上皆为内部运算用的位定义.
DD1: MOV R7,#15 ; 装从20单元清0至29单元所用的标志清除次数
MOV R0,#20H ; 在R0装入地址,用于间接寻址
D1: MOV @R0,#00H
INC R0
DJNZ R7,D1 ;循环清零
RET
ORG 0030H
MAIN:
MOV SP,#2FH ; 将堆栈定义于数据缓存区30H开始存放
MOV TMOD,#11H ; 将定时器0与1同置为方式一16位定时器
MOV TH1,#0FFH
MOV TL1,#09CH ; 将定时器1定时中断时间设为100uS中断一次
MOV TH0,#3CH
MOV TL0,#0B0H ; 将定时器0定时中断时间设为50MS中断一次
MOV IP,#08H ; 将定时器1设为最高中断级
MOV IE,#8AH ; 将总中断及两定时器中断开关闭合
; SETB TR0 ; T0定时器开始工作
; SETB TR1 ; T1定时器开始工作
ACALL DD1 ; 调用DD1子程序,对20至2E的空间进行清零
SETB HOT_LED1
SETB HOT_LED2
SETB XUAN_LED1
SETB XUAN_LED2 ;对灯进行初始化,待机时全部不亮
CLR XUANOUT
CLR HOTOUT
MOV MIN,#18 ;将倒计时间设为30分钟
ACALL KEY ;调用按键检测子程序
MOV A,HOTDW ;将热档位值赋予A
ORL A,XUANDW ;将旋转档位与热档位进行与运算
JNZ START ;对A进行检测,不为0则转移
AJMP MAIN
START:
SETB OPENBIT
SETB TR0
SETB TR1 ;将定时器1与定时器2打开
;以下为主循环检测判断程序
START1:
;调用按键检测程序
MOV R7,HOTON
CJNE R7,#0,OUT1;检测HOTON是否己到0
JNB HOTBIT,HOT_OFF
MOV HOTON,HOTON1
AJMP OUT1
HOT_OFF:
MOV HOTON,HOTOFF ;以上自START1起都是对波形值进行装值的过程
OUT1:
MOV R7,XUANON
CJNE R7,#0,OUT2 ;检测xuanon是否己到0
JNB XUANBIT,XUAN_OFF
MOV XUANON,XUANON1
AJMP OUT2
XUAN_OFF:
MOV XUANON,XUANOFF ;以上自OUT1都是对旋转值进行装值的过程
OUT2: MOV R6,MIN
MOV A,HOTDW ;将热档位值赋予A
ORL A,XUANDW ;将旋转档位与热档位进行与运算
JZ START2 ;对A进行检测,不为0则转移
ACALL KEY
CJNE R6,#0,START1
START2:
CLR TR0
CLR TR1
AJMP MAIN ;检测时间到,或是档位为0时,自动返回主程序循环状态
;-----------------------------------以上为程序的装值及退出条件设定检测主循环程序
;---------------------------------------以下为定时器0的30分钟倒计时
TIME0:
MOV TH0,#3CH
MOV TL0,#0B0H ; 将定时器0装初值
INC JIA ; 对50MS进行累加
MOV R5,JIA
CJNE R5,#20,TOOUT; 对JIA的值进行20判断
MOV JIA,#0 ;对JIA值进行清零
INC SEC ;达到一秒时累加
MOV R5,SEC ; 对秒的值进行1分钟到达的判断
CJNE R5,#60,TOOUT
MOV SEC,#0
DEC MIN
TOOUT:
RETI
;------------------------------------以上为定时中断0的子程序,分钟计数
;-----------------------------------------以下为定时中断1的子程序,占空比调节设置
TIME1:
MOV TH1,#0FFH
MOV TL1,#09CH ; 将定时器1装初值
CLR EA
PUSH ACC
PUSH PSW
MOV R0,HOTDW
CJNE R0,#0,CX1
CLR HOTOUT
CLR HOTBIT
AJMP NEXT
CX1:
DJNZ HOTON,NEXT
CPL HOTOUT
CPL HOTBIT
NEXT:
MOV R0,XUANDW
CJNE R0,#0,CX2
CLR XUANOUT
CLR XUANBIT
AJMP NEXT1
CX2: DJNZ XUANON,NEXT1
CPL XUANOUT
CPL XUANBIT
NEXT1:
POP PSW
POP ACC
SETB EA
RETI
;---------------------------------------以上为定时中断1的子程序
;-------------------------------以下为按键检测运算子程序
KEY:
JNB HOTKEY,KEY11
AJMP NEXTKEY
KEY11: MOV R2,HOTDW
CJNE R2,#0,DDDD
DDDD: MOV R3,#110
ACALL DELAY10MS
JNB HOTKEY,KEYCX
AJMP NEXTKEY
KEYCX:
INC HOTDW
MOV R2,HOTDW
CJNE R2,#4,CL1
MOV HOTDW,#0
SETB HOT_LED1
SETB HOT_LED2
CL1: CJNE R2,#1,CL2
MOV HOTON,#3
MOV HOTON1,#3
MOV HOTOFF,#7
CLR HOT_LED1
CL2: CJNE R2,#2,CL3
MOV HOTON,#6
MOV HOTON1,#6
MOV HOTOFF,#4
SETB HOT_LED1
CLR HOT_LED2
CL3: CJNE R2,#3,NEXTKEY
MOV HOTON,#9
MOV HOTON1,#9
MOV HOTOFF,#1
CLR HOT_LED1
NEXTKEY:
JNB XUANKEY,KEYCX1
AJMP OUTKEY
KEYCX1: MOV R2,XUANDW
CJNE R2,#0,DDD
MOV R3,#120
AJMP CCC
DDD: MOV R3,#98
CCC: ACALL DELAY10MS
JNB XUANKEY,KEYCX2
AJMP OUTKEY
KEYCX2:
INC XUANDW
MOV R2,XUANDW
CJNE R2,#4,CL4
MOV XUANDW,#0
SETB XUAN_LED1
SETB XUAN_LED2
CL4:CJNE R2,#1,CL5
MOV XUANON,#4
MOV XUANON1,#4
MOV XUANOFF,#6
CLR XUAN_LED1
CL5:CJNE R2,#2,CL6
MOV XUANON,#7
MOV XUANON1,#7
MOV XUANOFF,#3
SETB XUAN_LED1
CLR XUAN_LED2
CL6:CJNE R2,#3,OUTKEY
MOV XUANON,#9
MOV XUANON1,#9
MOV XUANOFF,#1
CLR XUAN_LED1
OUTKEY:
RET
DELAY10MS:
D111: MOV R4,#250
D222: DJNZ R4,D222
DJNZ R3,D111
RET
END