新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機的PD控溫程序

        51單片機的PD控溫程序

        作者: 時間:2012-10-12 來源:網絡 收藏

        ;此控溫程序是采用方式,入口在 : BLXS 最大取值 255 WFXS 最大取值 255
        ; SDWDHH,SDWDHL 設定溫度的16進制高低字節存儲地址
        ; WDZHH,WDZHL 當前溫度的16進制高低字節存儲地址
        ;
        ; 出口在: 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 存設定溫度帶一位小數
        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 ;本次溫度大于設定溫度,求補锝實際數值 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 ;將本次偏差數值與符號賦給上次保存地址
        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) 的結果,存入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) 的結果,存入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 ;本次偏差>上次偏差,轉走
        SETB WFPCFH ;微分偏差符號置位
        CLR C
        MOV A,#0FFH
        SUBB A,PCWFL ;本次偏差上次偏差,求補锝實際數值
        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 ;將本次偏差數值與符號賦給上次保存地址
        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 ;結果送到比例常數存儲
        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 ;結果送到微分常數存儲
        JB BLPCFH,FOOL2 ;比例相為負,不計算結果,直接賦pouth=#00 poutl=#200,退出中斷
        JB WFPCFH,AOOL2 ;微分項為負轉走
        CLR C
        MOV A,BLCSL
        ADD A,WFCSL ;KP>0,KD>0
        MOV ZSJCSL,A ;將結果存入總時間常數中 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呢,因為進行偏差計算時時帶一位小數的擴大了10倍
        JC AOOL3 ;有借位,說明總時間常數《2000h,數據沒有溢出繼續
        MOV ZSJCSL,#0D0H
        MOV ZSJCSH,#07H ;無借位說明總時間常數>2000h,數據溢出賦最大值2000h繼續

        JMP AOOL3

        FOOL2:
        MOV ZSJCSL,#0 ;比例項小于微分項不加熱
        MOV ZSJCSH,#0
        JMP AOOL3

        AOOL2:
        CLR C
        MOV A,BLCSL
        SUBB A,WFCSL ;KP>0,KD0
        MOV ZSJCSL,A ;將結果存入總時間常數中 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入是為了增加精度,否則總時間常數可以直接除以10得POUTH值;;;;;;;;
        AOOL3: MOV R6,ZSJCSH
        MOV R7,ZSJCSL ;總數據常數里面存的是16進制數
        MOV R3,#0
        MOV R4,#0
        MOV R5,#0
        CALL HB2 ;換算成bcd碼出口在r3,r4,r5中
        MOV A,R5
        ANL A,#0FH ;取小數位
        CLR C
        SUBB A,#5
        JC PPPOOP1 ;小數位5,轉走
        MOV A,R5
        ANL A,#0F0H
        SWAP A
        INC A
        PPPOOP2:
        MOV R5,A ;小數位>5,個位數加1實現四舍五入
        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 為了節省存儲器此處用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


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 兴安县| 政和县| 收藏| 寻乌县| 砀山县| 武清区| 怀集县| 北川| 新野县| 威远县| 诸暨市| 孝感市| 丰原市| 泰来县| 嘉荫县| 定远县| 徐汇区| 稷山县| 南陵县| 长乐市| 台安县| 财经| 景谷| 六枝特区| 陈巴尔虎旗| 南京市| 外汇| 九江市| 察哈| 应城市| 丹东市| 郸城县| 上犹县| 云阳县| 伊春市| 金堂县| 思茅市| 房山区| 南昌县| 南靖县| 潜江市|