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

📄 350ad1.asm

📁 C8051F350的抗干扰数据采集程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;显示电压值/采样值 ,内部参考电压,中断采样,定时器扫描按键清零,数据存储(1000H),
;带通讯,外部晶振,系数设定,锁定FLASH,

;-----------------------------------------------------------------------------

$include (c8051f350.inc)               ; Include register definition file.

;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
; EQUATES
;-----------------------------------------------------------------------------
S_E      BIT    20H      ;N次采样结束标志
Z_F      BIT    21H      ;=0正.=1负
KM       BIT    22H
KP       BIT    23H  
W_B      BIT    24H      ;=0显示,=1不显示
UP_DOWN  BIT    25H      ;=0加1,=1减1
S_T      BIT    26H      ;=1,设置状态
HOLD     BIT    27H      ;=1,最大值保持;=0 瞬时值
OVER     BIT    28H      ;=1溢出1010N
STA_S    BIT    29H      ;=1开始数据保存
;
K1       BIT    P1.1; P0.1  
K2       BIT    P1.0; P0.0
K3       BIT    P1.2
;显示    
LCDCS    BIT     P0.6    ;用户自定义液晶CS对应引脚
LCDWR    BIT     P0.7    ;用户自定义液晶WR对应引脚
LCDDAT   BIT     P1.1    ;用户自定义液晶DATA对应引脚
LCDBUF   EQU     30H     ;用户自定义LCD缓冲区首地址
LCDBUFEND EQU    LCDBUF+3;(33H)用户自定义LCD缓冲区末地址
BCDCODE  EQU     34H     ;存放BCD代码34H~37H
LCD_ADDR EQU     38H     ;存放液晶地址A5~A0
LCD_DATA EQU     39H     ;存放液晶显示数据D0~D3
LCD_COM  EQU     3AH     ;存放液晶命令
;
KEYZ     EQU     3BH     ;按键
KEYTIM   EQU     3CH     ;连续按键次数
SELEC    EQU     3DH     ;功能项,=0,系数设定;1,零度校验;2,定点校验;3,退出
SHBAR    EQU     3EH     ;每200次显示一次电量,(约40秒)
;计算
SMPTMS	 DATA	   40H      ;采样次数
ADSUMH	 DATA	   41H      ;采样累加和
ADSUMM   DATA	   42H
ADSUML   DATA	   43H
MAXH  	 DATA	   44H      ;采样最大值          
MAXL  	 DATA	   45H
MINH  	 DATA	   46H      ;采样最小值
MINL  	 DATA	   47H
COD1H    DATA    48H       ;计算用的单元
COD1L    DATA    49H
COD2H    DATA    4AH
COD2L    DATA    4BH
BINH     EQU     4CH      ;平均采样值
BINL     EQU     4DH
WEGH     EQU     4EH      ;力值
WEGL     EQU     4FH
;
DISAH    EQU     67H      ;显示总值
DISAL    EQU     68H
TIME     EQU     69H      ;显示平均次数
WEG_MAXH EQU     6AH      ;力值峰值
WEG_MAXL EQU     6BH
XBINH    EQU     6CH      ;采样相对值
XBINL    EQU     6DH
SJCDH    EQU     6EH      ;数据长度
SJCDL    EQU     6FH
;

TXH      EQU     50H      ;系数高位
TXL      EQU     51H    
ZEROH    EQU     52H      ;零点AD
ZEROL    EQU     53H
NWEG1    EQU     54H      ;标定百分点1
NWEG2    EQU     55H      ;标定百分点2
NWEG3    EQU     56H      ;标定百分点3
PAN1H    EQU     57H      ;标定点1AD
PAN1L    EQU     58H  
PAN2H    EQU     59H      ;标定点2AD
PAN2L    EQU     5AH  
PAN3H    EQU     5BH      ;标定点3AD
PAN3L    EQU     5CH  
KWEG1H   EQU     5DH      ;K1系数
KWEG1L   EQU     5EH
KWEG2H   EQU     5FH      ;K2系数
KWEG2L   EQU     60H
KWEG3H   EQU     61H      ;K3系数
KWEG3L   EQU     62H
NWEG     EQU     63H      ;标定时暂用
;
;
WORK     EQU     2FH      ;自动追零的次数
;
DATABUF  DATA    70H      ;70H~81H  AD采样暂存缓冲器
;XRAM地址
ADR_TXH   EQU    0001H
ADR_TXL   EQU    0002H
ADR_ZEROH EQU    0003H
ADR_ZEROL EQU    0004H
ADR_NWEG1 EQU    0005H
ADR_NWEG2 EQU    0006H
ADR_NWEG3 EQU    0007H
ADR_PAN1H EQU    0008H
ADR_PAN1L EQU    0009H
ADR_PAN2H EQU    000AH
ADR_PAN2L EQU    000BH
ADR_PAN3H EQU    000CH
ADR_PAN3L EQU    000DH
ADR_KWEG1H EQU    000EH
ADR_KWEG1L EQU    000FH
ADR_KWEG2H EQU    0010H
ADR_KWEG2L EQU    0011H
ADR_KWEG3H EQU    0012H
ADR_KWEG3L EQU    0013H
ADR_FIRST  EQU    0030H  ;数据保存首地址

;-----------------------------------------------------------------------------
; RESET and INTERRUPT VECTORS
;-----------------------------------------------------------------------------

            ; Reset Vector
            cseg AT 0
            ljmp Main                     ; Locate a jump to the start of
                                          ; code at the reset vector.
;------------------------------------------------------------------------------------------------------------               ljmp Main  						 ; Locate a jump to the start of code at 
                                       ; the reset vector.
              ;ORG 000BH
              ;LJMP KIN 
              ;ORG 002BH
              ;LJMP SEND 
              ORG 0053H
	            LJMP ADC0_ISR

;-----------------------------------------------------------------------------
; CODE SEGMENT
;-----------------------------------------------------------------------------
            ORG 0080H
Main:      
           ; Disable the WDT.
             anl PCA0MD, #00h      ; clear Watchdog Enable bit
            MOV SP,#0c0H
						mov psw,#00h
            ; Enable the Port I/O Crossbar
	          ;MOV  P0MIN
 	          ;orl   P0MDOUT,#03FH
					  orl   P1MDOUT,#03FH
            mov   P0SKIP,#0CH             ;X1\X2
						;ORL   P0MOUT,#03H             ;P0.0 P0.1为push-pull
            mov   XBR1, #40h              ; enable Crossbar
            mov   XBR0, #00h
          ;初始化振荡器
	          CLR P0.2
	          CLR P0.3
	          ANL P0MDIN,#0F3H               ;XTAL1/2设为模拟输入
            MOV OSCXCN,#67H;#77H           ;77H,1/2外部晶振;67H,单倍外部晶振
            ;MOV R1,#6
            MOV R0,#0AAH
AA:	        DJNZ R0,$                      ; 等待 ~ us
	          ;DJNZ R1,AA 
WAIT:       MOV A,OSCXCN                  ; 查询 XTLVLD是否为1
            JNB ACC.7,WAIT     
            ANL OSCICN,#0F0H              ; 禁止内部振荡器
            MOV CLKSEL,#01H
;
           ;LCALL LOCK_FLASH       ;锁定FLASH
           LCALL ADC_INIT
           NOP
					 NOP
					 ;
;初始数据
				  	MOV ADC0H,#00H
						MOV ADC0M,#00H
						MOV ADC0L,#00H
            CLR Z_F
            MOV SMPTMS,#5
			   		MOV DISAH,#00H
			  		MOV DISAL,#00H
			  		MOV TIME,#10
						MOV R0,#ADSUMH                ;单元清零
						MOV R1,#5
						CLR A
SS0:				MOV @R0,A
						INC R0
						DJNZ R1,SS0
						MOV KEYZ,A
						MOV KEYTIM,A
            MOV SELEC,A
            MOV R1,#20
						MOV R0,#DATABUF               ;AD存储缓冲区清零
SS1:				MOV @R0,A
						INC R0
						DJNZ R1,SS1
            MOV R1,#8
						MOV R0,#LCDBUF                ;显示缓冲器清零
SS11:        MOV @R0,A
            INC R0
						DJNZ R1,SS11
						MOV MINH,#0FFH
						MOV MINL,#0FFH
						MOV BINH,#00H
						MOV BINL,#00H
						MOV SJCDH,#00H
						MOV SJCDL,#30H
            MOV WORK,#20
						CLR STA_S
;
SS30:       MOV R0,#42              ;将暂时存数的单元清零
            MOV DPTR,#ADR_FIRST-2
						MOV A,#00H
SS31:		    MOVX @DPTR,A
            INC DPTR
						DJNZ R0,SS31
           MOV IE,#0A2H;82h
;
					 MOV ADC0MD,#82H
					 MOV EIE1,#08H        ;使能AD中断
           CLR AD0INT 
					 LCALL LCDINT         ;液晶初始化
					 ;
					 ;LCALL BATTER     ;电量显示
					 ;
SSA:       ;LCALL DISDAV      ;平均显示值
           LCALL USERCONT    ;送BCD码到LCD缓冲区
					 LCALL TRANSRAM    ;送LCD缓冲区到LCD控制器
					 ;
		       MOV R4,#2
           LCALL DELY
					 JMP SSA
;;;;;;;;;;;;;;;;;;主程序到此
;;;;;;;;;;;;;;;;;
;***************************
;显示取10次平均值
;***************************
DISDAV:   CLR C
          MOV A,WEGL
					ADD A,DISAL
					MOV DISAL,A
					MOV A,WEGH
					ADDC A,DISAH
          MOV DISAH,A
          DJNZ TIME,DISD1
          MOV R4,#00H
					MOV R5,#00H
					MOV R6,DISAH
					MOV R7,DISAL
					MOV R2,#00H
					MOV R3,#10
					LCALL NDIV          ;求10次平均值
					;
   				;MOV A,R6            ;若为0,符号为“+"
      		;CJNE A,#00H,DISD2
					;MOV A,R7
					;CJNE A,#00H,DISD2
					;CLR Z_F
          ;
DISD2:		MOV A,R6
					MOV R2,A
					MOV A,R7
					MOV R3,A
					LCALL BCDM
					JNB HOLD,DISD10
          MOV R2,WEG_MAXH
				  MOV R3,WEG_MAXL
          LCALL BCDM          ;
DISD10:		MOV DISAH,#00H
					MOV DISAL,#00H
					MOV TIME,#10
DISD1:    RET

;****************************
;有关AD
;****************************
;AD0初始化
ADC_INIT:    MOV ADC0MD,#80H                ;模式选择,IDLE
             MOV ADC0CF,#04H                ;结构,SINC3、外部参考,(ADC0CF.2=0,内部参考)
						 MOV ADC0CN,#10H;#03H;#00H      ;控制,单极,增益1,(ADC0CN.4=1,双极)
             ;MOV ADC0CLK,#09H              ;MDCLK=2.4576MHZ  SYSCLK=24.5mhz
						 ;MOV ADC0BUF,#005H             ;高低输入缓冲器选择
             MOV REF0CN,#02H                ;内部振荡器偏压使能
             MOV ADC0CLK,#00H;#03H          ;MDCLK=2.4576MHZ  SYSCLK=11.0592mhz,AD0CLK=(11.0592/2.4576)-1
;
						 MOV ADC0DECH,#01H;#00H         ;OUT WORD RATE=100HZ  (DEC=(2.4576/128/WORD RATE)-1)
						 MOV ADC0DECL,#03FH;#04FH;#07fH           
             MOV ADC0DAC,#00H
						 MOV ADC0MUX,#01H;#38H          ;08H,AIN0.0-"+",GND  ;18H,AIN0.1-"+",GND;01h,AIN0.0-"+",AIN0.1-"-"
;
             MOV ADC0MD,#81H                ;AD0EN=1,FULL INTERNAL cal
ADC_INT0:    JB AD0CALC,ADC_INT3;1          ;ADC0CALC=1,校验结束
						 JMP ADC_INT0
;
ADC_INT3:    MOV ADC0STA,#00H
             ;MOV ADC0MD,#82H               ;单转换
             MOV ADC0MD,#83H                ;连续转换
             NOP
				  	 NOP
			       RET
;AD采样中断               
ADC0_ISR:      push psw
               push acc
							 PUSH B
               CLR PSW.3
               SETB PSW.4
               ;LCALL FILT
							 LCALL DAVGX
							 ;LCALL VOLTAGE    ;显示采样电压值
      				 ;LCALL BCDM      ;显示十进制采样码
ADC01:         CLR AD0INT
               ;MOV ADC0MD,#82H
               MOV ADC0MD,#83H
							 ;JNB S_E,ADC02
					    
							 MOV R2,binH
				       MOV R3,binL
							 ;LCALL IBTD
							 ;MOV A,R5
							 ;MOV R2,A
							 ;MOV A,R6
							 ;MOV R3,A  
							 LCALL BCDM       ;显示十六进制采样码
							 ;LCALL VOLTAGE    ;显示采样电压值
							 ;
							 ;JNB HOLD,ADC02  ;HOLD=1显示峰值保持
               ;LCALL HOLDMAX
ADC02:  			 POP B
               pop acc
							 pop psw
               NOP
				    	 NOP
							 RETI
;AD1采样
AD1SAMP:       CLR S_E; MOV SMPTMS,#5
AD1SAMP0: 		 MOV ADC0MD,#83H
AD1SAMP1:  		 JNB AD0INT,AD1SAMP1
               LCALL DAVGX
							 ;LCALL FILT
							 CLR AD0INT
							 JNB S_E,AD1SAMP0;DJNZ SMPTMS,AD1SAMP0
							 RET  
;*************************
;电池电量测试显示
;*************************
BATTER:    CLR TR1
					 MOV EIE1,#00H        ;关闭AD中断
					 MOV ADC0MUX,#18H               ;AIN0.1-"+",GND
           MOV ADC0MD,#81H                ;AD0EN=1,FULL INTERNAL cal
BATTE31:   JB AD0CALC,BATTE32           ;ADC0CALC=1,校验结束
					 JMP BATTE31
					 ;
BATTE32:   MOV ADC0STA,#00H
           MOV ADC0MD,#83H               ;连续转换
		       MOV R4,#1
           LCALL DELY
           LCALL AD1SAMP
           ;LCALL BATT          ;电池电量显示
					 ;
					 MOV R2,binH
				   MOV R3,binL
					 LCALL VOLTAGE    ;显示采样电压值
;
           LCALL ADC_INIT
					 MOV EIE1,#08H        ;使能AD中断
           SETB TR1
           RET
					  
;****************************
;有关显示数字显示(4位)
;输入BCDCODE
;****************************
USERCONT:MOV DPTR,#TABL                   ;用户在此根据模块地址表填写LCD缓冲区
         MOV R0,#LCDBUF
				 MOV R1,#BCDCODE
	  	   MOV LCD_DATA,#00H  ;显示" "符
				 ;LCALL SHOW_CHAR   
				 CLR W_B
				 ;JNB Z_F,USER0
				 ;MOV LCD_DATA,#40H
				 ;LCALL SHOW_CHAR         ;显示:-"号
;                 
USER0:	 MOV A,@R1
      	 CJNE A,#00H,USER1
         MOV @R0,#00H                   ;"0"不显示
				 SETB W_B
         JMP USER2
USER1:	 MOVC A,@A+DPTR                   ;BUFFER1
         SWAP A
				 MOV @R0,A
;USERCONT:
USER2:	 INC R0
				 INC R1     
				 MOV A,@R1                       ;BUFFER2
				 JNB W_B,USER3
				 CJNE A,#00H,USER3
         MOV @R0,#00H                   ;"0"不显示
         JMP USER4
USER3:	 CLR W_B
         MOVC A,@A+DPTR
				 SWAP A
				 MOV @R0,A
;
USER4:	 INC R0
				 INC R1
				 MOV A,@R1                      ;BUFFER3
				 JNB W_B,USER5
				 CJNE A,#00H,USER5
         MOV @R0,#00H                   ;"0"不显示
         JMP USER6
USER5:	 MOVC A,@A+DPTR   
				 MOV @R0,A
				 ;
USER6:	 INC R0
	  		 INC R1
				 MOV A,@R1                      ;BUFFER4
				 MOVC A,@A+DPTR
				 MOV @R0,A
         RET
TRANSRAM:  MOV R1,#LCDBUF
				   MOV LCD_ADDR,#2   ;(SEG2/3)
           MOV LCD_DATA,@R1
           CALL LCDWRITE
					 ;
           INC R1
				   MOV LCD_ADDR,#4   ;(SEG4/5)
           MOV LCD_DATA,@R1
           CALL LCDWRITE
					 ;
           INC R1
				   MOV LCD_ADDR,#9   ;(SEG9/10)
           MOV LCD_DATA,@R1
           CALL LCDWRITE
					 ;
           INC R1
				   MOV LCD_ADDR,#7   ;(SEG7/8)
           MOV LCD_DATA,@R1
           CALL LCDWRITE
           RET

;液晶初始化
LCDINT:     MOV LCD_COM,#0E3H  ;NORMAL
            LCALL SENDCOM
            MOV LCD_COM,#05H   ;关看门狗
            LCALL SENDCOM
            MOV LCD_COM,#029H   ;4COM,1/3BIAS
            LCALL SENDCOM
            MOV LCD_COM,#01H   ;SYSTEM ENABLE
            LCALL SENDCOM
						MOV LCD_COM,#03H   ;LCD ON
            LCALL SENDCOM
            LCALL SHOW_LCD      ;全显
						MOV R4,#50
						LCALL DELEY
            LCALL CLR_LCD      ;清屏
            RET
;延时5us
D_5:        MOV R3,#1
            DJNZ R3,$
            RET
;发送命令
SENDCOM:  	CLR LCDCS
						CLR LCDWR
            MOV R2,#3
						MOV A,#80H   ;写100代码
            LCALL SENDBIT
            ;
            MOV R2,#9   ;送命令8位+1
						MOV A,LCD_COM
						LCALL SENDBIT
;
            CLR LCDWR
            NOP
            SETB LCDCS
            RET

;写液晶,输入LCD_ADDR,LCD_DATA
LCDWRITE:   CLR LCDCS
						CLR LCDWR
            MOV R2,#3
						MOV A,#0A0H   ;写100代码
            LCALL SENDBIT
						;
            CLR C
            MOV R2,#6   ;送A5~A0
						MOV A,LCD_ADDR
            RLC A
            RLC A
            LCALL SENDBIT 
;
            CLR C
						MOV A,LCD_DATA
            MOV R2,#8     ;送字符  两次D0~D3
            LCALL SENDBIT 
						CLR LCDWR 
            SETB LCDCS
            RET
;显示字符,输入LCD_DATA
SHOW_CHAR:  MOV LCD_ADDR,#13
            CLR LCDCS

⌨️ 快捷键说明

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