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

📄 xujiejie.asm

📁 用汇编语言编写测电压
💻 ASM
字号:
 COM     EQU     50H
DAT     EQU     51H

TC0	EQU     52H     	;定时器计数单元
		
REST0	EQU	54H		;存放通道0转换结果



AIN0	EQU	00H		;通道0


LGAT	EQU	33H		;量程转换门限


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:	LCALL WPAD
        MOV	SP,#60H		;设置堆栈起始位置
	LCALL	INT		;对显示器进行初始化
	MOV	30H,#30h	;显示电压值初始化为 ------
	MOV	31H,#0A5H	;-
	MOV	32H,#30H	;-
	MOV	33H,#30H	;-
	MOV	34H,#30h	;-
	MOV	35H,#30H	;-
	MOV	R7 ,#30H	;
	LCALL	N1		;显示出"Voltage = "
	MOV	REST0,#00H	;转换结果为00
	
;--------------------------------------
;定时器初始化
;**************************************
	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	IE,#82H		;开定时中断
	
	
	MOV	A,#AIN0
	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
	

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

	MOV	DPTR,#ADCADD	;启动下一次通道0的转换
	MOV	A,#AIN0
	MOVX	@DPTR,A
        SJMP	V2SHOW
CST0:	LJMP	REI		;前面跳转到此接力
	


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

UIN0:	MOV	B,#EV
	MUL	AB
	MOV	R2,B
	MOV	R3,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	DCOUV		;转到启动 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
      
DCOUV:	MOV	A,REST0
        MOV	A,#AIN0
	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		;17个数据
	MOV	R3,#00H		;要显示的数据位
SL:	
        MOV	A,R3
	MOVC	A,@A+DPTR
	MOV	DAT,A
	LCALL	PR2
	INC	R3
	DJNZ	R2,SL
	
	;以上是固定显示标志 
          
         MOV   COM,#0C0H      ;设置第2行DDRAM地址
	LCALL PR1         ;写入
	MOV   R4,#11H        ;第2行共17个字符
	LCALL WP1  

WPAD:	MOV   COM,#40H        ;设置CGRAM首地址为0
	LCALL PR1           ;写入CGRAM首地址
	MOV   R4,#24         ;3个汉字共24字节子模数据
	MOV   DPTR,#ZIMO     ;指向字模首地址
WP1:    CLR   A
	MOVC  A,@A+DPTR
	MOV   DAT,A
	LCALL PR2          ;写入1字节字模数据
	INC   DPTR
	DJNZ  R4,WP1
	RET
ZIMO:	DB  08H,0FH,12H,0FH,0AH,1FH,02H,00H;“年”
	DB  0FH,09H,0FH,09H,0FH,09H,11H,00H;“月”
	DB  0FH,09H,09H,0FH,09H,09H,0FH,00H;“日” 	

	RET
STAB:	DB	"200500756   ",00H,01H,02H,20H
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



	END																			   	

⌨️ 快捷键说明

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