增量式PID控制算法程序匯編_第1頁
增量式PID控制算法程序匯編_第2頁
增量式PID控制算法程序匯編_第3頁
增量式PID控制算法程序匯編_第4頁
增量式PID控制算法程序匯編_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余33頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、.*增量式 PID 控制算法程序 ( 匯編)增量式 PID 控制算法程序 *;T、TD TI、KP依次從 30H, 33H, 36H, 39H開始。;A , B, C的值依次存在 BL0CK,1 BL0CK2 BL0CK3勺地址里這里 R(k) 給的是定值;0RG 0000HBL0CK1 EQU 43H ;A,B ,C BL0CK2 EQU 46HBL0CK3 EQU 49HUK EQU 4CH ;存結(jié)果 UKRK EQU 50HEK EQU 53H ;存放偏差值E(k)的始址EK1 EQU 56H ;存放E(k-1)的始址EK2EQU 59H ;存放 E(k-2) 的始址 CK EQU 5C

2、H ;采樣數(shù)據(jù)始址BUFF EQU 60H ;暫存區(qū)BUFF1 EQU 63HBUFF2 EQU 66HREC EQU 69HTEST:MOV RK,#01H 常數(shù) Rk 的 BCD碼浮點(diǎn)數(shù) MOV RK+1,#12H ;1.25 MOV RK+2,#50HMOV 3CH,#01H 常數(shù) 1 的 BCD碼浮點(diǎn)數(shù) MOV 3DH,#10HMOV 3EH,#00HMOV 40H,#01H 常數(shù) 2 的 BCD碼浮點(diǎn)數(shù) MOV 41H,#20HMOV 42H,#00HMOV 30H,#01H ;T的 BCD碼浮點(diǎn)數(shù) MOV 31H,#23H ;2.34 MOV 32H,#40HMOV 33H,#01

3、H ;Td的 BCD碼浮點(diǎn)數(shù) MOV 34H,#35H ;3.54 MOV 35H,#40HMOV 36H,#01H ;Ti 的 BCD碼浮點(diǎn)數(shù) MOV 37H,#11H ;1.12 MOV 38H,#20HMOV 39H,#01H ;Kp的 BCD碼浮點(diǎn)數(shù) MOV 3AH,#12H ;1.25 MOV 3BH,#50HMOV R0,#RK ;指向, 碼浮點(diǎn)操作數(shù)LCALL BTOF ;將其轉(zhuǎn)換成二進(jìn)制浮點(diǎn)操作數(shù) MOV R0,#3CHLCALL BTOFMOV R0,#40HLCALL BTOFMOV R0,#39HLCALL BTOFMOV R0,#36H ;指向, 碼浮點(diǎn)操作數(shù) Ti L

4、CALL BTOF ;將其轉(zhuǎn)換成二進(jìn)制浮點(diǎn) 操作數(shù) MOV R0,#33H ;指向, 碼浮點(diǎn)操作數(shù) Td LCALL BTOF ;將其轉(zhuǎn)換成二進(jìn)制 浮點(diǎn)操作數(shù) MOV R0,#30H ;指向, 碼浮點(diǎn)操作數(shù) T LCALL BTOF ;將其轉(zhuǎn)換成二進(jìn) 制浮點(diǎn)操作數(shù)MOV R1, #BUFF1 保存 30H 中的值 即 T 值 LCALL FMOVR0MOV R1, #36H ;計(jì)算 A值(1+T/Ti+Td/T).KpLCALL FDIVMOV R1,#3CH ;常數(shù)1LCALL FADDMOV R0,#33H保存33H中的值MOV R1,#BUFFLCALL FMOVR0MOV R1,#BU

5、FF1LCALL FDIVMOV R1,#30H ;30H里存的是 T/Ti+1 LCALL FADDMOV R1,#39HLCALL FMULMOV R1 ,#BLOCK1 將結(jié)果保存在 BLOCK中 LCALL FMOVR0MOV R1,#BUFF1 ;30H恢 復(fù)原值MOV R0,#30HLCALL FMOVMOV R1,#BUFF ;33H恢 復(fù)原值MOV R0,#33HLCALL FMOVMOV R0,#40H 計(jì)算 B 的值 Kp.(1+2.Td/T)MOV R1,#33HLCALL FMULMOV R1,#30HLCALL FDIVMOV R1,#3CHLCALL FADDMOV

6、 R1,#39HLCALL FMULMOV R1,#BLOCK2保存 B 值到 BLOCK中 LCALL FMOVR0MOV R0,#39H 計(jì)算 C 的值 Kp.Td/T MOV R1,#33HLCALL FMULMOV R1,#BLOCK3保存 C值到 BLOCK中 LCALL FMOVROMOV R0,#EK1 將 EK1, EK2設(shè)初值 0 LCALL FCLRMOV RO,#EK2LCALL FCLRMOV REC,#03H 設(shè); 置采樣次數(shù)LOOP: MOV CK,#7eH ;采樣數(shù)據(jù)暫時(shí)給了一個(gè)定值 MOV CK+1,#21H ;0.002112MOV CK+2,#12HMOV

7、R0,#CKLCALL BTOFMOV R0,#RK保存R(k)中的值MOV R1,#BUFFLCALL FMOVR0MOV R1,#CKLCALL FSUB ;計(jì)算 R(k)-C(k) 的值送給 E(k) MOV R1,#EKLCALL FMOVR0MOV R1,#BUFF 恢復(fù) RK的值 釋放 BUFF MOV R0,#RKLCALL FMOVMOV R0,#BLOCK2將 B.e(k-I)的值暫存在 BUFF1中MOV R1,#BUFF 保存 BLCALL FMOVR0MOV R1,#EK1LCALL FMULMOV R1,#BUFF1LCALL FMOVR0Aoi/id nnvon乙歸

8、#3 AOI/I 才(乙-母AOI/I aoid nnvon 用嗨嫌沖懸曲o日 wn: >in#lod aoiaiAoi/id nnvon ddna w# v MM ddnatfLd aoiai 0dAOi/id nnvon 申MCIAOIAIaavd nnvon 乙 ddna#1 Ld aoiai ansd nnvon fe->i)3 9+(k>i)3 a-(>i)3 v ®>in #44 HdnatfLd aoiai nniAid nnvon >i3#lLd AOIAI 0dAOi/id nnvon ddnatfLd aoiai (>i)

9、3 v: oonatfod aoiaiAoi/id nnvon ddna MM ddnatfLd aoiai 0dAOi/id nnvon 乙 ddna#1 Ld aoiai nniAid nnvon 2>i3#lLd AOIAI 0dAOi/id nnvon o ddna#1 aoiai 竝run日 丑型島粵陰(3->i)90 Boioonatfod aoiaiAoi/id nnvon ddna w#a MM ddnatfLd aoiaiMOV R1,#EKMOV R0,#EK1LCALL FMOVLCALL DELAY ;等待采樣時(shí)刻DJNZ REC,NEXT1SJMP $NE

10、XT1: LJMP LOOPDELAY: MOV R7,#02H DELAY1: MOV R6,#0FFH DELAY2: DJNZ R6,DELAY2 DJNZ R7,DELAY1RET; (,) 標(biāo)號(hào): ,功能: 浮點(diǎn)數(shù)格式化; 入口條件 : 待格式化浮點(diǎn)操作數(shù)在 R0 中。; 出口信息 : 已格式化浮點(diǎn)操作數(shù)仍在 R0 中。 ; 影響資源 :PSW、A、R2、 R3、R4位仆H堆棧需求:,字節(jié)FSDT: LCALL MVR0 ;將待格式化操作數(shù)傳送到第一工作區(qū)中 LCALL RLN ; 通過 左規(guī)完成格式化LJMP MOV0 ;將已格式化浮點(diǎn)操作數(shù)傳回到 R0 中; (,) 標(biāo)號(hào): ,功

11、能: 浮點(diǎn)數(shù)加法;入口條件:被加數(shù)在R0中,加數(shù)在R1中。;出口信息:OV=0時(shí),和仍在R0 中,0V=1時(shí),溢出。;影響資源:PSW A B R2,R7、位1EH 1FH堆棧需求:, 字節(jié)FADD: CLR F0 ; 設(shè)立加法標(biāo)志SJMP AS ;計(jì)算代數(shù)和; (,) 標(biāo)號(hào): , 功能: 浮點(diǎn)數(shù)減法; 入口條件 : 被減數(shù)在 R0 中,減數(shù)在 R1 中。 ; 出口信息 :OV=0 時(shí),差仍在 R0 中,0V=1時(shí),溢出。;影響資源:PSW A、B、R2,R7、位1EH 1FH堆棧需求:,字 節(jié)FSUB: SETB F0 ;設(shè)立減法標(biāo)志AS: LCALL MVR1 ;計(jì)算代數(shù)和。先將 R1 傳

12、送到第二工作區(qū) M0V C,F0 ; 用加 減標(biāo)志來校正第二操作數(shù)的有效符號(hào) CLR A ; *, 應(yīng)加的一條語句RRC AXRL A,R1M0V C,ACC.7ASN: MOV 1EH,C ;將第二操作數(shù)的有效符號(hào)存入位 1EH中XRL A,R0 ;與第一 操作數(shù)的符號(hào)比較RLC AMOV F0,C ;保存比較結(jié)果LCALL MVR0將R0傳送到第一工作區(qū)中LCALL AS1 ; 在工作寄存器中完成代數(shù)運(yùn)算MOV0: INC R0 ;將結(jié)果傳回到R0中的子程序入口 INC R0MOV A,R4 ;傳回尾數(shù)的低字節(jié)MOV R0,ADEC R0MOV A,R3 ;傳回尾數(shù)的高字節(jié)MOV R0,A

13、DEC R0MOV A,R2 ;取結(jié)果的階碼MOV C,1FH ;取結(jié)果的數(shù)符MOV ACC.7,C ;拼入階碼中MOV R0,ACLR ACC.7 ; 不考慮數(shù)符CLR OV ;清除溢出標(biāo)志CJNE A,#3FH,MV01 階碼是否上溢,*應(yīng)為#40HSETB OV ;設(shè)立溢出標(biāo)志MV01: MOV A,R0 取; 出帶數(shù)符的階碼 RETMVR0: MOV A,R0將R0傳送到第一工作區(qū)中的子程序MOV C,ACC.7 ;將數(shù)符保存在位1FH中MOV仆H,CMOV C,ACC.6 ;將階碼擴(kuò)充為 , 補(bǔ)碼 MOV ACC.7,CMOV R2,A ;存放在R2中INC R0MOV A,R0將尾

14、數(shù)高字節(jié)存放在 R3中MOV R3,A ;INC R0MOV A,R0將尾數(shù)低字節(jié)存放在 R4中MOV R4,ADEC R0 ;恢復(fù)數(shù)據(jù)指針DEC R0RETMVR1: MOV A,R1將R1傳送到第二工作區(qū)中的子程序MOV C,ACC.7 ;將數(shù)符保存在位1EH中MOV 1EH,CMOV C,ACC.6 ;將階碼擴(kuò)充為 , 補(bǔ)碼 MOV ACC.7,CMOV R5,A ;存放在R5中INC R1MOV A,R1將尾數(shù)高字節(jié)存放在 R6中MOV R6,AINC R1MOV A,R1將尾數(shù)低字節(jié)存放在 R7中MOV R7,ADEC R1 ;恢復(fù)數(shù)據(jù)指針DEC R1RETAS1: MOV A,R6

15、 ;讀取第二操作數(shù)尾數(shù)高字節(jié) ORL A,R7JZ AS2 ; 第二操作數(shù)為零,不必運(yùn)算 MOV A,R3 ; 讀取第一操作數(shù)尾數(shù)高字節(jié)ORL A,R4JNZ EQMOV A,R6 ;第一操作數(shù)為零,結(jié)果以第二操作數(shù)為準(zhǔn)MOV R3,AMOV A,R7MOV R4,AMOV A,R5MOV R2,AMOV C,1EHMOV 1FH,CAS2: RETEQ: MOV A,R2 ;對(duì)階,比較兩個(gè)操作數(shù)的階碼XRL A,R5JZ AS4 ; 階碼相同,對(duì)階結(jié)束 JB ACC.7,EQ3; 階符互異MOV A,R2 ;階符相同,比較大小 CLR CSUBB A,R5JC EQ4EQ2: CLR C ;

16、 第二操作數(shù)右規(guī)一次 MOV A,R6 ; 尾數(shù)縮小一半RRC AMOV R6,AMOV A,R7RRC AMOV R7,AINC R5 ; 階碼加一ORL A,R6 ; 尾數(shù)為零否 ,JNZ EQ ; 尾數(shù)不為零,繼續(xù)對(duì)階MOV A,R2 ;尾數(shù)為零,提前結(jié)束對(duì)階 MOV R5,ASJMP AS4EQ3: MOV A,R2 ;判斷第一操作數(shù)階符JNB ACC.7,EQ2;如為正,右規(guī)第二操作數(shù)EQ4: CLR CLCALL RR1 ;第一操作數(shù)右規(guī)一次 ORL A,R3 ; 尾數(shù)為零否,JNZ EQ ;不為零,繼續(xù)對(duì)階 MOV A,R5 ;尾數(shù)為零,提前結(jié)束對(duì)階 MOV R2,AAS4: J

17、B F0,AS5 ; 尾數(shù)加減判斷 MOV A,R4 ;尾數(shù)相加ADD A,R7MOV R4,AMOV A,R3ADDC A,R6MOV R3,AJNC AS2LJMP RR1 ;有進(jìn)位,右規(guī)一次AS5: CLR C ; 比較絕對(duì)值大小 MOV A,R4SUBB A,R7MOV B,AMOV A,R3SUBB A,R6JC AS6MOV R4,B ;第一尾數(shù)減第二尾數(shù) MOV R3,ALJMP RLN ;結(jié)果規(guī)格化AS6: CPL 1FH ; 結(jié)果的符號(hào)與第一操作數(shù)相反CLR C ; 結(jié)果的絕對(duì)值為第二尾數(shù)減第一尾數(shù)MOV A,R7SUBB A,R4MOV R4,AMOV A,R6SUBB A

18、,R3MOV R3,ARLN: MOV A,R3 ;浮點(diǎn)數(shù)規(guī)格化 ORL A,R4 ; 尾數(shù)為零否 , JNZ RLN1MOV R2,#OC1H階碼取最小值*, 應(yīng)為#C0HRETRLN1: MOV A,R3 JB ACC.7,RLN2;尾數(shù)最高位為一否,CLR C ;不為一,左規(guī)一 次 LCALL RL1SJMP RLN ;繼續(xù)判斷RLN2: CLR OV ;規(guī)格化結(jié)束 RETRL1: MOV A,R4 ; 第一操作數(shù)左規(guī)一次RLC A ; 尾數(shù)擴(kuò)大一倍MOV R4,AMOV A,R3RLC AMOV R3,ADEC R2 ; 階碼減一CJNE R2,#0C0H,RL1E階碼下溢否,*應(yīng)改為

19、 CJNE R2 #OBFH RL1E;CLR AMOV R3,A ;階碼下溢,操作數(shù)以零計(jì) MOV R4,AMOV R2,#0C1H ; * 應(yīng)改為 MOV R2 #0C0HRL1E: CLR OVRETRR1: MOV A,R3 ;第一操作數(shù)右規(guī)一次 RRC A ; 尾數(shù)縮小一半MOV R3,AMOV A,R4RRC AMOV R4,AINC R2 ; 階碼加一CLR OV ;清溢出標(biāo)志CJNE R2,#40H,RR1E階碼上溢否,MOV R2,#3FH ;階碼溢出SETB OVRR1E: RET; (,) 標(biāo)號(hào): ,功能: 浮點(diǎn)數(shù)乘法; 入口條件 : 被乘數(shù)在 R0 中,乘數(shù)在 R1 中

20、。 ; 出口信息 :OV=0 時(shí),積仍在 R0 中,0V=1時(shí),溢出。;影響資源:PSW A、B、R2,R7、位1EH 1FH堆棧需求:,字節(jié)FMUL: LCALL MVR0將R0傳送到第一工作區(qū)中 MOV A,R0XRL A,R1 ;比較兩個(gè)操作數(shù)的符號(hào)RLC AMOV 1FH,C ;保存積的符號(hào)LCALL MUL0 ;計(jì)算積的絕對(duì)值LJMP MOV0 ;將結(jié)果傳回到 R0 中MUL0: LCALL MVR1將R1傳送到第二工作區(qū)中 MUL1: MOV A,R3 ;第一尾數(shù) 為零否, ORL A,R4JZ MUL6MOV A,R6 ;第二尾數(shù)為零否 ,ORL A,R7JZ MUL5MOV A

21、,R7 ;計(jì)算 R3R4X R6R7,?R3R4MOV B,R4 MUL ABMOV A,B XCH A,R7 MOV B,R3 MUL ABADD A,R7 MOV R7,A CLR AADDC A,B XCH A,R4 MOV B,R6 MUL ABADD A,R7 MOV R7,A MOV A,B ADDC A,R4 MOV R4,A CLR ARLC AXCH A,R3 MOV B,R6 MUL ABADD A,R4 MOV R4,A MOV A,B ADDC A,R3 MOV R3,A JB ACC.7,MUUR 為規(guī)格 化數(shù)否 , R7 四舍五入MOV A,R7 ;左規(guī)一次 RLC

22、 AMOV R7,A LCALL RL1 MUL2: MOV A,R7JNB ACC.7,MUL3INC R4MOV A,R4 JNZ MUL3 INC R3MOV A,R3 JNZ MUL3 MOV R3,#80H INC R2MUL3: MOV A,R2 ;求積的階碼ADD A,R5MD: MOV R2,A ;階碼溢出判斷JB ACC.7,MUL4JNB ACC.6,MUL6MOV R2,#3FH ;階碼上溢,設(shè)立標(biāo)志 SETB OVRETMUL4: JB ACC.6,MUL6 MUL5: CLR A ;結(jié)果清零(因子為零或階碼下溢 ) MOVR3,AMOV R4,AMOV R2,#41H

23、MUL6: CLR OVRET; (,) 標(biāo)號(hào): , ,, 功能:浮點(diǎn)數(shù)除法;入口條件:被除數(shù)在R0中,除數(shù)在R1中。;出口信息:OV=0時(shí),商仍在R0 中,OV=1時(shí),溢出。;影響資源:PSW A、B、R2,R7、位1EH 1FH堆棧需求:,字節(jié)FDIV: INC R0MOV A,R0INC R0ORL A,R0DEC R0DEC R0JNZ DIV1MOV R0,#41被除數(shù)為零,不必運(yùn)算 CLR OVRETDIV1: INC R1MOV A,R1INC R1ORL A,R1DEC R1DEC R1JNZ DIV2SETB OV ;除數(shù)為零,溢出RETDIV2: LCALL MVR0 ;將

24、R0傳送到第一工作區(qū)中 MOV A,R0XRL A,R1 ;比較兩個(gè)操作數(shù)的符號(hào)RLC AMOV仆H,C保存結(jié)果的符號(hào)LCALL MVR1將R1 傳送到第二工作區(qū)中LCALL DIV3 ;調(diào)用工作區(qū)浮點(diǎn)除法 LJMP MOV0 ;回傳結(jié)果DIV3: CLR C ; 比較尾數(shù)的大小 MOV A,R4SUBB A,R7MOV A,R3SUBB A,R6JC DIV4LCALL RR1 ;被除數(shù)右規(guī)一次 SJMP DIV3DIV4: CLR A ;借用R0R1R2乍工作寄存器XCH A,R0 ; 清零并保護(hù)之 PUSH ACCCLR AXCH A,R1PUSH ACCMOV A,R2PUSH ACC

25、MOV B,#10H ;除法運(yùn)算, R3R4,R6R7,?R0R1DIV5: CLR C MOV A,R1RLC AMOV R1,AMOV A,R0RLC AMOV R0,AMOV A,R4RLC AMOV R4,AXCH A,R3RLC AXCH A,R3MOV F0,CCLR CSUBB A,R7MOV R2,AMOV A,R3SUBB A,R6ANL C,/F0JC DIV6MOV R3,AMOV A,R2MOV R4,AINC R1DIV6: DJNZ B,DIV5MOV A,R6 ;四舍五入 CLR CRRC ASUBB A,R3CLR AADDC A,R1 ;將結(jié)果存回 R3R4M

26、OV R4,ACLR AADDC A,R0MOV R3,APOP ACC ;恢復(fù) R0R1R2 MOV R2,APOP ACCMOV R1,APOP ACCMOV R0,AMOV A,R2 ;計(jì)算商的階碼 CLR CSUBB A,R5LCALL MD ;階碼檢驗(yàn) LJMP RLN ; 規(guī)格化; (,)標(biāo)號(hào): ,功能: 浮點(diǎn)數(shù)清零; 入口條件 : 操作數(shù)在 R0 中。 ; 出口信息 : 操作數(shù)被清零。 ; 影響資源 :A 堆棧 需求: , 字節(jié)FCLR: INC R0 INC R0CLR AMOV R0,ADEC R0MOV R0,ADEC R0MOV R0,#41HRET/PID 算法溫控 C

27、語言 2008-08-17 18:58#include<reg51.h>#include<intrins.h>#include<math.h>#include<string.h>struct PID unsigned int SetPoint; / 設(shè)定目標(biāo) Desired Valueunsigned int Proportion; / 比例常數(shù) Proportional Const unsigned int Integral; / 積分常數(shù) Integral Const unsigned int Derivative; / 微分常 數(shù) Deri

28、vative Const unsigned int LastError; / Error-1 unsigned int PrevError; / Error-2 unsigned int SumError; / Sums of Errors ;struct PID spid; / PID Control Structure unsigned int rout; / PID Response (Output) unsigned int rin; / PID Feedback (Input) sbit data1=P1A0;sbit clk=P1M;sbit plus=P2A。;sbit subs

29、=P2A1;sbit stop=P2A2;sbit output=P3A4;sbit DQ=P3A3;unsigned char flag,flag_1=0;unsigned char high_time,low_time,count=0;/ 占空比調(diào)節(jié)參數(shù)unsigned char set_temper=35;unsigned char temper;unsigned char i;unsigned char j=0;unsigned int s;*延時(shí)子程序,延時(shí)時(shí)間以12M晶振為準(zhǔn),延時(shí)時(shí)間為30usX time*/void delay(unsigned char time) unsig

30、ned char m,n;for(n=0;n<time;n+)for(m=0;m<2;m+)/*寫一位數(shù)據(jù)子程序*/void write_bit(unsigned char bitval) EA=0;DQ=0; /*拉低DQ以開始一個(gè)寫時(shí)序*/if(bitval=1)_nop_();DQ=1; /* 如要寫 1,則將總線置高 */delay(5); /* 延時(shí) 90us 供 DA18B20采樣*/DQ=1; /*釋放DQ總線*/_nop_();_nop_();EA=1;*寫一字節(jié)數(shù)據(jù)子程序*/void write_byte(unsigned char val) unsigned c

31、har i;unsigned char temp;EA=0; /* 關(guān)中斷 */TR0=0;for(i=0;i<8;i+) /* 寫一字節(jié)數(shù)據(jù),一次寫一位 */temp=val>>i; /* 移位操作,將本次要寫的位移到最低位 */ temp=temp&1;write_bit(temp); /* 向總線寫該位 */delay(7); /* 延時(shí) 120us 后*/ TR0=1;EA=1; /* 開中斷 */ /* 讀一位數(shù)據(jù)子程序*/ unsigned char read_bit() unsigned char i,value_bit; EA=0;DQ=O; /*拉低

32、DQ開始讀時(shí)序*/_nop_();_nop_();DQ=1; /* 釋放總線 */for(i=0;i<2;i+)value_bit=DQ;EA=1;return(value_bit);/*讀一字節(jié)數(shù)據(jù)子程序*/unsigned char read_byte() unsigned char i,value=0; EA=0;for(i=0;i<8;i+)if(read_bit() /* 讀一字節(jié)數(shù)據(jù),一個(gè)時(shí)序中讀一次,并作移位處理 */ value|=0x01<<i;delay(4); /* 延時(shí) 80us 以完成此次都時(shí)序,之后再讀下一數(shù)據(jù) */ EA=1;return(

33、value);/*復(fù)位子程序*'unsigned char reset() unsigned char presence; EA=0;DQ=O; /*拉低DQ總線開始復(fù)位*/delay(30); /* 保持低電平 480us*/DQ=1; /* 釋放總線*/delay(3);presence=DQ; /* 獲取應(yīng)答信號(hào) */delay(28); /* 延時(shí)以完成整個(gè)時(shí)序 */EA=1;return(presence); /* 返回應(yīng)答信號(hào),有芯片應(yīng)答返回 O, 無芯片則返回 1*/ /*獲取溫度子程序*/void get_temper()unsigned char i,j;doi=re

34、set(); /* 復(fù)位 */while(i!=O); /*1 為無反饋信號(hào) */ i=Oxcc; /* 發(fā)送設(shè)備定位命令 */write_byte(i);i=0x44; /* 發(fā)送開始轉(zhuǎn)換命令 */write_byte(i);delay(180); /* 延時(shí) */doi=reset(); /* 復(fù)位 */while(i!=0);i=0xcc; /* 設(shè)備定位 */write_byte(i);i=0xbe; /* 讀出緩沖區(qū)內(nèi)容 */write_byte(i);j=read_byte();i=read_byte();i=(i<<4)&0x7f;s=(unsigned in

35、t)(j&0x0f); s=(s*100)/16;j=j>>4;temper=i|j; /* 獲取的溫度放在 temper 中 */*=Initialize PID Structure*/void PIDInit (struct PID *pp) memset ( pp,0,sizeof(struct PID); /*=P 計(jì)算部分=*/ unsigned int PIDCalc( struct PID *pp, unsigned int NextPoint )unsigned int dError,Error;Error = pp->SetPoint - NextP

36、oint; /偏差pp->SumError += Error; / 積分 dError = pp->LastError - pp->PrevError; /當(dāng)前微分pp->PrevError = pp->LastError; pp->LastError = Error; return (pp->Proportion * Error/比例+ pp->Integral * pp->SumError /積分項(xiàng)+ pp->Derivative * dError); /微分項(xiàng)/* 溫度比較處理子程序*/compare_temper()unsig

37、ned char i;if(set_temper>temper)if(set_temper-temper>1) high_time=100;low_time=0;else for(i=0;i<10;i+) get_temper();rin = s; / Read Inputrout = PIDCalc ( &spid,rin ); / Perform PID Interation if (high_time<=100) high_time=(unsigned char)(rout/800); else high_time=100;low_time= (100-h

38、igh_time); else if(set_temper<=temper) if(temper-set_temper>0) high_time=0;low_time=100;elsefor(i=0;i<10;i+) get_temper();rin = s; / Read Input rout = PIDCalc ( &spid,rin ); / Perform PIDInterationif (high_time<100)high_time=(unsigned char)(rout/10000);elsehigh_time=0;low_time= (100-

39、high_time); / else/ /*T0 中斷服務(wù)子程序,用于控制電平的翻轉(zhuǎn) ,40us*100=4ms 周期*/void serve_T0() interrupt 1 using 1if(+count<=(high_time) output=1;else if(count<=100)output=0;else count=0;TH0=0x2f;TL0=0xe0; /* 串行口中斷服務(wù)程序,用于上位機(jī)通訊 */void serve_sio() interrupt 4 using 2 /* EA=0;RI=0; i=SBUF;if(i=2)while(RI=0) RI=0;

40、set_temper=SBUF; SBUF=0x02;while(TI=0) TI=0; else if(i=3)TI=0;SBUF=temper;while(TI=0) TI=0;EA=1; */void disp_1(unsigned char disp_num16)unsigned char n,a,m; for(n=0;n<6;n+) / k=disp_num1n; for(a=0;a<8;a+) clk=0;m=(disp_num1n&1); disp_num1n=disp_num1n>>1; if(m=1)data1=1;elsedata1=0;_n

41、op_();clk=1;_nop_();/*顯示子程序功能: 將占空比溫度轉(zhuǎn)化為單個(gè)字符,顯示占空比和測(cè)得到的溫度*/void display()unsigned char codenumber=0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6;unsigned char disp_num6; unsigned int k,k1;k=high_time;k=k%1000;k1=k/100;if(k1=0)disp_num0=0;elsedisp_num0=0x60;k=k%100;disp_num1=numberk/10; disp_num2=

42、numberk%10; k=temper;k=k%100;disp_num3=numberk/10; disp_num4=numberk%10+1;disp_num5=numbers/10; disp_1(disp_num);/*主程序*/main()unsigned char z;unsigned char a,b,flag_2=1,count1=0;unsigned char phil=2,0xce,0x6e,0x60,0x1c,2;TMOD=0x21;TH0=0x2f;TL0=0x40;SCON=0x50;PCON=0x00;TH1=0xfd;TL1=0xfd;PS=1;EA=1;EX1=0;ET0=1;ES=1;TR0=1;TR1=1;high_time=50;low_time=50;PIDInit ( &spid ); / Initialize Structurespid.Proportion = 10; / Set PID Coefficientsspid.Integral = 8; spid.Derivative =6; spid.Se

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論