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

📄 单片机应用技术讲座(17)源程序.txt

📁 大量常用优秀程序源代码和说明
💻 TXT
📖 第 1 页 / 共 2 页
字号:
                  RETI
;****************************************************************************
                       [显示子程序]
DIR:       MOV SCON,#00H            ;置串行口移位寄存器状态
                  SETB P1.4             ;开显示
                  JB 5DH,DL1            ;显示设定温度则转
         DL2:     MOV DPTR,#SEGT
        DL0:      MOV A,@R0
                  MOVC A,@A+DPTR
                  MOV SBUF,A
  LOOP1:          JNB TI,LOOP1
                  CLR TI
                  INC R0
                   MOV A,@R0
                   MOVC A,@A+DPTR
                   ANL A,#7FH      ;使个位带小数点
                   MOV SBUF,A
   LOOP2:          JNB TI,LOOP2
                   CLR TI
                   INC R0
                   MOV A,@R0
                   MOVC A,@A+DPTR
                   MOV SBUF,A
   LOOP3:          JNB TI,LOOP3
                   CLR TI
                   CLR P1.4
                   CLR 5DH
                   RET
         DL1:      MOV 50H,#0AH              ;使小数位黑屏
                   AJMP DL2
 SEGT:             DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
;****************************************************************************
      DAAD1:        MOV A,#00H            ;[加1子程序]          
                    ORL A,@R1
                    ADD A,#01H
                    CJNE A,#5AH,DAAD2	  ;判断超过90度了吗?
      DAAD3:        MOV @R1,A
        DAA:          RET                
      DAAD2:	    JC DAAD3
	           	    MOV @R1,#28H          ;超过90度则回到40度
		            AJMP DAA
 ;***************************************************************************
	DEEC1:	    MOV A,@R1		  ;[减1子程序]
		        DEC A
		        CJNE A,#28H,DEEC2	  ;判断低于40度了吗?
	DEEC3:	    MOV @R1,A
	  DEE:	      RET
	DEEC2:	    JNC DEEC3
		        MOV @R1,#5AH	  ;低于40度则回到90度
	  	        AJMP DEE
;****************************************************************************
     PTT0:          CLR EA                ;[T0中断子程序]
                    PUSH ACC
                    PUSH PSW
                    PUSH DPL
                    PUSH DPH
                    SETB EA               ;压栈后开中断,响应键盘
      PPP:          LCALL  SMAP               ;采样数据
                    LCALL  FILTER         ;数字滤波
                    MOV  A,2AH            ;取采样值
                    CJNE A,#01H,AAA       ;下限40度比较
                    AJMP BBB
      AAA:          JC CCC                 ;小于40度则转移
                    CJNE A,#0FEH,DDD       ;上限90度比较
                    AJMP BBB              ;转到40-90度正常范围内处理
      DDD:          JC  BBB
                    CLR P1.2              ;大于90度黄灯亮报警
                    SETB 5EH
                    CLR P1.1              ; 置标志,启动风扇
                    AJMP  PPP
      CCC:          CLR P1.3                  ;小于40度绿灯亮报警
                    SETB 5FH
                    CLR P1.0              ;置标志,启动电炉
                    AJMP PPP
      BBB:          SETB P1.0
                     SETB  P1.1
                     SETB P1.2
                     SETB P1.3
                     CLR 5EH 
                     CLR 5FH               ;40-90度之间则正常
                      LCALL PID 
                      JB 20H,EEE           ;设定温度< 实际温度,则转到风扇处理
                      MOV A,29H
                      ACALL FFF
                      CLR P1.0
      LOOP10:         MOV R0,#56H                ;存放相乘结果的首址
                      MOV R1,#55H          ;赋显示缓冲区最高位地址(十位)
                      LCALL SCACOV  ;调用“标度转化------二-十进制转化”子程序
                       MOV R0,#53H         ;赋显示首址
                       LCALL DIR
                       JB D5H,LOOP10        ;等待T1中断
					   CLR EA
                       POP DPH
                       POP DPL                   
                       POP PSW
					   SETB EA
                       POP ACC
                         RETI
         EEE:         MOV A,28H                ;风扇处理
                       LCALL FFF
                       CLR P1.1
                       AJMP LOOP10
         FFF:          CPL  A                   ;根据PID结果计算T1初值
                      INC A
                      MOV TL1,A
	                  MOV TH1,#0FFH
                      SETB  PI1
                      SETB TR1 
                      SETB ET1
                       RET  
;****************************************************************************
    SCACOV:        MOV R7,#00H        ;[“标度转化------二-十进制转化”子程序]
                    MOV R6,2AH               ;取采样值,并转化为双字节
                    MOV R5,#33H
                    MOV R4,#24H              ;赋参数(纯小数)
                    LCALL MULT               ;调用双字节乘法子程序
                    MOV R5,#00H
                    MOV R4,#28H              ;赋参数40度
                    MOV A,@R0
		            MOV R3,A
                    DEC R0
                    MOV A,@R0                ;存乘法结果的整数
		            MOV R2,A
                    LCALL DSUM        ;调用加法子程序,且R7,R6为有效值(R7=00H)
                    MOV A,R6
                    MOV B,#10
                    DIV  AB
                    MOV @R1,A                ;存十位数
                    DEC R1
      	            XCH A,B 
                    MOV @R1,A                ;存个位数
                    DEC R0
                    MOV A,@R0                ;取有效小数
                    MOV B,#10
                    DIV  AB
                    DEC R1
                    MOV @R1,A                ;送小数到显示缓冲区
                    MOV A,B
                    CJNE A,#5,QQ             ;小数四舍五入
          QQ:       JC PP 
                    MOV A,@R1
                    ADD A,#01H
                    DA  A
                    MOV @R1,A
          PP:       RET
;****************************************************************************
         SMAP:       MOV R0,#2CH                  ; [采样子程序]
                     MOV R1,#03H             ;采样次数
        SAM1:        MOV DPTR,#7FF8H
                     MOVX @DPTR,A            ;启动A/D                    
                     MOV R2,#20H
        DLY:         DJNZ R2,DLY                 ;延时一小会
       HERE:         JB P3.3,HERE
					 MOV DPTR,#7FF8H
                     MOVX A,@DPTR           ;读取转化结果
                     MOV @R0,A
                      INC R0
                      DJNZ R1,SAM1
                      RET
;****************************************************************************
    FILTER:           MOV A,2CH                    ;[数字虑波子程序]
                      CJNE A,2DH,CMP1
                      AJMP CMP2
       CMP1:          JNC CMP2
                      XCH A,2DH
                      XCH A,2CH
       CMP2:          MOV A,2DH
                      CJNE A,2EH,CMP3
                      MOV 2AH,A
                      AJMP RR
        CMP3:         JC CMP4
                      MOV 2AH,A
                      AJMP RR
        CMP4:         MOV A,2EH
                      CJNE A,2CH,CMP5
                      MOV 2AH,A
                      AJMP RR
        CMP5:         JC CMP6
                      XCH A,2CH
        CMP6:         MOV 2AH,A 
        RR:              RET
;****************************************************************************
     PTT1:            CLR 00H                     ;[T1中断子程序]
                      JB 20H,GGG
                      SETB P1.0                   ;关闭电炉
      GG:             CLR PT1
  RETI
      GGG:            SETB P1.1                   ;关闭风扇
                      CLR 20H
                      AJMP GG
;****************************************************************************
      DLY10MS:   MOV R7,#0A0H            ;[延时10毫秒子程序]
         DL00:   MOV R6,#0FFH
         DL11:   DJNZ R6,DL11
                 DJNZ R7,DL00
                 RET
;****************************************************************************       
PID:     MOV R5,#00H           [PID算法子程序]
		 MOV R4,2DH		 ;取Nx值
		 MOV R3,#00H
		 MOV R2,#28H		 ;取40度值
 		 LCALL CPL1
		 LCALL DSUM		 ;求(Nx-28H)的值
		 MOV R0,#5AH		 ;赋乘法运算暂存单元地址首址
 		 MOV R5,#05H
		 MOV R4,#1CH	 	 ;赋参数(5.12)
		 LCALL MULT		 ;调无符号数乘法
		 MOV 31H,5BH
		 MOV 32H,5AH		 ;存放结果的有效值
		 MOV R5,31H
         MOV R4,32H              ;取双字节的Ur(设定值)
         MOV R3,2AH
         MOV R2,#00H             ;取双字节的Ui(k)(实测值)
 		 ACALL CPL1              ;取Ui(k)的补码
         ACALL DSUM              ;计算E(k)
		 MOV 39H,R7
		 MOV 3AH,R6              ;存E(K)
		 MOV R5,35H
         MOV R4,36H              ;取KI参数
 		 MOV R0,#4AH
         ACALL MULT1             ;计算PI=KI*E(K)
		 MOV R5,39H
		 MOV R4,3AH              ;取E(K)
		 MOV R3,3BH
  		 MOV R2,3CH              ;取E(K-1)
 		 ACALL CPL1
 		 ACALL DSUB              ;求E(K)-E(K-1)
		 MOV R5,33H
		 MOV R4,34H           	 ;取Kp参数
		 MOV R0,#46H
		 ACALL MULT1    	 ;求Kp*[E(K)-E(K-1)]
		 MOV R5,49H
		 MOV R4,48H
		 MOV R3,4DH
		 MOV R2,4CH
		 ACALL DSUM              ;求Kp*[E(K)-E(K-1)]+KI*E(K)
		 MOV 4AH,R7
 		 MOV 4BH,R6              ;保存上式之和
		 MOV R5,39H
		 MOV R4,3AH              ;取E(K)
		 MOV R3,3DH
		 MOV R2,3EH              ;取E(K-2)
		 ACALL DSUM		 ;计算E(K)+E(K-2)
		 MOV A,R7
		 MOV R5,A
		 MOV A,R6
		 MOV R4,A
		 MOV R3,3BH
		 MOV R2,3CH              ;取E(k-1)
		 ACALL CPL1
		 ACALL DSUM		 ;求出E(K)+E(K-2)-2*E(K-1)
		 MOV A,R7
		 MOV R5,A
		 MOV A,R6
		 MOV R4,A
		 MOV R3,3BH
		 MOV R2,3CH
		 ACALL CPL1
		 ACALL DSUM
		 MOV R5,37H
		 MOV R4,38H		 ;取Kd参数
		 MOV R0,#46H
		 ACALL MULT1		 ;求出Pd=Kd*[E(K)+E(K-2)-2*E(K-1)]
		 MOV R5,49H
		 MOV R4,48H      	 ;取Pd
		 MOV R3,4AH		
		 MOV R2,4BH		 ;取Kp*[E(K)-E(K-1)]+KI*E(K)
		 ACALL DSUM		 ;计算Pd+PI
		 MOV A,R7
		 MOV R3,A
		 MOV A,R6             	 ;取Pd+PI
		 MOV R2,A
		 MOV R5,2FH
		 MOV R4,30H         	 ;取P(k-1)
		 ACALL DSUM		 ;求P(K)=Pd+Pp+P(K-1)
		 MOV 2FH,R7
		 MOV 30H,R6		 ;存P(k)到P(k-1)
		 MOV 29H,2FH
		 MOV 3DH,3BH
		 MOV 3EH,3CH		 ;存E(K-1)到E(K-2)
		 MOV 3BH,39H
		 MOV 3CH,3AH		 ;存E(K)到E(k-1)
		 MOV A,31H			;取设定值
		 CJNE A,2AH,AA2	;比较设定值与实测值
   AA3: CLR 20H			;清电炉标志
   AA1:       RET
   AA2:	 JNC AA3
 SETB 20H		 ;清风扇标志位
 MOV R3,39H
 MOV R2,3AH
 LCALL CPL1
 MOV A,R3
 MOV R7,A
 MOV A,R2
 MOV R6,A
		 MOV R5,42H
		 MOV R4,43H		 ;取K(风扇)参数
		 MOV R0,#5AH
		 ACALL MULI1		 ; 计算P`=K*E(K),且结果防在51H,50H单元中
		 MOV 28H,5BH		 ;取8位有效值,放到28H单元中
		 AJMP AA1
;****************************************************************************DSUM: 	 MOV A,R4  		 ;[双字节加法子程序]:(R5R4)+(R3R2)-->(R7R6)
		 ADD A,R2
		 MOV R6,A
		 MOV A,R5
		 ADDC A,R3
		 MOV R7,A
		 RET
;****************************************************************************
 CPL1:	 MOV A,R2		 ;[双字节求补子程序]:(R3R2)求补
		 CPL A
		 ADD A,#01H
		 MOV R2,A	 	
		 MOV A,R3
		 CPL A
		 ADDC A,#00H
		 MOV R3,A
		 RET
;****************************************************************************
 MULT1:	 MOV A,R7		 ;[双字节有符号数乘法]:被乘数(R7R6),乘数(R5R4)
		 RLC A
		 MOV 5CH,C      	 ;被乘数符号C1-->5CH位
		 JNC POS1		 ;为正数则转
		 MOV A,R6		 ;为负数则求补
		 CPL A
	 	 ADD A,#01H
		 MOV R6,A
	 	 MOV A,R7
		 CPL A
	 	 ADDC A,#00H
		 MOV R7,A
POS1:	 MOV A,R5		 ;取乘数
		 RLC A		 	 ;乘数符号C2-->5DH位
		 MOV 5DH,C
		 JNC POS2		 ;为整数则转
		 MOV A,R4
		 CPL A
		 ADD A,#01H
		 MOV R4,A
		 MOV A,R5
		 CPL A
		 ADDC A,#00H
		 MOV R5,A
POS2:	 ACALL MULT		 ;调双字节无符号数乘法子程序
 		 MOV C,5CH
		 ANL C,5DH
		 JC TPL		         ;负负相乘则转
		 MOV C,5CH
		 ORL C,5DH
		 JNC TPL		 ;正正相乘则转
		 DEC R0
		 MOV A,@R0
		 CPL A
 		 ADD A,#01H
		 MOV @R0,A
		 INC R0
		 MOV A,@R0
		 CPL A
		 ADDC A,#00H
		 MOV @R0,A
TPL:	 RET
;**************************************************************************** MULT:	 MOV A,R6
		 MOV B,R4		 ;取低位相乘
		 MUL AB
		 MOV @R0,A
	 	 MOV R3,B
		 MOV A,R4
		 MOV B,R7
		 MUL AB
		 ADD A,R3
		 MOV R3,A
		 MOV A,B
		 ADDC A,#00H
		 MOV R2,AMOV A,R6
		 MOV B,R5
		 MUL AB
		 ADD A,R3
		 INC R0
		 MOV @R0,A
		 CLR 5BH
		 MOV A,R2
		 ADDC A,B
		 MOV R2,A
		 JNC LAST
		 SETB 5BH		 ;置进位标志
LAST:	 MOV A,R7
		 MOV B,R5
		 MUL AB
		 ADD A,R2
		 INC R0
		 MOV @R0,A		 ;存积的第二字节
		 MOV A,B
		 ADDC A,#00H
		 MOV C,5BH
		 ADDC A,#00H
		 INC R0      
         MOV @R0,A             
       RET
       END



⌨️ 快捷键说明

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