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

📄 adc.asm

📁 ADC模数转换实验
💻 ASM
字号:
;------------------------------------------------
;ADC测试程序。在四位共阳动态LED上显示ADC 转换数据
;20H~23H是显示缓冲区
;购买学习板可发email:wbq-wang@163.com
;可联系13556029592王先生到淘宝网上购买
;www.fdzj.com
;------------------------------------------------
	ORG 0000H
	LJMP INIT
	ORG 000BH	
	LJMP ADC	;T0中断服务程序

INIT:   MOV 28H,#0      ;储存转换数据
	MOV SP,#60H	;初始化SP
	MOV 20H,#0ffh	;给显示区赋值
	MOV 21H,#0ffh
	MOV 22H,#0ffh
	MOV 23H,#0ffh

	MOV 30H,#0      ;0.3秒计时用

	MOV R0,#20H     ;显示缓冲区起点
	MOV R5,#0FEH    ;扫描位选起始值

	MOV TMOD,#01H	;T0 方式1
	MOV TH0,#3CH	;(65536-50000)/256	  ;赋初值
	MOV TL0,#0B0H   ;65536-((65536-50000)/256*256)
	SETB EA		;开中断
	SETB ET0
	SETB TR0	;开定时器

MAIN:   LCALL DISPLAY	;主程序只要完成扫描显示功能
        LJMP  MAIN

;-------------------------------------
;T0中断服务程序,读取ADC数据并且拆字
;占用资源:30H
;-------------------------------------
ADC:	INC 30H
	MOV A,30H
	CJNE A,#7,ADC_QUIT	;计时50MS*6=300MS
	MOV 30H,#0
	LCALL READ_ADC
	LCALL CONVERSE
ADC_QUIT:
	RETI

;-----------------------------------------------
;程序功能:读出ADC TLC548 的数据
;占用资源:R1,28H
;硬件连接:P35---CLK,  P36---DO,  P37---CS
;转换结果储存在28H单元
;-----------------------------------------------
READ_ADC:NOP		;初始化
	SETB P3.7	;CS置高电平
	CLR P3.5	;CLK产生下降沿
	MOV R1,#00H	;移位计数标志清零
ADP:    CLR P3.7        ;CS为0,开始读前一个转换完毕的数值
	NOP 		;延时1.4uS,具体视单片机时钟而定
	NOP
NEXT: 	SETB P3.5	;置I/O CLOCK为1
	MOV C,P3.6
	RLC A
	CLR P3.5  	;置I/O CLOCK为零
	INC R1		;移位计数
	CJNE R1,#8,NEXT	;判断是否满8次
	MOV R1,#0	;计数寄存器重置
	SETB P3.7	;CS为1,停止读数
	MOV 28H,A 	;28H:储存转换数据.
	RET
;------------------------------------------
;三位数的拆字程序
;入口地址:28H(要拆分的数字)
;出口地址:22~20H(拆分后的百位,十位和个位数)
;------------------------------------------
CONVERSE:         	;拆字程序,拆分成BCD码并储存在显示缓冲区
	MOV R1,#22H	;显示缓冲区首地址(三位数)
	MOV A,28H	;读入要拆分的数据
	MOV B,#100	;除于100得到百位数
	DIV AB
	MOV @R1,A	;保存百位数
	DEC R1		;修改缓冲区地址

	MOV A,B		;读入要拆分的数据(余数)
	MOV B,#10	;除于10得到十位数
	DIV AB
	MOV @R1,A	;保存十位数
	DEC R1		;修改缓冲区地址

	MOV @R1,B	;保存个位数

	RET
;-----------------------------------------------
;使用资源:R0,R5,20H~24H   占用P0,P2口
;-------------------------------------------------------
DISPLAY:                  ;每次只显示一位
	MOV P0,#0FFH
	CJNE R0,#24H,DISPLAY1  ;如果四位都已经扫描完毕
	MOV R0,#20H            ;则从第一位重新扫描显示
	MOV R5,#0FEH
DISPLAY1:
	MOV DPTR,#TABLE		
	MOV A,@R0	     ;根据要显示的数字查找字符表
	MOVC A,@A+DPTR
;********************************
;	CJNE R0,#22H,X10    ;给第三位LED加上小数点
;	ANL A,#01111111B
;X10:    NOP
	;CJNE R0,#24H,X11    ;给第五位LED加上小数点
	;ANL A,#01111111B
X11:	MOV P0,A	;送显示信号
	MOV P2,R5	;送位选信号
	LCALL DELAY5MS  ;每次扫描延时5ms

X3:	MOV A,R5	;位选码移位
	RL A
	MOV R5,A
	INC R0		;指向下一个要显示的字符
 	RET

DELAY5MS:	
	MOV R6,#25  	;5毫秒延时
D1:	MOV R7,#100
	DJNZ R7,$
	DJNZ R6,D1
 	RET

TABLE:        ;显示字型码(共阳)
	DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
	
	END

⌨️ 快捷键说明

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