?? 爐溫控制實現.txt
字號:
八、 程序代碼和代碼分析
ORG 0000H ;偏移量0000H
LJMP MAIN ;跳轉到MAIN運行
ORG 0003H ;偏移量0003H
LJMP CIT1 ;外中斷0中斷處理
ORG 000BH ;偏移量000BH
LJMP PIT0 ;計時器0溢出中斷處理
ORG 0013H ;偏移量0013H
LJMP INT0 ;外中斷1中斷處理
ORG 001BH ;偏移量001BH
LJMP PIT1 ;計時器1溢出中斷處理
ORG 0030H ;偏移量0030H
MAIN: SETB P3.5 ;截止控制硅
NOP
SETB P3.4 ;電網工頻過0脈沖
NOP
MOV SP, #60H ;初始化堆棧指針,60H
MOV P1, #0FFH ;送FF到P1口,啟動14433
MOV DPTR, #5FFFH ;下面三行,將顯示RAM置1
MOV A, #0DCH
MOVX @DPTR, A
LP: MOVX A, @DPTR ;讀出8279狀態字
JB ACC.7, LP ;最高位為1,則跳轉到上一步
MOV DPTR, #5FFFH
MOV A, #00H ;設A為8279控制字000 00000B,左進方式,顯
示8個字符,二鍵鎖定,編碼掃描
MOVX @DPTR, A ;送控制字
MOV A, #34H ;8279控制字,將系統時鐘分頻至100kHz的20
倍
MOVX @DPTR, A ;送控制字
MOV TMOD, #11H ;設定時模式
;分別為定時器0、1的高、低位賦初值
MOV TH0, #0FFH
MOV TL0, #0FFH
MOV TH1, #0D8H
MOV TL1, #0F0H
CLR 22H ;清除按鍵中斷的標志位
NOP
CLR 23H ;清除外中斷0的標志位
NOP
CLR 25H ;清除定時器0溢出中斷的標志位
NOP ;循環初始39H到3EH顯示數據存儲單元,全為暗碼
MOV R0, #39H
MOV R7, #06H
LPP: MOV @R0, #17H
INC R0
DJNZ R7, LPP ;循環清除從40H開始,32個數據存儲單元
MOV R0, #40H
MOV R7, #20H
LPPL: MOV @R0, #00H
MOV A, #1H
ORL A; TM0D
MOV TM0D, A
MOV @R0 #00H
INC R0
DJNZ R7, LPPL
MOV 50H, #96H ;初始1.5秒時間常數
LCALL DIR ;顯示
CLR IT1 ;清外中斷1類型控制位,低電平觸發
NOP
SETB EX1 ;允許外中斷1
NOP
SETB IT0 ;置位中斷0類型控制位,高電平觸發
NOP
SETB EX0 ;允許外中斷0
NOP
MOV IP, #08H ;設中斷優先級,計時器1中斷最高
SETB EA ;置總中斷允許位,允許中斷
NOP
LPPP: LCALL KEYI ;輸入給定溫度值的十位
ANL A, #0FH ;保留低四位,限制在范圍
CJNE A, #0AH, LPP1 ;比10小則置位進位
LPP1: JNC LPPP ;比10大,重新輸入
MOV 3EH, A ;送鍵值到相應的顯示數據存儲單元
MOV 40H, A ;送設定溫度值高位
LCALL DIR ;顯示
LPP2: LCALL KEYI ;輸入給定溫度值的個位
ANL A, #0FH ;限制處理
CJNE A, #0AH, LPP3
LPP3: JNC LPP2
MOV 3DH, A ;送鍵值到相應的顯示數據存儲單元
MOV 41H, A ;送設定溫度值低位
LCALL DIR ;顯示
LP00: LCALL KEYI ;輸入采樣周期高位
ANL A, #0FH ;限制處理
CJNE A, #0AH, LP01
LP01: JNC LP00
MOV 3AH, A ;采樣周期高位送相應的顯示存儲單元
MOV 3BH, #1AH ;顯示t
MOV 3CH, #17H ;暗碼
LCALL DIR ;顯示
LP02: LCALL KEYI ;輸入采樣周期高位
ANL A, #0FH ;限制處理
CJNE A, #0AH, LP03
LP03: JNC LP02
MOV 39H, A ;采樣周期高位送相應的顯示存儲單元
LCALL DIR ;顯示
MOV A, 3AH ;取采樣周期高位
MOV B, #10
MUL AB ;×10
ADD A, 39H ;加上低位
MOV 5CH, A ;保存采樣周期二進制
;轉采樣周期為BCD碼
MOV B, #64H
MUL AB
MOV 51H, B ;送采樣周期BCD高位
MOV 52H, A ;送采樣周期BCD低位
LPP4: LCALL KEYI ;輸入比例常數十位
ANL A, #0FH ;限制處理
CJNE A, #0AH, LPP5
LPP5: JNC LPP4
MOV 3AH, A ;處理顯示存儲單元,不再贅述
MOV 3BH, #18H
MOV 3CH, #17H
MOV 39H, #17H
LCALL DIR
LPP6: LCALL KEYI ;輸入比例常數個位
ANL A, #0FH
CJNE A, #0AH, LPP7
LPP7: JNC LPP6
MOV 39H, A
LCALL DIR ;十、個位轉成一個數
MOV A, 3AH
MOV B, #10
MUL AB
ADD A, 39H
MOV 53H, A ;比例常數存入53H
LPP8: LCALL KEYI ;輸入積分常數百位
ANL A, #0FH
CJNE A, #0AH, LPP9
LPP9: JNC LPP8
MOV 3BH, A
MOV 3CH, #19H
MOV 3AH, #17H
MOV 39H, #17H
LCALL DIR
LPPA: LCALL KEYI ;輸入積分常數十位
ANL A, #0FH
CJNE A, #0AH, LPPB
LPPB: JNC LPPA
MOV 3AH, A
LCALL DIR
LPPC: LCALL KEYI ;輸入積分常數個位
ANL A, #0FH
CJNE A, #0AH, LPPD
LPPD: JNC LPPC
MOV 39H, A
LCALL DIR
MOV R0, #3BH ;取積分常數百位
MOV R2, #02H ;轉換計算的次數
LCALL CDDD ;將三個數按10制權轉成一個數
MOV 58H, R4 ;將結果(即積分常數)存入58H
LPPE: LCALL KEYI ;輸入微分常數十位
ANL A, #0FH
CJNE A, #0AH, LPPF
LPPF: JNC LPPE
MOV 3AH, A
MOV 3BH, #0DH
MOV 3CH, #17H
MOV 39H, #17H
LCALL DIR
LPPG: LCALL KEYI ;輸入微分常數個位
ANL A, #0FH
CJNE A, #0AH, LPPH
LPPH: JNC LPPG
MOV 39H, A
;延時,保持顯示
MOV 2FH, #0FFH
MOV 2EH, #80H
LPPJ: LCALL DIR
DJNZ 2FH, LPPJ
DJNZ 2EH, LPPJ ;轉換
MOV A, 3AH ;取微分常數十位
MOV B, #10
MUL AB ;乘10
ADD A, 39H ;加上微分常數個位
MOV 59H, A ;送入59H保存微分常數
MOV B, 53H ;取比例常數
MUL AB ;計算Kd’ = Kp?Kd
MOV 56H, B ;分別送高低位
MOV 57H, A
MOV A, 53H ;取比例常數
MOV B, 58H ;取積分常數
MUL AB ;計算Ki’ = Kp?Ki
MOV 54H, B ;分別送高低位
MOV 55H, A
MOV 20H, #00H ;清空采樣值高低位
MOV 21H, #00H
MOV A, 41H ;取溫度設定值低位
ANL A, #0FH ;保留低四位,存入R0
MOV R0, A
MOV A, 40H ;取溫度設定值低位
ANL A, #0FH ;保留低四位
MOV B, #10 ;乘10并加上低位
MUL AB
ADD A, R0
MOV 42H, A ;存設定值二進制于42H
MOV B, #14H
DIV AB ;計算溫度的5%
JNZ NZER ;結果是否為0
MOV A, #01H ;為0則設最小值為1
NZER: MOV 44H, A ;將設定值的5%存入44H
CLR 26H ;清26H
NOP
SETB ET1 ;置定時器1中斷允許位,允許定時器中斷
NOP
SETB TR1 ;置計時器1中斷類型,高電平有效
NOP
COOP: MOV 3CH, #00H ;將0送入顯示緩沖區3CH
MOV A, 20H ;將A/D采樣值高位送A
ANL A, #10H ;保留第4位狀態
SWAP A ;A交換高低位
MOV 3BH, A ;A顯示存儲單元3BH
MOV A, 20H ;將A/D采樣值高位送A
ANL A, #0FH ;保留低4位
MOV 3AH, A ;A顯示存儲單元3AH
MOV A, 21H ;將A/D采樣值低位送A
ANL A, #0F0H ;保留高4位
SWAP A ;高低位交換
MOV 39H, A ;A顯示存儲單元39H
LCALL CDTB ;調用CDTB子程序
CLR C ;清進位位
MOV A, R3 ;將采樣結果的二進制值送A
RRC A ;將A除以2
MOV R3, A ;結果送入R3
MOV A, R4 ;將R4內容移入A
RRC A ;A除以2
MOV R4, A ;將采樣結果二進制值送R4
MOV 43H, A ;將采樣結果二進制值即當前溫度送43H
CLR C ;清進位位
MOV A, 42H ;將設定值的二進制值送A
MOV B, 43H ;將當前溫度的二進制值送B
SUBB A, B ;計算A減B
MOV 45H, A ;將當前溫差送45H
MOV 18H, C ;將符號送18H保存
JNC DOOP ;如果設定溫度大于當前溫度,跳轉到DOOP
CPL A ;將A取反
ADD A, #01H ;將A加1,計算其補碼形式
MOV 45H, A ;將結果送當前溫差
DOOP: LCALL CTBB ;調用CTBB子程序
MOV A, #17H ;將17H送A
MOV 3CH, A ;A顯示存儲單元3CH
MOV A, R3 ;將R3內容移入到A
ANL A, #0FH ;保留低4位
MOV 3BH, A ;A顯示存儲單元3BH
MOV A, R4 ;將當前溫度移入到A
ANL A, #0F0H ;保留高四位
SWAP A ;交換A的高低位
MOV 3AH, A ;A顯示存儲單元3AH
MOV A, R4 ;將當前溫度放入到A
ANL A, #0FH ;保留低4位
MOV 39H, A ;A顯示存儲單元39H
MOV A, 40H ;將設定值的高位送A
ANL A, #0FH ;保留低4位
MOV 3EH, A ;A顯示存儲單元3EH
MOV A, 41H ;將設定值的低位送A
ANL A, #0FH ;保留低4位
MOV 3DH, A ;A顯示存儲單元3DH
LCALL DIR ;調用顯示子程序
MOV IP, #08H ;將08H移入IP寄存器
JB 18H, CPPP ;如果18H為1則跳轉到CPPP
CLR C ;清空C
MOV A, 45H ;當前溫差移入到A
MOV B, 44H ;將設定值的5%移入到B
SUBB A, B ;用A減B
JC CPPP ;如當前溫差小于設定值的5%,跳轉到CPPP
CLR P3.5 ;清定時器1輸出狀態為0,即激活可控硅
NOP ;空操作
LJMP COOP ;跳轉到COOP
CPPP: SETB P3.5 ;置定時器1輸出狀態為1,關閉可控硅
NOP ;空操作
LJMP COOP ;跳轉到COOP
CIT1: ;外中斷0處理子程序
;入棧保護現場
PUSH PSW
PUSH ACC
SETB PSW.3 ;使用01組寄存器
SETB 23H ;外中斷0標志置位
NOP
MOV P1, #0FFH ;啟動轉換
NOP
CIX1: MOV A, P1 ;讀A/D轉換結果
JNB ACC.4, CIX1 ;判斷轉換是否結束
JB ACC.2, CL1 ;判斷結果正負
SETB 07H ;負,則置位07H
LJMP CL2
CL1: CLR 07H ;正,復位07H
CL2: JB ACC.3, CL3 ;判斷千位是否為0
SETB 04H ;為0置位04H
LJMP CL4
CL3: CLR 04H ;不為0復位04H
CL4: MOV P1, #0FFH ;啟動轉換
MOV A, P1
JNB ACC.5, CL4 ;判斷百位是否轉換,沒有循環等待
MOV R0, #20H ;R0為20H
XCHD A, @R0 ;A與R0低四位交換
CL5: MOV P1, #0FFH ;啟動轉換
MOV A, P1 ;讀結果
JNB ACC.6, CL5 ;十位是否轉換,沒有循環等待
SWAP A ;A的高低位互換
INC R0 ;R0內容+1,指向21H
MOV @R0, A ;A送21H,21H高位為十位
CL6: M MOV P1, #0FFH ;啟動轉換
MOV A, P1 ;讀結果
JNB ACC.7, CL6 ;個位是否轉換,沒有循環等待
XCHD A, @R0 ;與R0低四位交換,21H低位為個位
MOV A, 20H ;取出百位,即采樣值高位
ANL A, #0FH ;保留低四位
XRL A, #0FH ;是否為全1
JNZ WWW1
MOV A, 20H ;取出20H
ANL A, #0F0H ;保留高四位
MOV 20H, A ;送回20H
WWW1: SETB 15H ;轉換結束標志
NOP
;出棧恢復現場
POP ACC
POP PSW
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -