此控溫程序是采用PD控溫方式,入口在 : BLXS 最大取值 255 WFXS 最大取值 255 ; SDWDHH,SDWDHL 設(shè)定溫度的16進制高低字節(jié)存儲地址 ; WDZHH,WDZHL 當前溫度的16進制高低字節(jié)存儲地址 ; ; 出口在: ZSJCSH 加熱時間 ; ZSJCSL 不加熱時間 ; ; ZSJCSH+ZSJCSL=200 則一個控溫周期= 200*基本定時周期BCPCHH EQU 30H BCPCHL EQU 31H BLCSH EQU 32H BLCSL EQU 33H BLXS EQU 34H WFXS EQU 35H PCWFH EQU 36H PCWFL EQU 37H SCPCHH EQU 38H SCPCHL EQU 39H SDWDHH EQU 3AH SDWDHL EQU 3BH WDZHH EQU 3CH WDZHL EQU 3DH WFCSH EQU 3EH WFCSL EQU 3FH ZSJCSH EQU 40H ZSJCSL EQU 41H BLPCFH BIT 00H SCBLPCFH BIT 01H WFPCFH BIT 02H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;PID控溫子程序需定義RAM SDWDHH SDWDHL WDZHL WDZHH BCPCHL BCPCHH SCPCHH SCPCHL ; BLXS WFXS PCWFH PCWFL WFCSL WFCSH BLCSL BLCSH ZSJCSH ZSJCSL ; ; 標志位 BLPCFH SCBLPCFH WFPCFH PDjs: ;計算e(t) 值 CLR C MOV A,SDWDHL ;sdwdhh,sdwdhl 存設(shè)定溫度帶一位小數(shù) MOV R7,WDZHL SUBB A,R7 MOV BCPCHL,A ;存本次偏差低8位 MOV A,SDWDHH MOV R7,WDZHH SUBB A,R7 MOV BCPCHH,A ;存本次偏差高8位 JC BOOLL2 CLR BLPCFH ;清比例偏差符號 BOOLL3: JB BLPCFH,JSSZ3 ;符號位為0表示正值,為1表示負值 本次比例偏差符號 為負不加熱退出 JB SCBLPCFH,JSSZ2 ;符號位為0表示正值,為1表示負值 上次比例偏差符號 JMP JSSZ1 BOOLL2: SETB BLPCFH CLR C MOV A,#0FFH SUBB A,BCPCHL ;本次溫度大于設(shè)定溫度,求補锝實際數(shù)值 e(t) MOV BCPCHL,A MOV A,#0FFH SUBB A,BCPCHH MOV BCPCHH,A INC BCPCHL JMP BOOLL3 JSSZ3: MOV A,BCPCHL MOV SCPCHL,A MOV A,BCPCHH MOV SCPCHH,A JB BLPCFH,MLLP1232 ;將本次偏差數(shù)值與符號賦給上次保存地址 CLR SCBLPCFH JMP fool2 MLLP1232: SETB SCBLPCFH jmp fool2 JSSZ2: CLR C ;e(t)>0 e(t-1) <0 MOV A,BCPCHL ;計算e(t)-e(t-1) 的結(jié)果,存入PCWFL,PCWFH中 ADDC A,SCPCHL MOV PCWFL,A MOV A,BCPCHH ADDC A,SCPCHH MOV PCWFH,A CLR WFPCFH JMP AOOL1 JSSZ1: CLR C ;到此為止,本次e(t) 值已算出,并有符號位,可判正負%%%%%%%%%%%%%%%%%%%%%%% MOV A,BCPCHL ;計算e(t)-e(t-1) 的結(jié)果,存入PCWFL,PCWFH中 SUBB A,SCPCHL ;e(t) e(t-1) 都為正值 MOV PCWFL,A MOV A,BCPCHH SUBB A,SCPCHH MOV PCWFH,A CLR WFPCFH JNC AOOL1 ;本次偏差>上次偏差,轉(zhuǎn)走 SETB WFPCFH ;微分偏差符號置位 CLR C MOV A,#0FFH SUBB A,PCWFL ;本次偏差<上次偏差,求補锝實際數(shù)值 MOV PCWFL,A MOV A,#0FFH SUBB A,PCWFH MOV PCWFH,A INC PCWFL AOOL1: MOV A,BCPCHL MOV SCPCHL,A MOV A,BCPCHH MOV SCPCHH,A JB BLPCFH,MLLP1 ;將本次偏差數(shù)值與符號賦給上次保存地址 CLR SCBLPCFH JMP MLLP2 MLLP1: SETB SCBLPCFH MLLP2: MOV R2,BCPCHH MOV R3,BCPCHL MOV R4,#0 ;求kp*e(t) MOV R5,#0 MOV R6,#0 MOV R7,BLXS CALL MULD MOV BLCSL,R5 ;結(jié)果送到比例常數(shù)存儲 MOV BLCSH,R4 MOV R3,PCWFL MOV R2,PCWFH MOV R4,#0 MOV R5,#0 MOV R6,#0 MOV R7,WFXS CALL MULD ;求kd*(e(t)-e(t-1)) MOV WFCSL,R5 MOV WFCSH,R4 ;結(jié)果送到微分常數(shù)存儲 JB BLPCFH,FOOL2 ;比例相為負,不計算結(jié)果,直接賦pouth=#00 poutl=#200,退出中斷 JB WFPCFH,AOOL2 ;微分項為負轉(zhuǎn)走 CLR C MOV A,BLCSL ADD A,WFCSL ;KP>0,KD>0 MOV ZSJCSL,A ;將結(jié)果存入總時間常數(shù)中 kp*e(t)+kd*(e(t)-e(t-1)) MOV A,BLCSH ADDC A,WFCSH MOV ZSJCSH,A AOOL4: CLR C MOV A,ZSJCSL SUBB A,#0D0H MOV A,ZSJCSH SUBB A,#07H ;為什么是小于2000而不是200呢,因為進行偏差計算時時帶一位小數(shù)的擴大了10倍 JC AOOL3 ;有借位,說明總時間常數(shù)《2000h,數(shù)據(jù)沒有溢出繼續(xù) MOV ZSJCSL,#0D0H MOV ZSJCSH,#07H ;無借位說明總時間常數(shù)>2000h,數(shù)據(jù)溢出賦最大值2000h繼續(xù) JMP AOOL3 FOOL2: MOV ZSJCSL,#0 ;比例項小于微分項不加熱 MOV ZSJCSH,#0 JMP AOOL3 AOOL2: CLR C MOV A,BLCSL SUBB A,WFCSL ;KP>0,KD<0 MOV ZSJCSL,A ;將結(jié)果存入總時間常數(shù)中 kp*e(t)-kd*(e(t)-e(t-1)) MOV A,BLCSH SUBB A,WFCSH MOV ZSJCSH,A JNC AOOL4 ;KP>KD MOV ZSJCSL,#0 ;比例項小于微分項不加熱 MOV ZSJCSH,#0 JMP AOOL3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;以下程序的4舍5入是為了增加精度,否則總時間常數(shù)可以直接除以10得POUTH值;;;;;;;; AOOL3: MOV R6,ZSJCSH MOV R7,ZSJCSL ;總數(shù)據(jù)常數(shù)里面存的是16進制數(shù) MOV R3,#0 MOV R4,#0 MOV R5,#0 CALL HB2 ;換算成bcd碼出口在r3,r4,r5中 MOV A,R5 ANL A,#0FH ;取小數(shù)位 CLR C SUBB A,#5 JC PPPOOP1 ;小數(shù)位<5,轉(zhuǎn)走 MOV A,R5 ANL A,#0F0H SWAP A INC A PPPOOP2: MOV R5,A ;小數(shù)位>5,個位數(shù)加1實現(xiàn)四舍五入 MOV A,R4 ANL A,#0FH SWAP A ADD A,R5 MOV R3,A MOV A,R4 ANL A,#0F0H SWAP A MOV R2,A CALL BH2 MOV ZSJCSH,r3 ;MOV POUTH,R3 為了節(jié)省存儲器此處用zsjcsh,zsjcsl MOV A,#200 ;代替pouth,poutl SUBB A,R3 MOV ZSJCSl,a ;MOV POUTL,A RET PPPOOP1: MOV A,R5 ANL A,#0F0H SWAP A JMP PPPOOP2 ;(21)標號: BH2 功能:雙字節(jié)BCD碼整數(shù)轉(zhuǎn)換成雙字節(jié)十六進制整數(shù) ;入口條件:待轉(zhuǎn)換的雙字節(jié)BCD碼整數(shù)在R2、R3中。 ;出口信息:轉(zhuǎn)換后的雙字節(jié)十六進制整數(shù)仍在R2、R3中。 ;影響資源:PSW、A、B、R2、R3、R4 堆棧需求: 4字節(jié) BH2: MOV A,R3; ;將低字節(jié)轉(zhuǎn)換成十六進制 LCALL BCDH MOV R3,A MOV A,R2; ;將高字節(jié)轉(zhuǎn)換成十六進制 LCALL BCDH MOV B,#100; ;擴大一百倍 MUL AB ADD A,R3; ;和低字節(jié)按十六進制相加 MOV R3,A CLR A ADDC A,B MOV R2,A RET ;(20)標號:BCDH 功能:單字節(jié)BCD碼整數(shù)轉(zhuǎn)換成單字節(jié)十六進制整數(shù) ;入口條件:待轉(zhuǎn)換的單字節(jié)BCD碼整數(shù)在累加器A中。 ;出口信息:轉(zhuǎn)換后的單字節(jié)十六進制整數(shù)仍在累加器A中。 ;影響資源:PSW、A、B、R4 堆棧需求: 2字節(jié) BCDH: MOV B,#10H ; ;分離十位和個位 DIV AB MOV R4,B ; ;暫存?zhèn)位 MOV B,#10 ; ;將十位轉(zhuǎn)換成十六進制 MUL AB ADD A,R4 ; ;按十六進制加上個位 RET ;(17) 標號: HB2 功能:雙字節(jié)十六進制整數(shù)轉(zhuǎn)換成雙字節(jié)BCD碼整數(shù)
;入口條件:待轉(zhuǎn)換的雙字節(jié)十六進制整數(shù)在R6、R7中。 ;出口信息:轉(zhuǎn)換后的三字節(jié)BCD碼整數(shù)在R3、R4、R5中。 ;影響資源:PSW、A、R2~R7 堆棧需求: 2字節(jié) HB2: CLR A ; ;BCD碼初始化 MOV R3,A MOV R4,A MOV R5,A MOV R2,#10H ; ;轉(zhuǎn)換雙字節(jié)十六進制整數(shù) HB3: MOV A,R7 ; ;從高端移出待轉(zhuǎn)換數(shù)的一位到CY中 RLC A MOV R7,A MOV A,R6 RLC A MOV R6,A MOV A,R5 ; ;BCD碼帶進位自身相加,相當于乘2 ADDC A,R5 DA A ; ;十進制調(diào)整 MOV R5,A MOV A,R4 ADDC A,R4 DA A MOV R4,A MOV A,R3 ADDC A,R3 MOV R3,A ; ;雙字節(jié)十六進制數(shù)的萬位數(shù)不超過6,不用調(diào)整 DJNZ R2,HB3 ; ;處理完16bit RET ;(5) 標號: MULD 功能:雙字節(jié)二進制無符號數(shù)乘法 ; ;入口條件:被乘數(shù)在R2、R3中,乘數(shù)在R6、R7中。 ;出口信息:乘積在R2、R3、R4、R5中。 ;影響資源:PSW、A、B、R2~R7 堆棧需求: 2字節(jié) MULD: MOV A,R3 ; ;計算R3乘R7 MOV B,R7 MUL AB MOV R4,B ; ;暫存部分積 MOV R5,A MOV A,R3 ; ;計算R3乘R6 MOV B,R6 MUL AB ADD A,R4 ; ;累加部分積 MOV R4,A CLR A ADDC A,B MOV R3,A MOV A,R2 ; ;計算R2乘R7 MOV B,R7 MUL AB ADD A,R4 ; ;累加部分積 MOV R4,A MOV A,R3 ADDC A,B MOV R3,A CLR A RLC A XCH A,R2 ; ;計算R2乘R6 MOV B,R6 MUL AB ADD A,R3 ; ;累加部分積 MOV R3,A MOV A,R2 ADDC A,B MOV R2,A RET |