;***********************************************************
;* *
;* 数字电压表演示程序 *
;* *
;***********************************************************
;功能: 数码管显示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
相关文章