⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wendukongzhixitong.txt

📁 用汇编语言做温度控制系统程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
CSEG AT 0000H                   ; 04.7.23 4 KEY; 误差+2/-1度; 滤波
  LJMP START0             
CSEG AT 400BH
     LJMP CLOCK0
CSEG AT 401BH
     LJMP CLOCK1
CSEG AT 4100H
PORT8279 EQU 0CFE8H             ;8279片选信号
SIGN0 EQU 00H                   ;20H.0
SIGN1 EQU 01H                   ;20H.1
SIGN2 EQU 02H                   ;20H.2 
SIGN3 EQU 03H                   ;20H.3    ; Select Disp 
SIGN4 EQU 04H                   ;20H.4    ; +/- Enable
SIGN5 EQU 05H                   ;20H.5    ; Enter 

         ;;&&&&&&&&&&&&&&&    主程序     &&&&&&&&&&&&&&&&&&&&&&&&

;===============初始化及赋初值==========================    
START0:  CLR SIGN3
         CLR SIGN4
         CLR SIGN5
         MOV 2CH,#00H
         MOV 2DH,#00H
         MOV 2EH,#00H
         MOV 3FH,#05H           ; 键菜单号初值 4-R(K);3-Kp;2-Ki;1-Kd
         MOV 31H,#60            ;R(k)H
         MOV 32H,#00H           ;R(k)L 
         MOV 33H,#30H           ;KpH 
         MOV 34H,#00H           ;KpL
         MOV 35H,#02H           ;KiH
         MOV 36H,#00H           ;KiL
         MOV 37H,#01H           ;KdH 
         MOV 38H,#00H           ;KdL
         MOV 2FH,#00H           ;P(k-1)H
         MOV 30H,#00H           ;P(k-1)L
         MOV 3BH,#00H           ;E(k-1)H
         MOV 3CH,#00H           ;E(k-1)L
         MOV 3DH,#00H           ;E(k-2)H
         MOV 3EH,#00H           ;E(k-2)L 
         MOV DPTR,#PORT8279+1   ;8279显示RAM全部清零
         MOV A,#0D1H
         MOVX @DPTR,A

;================开始运行=============================  

STAR1:  MOV   SP,#70H
        MOV   R2,#50h            ; sample time = (R2)*2mS + ....
        MOV   TMOD,#01H          ;定时器0设置为方式一
        MOV   TL0,#1BH           ;置时间常数,每0.002秒中断一次
        MOV   TH0,#0FCH          ; 计算:0FFFFH-0FC1B=3F4H=996--1000*2uS=2mS
        SETB  EA
        SETB  ET0
        SETB  TR0
STAR2:  MOV  DPTR,#0CFE9H         ;8279命令字
	MOVX A,@DPTR
	ANL A,#0FH
	lcall d1ms
	JZ samp               ;无键按下,则转SAMP采样子程序 
	lcall KEYGL           ;有键按下,则转EYGL键处理子程序 
	     
samp:   CJNE  R2,#00H,samp        ; 采样延时
        CLR   TR0

	LCALL  SAMPLING          ;调用启动A/D采样子程序
	LCALL  FILTER            ; 调用中值滤波子程序
        LCALL SEND               ; 调用串行通信子程序
        LCALL DIGTOTEM           ;调用标度变换子程序
	LCALL PID                ; 调用pid子程序
        JB SIGN3,DISP1
        mov 40h,2ah              ; 显示温度值
        lcall ZHBCD             
        mov 50h,#11h
        mov 51h,#12h
        mov 52h,#13h
        mov 53h,#10h
DISP1:  lcall disp                ; 显示参数修改值
        LCALL  PWMOUT             ;调用PWM输出子程序          
        LJMP  STAR1
	
       

       ;&&&&&&&&&&&&&&&    中断服务程序     &&&&&&&&&&&&&&&&&&&&&&&&

      
;=================  CLOCK0 中断 ========================

CLOCK0: MOV   TL0,#1BH            ;置时间常数,每0.002秒中断一次
        MOV   TH0,#0FCH
        PUSH  ACC
        PUSH  PSW
        PUSH  DPH
        PUSH  DPL
        DEC   R2
        POP   DPL
        POP   DPH
        POP   PSW
        POP   ACC
        RETI

;=================CLOCK1 中断========================
       
 CLOCK1: MOV   TL1,#0CH           ;置时间常数,每0.001秒中断一次
         MOV   TH1,#0FEH
         PUSH  ACC
         PUSH  PSW
         PUSH  DPH
         PUSH  DPL
         DEC   R2
         POP   DPL
         POP   DPH
         POP   PSW
         POP   ACC
         RETI

     

       ;&&&&&&&&&&&&&&&    子程序     &&&&&&&&&&&&&&&&&&&&&&&&   


;=================采样子程序========================
       
  
SAMPLING:MOV R0,#2CH               ; 采样值存放初始地址 2CH,2DH,2EH
        MOV R3,#03H                 ; 采样3次
SAMP1:  MOV R4,#50H                 
        MOV   DPTR,#0CFA0H          ; A/D 0809 地址
        MOVX  @DPTR,A               ; 启动采样
LOP1:   DJNZ R4,LOP1                   
        MOVX  A,@DPTR               ; 延时;等待采样结束
        mov @r0,a
        INC R0
        DJNZ R3,SAMP1               ; 循环采样3次
        RET
 

;=================标度转换子程序========================
                         
DIGTOTEM:mov b,#27h	            ;  标度转换  #27h: 100/255=0.39(比例系数)
        mul ab                      ;   Tx=100*xxH/ffH =xx.xx
        mov r5,a                    ;   /64h
      	mov r4,b
	mov r3,#00h                 ; r2r3r4r5/r6r7=r4r5....r2r3
	mov r2,#00h
	mov r6,#00h
	mov r7,#064h
	Lcall ndiv
        mov a,#63h                  ;T=99-TX (温度传感器负特性)
        clr c
        subb a,r5
        mov 2ah,a                   ; 采样值---2AH
        RET
     

       
;=====================PWM开关输出控制子程序===========================
PWMOUT: MOV   R2,30H
        MOV   TMOD,#10H          ;定时器0设置为方式一
        MOV   TL1,#0CH           ;置时间常数,每0.001秒中断一次
        MOV   TH1,#0FEH          ; 0FFFFH-0FE0CH=1F3H=499----500*2uS=1mS
        SETB  EA
        SETB  ET1
        SETB  TR1
RECV4:  CJNE  R2,#00H,RECV3        ;延时    
        MOV   R2,30H
        MOV   A,#0FFH
        CLR   C
        SUBB  A,30H
        MOV   R2,A
RECV6:  CJNE  R2,#00H,RECV5        
        CLR   TR1
        RET 
RECV5:  MOV   DPTR,#0CFA8H
        MOV   A,#0FFH
        MOVX  @DPTR,A       
        AJMP  RECV6  
RECV3:  MOV   DPTR,#0CFA8H
        MOV   A,#00H
        MOVX  @DPTR,A       
        AJMP  RECV4

;===================== 中值滤波子程序 ==========================
FILTER:MOV A,2CH
       CJNE A,2DH,CMP1            ; 2C与2D比较,不等则转CMP1 
       AJMP CMP2                  ; (2C)=(2D),则与2E比较
CMP1:  JNC CMP2                   ; C=1,即(2C)>(2D),则转CMP2,与2E比较
       XCH A,2DH                  ; C=0,即(2C)<(2D),则交换
       XCH A,2CH
CMP2:  MOV A,2DH                  
       CJNE A,2EH,CMP3            ; 2E与2D比较,不等则转CMP3 
       MOV 2AH,A                  ; (2E)=(2D)<(2E)
       RET
CMP3:  JC CMP4                    ; C=1,(2D)<(2E){(2D)<(2C)}则转CMP4,(2E)与(2C)比较
       MOV 2AH,A                  ; C=0,即(2C)>(2D)>(2E)
       RET
CMP4:  MOV A,2EH
       CJNE A,2CH,CMP5            ; 2C与2E比较,不等则转CMP5 
       MOV 2AH,A                  ; (2C)=(2E)>(2D)
       RET
CMP5:  JC CMP6                    ; C=1,即(2C)>(2E){(2D)<(2E)}转CMP6
       XCH A,2CH                  ; C=0,(2E)>(2C)>(2D)
CMP6:  MOV 2AH,A                  ; (2C)送A
       RET
                                                    
;=================== 8279 disp 子程序===========================	   
        
disp:   MOV  DPTR,#0CFE9H         ;写显示RAM命令字
        MOV  A,#90H
        MOVX @DPTR,A
        MOV  R7,#06H              ; 06为显示位数
        MOV  R0,#50H              ; 存放转换结果地址初值送R0
 DL0:   MOV  A,@R0
        MOV DPTR,#TAB             ; 转换为显码
        MOVC A,@A+DPTR,
        MOV  DPTR,#0CFE8H         ; 8279数据口地址
        MOVX @DPTR,A              ; 送显码输出
        INC  R0
        DJNZ R7,DL0               ; 没显示完则继续
        LJMP DEL1
        
 TAB:   DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H
        db 40H,31h,1ch,54h,73h,63h,39h

 DEL1:  MOV  R3,#200               ;延时一段时间使显示更稳定
 DEL2:  MOV  R4,#126
 DEL3:  DJNZ R4,DEL3
        DJNZ R3,DEL2
	ret  
       
       


;=======================串行传送通信子程序==============================
SEND:   PUSH    ACC                ;串行通信子程序
TRA1C:	MOV     DPTR,#0CFE5H
	MOVX    A,@DPTR
	JBC     ACC.5,TRA1A
	SJMP    TRA1C
TRA1A:  MOV     DPTR,#0CFE0H
	POP ACC
	MOVX    @DPTR,A
	RET

;=====================十六进制转换BCD码子程序============================
ZHBCD: MOV A,40H
       MOV B,#0AH                   
	   DIV AB                      ; A/B=A....B
	   SWAP A
	   ORL A,B                     ;分离高四位和低四位 
       MOV R1,A                    ;并依次存放在50H到51H中
       swap a
       ANL  A,#0FH            
       MOV  54H,A
       MOV  A,R1
       ANL  A,#0FH
       MOV  55H,A       
       RET
       
;==================== BCD码转换十六进制子程序 ===========================

BCDZH: MOV A,41H                   ; 二位BCD(压缩为一个字节)转换成一个字节二进制数
       anl a,#0f0h
       swap a
       MOV B,#10                   
       mul AB                      ; 高位?BCD乘?10
       mov r3,a                
       MOV A,41H
       anl a,#0fh
       add a,r3                    ; 加上低位BCD
       MOV 41H,A
       RET   
       
;================== 无符号双字节除法子程序 ================================     		
ndiv:   mov a,r3             ; 无符号双字节除法子程序 r2r3r4r5/r6r7=r4r5....r2r3          	                clr c
	subb a,r7
	mov a,r2
	subb a,r6
	jnc ndve1
	mov b,#16
	sjmp ndvl1
ndve1: setb f0
       mov b,#16       
ndvl1: clr c
       mov a,r5
       rlc a
       mov r5,a
       mov a,r4
       rlc a
       mov r4,a
       mov a,r3
       rlc a
       mov r3,a
       xch a,r2
       rlc a
       xch a,r2
       mov f0,c
       clr c
       subb a,r7
       mov r1,a
       mov a,r2
       subb a,r6
       jb f0,ndvm1
       jc ndvd1
ndvm1: mov r2,a
       mov a,r1
       mov r3,a
       inc r5
ndvd1: djnz b,ndvl1
       clr f0
       ret

;====================延时 1 Second子程序=====================
dlay:  mov r4,#40h             
delay1:acall d1ms
       djnz r4,delay1
       ret
;======================延时 1 MS 子程序 =========================
d1ms:  mov r6,#10
delay2:mov r7,#80h
       djnz r7,$ 
       djnz r6,delay2
       ret       


;=======================PID控制计算子程序=============================
;入口为2ah,出口为30h
PID:    MOV R5,31H             ;R(k)送R5R4

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -