电压测量代码

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

COM EQU 50H
DAT EQU 51H

TC0 EQU 52H ;定时器计数单元
TC1 EQU 53H ;定时技术单元2
REST0 EQU 54H ;存放通道0转换结果
REST1 EQU 55H ;存放通道1的转化结果
CURA EQU 56H ;当前的转换通道

AIN0 EQU 00H ;通道0
AIN1 EQU 01H ;通道1

LGAT EQU 33H ;量程转换门限
BIG EQU 20H.1 ;高电压标志

ADCADD EQU 0F6FFH ;ADC0808 地址

RS EQU P2.1 ;LCD 寄存器选择信号
RW EQU P2.2 ;LCD 读/写选择信号
E EQU P2.3 ;LCD 使能信号

EV EQU 196 ;<5V时每个间隔的电压值数量级为10^-4
MAXV EQU 255 ;最大数字量
;--------------------------------------
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP BT0
ORG 0030H
MAIN: MOV SP,#60H ;设置堆栈起始位置
LCALL INT ;对显示器进行初始化
MOV 30H,#'-' ;显示电压值初始化为 ------
MOV 31H,#'-' ;-
MOV 32H,#'-' ;-
MOV 33H,#'-' ;-
MOV 34H,#'-' ;-
MOV 35H,#'-' ;-
MOV R7 ,#30H ;
LCALL N1 ;显示出"Voltage = "
MOV REST0,#00H ;转换结果为00
MOV REST1,#00H
;--------------------------------------
;定时器初始化
;**************************************
MOV TMOD,#00H ;T0工作方式0
MOV TH0,#0CH ;定时 5ms ,fosc=12MHz时,为0C78H fosc=6MHz 时为 163CH
MOV TL0,#78H
SETB TR0 ;启动T0
MOV TC0,#14H ;定时 100ms 采样一次 28H=40
MOV TC1,#28H ;
MOV IE,#82H ;开定时中断

MOV CURA,#AIN0
MOV A,CURA
MOV DPTR,#ADCADD
MOVX @DPTR,A
;--------------------------------------
;程序循环等待部分
;**************************************
LP: MOV R7,#30H ;显示缓冲区首地址
LCALL DISPLAY ;调用显示
SJMP LP ;循环显示
;主程序结束


;--------------------------------------
;定时器中断服务程序,读取转换结果并转换为显示值
;**************************************
BT0: MOV TH0,#0CH ;定时 5ms ,fosc=12MHz时,为0C78H fosc=6MHz 时为 163CH
MOV TL0,#78H
PUSH PSW
MOV PSW,#08H ;中断中使用寄存器 1

DEC TC0 ;中断中两个计数单元都-1
DEC TC1

MOV A,TC0 ;如果 0 单元为 0 ,则采集 0 通道数据
CJNE A,#00H,BTN1
MOV TC0,#28H ;200ms转换一次
MOV DPTR,#ADCADD ;读取通道0转换结果
MOVX A,@DPTR
MOV REST0,A
MOV A,#AIN1 ;启动下一次通道1的转换
MOVX @DPTR,A
LJMP V2SHOW ;转到数据转换程序

BTN1: MOV A,TC1
CJNE A,#00H,CST0
MOV TC1,#28H
MOV DPTR,#ADCADD
MOVX A,@DPTR
MOV REST1,A
MOV DPTR,#ADCADD ;启动下一次通道0的转换
MOV A,#AIN0
MOVX @DPTR,A


SJMP CONU
CST0: LJMP REI ;前面跳转到此接力
CONU:


;---转换结果为电压值
V2SHOW: MOV A,REST0

CJNE A,#0FFH,UIN0
SETB BIG
MOV A,REST1
UIN0: MOV B,#EV
MUL AB
MOV R2,B
MOV R3,A

;//////////高电压时的值
JNB BIG,B2BCD ;小电压
CLR BIG ;大电压,结果乘以 2
CLR C
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV A,#00

H
ADDC A,#00H
MOV R1,A

;---------将二进制转换为十进制
B2BCD: CLR A
MOV R4,A
MOV R5,A
MOV R6,A
MOV R7,#24 ;24bit 即 3 字节
LOOP: CLR C
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R1
RLC A
MOV R1,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
DJNZ R7,LOOP

;------------------------------
;根据转换结果选择量程
MOV A,#LGAT
MOV B,REST0
SUBB A,B
JNC LOWM ;转小量程
;大量程转换程序
SMV: MOV DPTR,#DTAB ;将转换结果放到显示缓冲区
MOV A,R4 ;得到最高位
ANL A,#0FH
MOVC A,@A+DPTR
MOV 30H,A
MOV 31H,#02EH ;小数点
MOV A,R5 ;得到小数点后第1/2位
ANL A,#0FH
MOVC A,@A+DPTR
MOV 33H,A
MOV A,R5
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV 32H,A
MOV A,R6 ;得到小数点后第3位
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV 34H,A
LJMP CST ;转到启动 A/D 转换程序
;小量程转换程序
LOWM: MOV DPTR,#DTAB ;将转换结果放到显示缓冲区
MOV 30H,#02EH ;最高位显示小数点
MOV A,R5 ;得到小数点后第1/2位
ANL A,#0FH
MOVC A,@A+DPTR
MOV 32H,A
MOV A,R5
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV 31H,A
MOV A,R6 ;得到小数点后第3位
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV 33H,A
MOV A,R6
ANL A,#0FH
MOVC A,@A+DPTR
MOV 34H,A

CST: MOV A,CURA
CJNE A,#AIN0,TAIN1
MOV CURA,#AIN1
LJMP DOCOV
TAIN1:
MOV CURA,#AIN0
DOCOV: MOV A,CURA
MOV DPTR,#ADCADD
MOVX @DPTR,A

MOV 35H,#'V' ;单位

REI: POP PSW
RETI
DTAB: DB "0123456789"
;--------二进制转换位十进制
;中断服务程序结果
;--------------------------------------
;LCD 显示相关程序
;**************************************
DISPLAY: ;显示
MOV COM,#08AH ;开始显示的地址
LCALL PR1
MOV R1,#06H ;要显示的数据个数
MOV R0,#30H ;要显示数据的首地址
L: MOV DAT,@R0
LCALL PR2
INC R0 ;指向要显示的下一个数据
DJNZ R1,L ;未显示完,则显示下一个
RET
;--------------------------------------
;逐字输入方式演示程序段
;**************************************
N1: MOV COM,#01H ;清屏
LCALL PR1
MOV COM,#06H ;写入数据后 AC 自动加 1
LCALL PR1
MOV COM,#080H ;开始显示的 LCD RAM 地址
LCALL PR1
MOV DPTR,#TAB
MOV R2,#10H ;要显示的字符数
MOV R3,#00H
WRIN: MOV A,R3
MOVC A,@A+DPTR
MOV DAT,A
LCALL PR2
INC R3
DJNZ R2,WRIN

MOV COM,#0C0H ;显示首地址
LCALL PR1
MOV DPTR,#STAB ;显示数据首地址
MOV R2,#10H ;16个数据
MOV R3,#00H ;要显示的数据位
SL: MOV A,R3
MOVC A,@A+DPTR
MOV DAT,A
LCALL PR2
INC R3
DJNZ R2,SL
;以上是固定显示标志 "TX0501:200500775"
; MOV COM,#07H ;写入数据后 AC 自动加 1
; LCALL PR1

RET
STAB: DB "XG1045:jiangjuan"
TAB: DB "Voltage = ------"
;--------------------------------------
;LCD 间接控制方式下的初始化程


;**************************************
INT: LCALL DELAY
MOV COM,#38H ;设置功能: 8位数据,5X8字体
LCALL PR1
MOV COM,#01H
LCALL PR1
MOV COM,#06H
LCALL PR1
MOV COM,#0EH
LCALL PR1
RET
;--------------------------------------
;延时程序
;**************************************
DELAY: MOV R6,#0FH
MOV R7,#00H
DELAY1: NOP
DJNZ R7,DELAY1
DJNZ R6,DELAY1
RET

;--------------------------------------
;LCD 间接控制方式的驱动程序
;**************************************
;--------1.读 BF 和 AC 值
PR0: PUSH ACC
MOV P0,#0FFH ;P0复位,准备读。
CLR RS ;RS=0
SETB E ;E=1
LCALL DELAY
MOV COM,P0 ;读 BF 和 AC6-4 值
CLR E ;E=0
POP ACC
RET
;--------2.写指令代码程序
PR1: PUSH ACC
CLR RS
SETB RW
PR11: MOV P0,#0FFH
SETB E
LCALL DELAY
NOP
MOV A,P0
CLR E
JB ACC.7,PR11
CLR RW
MOV P0,COM
SETB E
CLR E
POP ACC
RET
;--------3.写显示数据程序
PR2: PUSH ACC
CLR RS
SETB RW
PR21: MOV P0,#0FFH
SETB E
LCALL DELAY
MOV A,P0
CLR E
JB ACC.7,PR21
SETB RS
CLR RW
MOV P0,DAT
SETB E
CLR E
POP ACC
RET
;--------4.读显示数据程序
PR3: PUSH ACC
CLR RS
SETB RW
PR31: MOV P0,#0FFH
SETB E
LCALL DELAY
MOV A,P0
CLR E
JB ACC.7,PR31
SETB RS
SETB RW
MOV P0,#0FFH
SETB E
MOV DAT,P0
CLR E
POP ACC
RET
CNAME:
DB 0FDH,0FFH,0FEH,0FFH,080H,001H,0BFH,0FDH,07DH,0FBH,0FDH,0FFH,0FDH,0FBH,000H,001H
DB 0FBH,0DFH,0F7H,0DFH,0E7H,0DFH,0F9H,0BFH,0FEH,07FH,0FDH,0BFH,0F3H,0CFH,0CFH,0EFH

DB 0FFH,0F7H,080H,003H,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0FFH,0FEH,0EFH,0C0H,007H
DB 0FEH,0FFH,0FEH,0FFH,0FEH,0BFH,0FEH,0CFH,0FEH,0EFH,0FEH,0FBH,000H,001H,0FFH,0FFH

DB 0DFH,0BFH,0DFH,0BFH,0DFH,0BBH,0D8H,001H,003H,0BBH,0DBH,0BBH,0DBH,0BBH,0D8H,003H
DB 0DBH,0BBH,0DBH,0BBH,0C3H,0BBH,018H,003H,0BBH,0BBH,0FFH,0BFH,0FFH,0BFH,0FFH,0BFH


END


相关文档
最新文档