ADC0832数码管显示电压表汇编程序

2023-01-04  

;***********************************************************

;* *

;* 数字电压表演示程序 *

;* *

;***********************************************************

;功能: 数码管显示ADC0832采样值

;适用于 MCS-51 开发板

;创作人: Jihao

;=====================================================

AD_CLK EQU P1.5

AD_DAT EQU P1.6

AD_CS EQU P1.4

DISSTART EQU 30H ;显示单元首地址

LED_DATA EQU P0 ;数码管数据定义

AD_TEMP EQU 2FH ;AD采样值存放单元

ORG 0000H

JMP START

ORG 0030H

;====================================================

START:

MOV SP,#60H

MOV A,#00H

MOV AD_TEMP,A

MOV P0,#0FFH

MOV P2,#0FFH

START1:

ACALL AD_CONV

MOV R4,#0AH

START2:

ACALL TUNBCD

ACALL ADPLAY

DJNZ R4,START2

JMP START1

;====================================================

;AD转换子程序

;AD转换值存放AD_TEMP中

;先ADC0832初始化,后采集数据。

;====================================================

AD_CONV:

SETB AD_CS ;一个转换周期开始

CLR AD_CLK

CLR AD_CS ;CS置0,片选有效

SETB AD_DAT ;DI置1,起始位

SETB AD_CLK ;第一个脉冲

CLR AD_DAT ;在负跳变之前加一个DI反转操作

CLR AD_CLK

SETB AD_DAT ;DI置1,设为单通道

SETB AD_CLK ;第二个脉冲

CLR AD_DAT

CLR AD_CLK

CLR AD_DAT ;DI置0,选择通道0

SETB AD_CLK ;第三个脉冲

SETB AD_DAT

CLR AD_CLK

NOP

NOP

SETB AD_CLK ; 第四个脉冲

MOV R1,#08H ;计数器初值,读取8位数据,

AD_READ: CLR AD_CLK ;下降沿

MOV C,AD_DAT ;读取DO端数据

RLC A ;C移入A,高位在前

SETB AD_CLK ;下一个脉冲

DJNZ R1,AD_READ ;没读完继续

SETB AD_CS

MOV AD_TEMP,A ;转换结果存入AD_TEMP

RET

;====================================================

;AD采集值转为三位BCD码子程序

;转换后的三位BCD码分别存入DISSTART+2、

;DISSTART+1、DISSTART 单元中。

;AD采集值在AD_TEMP单元中。

;255/51=5.00V 运算

;====================================================

TUNBCD:

MOV A,AD_TEMP

MOV B,#51

DIV AB

MOV DISSTART+2,A ;整数个位数放入DISSTART+2

MOV A,B ;余数大于1AH,F0为0,乘法溢出,结果加5

CLR F0

SUBB A,#1AH ;相减不够,C=1 表示余数小于1AH(26)

MOV F0,C

MOV A,#10 ;

MUL AB ;余数乘以10,相当于补0,继续除。

MOV B,#51

DIV AB ;再除以51

JB F0,T_BCD1

ADD A,#5

T_BCD1:

MOV DISSTART+1,A ;小数后第一位放入DISSTART+1

MOV A,B

CLR F0

SUBB A,#1AH

MOV F0,C

MOV A,#10

MUL AB

MOV B,#51

DIV AB

JB F0,T_BCD2

ADD A,#5

T_BCD2:

MOV DISSTART,A ;小数后第二位放入DISSTART

RET

;====================================================

;显示子程序

;使用三位数码管显示

;====================================================

ADPLAY:

PUSH PSW

CLR PSW.3

SETB PSW.4

MOV R0,#DISSTART ;开始填充显示单元

MOV R2,#03H ;共计填充 3 位

DISP1: MOV A,@R0 ;获得当前位地址

MOV DPTR,#TAB_NU ;获得表头

MOVC A,@A+DPTR ;获得编码数据

MOV @R0,A ;保存编码数据

INC R0 ;指向下一个带转换数据

DJNZ R2,DISP1 ;继续转换,直到完成

MOV R0,#DISSTART ;获得显示单元首地址

MOV R1,#0FEH ;从第一个数码管开始

MOV R2,#03H ;共显示3位数码管

DISP2: MOV LED_DATA,@R0 ;读取显示单元数据

MOV P2,R1 ;开始显示当前位

MOV A,R1 ;准备显示下一位

RL A ;

MOV R1,A ;下一位

INC R0 ;取下一个单元地址

JNB ACC.2,DISP3 ;第三位数码管加小数点

JMP DISP4

DISP3: MOV A,@R0

ANL A,#7FH

MOV @R0,A

DISP4: LCALL DELAY2MS ;延时 2 MS

LCALL DELAY2MS

LCALL DELAY2MS

DJNZ R2,DISP2 ;重复显示下一个

POP PSW

RET ;显示完成,返回

;====================================================

;延时子程序

;====================================================

DELAY2MS:

MOV R6,#10

DEL1: MOV R7,#100

DJNZ R7,$

DJNZ R6,DEL1

RET

;====================================================

TAB_NU:

DB 0c0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H

DB 80H,90H,88H,83H,0C6H,0A1H,86H,8EH

;====================================================

END


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。