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

📄 00729.asm

📁 用汇编语言编写测电压
💻 ASM
字号:
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
	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,#00H
	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
		;以上是固定显示标志 "dianqi10501niuzf"
;	MOV	COM,#07H	;写入数据后 AC 自动加 1
;	LCALL	PR1

	RET
STAB:	DB	"dianqi10501niuzf"
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
	END																			   	

⌨️ 快捷键说明

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