P2口接数码管,4个数码管选通端由P1.4P1.7控制,分别控制千位~个位。STC单片机P1口自带AD转换。
ADC_CONTR  EQU  0C5H  ;A/D转换寄存器
ADC_RES  EQU  0C6H  ;8位A/D转换结果寄存器
P1ASF      EQU  9DH
              ;P1口中的相应位作为模拟功能使用时的控制寄存器,如做A/D用,相应位要置1
ADC_Power_On_Speed_Channel_2 EQU 11100010B 
P1M0 EQU 91H
      P1M1 EQU 92H
ADC_Channel_2_Result    EQU 32H    ;2通道A/D转换结果
    ORG  0000H
    MOV DPTR,#TAB
AD:  MOV  SP, #7FH                  ;设置堆栈 
    ACALL ADC_Power_On              ;开ADC电源, 第一次使用时要打开内部模拟电源
                                  ;开ADC电源, 可适当加延时,1mS以内就足够了
    ACALL Set_P12_ASF              ;设置 P1.2 为模拟功能口
    ACALL Set_ADC_Channel_2        ;设置 P1.2 作为A/D转换通道
    ACALL Get_AD_Result
    MOV  A,ADC_Channel_2_Result
           
    MOV B,#20                      ;计算电压值
    MUL AB
    MOV 60H,A
    MOV 61H,B
    MOV R2,#00H                ;十六进制转换十进制
    MOV R3,#00H
    MOV R4,#16
YI:MOV A,60H
    RLC A
    MOV 60H,A
    MOV A,61H
    RLC A
    MOV 61H,A
    MOV A,R2
    ADDC A,R2
    DA A
    MOV R2,A
    MOV A,R3
    ADDC A,R3
    DA A
    MOV R3,A
    DJNZ R4,YI
    MOV A,R3
    MOV B,#16            ;取出千位百位
    DIV AB支持小数点的进制转换器
    ADD A,#0AH            ;显示小数点
    MOV 50H,A
    MOV 51H,B
    MOV A,R2
    MOV B,#16            ;取出十位个位
    DIV AB
    MOV 52H,A
    MOV 53H,B       
    MOV R0,#50H
    MOV DPTR,#TAB1        ;显示电压值
    MOV A,@R0
    MOVC A,@A+DPTR
    MOV P2,A
    CLR P1.4
    LCALL DELAY
    SETB P1.4
    INC R0
    MOV DPTR,#TAB
    MOV A,@R0
    MOVC A,@A+DPTR
    MOV P2,A
    CLR P1.5
    LCALL DELAY
    SETB P1.5
    INC R0
    MOV A,@R0
    MOVC A,@A+DPTR
    MOV P2,A
    CLR P1.6
    LCALL DELAY
    SETB P1.6
    INC R0
    MOV A,@R0
    MOVC A,@A+DPTR
    MOV P2,A
    CLR P1.7
    LCALL DELAY
    SETB P1.7
    sjmp  AD
   
   
ADC_Power_On:
    PUSH  ACC
    ORL  ADC_CONTR, #80H          ;开A/D转换电源
    MOV  A, #20H
    ACALL DELAY                  ;开A/D转换电源后要加延时,1mS以内就足够了
    POP  ACC 
    RET
                                  ;设置P1.2为模拟功能
Set_P12_ASF:
    PUSH  ACC
    MOV  A, #00000100B
    ORL  P1ASF, A
ORL  P1M0, A
    ORL  P1M1, A
    POP  ACC
    RET
Set_ADC_Channel_2:
    MOV  ADC_CONTR, #ADC_Power_On_Speed_Channel_2
                                ;选择P1.2作为A/D转换通道
    MOV  A, #05H                ;更换 A/D 转换通道后要适当延时, 使输入电压稳定
                                ;以后如果不更换 A/D 转换通道的话, 不需要加延时
    ACALL DELAY                  ;切换 A/D 转换通道,加延时20uS~200uS就可以了,与输入电压源的内阻有关
                                ;如果输入电压信号源的内阻在10K以下,可不加延时
    RET
Get_AD_Result:
    PUSH  ACC                      ;入栈保护
    MOV  ADC_RES, #0 
    ORL  ADC_CONTR, #00001000B    ;启动 AD 转换
    NOP                            ;在对ADC_CONTR寄存器进行写操作后,要加4个空操作延时,才能够正确读到ADC_CONTR的值
    NOP                            ;在对ADC_CONTR寄存器进行写操作后,要加4个空操作延时,才能够正确读到ADC_CONTR的值
    NOP                            ;在对ADC_CONTR寄存器进行写操作后,要加4个空操作延时,才能够正确读到ADC_CONTR的值
    NOP                            ;在对ADC_CONTR寄存器进行写操作后,要加4个空操作延时,才能够正确读到ADC_CONTR的值
Wait_AD_Finishe:
    MOV  A, #00010000B            ;判断 AD 转换是否完成
    ANL  A, ADC_CONTR
    JZ    Wait_AD_Finishe          ;AD 转换尚未完成, 继续等待
    ANL  ADC_CONTR, #11100111B    ;清0 ADC_FLAG, ADC_START 位, 停止A/D转换
    MOV  A, ADC_RES
    MOV  ADC_Channel_2_Result, A  ;保存 AD 转换结果
    POP  ACC   
    RET
DELAY:MOV R6 ,#05H              ;延时程序
  DL2:MOV R7 ,#7DH 
  DL1:NOP
      NOP
      DJNZ R7,DL1
      DJNZ R6,DL2
      RET
TAB:DB 44H , 0DEH , 62H , 52H , 0D8H , 51H , 41H , 0D6H , 40H , 50H  , 04H,9EH,22H,
12H,98H,11H,01H,96H,00H,10H        ;前10为不带小数点字码表后10为带小数点字码表
    END   

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。