📄 350ad1.asm
字号:
;显示电压值/采样值 ,内部参考电压,中断采样,定时器扫描按键清零,数据存储(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 + -