?? 單片機應用技術講座(17)源程序.txt
字號:
RETI
;****************************************************************************
?。埏@示子程序]
DIR: MOV SCON,#00H ;置串行口移位寄存器狀態
SETB P1.4 ;開顯示
JB 5DH,DL1 ;顯示設定溫度則轉
DL2: MOV DPTR,#SEGT
DL0: MOV A,@R0
MOVC A,@A+DPTR
MOV SBUF,A
LOOP1: JNB TI,LOOP1
CLR TI
INC R0
MOV A,@R0
MOVC A,@A+DPTR
ANL A,#7FH ;使個位帶小數點
MOV SBUF,A
LOOP2: JNB TI,LOOP2
CLR TI
INC R0
MOV A,@R0
MOVC A,@A+DPTR
MOV SBUF,A
LOOP3: JNB TI,LOOP3
CLR TI
CLR P1.4
CLR 5DH
RET
DL1: MOV 50H,#0AH ;使小數位黑屏
AJMP DL2
SEGT: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
;****************************************************************************
DAAD1: MOV A,#00H ;[加1子程序]
ORL A,@R1
ADD A,#01H
CJNE A,#5AH,DAAD2 ;判斷超過90度了嗎?
DAAD3: MOV @R1,A
DAA: RET
DAAD2: JC DAAD3
MOV @R1,#28H ;超過90度則回到40度
AJMP DAA
;***************************************************************************
DEEC1: MOV A,@R1 ;[減1子程序]
DEC A
CJNE A,#28H,DEEC2 ;判斷低于40度了嗎?
DEEC3: MOV @R1,A
DEE: RET
DEEC2: JNC DEEC3
MOV @R1,#5AH ;低于40度則回到90度
AJMP DEE
;****************************************************************************
PTT0: CLR EA ;[T0中斷子程序]
PUSH ACC
PUSH PSW
PUSH DPL
PUSH DPH
SETB EA ;壓棧后開中斷,響應鍵盤
PPP: LCALL SMAP ;采樣數據
LCALL FILTER ;數字濾波
MOV A,2AH ;取采樣值
CJNE A,#01H,AAA ;下限40度比較
AJMP BBB
AAA: JC CCC ;小于40度則轉移
CJNE A,#0FEH,DDD ;上限90度比較
AJMP BBB ;轉到40-90度正常范圍內處理
DDD: JC BBB
CLR P1.2 ;大于90度黃燈亮報警
SETB 5EH
CLR P1.1 ; 置標志,啟動風扇
AJMP PPP
CCC: CLR P1.3 ;小于40度綠燈亮報警
SETB 5FH
CLR P1.0 ;置標志,啟動電爐
AJMP PPP
BBB: SETB P1.0
SETB P1.1
SETB P1.2
SETB P1.3
CLR 5EH
CLR 5FH ;40-90度之間則正常
LCALL PID
JB 20H,EEE ;設定溫度< 實際溫度,則轉到風扇處理
MOV A,29H
ACALL FFF
CLR P1.0
LOOP10: MOV R0,#56H ;存放相乘結果的首址
MOV R1,#55H ;賦顯示緩沖區最高位地址(十位)
LCALL SCACOV ;調用“標度轉化------二-十進制轉化”子程序
MOV R0,#53H ;賦顯示首址
LCALL DIR
JB D5H,LOOP10 ;等待T1中斷
CLR EA
POP DPH
POP DPL
POP PSW
SETB EA
POP ACC
RETI
EEE: MOV A,28H ;風扇處理
LCALL FFF
CLR P1.1
AJMP LOOP10
FFF: CPL A ;根據PID結果計算T1初值
INC A
MOV TL1,A
MOV TH1,#0FFH
SETB PI1
SETB TR1
SETB ET1
RET
;****************************************************************************
SCACOV: MOV R7,#00H ;[“標度轉化------二-十進制轉化”子程序]
MOV R6,2AH ;取采樣值,并轉化為雙字節
MOV R5,#33H
MOV R4,#24H ;賦參數(純小數)
LCALL MULT ;調用雙字節乘法子程序
MOV R5,#00H
MOV R4,#28H ;賦參數40度
MOV A,@R0
MOV R3,A
DEC R0
MOV A,@R0 ;存乘法結果的整數
MOV R2,A
LCALL DSUM ;調用加法子程序,且R7,R6為有效值(R7=00H)
MOV A,R6
MOV B,#10
DIV AB
MOV @R1,A ;存十位數
DEC R1
XCH A,B
MOV @R1,A ;存個位數
DEC R0
MOV A,@R0 ;取有效小數
MOV B,#10
DIV AB
DEC R1
MOV @R1,A ;送小數到顯示緩沖區
MOV A,B
CJNE A,#5,QQ ;小數四舍五入
QQ: JC PP
MOV A,@R1
ADD A,#01H
DA A
MOV @R1,A
PP: RET
;****************************************************************************
SMAP: MOV R0,#2CH ; [采樣子程序]
MOV R1,#03H ;采樣次數
SAM1: MOV DPTR,#7FF8H
MOVX @DPTR,A ;啟動A/D
MOV R2,#20H
DLY: DJNZ R2,DLY ;延時一小會
HERE: JB P3.3,HERE
MOV DPTR,#7FF8H
MOVX A,@DPTR ;讀取轉化結果
MOV @R0,A
INC R0
DJNZ R1,SAM1
RET
;****************************************************************************
FILTER: MOV A,2CH ;[數字慮波子程序]
CJNE A,2DH,CMP1
AJMP CMP2
CMP1: JNC CMP2
XCH A,2DH
XCH A,2CH
CMP2: MOV A,2DH
CJNE A,2EH,CMP3
MOV 2AH,A
AJMP RR
CMP3: JC CMP4
MOV 2AH,A
AJMP RR
CMP4: MOV A,2EH
CJNE A,2CH,CMP5
MOV 2AH,A
AJMP RR
CMP5: JC CMP6
XCH A,2CH
CMP6: MOV 2AH,A
RR: RET
;****************************************************************************
PTT1: CLR 00H ;[T1中斷子程序]
JB 20H,GGG
SETB P1.0 ;關閉電爐
GG: CLR PT1
RETI
GGG: SETB P1.1 ;關閉風扇
CLR 20H
AJMP GG
;****************************************************************************
DLY10MS: MOV R7,#0A0H ;[延時10毫秒子程序]
DL00: MOV R6,#0FFH
DL11: DJNZ R6,DL11
DJNZ R7,DL00
RET
;****************************************************************************
PID: MOV R5,#00H ?。跴ID算法子程序]
MOV R4,2DH ;取Nx值
MOV R3,#00H
MOV R2,#28H ;取40度值
LCALL CPL1
LCALL DSUM ;求(Nx-28H)的值
MOV R0,#5AH ;賦乘法運算暫存單元地址首址
MOV R5,#05H
MOV R4,#1CH ;賦參數(5.12)
LCALL MULT ;調無符號數乘法
MOV 31H,5BH
MOV 32H,5AH ;存放結果的有效值
MOV R5,31H
MOV R4,32H ;取雙字節的Ur(設定值)
MOV R3,2AH
MOV R2,#00H ;取雙字節的Ui(k)(實測值)
ACALL CPL1 ;取Ui(k)的補碼
ACALL DSUM ;計算E(k)
MOV 39H,R7
MOV 3AH,R6 ;存E(K)
MOV R5,35H
MOV R4,36H ;取KI參數
MOV R0,#4AH
ACALL MULT1 ;計算PI=KI*E(K)
MOV R5,39H
MOV R4,3AH ;取E(K)
MOV R3,3BH
MOV R2,3CH ;取E(K-1)
ACALL CPL1
ACALL DSUB ;求E(K)-E(K-1)
MOV R5,33H
MOV R4,34H ;取Kp參數
MOV R0,#46H
ACALL MULT1 ;求Kp*[E(K)-E(K-1)]
MOV R5,49H
MOV R4,48H
MOV R3,4DH
MOV R2,4CH
ACALL DSUM ;求Kp*[E(K)-E(K-1)]+KI*E(K)
MOV 4AH,R7
MOV 4BH,R6 ;保存上式之和
MOV R5,39H
MOV R4,3AH ;取E(K)
MOV R3,3DH
MOV R2,3EH ;取E(K-2)
ACALL DSUM ;計算E(K)+E(K-2)
MOV A,R7
MOV R5,A
MOV A,R6
MOV R4,A
MOV R3,3BH
MOV R2,3CH ;取E(k-1)
ACALL CPL1
ACALL DSUM ;求出E(K)+E(K-2)-2*E(K-1)
MOV A,R7
MOV R5,A
MOV A,R6
MOV R4,A
MOV R3,3BH
MOV R2,3CH
ACALL CPL1
ACALL DSUM
MOV R5,37H
MOV R4,38H ;取Kd參數
MOV R0,#46H
ACALL MULT1 ;求出Pd=Kd*[E(K)+E(K-2)-2*E(K-1)]
MOV R5,49H
MOV R4,48H ;取Pd
MOV R3,4AH
MOV R2,4BH ;取Kp*[E(K)-E(K-1)]+KI*E(K)
ACALL DSUM ;計算Pd+PI
MOV A,R7
MOV R3,A
MOV A,R6 ;取Pd+PI
MOV R2,A
MOV R5,2FH
MOV R4,30H ;取P(k-1)
ACALL DSUM ;求P(K)=Pd+Pp+P(K-1)
MOV 2FH,R7
MOV 30H,R6 ;存P(k)到P(k-1)
MOV 29H,2FH
MOV 3DH,3BH
MOV 3EH,3CH ;存E(K-1)到E(K-2)
MOV 3BH,39H
MOV 3CH,3AH ;存E(K)到E(k-1)
MOV A,31H ;取設定值
CJNE A,2AH,AA2 ;比較設定值與實測值
AA3: CLR 20H ;清電爐標志
AA1: RET
AA2: JNC AA3
SETB 20H ;清風扇標志位
MOV R3,39H
MOV R2,3AH
LCALL CPL1
MOV A,R3
MOV R7,A
MOV A,R2
MOV R6,A
MOV R5,42H
MOV R4,43H ;取K(風扇)參數
MOV R0,#5AH
ACALL MULI1 ; 計算P`=K*E(K),且結果防在51H,50H單元中
MOV 28H,5BH ;取8位有效值,放到28H單元中
AJMP AA1
;****************************************************************************DSUM: MOV A,R4 ;[雙字節加法子程序]:(R5R4)+(R3R2)-->(R7R6)
ADD A,R2
MOV R6,A
MOV A,R5
ADDC A,R3
MOV R7,A
RET
;****************************************************************************
CPL1: MOV A,R2 ;[雙字節求補子程序]:(R3R2)求補
CPL A
ADD A,#01H
MOV R2,A
MOV A,R3
CPL A
ADDC A,#00H
MOV R3,A
RET
;****************************************************************************
MULT1: MOV A,R7 ;[雙字節有符號數乘法]:被乘數(R7R6),乘數(R5R4)
RLC A
MOV 5CH,C ;被乘數符號C1-->5CH位
JNC POS1 ;為正數則轉
MOV A,R6 ;為負數則求補
CPL A
ADD A,#01H
MOV R6,A
MOV A,R7
CPL A
ADDC A,#00H
MOV R7,A
POS1: MOV A,R5 ;取乘數
RLC A ;乘數符號C2-->5DH位
MOV 5DH,C
JNC POS2 ;為整數則轉
MOV A,R4
CPL A
ADD A,#01H
MOV R4,A
MOV A,R5
CPL A
ADDC A,#00H
MOV R5,A
POS2: ACALL MULT ;調雙字節無符號數乘法子程序
MOV C,5CH
ANL C,5DH
JC TPL ;負負相乘則轉
MOV C,5CH
ORL C,5DH
JNC TPL ;正正相乘則轉
DEC R0
MOV A,@R0
CPL A
ADD A,#01H
MOV @R0,A
INC R0
MOV A,@R0
CPL A
ADDC A,#00H
MOV @R0,A
TPL: RET
;**************************************************************************** MULT: MOV A,R6
MOV B,R4 ;取低位相乘
MUL AB
MOV @R0,A
MOV R3,B
MOV A,R4
MOV B,R7
MUL AB
ADD A,R3
MOV R3,A
MOV A,B
ADDC A,#00H
MOV R2,AMOV A,R6
MOV B,R5
MUL AB
ADD A,R3
INC R0
MOV @R0,A
CLR 5BH
MOV A,R2
ADDC A,B
MOV R2,A
JNC LAST
SETB 5BH ;置進位標志
LAST: MOV A,R7
MOV B,R5
MUL AB
ADD A,R2
INC R0
MOV @R0,A ;存積的第二字節
MOV A,B
ADDC A,#00H
MOV C,5BH
ADDC A,#00H
INC R0
MOV @R0,A
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -