上次給大家在單片機論壇發了一個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