分享

用ADC0832制作数字电压表

 共同成长888 2021-11-09

;**************************************************************
;*  描述:                                                                       *
;*          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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多