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

📄 yali.asm

📁 压力测量(延时等待)51单片机程序 汇编语言编写
💻 ASM
字号:
;-------------------------------------------------------------------
A_DPORT 	EQU   8100H    ;0809 口地址
Z8279   	EQU   0FF82H   ;8279状态口地址
D8279   	EQU   0FF80H   ;8279数据口地址
LEDMOD  	EQU   00H      ;左边输入;外部译码键扫描方式,双键互锁                                   
LEDFEQ  	EQU   2FH      ;扫描速率
LEDCLS  	EQU   0C1H     ;清除显示 RAM
LEDWR0  	EQU   80H      ;设定的将要写入的显示RAM地址

MAX         EQU	  30H      ;采集数据的最大值
MIN     	EQU	  31H      ;采集数据的最小值
AVERAGE     EQU	  32H      ;采集数据的平均值
BIN_XS		EQU	  33H	   ;压力的二进制小数位
FLAG_BW     EQU   34H      ;十进制压力值百位标志位
FLAG_SW     EQU   35H      ;十进制压力值十位标志位
FLAG_GW     EQU   36H      ;十进制压力值个位标志位
FLAG_SFW    EQU   37H      ;十进制压力值十分位标志位
FLAG_BFW    EQU   38H      ;十进制压力值百分位标志位
FLAG_DW     EQU   39H      ;十进制压力值单位K/警戒值L/H
;-------------------------------------------------------------------
        ORG   0000H
        LJMP  START 
	    ;ORG   0003H        ;INT0入口地址
 				ORG   0040H
START:				            
		MOV   SP,#60H
		LCALL INIT8279     ;初始化键盘/显示接口芯片8279
		MOV   R7,#0FFH     ;A/D转换结束标志
LOOP:
		MOV   R6,#10H  	   ;采集16个数,并放在50H起始的16个单元中
     	MOV   R0,#50H
     
     	;SETB  IT0          ;选择INT0为边沿触发
		;SETB  EX0          ;开中断
		;SETB  EA
A_D:
    	MOV   A,#00H       ;通道数
        MOV   DPTR,#A_DPORT
        MOVX  @DPTR,A      ;启动A_D
     
    	;CJNE  R7,#00H,$    ;等待 A_D 转换结束
        LCALL T128VS       ;128VS延时程序
     	LCALL SCH
        	                   
 	    MOV   @R0,A        ;数据保存到50H起始的单元中
        INC   R0
     	MOV   R7,#0FFH     ;清读数标志
 	    DJNZ  R6,A_D
        ;CLR   EA           ;关中断
        
		LCALL FILTER       ;数据平滑处理子程序
        LCALL DISPLAY      ;显示压力值子程序
        LCALL DELAY
        
        LCALL DELAY
        LJMP  LOOP
;-------------------------------------------------------------------
T128VS:                    ;128VS延时子程序
                    
        PUSH  0            ;保存现场
        PUSH  1
        MOV   0,#0H
TM:
        MOV   1,#40H
        DJNZ  1,$
        DJNZ  0,TM
        POP   1            ;恢复现场
        POP   0
        RET  
;-------------------------------------------------------------------
SCH:                       ;A/D转换
    	
    	;MOV   A,@DPTR      ;置RD信号有效
    	MOVX  A,@DPTR      ;读 A_D 数据
      	MOV   R7,#00H      ;置读数标志
        RETI
;-------------------------------------------------------------------
INIT8279:                  ;8279初始化子程序
        PUSH  DPH          ;保存现场
        PUSH  DPL
        PUSH  ACC
        LCALL DELAY        ;延时
        MOV   DPTR ,#Z8279
        MOV   A,#LEDMOD    ;置8279工作方式
        MOVX  @DPTR,A
        MOV   A,#LEDFEQ    ;置键盘扫描速率
        MOVX  @DPTR,A
        MOV   A,#LEDCLS    ;清除 LED 显示
        MOVX  @DPTR,A
        POP   ACC          ;恢复现场
        POP   DPL
        POP   DPH
        RET
;-------------------------------------------------------------------
DELAY:                     ;延时子程序
        PUSH  0            ;保存现场
        PUSH  1
        MOV   0,#0H
DELAY1:
        MOV   1,#0H
        DJNZ  1,$
        DJNZ  0,DELAY1
        POP   1            ;恢复现场
        POP   0
        RET  
;-------------------------------------------------------------------
FILTER:    		           ;数据平滑处理子程序,结果放在AVERAGE中
        MOV   A,#00H 
        MOV   R7,#10H      ;计数
		MOV   R6,#00H        
		MOV   R5,#00H        
		MOV   MAX,#00H       
		MOV   MIN,#0FFH           
        MOV   R0,#50H      ;从50H开始依次取出16个数据
        
DSP:                      
        CLR   C
		MOV   A,@R0
		CJNE  A,MAX,QMAX
    	SJMP  NEXT		   
QMAX:                      ;求16个数据中的最大值
		JC    NEXT
		MOV   MAX,A
NEXT:
        CJNE  A,MIN,QMIN
        SJMP  QSUM
QMIN:                      ;求16个数据中的最小值
        JNC   QSUM
        MOV   MIN,A
QSUM:                      ;求16个数据之和
    	CLR   C
        ADDC  A,R5
		MOV   R5,A
		MOV   A,R6
		ADDC  A,#00H
		MOV   R6,A
		INC   R0
        DJNZ  R7,DSP
			                  
       	CLR   C            ;从和中减去最大值          
        MOV   A,R5
        SUBB  A,MAX   
        MOV   R5,A
 		MOV   A,R6
		SUBB  A,#00H
		MOV   R6,A
		
		CLR   C            ;再减去最小值        
        MOV   A,R5
        SUBB  A,MIN   
        MOV   R5,A
 		MOV   A,R6
		SUBB  A,#00H
		MOV   R6,A        
		
		MOV   R2,#0EH      ;求平均值
		ACALL DIVIDE	     

    	MOV   AVERAGE,R5		         
		RET
;-------------------------------------------------------------------
DISPLAY:
        MOV   B,#50
        MOV   A,AVERAGE
        LCALL CONVERT      ;电压信号转换为二进制压力值
        LCALL B2BCD
        MOV   R4,#04H
        LCALL DIS_DATA     ;显示压力值
        RET
;-------------------------------------------------------------------
CONVERT:	               ;间接压力值F=50*X/255=B*A/R2
                           ;为真实值的1/10
		MUL   AB
		MOV   R5,A
		MOV   R6,B    		
		MOV   R2,#255	   ;置除数为255
		LCALL DIVIDE	   
 		CJNE  R6,#00H,CONV1
 		SJMP  CONV2 
CONV1:
		MOV   BIN_XS,R5
		MOV   R5,#0
		MOV   R2,#0FFH
        ACALL DIVIDE	   
		MOV   A,BIN_XS
		MOV   R6,A
        RET
CONV2:			
		MOV   A,R5
		MOV   R6,A
		MOV   R5,#0
		RET
;-------------------------------------------------------------------
DIVIDE:		               ;16位/8位除法,商在R5中,余数在R6中
		MOV   R7,#08H
DIV1:  
   		CLR   C
		MOV   A,R5
		RLC   A
		MOV   R5,A
		MOV   A,R6
		RLC   A			
		MOV   44H,C
		CLR   C
		SUBB  A,R2
		JB    44H,DIV2
		JNC   DIV2
		ADD   A,R2
		AJMP  DIV3
DIV2:
		INC   R5
DIV3:
        MOV   R6,A     	
		DJNZ  R7,DIV1
		RET		
;-------------------------------------------------------------------
B2BCD:				       ;二进制数转为十进制数
		MOV   A,R5         ;二进制小数0.R5转为二位十进制小数
		MOV   B,#0AH
		MUL   AB
		MOV   R0,A		    
		MOV   A,B
		SWAP  A
		MOV   R1,A     	
		MOV   A,R0
		MOV   B,#0AH
		MUL   AB		        
		MOV   R0,A
		MOV   A,B
		ORL   A,R1
		MOV   R1,A          
		MOV   A,R0
		MOV   B,#0AH
		MUL   AB
		MOV   A,B
		CJNE  A,#4,JUDGE4	
		SJMP  COMP_OK
JUDGE4:
		JNC	  BIGER5
		SJMP  COMP_OK
BIGER5:
		CJNE  R1,#99H,D_PART
		MOV   R1,#00H
		MOV   A,R6
		ADD   A,#1H
		MOV   R6,A
		MOV   FLAG_SFW,#00H
		MOV   FLAG_BFW,#00H
		RET
D_PART:
		MOV   A,R1
		ADD   A,#1H
		DA    A
		MOV   R1,A
COMP_OK:
		MOV   A,R1
		ANL   A,#0F0H
		SWAP  A
		MOV   FLAG_SFW,A
		MOV   A,R1
		ANL   A,#0FH
		MOV   FLAG_BFW,A
		
		MOV   A,R6         ;二进制整数R6转为二位十进制整数
		MOV   B,#10
		DIV   AB
		MOV   FLAG_SW,A
		MOV   FLAG_GW,B
		
		MOV   FLAG_BW,FLAG_SW ;压力中间值扩大10倍变为真实值
        MOV   FLAG_SW,FLAG_GW
        MOV   FLAG_GW,FLAG_SFW
        MOV   FLAG_SFW,FLAG_BFW
        MOV   A,FLAG_BW
        CJNE  A,#0,COMBIG
        MOV   A,FLAG_SW
        CJNE  A,#0,WORTH
        MOV   FLAG_DW,#20H
        RET
COMBIG: 
        CJNE  A,#5,COMBIG2
        MOV   FLAG_DW,#21H
        RET
COMBIG2:CJNE  A,#4,WORTH
        MOV   A,FLAG_SW
        CJNE  A,#9,WORTH
        MOV   FLAG_DW,#21H
        RET
WORTH:
        MOV   FLAG_DW,#22H
                
        
		RET
;-------------------------------------------------------------------
DIS_DATA:                  ;显示压力值的百位、十位、个位、十分位数字
                           ;和标志位字符
        MOV   A,FLAG_BW
        CJNE  A,#0,DIS     
        MOV   R3,A
        LCALL DISLED
       
        SJMP  DIS_SW
DIS:    CJNE  A,#9,DIS_BW  
        MOV   R3,A
        LCALL DISLED
       
        SJMP  DIS_SW
DIS_BW:                    ;显示百位数字
        MOV   R3,A
        LCALL DISLED       
        
DIS_SW:                    ;显示十位数字
        DEC   R4
        MOV   A,FLAG_SW
        MOV   R3,A
        LCALL DISLED

        DEC   R4           ;显示个位数字
        MOV   A,FLAG_GW
        ADD   A,#10H
        MOV   R3,A
        LCALL DISLED

        DEC   R4           ;显示十分位数字
        MOV   A,FLAG_SFW
        MOV   R3,A
        LCALL DISLED

        DEC   R4           ;显示标志位字符,要么是L,要么是U,要么是G
        MOV   A,FLAG_DW
        MOV   R3,A
        LCALL DISLED
        RET
;-------------------------------------------------------------------
DISLED:                    ;显示字符子程序
                           ;输入: R4,位置 R3,值
        PUSH  DPH          ;保存现场
        PUSH  DPL
        PUSH  ACC    
        MOV   A,#LEDWR0    ;置显示起始地址
        ADD   A,R4         ;加位置偏移量
        MOV   DPTR,#Z8279
        MOVX  @DPTR,A      ;设定显示位置
        MOV   DPTR,#LEDSEG ;置显示常数表起始位置
        MOV   A,R3
        MOVC  A,@A+DPTR    ;查表
        MOV   DPTR,#D8279
        MOVX  @DPTR,A      ;显示数据
        POP   ACC          ;恢复现场
        POP   DPL
        POP   DPH
        RET  
;-------------------------------------------------------------------
LEDSEG:                    ;LED显示常数表    
        DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;'0,1,2,3,4,5,6,7'
 	    DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;'8,9,A,B,C,D,E,F'
    	DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,087H ;'0.,1.,2.,3.,4.,5.,6.,7.'
	    DB 0FFH,0EFH,0F7H,0FCH,0B9H,0DEH,0F9H,0F1H ;'8.,9.,A.,B.,C.,D.,E.,F.'
	    DB 38H,3EH,3CH     ;'L,U,G'
        END

⌨️ 快捷键说明

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