📄 我参加电子竞赛 做的温度控制的单片机程序.asm
字号:
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T00
ORG 001BH
LJMP T100
ORG 0030H
MAIN:MOV R0,#7FH
MAIN1:MOV @R0,#00H
DJNZ R0,MAIN1
MOV SP,#60H
MOV 08H,#32H
MOV 0FH,#20H
;MOV 10H,#20H
MOV TMOD,#11H ;使T0工作在方式1 T1工作于方式1
MOV TH0,#0FCH
MOV TL0,#18H ;设置定时初值1000us
SETB TR0
SETB ET0
; SETB IT0
; SETB EX0
SETB EA ;开中断
SETB 2FH.4
;********************************************************************************
BEGIN:
DIS00: MOV A,09H
MOV B,#64H
DIV AB
MOV 35H,A
MOV A,B
MOV B,#0AH
DIV AB
MOV 36H,A
MOV 37H,B
MOV A,43H ;主程序循环起点
CJNE A,#3aH,OUT01
MOV A,42H
CJNE A,#98H,OUT01
MOV 42H,#00H
MOV 43H,#00H
LCALL SAMP ;15S时间到则启动A/D
SETB 2FH.1
;********************************************************************************
OUT01:JNB 2FH.1,OUT02
LCALL FILTER
CLR 2FH.1
SETB 2FH.2
MOV R2,25H ;设定值U送R2
MOV R3,24H ;采样平均值R送R3
LCALL CPL1
LCALL SUM
MOV A,R2
CJNE A,#01AH,OUT04
LJMP OUT05
OUT04:JC OUT05
SETB P1.2
LJMP OUT06
OUT05:MOV 26H,#12H
MOV 27H,#1H
MOV 28H,#1H
LCALL PID
MOV TH1,2CH
MOV TL1,2DH
SETB TR1
SETB ET1
LJMP OUT06
;********************************************************************************
OUT02:MOV A,45H
CJNE A,#03H,OUT06
MOV A,44H
CJNE A,#0E8H,OUT06
MOV 44H,#00H
MOV 45H,#00H
MOV TH1,2CH
MOV TL1,2DH
SETB TR1
SETB ET1 ;500MS控制周期时间到则重复送PID计算的结果
OUT06: JB 2FH.4,OUT07
JNB 2FH.2,BEG
BEG:ljmp begin
OUT07: ; MOV 24H,#56H
MOV R0,24H
LCALL TRANSF
MOV 32H,R0
MOV 33H,R1
MOV 34H,R2
; MOV 25H,#0FFH
MOV R0,25H
LCALL TRANSF
MOV 35H,R0
MOV 36H,R1
MOV 37H,R2
CLR 2FH.2
CLR 2FH.4
LJMP BEGIN
;********************************************************************************
;********************************************************************************
;********************************************************************************
T100:CLR ET1
PUSH ACC
PUSH B
PUSH PSW
PUSH DPH
PUSH DPL
CLR P1.2 ;调节占空比
POP DPL
POP DPH
POP PSW
POP B
POP ACC
SETB ET1
RETI
;********************************************************************************
KEY1: MOV 30H,#01H
MOV A,#01H
ADD A,09H
MOV 09H,A
MOV A,#00H
ADDC A,13H
MOV 13H,A
RET
KEY2: MOV 30H,#02H
MOV A,#0AH
MOV B,09H
MUL AB
SWAP A
ADD A,B
SWAP A
MOV 09H,A
RET
KEY3: MOV 30H,#03H
CLR C
MOV A,#01H
XCH A,09H
SUBB A,09H
MOV 09H,A
RET
KEY4: MOV 30H,#04H
MOV 09H,#00H
RET
;********************************************************************************
T00:CLR EA ;中断程序——— 显示,键盘查询
PUSH ACC
PUSH B
PUSH PSW
PUSH DPH
PUSH DPL ;保护现场
CLR RS1 ;
SETB RS0 ; 设置工作寄存器区为1区,R0--R7对应08H--0FH单元
MOV TH0,#0FCH ;
MOV TL0,#25H ; 重新设置计数器初值
MOV DPTR,#7FFFH ; 送位显码
MOV A,#00H ;
MOVX @DPTR,A ; 启动位显码
MOV DPTR,#9FFFH ; 送段显码
MOV A,#0FFH ;
MOVX @DPTR,A ; 启动段显码
MOV A,@R0 ; R0中放置偏移地址 ,指定32H单元的内容为要显示的数据
MOV DPTR,#TAB ; DPTR中放置首地址
MOVC A,@A+DPTR ; 查表 ,将查的的数据放入A中
MOV DPTR,#9FFFH ; 重新启动段显码
MOVX @DPTR,A ; 送要显示的段数据 将数据显示
MOV DPTR,#7FFFH ; 重新启动位显码
MOV A,R7 ; 选择要显示的位
MOVX @DPTR,A ; 送要显示的位数据
INC R0 ; 指示下一个要显示的数据
RR A ;
MOV R7,A ; 送回,为下一次做准备
CJNE R0,#38H,scan ; 没有显示完全(32H--37H单元内容)则跳转到T101,否则执行下一条
MOV R0,#32H ;
MOV R7,#20H
;******************************************************************************************
scan:MOV A,42H
ADD A,#01H
MOV 42H,A
MOV A,43H
ADDC A,#00H
MOV 43H,A ; 负责加1,定时15S ————采样周期----启动A/D0809的周期
;******************************************************************************************
MOV A,44H
ADD A,#01H
MOV 44H,A
MOV A,45H
ADDC A,#00H
MOV 45H,A ; 负责加1,定时500MS————控制周期 ----
;***************************************
KEY01: MOV DPTR,#1FFFH
MOV A,#0FEH
MOVX @DPTR,A
JB P1.7,KEY02
INC 4aH
MOV A,4aH
CJNE A,#0AH,KEY02
MOV 4aH,#00H
MOV A,46H
CJNE A,#00H,KEY02
LCALL KEY2
INC 46H
KEY02: JNB P1.7,BECK1
MOV 46H,#00H
BECK1: MOV A,#0DFH
MOVX @DPTR,A
NOP
NOP
JB P1.7,KEY03
INC R2
INC 4bH
MOV A,4bH
CJNE A,#0FFH,LOOP02
MOV 4bH,#00H
INC 4cH
MOV A,4cH
SUBB A,#08H
JNC LOOP03
LOOP02: CJNE R2,#0AH,KEY03
MOV R2,#00H
MOV A,47H
CJNE A,#00H,KEY03
LOOP03: LCALL KEY1
INC 47H
KEY03: JNB P1.7,BECK2
MOV 4bH,#00H
MOV 4cH,#00H
MOV 47H,#00H
BECK2: MOV A,#0BFH
MOVX @DPTR,A
NOP
NOP
JB P1.7,KEY04
INC R3
INC R5
CJNE R5,#0FFH,LOOP00
MOV R5,#00H
INC R6
MOV A,R6
SUBB A,#08H
JNC LOOP01
LOOP00: CJNE R3,#08H,KEY04
MOV R3,#00H
MOV A,48H
CJNE A,#00H,KEY04
LOOP01: LCALL KEY3
INC 48H
KEY04: JNB P1.7,BECK3
MOV R5,#00H
MOV R6,#00H
MOV 48H,#00H
BECK3: MOV A,#7FH
MOVX @DPTR,A
NOP
NOP
JB P1.7,T101
INC R4
CJNE R4,#0AH,T101
MOV R4,#00H
MOV A,49H
CJNE A,#00H,T101
LCALL KEY4
INC 49H
T101: ;MOV 41H,#00H
NOP ;
POP DPL ;
POP DPH ;
POP PSW ;
POP B ;
POP ACC ;
SETB EA ;
RETI ; 子程序返回
;*******************采样**************************************************
SAMP:MOV R0,#20H ;采样值起始地址送R0
MOV R2,#04H ;采样四次
MOV DPTR,#5FFaH ;启动A/D0809
SAM1:MOVX @DPTR,A
NOP
WAIT:JB P3.2,WAIT ;等待A/D完成
MOVX A,@DPTR ;采样值送A
MOV @R0,A ;存采样值
INC R0
DJNZ R2,SAM1 ;若采样次数到了,返回
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -