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

📄 ad.asm

📁 使用单片机制作多路输入电压表源程序例子文件,需要的可以
💻 ASM
字号:
;**************************************************
;   平凡单片机工作室
; http://www.mcustudio.com
;    Copyright 2003 pingfan's McuStudio
;    All rights Reserved
;作者:周坚
;文件名:ad.asm
;DSB?1A型实验板与TLC1543的接口
;功能简介:每隔1s轮流将一个通道的值显示在数码管后4位,首位显示通道号
;**************************************************
	gCoun	DATA	22H		;通道计数器

;以下定义各引脚
	ADCLK 	EQU 	P1.1		;时钟
	ADaddr 	EQU 	P1.2		;地址引脚
	ADDout 	EQU 	P1.3		;数据端
	ADCS 	EQU 	P1.4		;片选端

	Hidden	DATA	10H		;消隐码
	Counter	DATA	57H		;显示程序用计数器
	DISPBUF DATA	58H		;显示缓冲区首地址
	
	ORG	0000H
	JMP	START
	ORG	000BH		;定时中断使用T0
	JMP	DISP		;定时中断程序
	ORG	30H
START:
	MOV	SP,#5FH		;初始化
	MOV	P1,#0FFH
	MOV	P0,#0FFH
	MOV	P2,#0FFH	;关所有LED及数码管
	MOV	TMOD,#00000001B	
	MOV	TH0,#HIGH(65536-3000)
	MOV	TL0,#LOW(65536-3000)
	SETB	TR0
	SETB	EA
	SETB	ET0
	MOV	Counter,#0	;计数器清零
	MOV	DISPBUF+1,#Hidden	;第2位显示器消隐
	MOV	gCoun,#0		;通道计数器清零,指向通道0
LOOP:
	CALL	Delay		;延时1s
	MOV	R2,gCoun	;送通道号
	CALL	ADConver
	MOV	A,R0
	MOV	R6,A
	MOV	A,R1
	MOV	R7,A
	CALL	HB2
;调用二-十进制转换程序
;入口:待转换的双字节十六进制数在R6和R7中
;出口:转换结束的结果在R3、R4和R5中,压缩BCD码方式存储
	MOV	A,R4
	ANL	A,#0F0H
	SWAP	A		;高低4位互换
	MOV	DispBuf+2,A	;最高位
	MOV	A,R4
	ANL	A,#0FH
	MOV	DispBuf+3,A
	MOV	A,R5
	ANL	A,#0F0H
	SWAP	A
	MOV	DispBuf+4,A
	MOV	A,R5
	ANL	A,#0FH
	MOV	DispBuf+5,A	
;以上程序段将压缩BCD码转换成非压缩BCD码并送显示缓冲区
	MOV	DispBuf,gCoun	;将通道号送第1个显示器的显示缓冲区
	INC	gCoun		;通道号加1
	MOV	A,gCoun
	CJNE	A,#11,LOOP	;判断是否到11了
	MOV	gCoun,#0		;到则回零
	JMP	LOOP

;命令:ADConver
;参数:r2 通道号,转换前存入 转换结后数据在r0r1中,高位在前
;资源占用:r0,r1,r7,A 
ADConver:
	CLR	ADClk	
	CLR	ADCS
	MOV	A,R2
	RLC	A
;送出地址信号
	MOV	R7,#4
C_L1:
	RLC	A
	MOV	ADAddr,C
	SETB	ADClk
	NOP
	NOP
	NOP
	NOP
	CLR	ADClk
	DJNZ	R7,C_L1
;补6个脉冲
	MOV	R7,#6
C_L2:
	SETB	ADClk
	NOP
	NOP
	NOP
	NOP
	CLR	ADClk
	DJNZ	R7,C_L2
;等待转换结束	
	SETB	ADCS
	NOP
	NOP
	NOP
	NOP
	CLR	ADCS
;取高2位
	NOP
	NOP
	NOP
	NOP
	SETB	ADDout
	SETB	ADClk
	MOV	C,ADDout
	MOV	ACC.1,C
	CLR	ADClk
	NOP
	NOP
	NOP
	NOP
	SETB	ADDout
	SETB	ADClk
	MOV	C,ADDout
	MOV	ACC.0,C
	CLR	ADClk
	ANL	A,#00000011B	;清A的高6位
	MOV	R0,A	;保存数据

	MOV	R7,#8
C_L3:
	NOP
	NOP
	NOP
	NOP
	SETB	ADDout
	SETB	ADClk
	MOV	C,ADDout
	MOV	ACC.0,C			
	RLC	A
	CLR	ADClk
	DJNZ	R7,C_L3
	SETB	ADCS
	MOV	R1,A
	RET
;**********************************************************
;以下是显示程序,使用定时器T1作定时中断
;**********************************************************
DISP: 				;定时器T0的中断响应程序
	PUSH	ACC		;ACC入栈
	PUSH	PSW		;PSW入栈
	MOV	TH0,#HIGH(65536-3000);定时时间为3000个周期
	MOV	TL0,#LOW(65536-3000)
	MOV	A,#DISPBUF	;显示缓冲区首地址
	ADD	A,Counter 
	MOV	R0,A
	MOV	A,@R0		;根据计数器的值取相应的显示缓冲区的值
	MOV	DPTR,#DISPTAB	;字形表首地址
	MOVC	A,@A+DPTR	;取字形码
	MOV	P0,A		;将字形码送P0位(段口)
	MOV	A,Counter	;取计数器的值
	MOV	R0,A
	MOV	DPTR,#BitTab
	MOVC	A,@A+DPTR		;取位
	ORL	P2,#11111100B
	ANL	P2,A
	INC	Counter		;计数器加1
	MOV	A,Counter
	CJNE	A,#6,DISPEXIT	
	MOV	Counter,#0	;如果计数器计到6,则让它回0
DISPEXIT:	
	POP	PSW
	POP	ACC
	RETI
BitTab:	DB 7Fh,0BFH,0DFH,0EFH,0F7H,0FBH
DISPTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH


HB2:	CLR	A
	MOV	R3,A
	MOV	R4,A
	MOV	R5,A
	MOV	R2,#10H
HB3:	MOV	A,R7
	RLC	A
	MOV	R7,A
	MOV	A,R6
	RLC	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
	MOV	A,R3
	ADDC	A,R3
	MOV	R3,A
	DJNZ	R2,HB3
	RET
Delay:
	MOV	R7,#10
D1:	MOV	R6,#250
D2:	MOV	R5,#200
	DJNZ	R5,$
	DJNZ	R6,D2
	DJNZ	R7,D1
	RET

end

⌨️ 快捷键说明

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