用ADC0832制作数字电压表
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用ADC0832制作数字电压表
;**************************************************************
;* 描述: *
;* ADC0832数字电压表数码管显示 *
;* *
;* 调节ADC0832旁边的电位器,数码管显示 ADC0832 转换值的大小 * ;* *
;* * ;******************************************************************
AD_CLK EQU P1.0
AD_DAT EQU P1.1
AD_CS EQU P3.4
DISSTART EQU 30H ;显示单元首地址
LED_DATA EQU P0 ;数码管数据定义
ORG 0000H
JMP START
;--------------------------------------------------------
START: MOV SP,#60H
MOV A,#00H
MOV 20H,A
MOV P0,#0FFH
MOV P2,#0FFH
START1: CALL AD_CONV
CALL AD_CHULI
CALL QUSHU
CALL ADPLAY
JMP START1
;---------------------------------------------------------
AD_CONV: ;ADC0832初始化
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
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 20H,A ;转换结果发给20H
RET
;------------------------------------------------------
AD_CHULI:
CLR C
MOV R5,#00H ;十进制转换的低位寄存器 MOV R4,#00H ;十进制转换的高位寄存器 MOV R3,#08H ;十进制调整的次数
MOV A,20H
AD_CHULI1:
RLC A
MOV R2,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
MOV R4,A
MOV A,R2
DJNZ R3,AD_CHULI1
MOV A,R5
ADD A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
RET
;-------------------------------------------------
QUSHU: MOV A,R5
ANL A,#0FH
MOV DISSTART,A
MOV A,R5
ANL A,#0F0H
SWAP A
MOV DISSTART+1,A
MOV A,R4
ANL A,#0FH
MOV DISSTART+2,A
MOV A,R4
ANL A,#0F0H
MOV DISSTART+3,A
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,#07FH ;从第一个数码管开始
MOV R2,#03H ;共显示3位数码管DISP2: MOV LED_DATA,@R0 ;读取显示单元数据 MOV P2,R1 ;开始显示当前位
MOV A,R1 ;准备显示下一位
RR A ;
MOV R1,A ;下一位
INC R0 ;取下一个单元地址
JNB ACC.5,DISP3 ;第三位数码管加小数点
JMP DISP4
DISP3: MOV A,@R0
ANL A,#7FH
MOV @R0,A
DISP4: LCALL DELAY5MS ;延时 2 MS
DJNZ R2,DISP2 ;重复显示下一个
POP PSW
RET ;显示完成,返回
;---------------------------------------------------
DELAY5MS:
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