打印

关于AD功能使用。请教前辈。

[复制链接]
1869|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
Galway-Zhang|  楼主 | 2010-11-19 14:11 | 只看该作者
;此为STC提供的AD测试源程序。但是实验结果是程序一直跑在串口子程序中。
;AD转换子程序没有运行
LED_MCU_START        EQU        P3.7
ADC_CONTR        EQU        0C5H                ;A/D转换寄存器
ADC_DATA        EQU        0C6H                ;A/D转换结果寄存器,为10位A/D转换结果的高8位
ADC_LOW2        EQU        0BEH                ;A/D转换结果寄存器,低2位有效,为10位A/D转换结果的低2位
                                        ;如果不用ADC_LOW2的低2位,只用ADC_DATA的8位,则为8位A/D转换
P1M0                EQU        91H                ;P1口模式选择寄存器0
P1M1                EQU        92H                ;P1口模式选择寄存器1

ADC_Power_On_Speed_Channel_0        EQU        P1.0                ;11100000B           ;0x0E0                ;P1.0作为A/D输入
ADC_Power_On_Speed_Channel_1        EQU        P1.1                ;11100001B        ;0x0E1                ;P1.1作为A/D输入
ADC_Power_On_Speed_Channel_2        EQU        P1.2                ;11100010B        ;0x0E2                ;P1.2作为A/D输入
ADC_Power_On_Speed_Channel_3        EQU        P1.3                ;11100011B        ;0x0E3                ;P1.3作为A/D输入
ADC_Power_On_Speed_Channel_4        EQU        P1.4                ;11100100B        ;0x0E4                ;P1.4作为A/D输入
ADC_Power_On_Speed_Channel_5        EQU        P1.5                ;11100101B        ;0x0E5                ;P1.5作为A/D输入
ADC_Power_On_Speed_Channel_6        EQU        P1.6                ;11100110B        ;0x0E6                ;P1.6作为A/D输入
ADC_Power_On_Speed_Channel_7        EQU        P1.7                ;11100111B        ;0x0E7                ;P1.7作为A/D输入

;-----------------------------------------------------------------------
;定义变量
ADC_Channel_0_Result        EQU        30H        ;0通道A/D转换结果
ADC_Channel_1_Result        EQU        31H        ;1通道A/D转换结果
ADC_Channel_2_Result        EQU        32H        ;2通道A/D转换结果
ADC_Channel_3_Result        EQU        33H        ;3通道A/D转换结果
ADC_Channel_4_Result        EQU        34H        ;4通道A/D转换结果
ADC_Channel_5_Result        EQU        35H        ;5通道A/D转换结果
ADC_Channel_6_Result        EQU        36H        ;6通道A/D转换结果
ADC_Channel_7_Result        EQu        37H        ;7通道A/D转换结果

        ORG        0000H
        LJMP        MAIN
        ORG        0050H
MAIN:
        CLR        LED_MCU_START                ;MCU工作指示灯 LED_MCU_START        EQU        P3.7
        MOV        SP,#7FH                        ;设置堆栈

        ACALL        Initiate_RS232                ;初始化串口

        ACALL        ADC_Power_On                ;开ADC电源,第一次使用时要打开内部模拟电源
                                        ;开ADC电源,可适当加延时,1mA以内就足够了
        ACALL        Set_P12_Open_Drain        ;设置P1.2为开漏
        ACALL        Set_ADC_Channel_2        ;设置P1.2作为A/D转换通道
        ACALL        Get_AD_Result                ;测量电压并且取A/D转换结果
        ACALL        Send_AD_Result                ;发送转换结果到PC机

        ACALL        Set_P12_Normal_IO        ;设置P1.2为普通IO
        MOV        A,ADC_Channel_2_Result        ;用P1口显示A/D转换结果
        CPL        A
        MOV        P1,A

Wait_Loop:
        SJMP        Wait_Loop                ;停机

        ;-----------------------------------------------------------------
        ;-----------------------------------------------------------------
Initiate_RS232:
        CLR        ES                        ;串口初始化
        MOV        TMOD,#20H                ;设置%1为波特率发生器
        MOV        SCON,#50H                ;0101,0000 8位数据位,无奇偶检验
        MOV        TH1,#0FBH                ;18.432MHz晶振,波特率=9600
        MOV        TL1,#0FBH               

        SETB        TR1                        ;启动T1
        RET
;----------------------------------------------------------------
Send_Byte:
        CLR        TI
        MOV        SBUF,A

Send_Byte_Wait_Finish:
        JNB        TI,Send_Byte_Wait_Finish
        CLR        TI
;        RET
;------------------------------------------------------------
ADC_Power_On:
        PUSH        ACC
        ORL        ADC_CONTR,#80H                        ;开A/D转换电源
        MOV        A,#20H
        ACALL        Delay                                ;开A/D转换电源后要加延时,1mS以内就足够
        POP        ACC
;        RET
;-------------------------------------------------------------------------------------
;-------------------------------------------------------------------------------------
;设置P1.2,设置A/D通道所在的I/0为开漏模式
Set_P12_Open_Drain:
        PUSH        ACC
        MOV        A,#0x04
        ORL        P1M0,A
        ORL        P1M1,A
        POP        ACC
;        RET
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
;设置P1.2为普通IO
Set_P12_Normal_IO:
        PUSH        ACC
        MOV        A,#0xFA
        ANL        P1M0,A
        ANL        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
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
Send_AD_Result:
        PUSH        ACC
        MOV        A,ADC_Channel_2_Result        ;取A/D转换结果
        ACALL        Send_Byte                ;发送转换结果到PC机
        POP        ACC
;        RET
;------------------------------------------------------------------------------
;-----------------------------------------------------------------------------
Get_AD_Result:
        PUSH        ACC
        MOV        ADC_DATA,#0
        ORL        ADC_CONTR,#0x8                        ;启动A/D转换

Wait_AD_Finishe:
        MOV        A,#0x10                                ;判断AD转换是否完成
        ANL        A,ADC_CONTR
        JZ        Wait_AD_Finishe                        ;AD转换尚未完成,继续等待

        ANL        ADC_CONTR,#0xE7                        ;清0 ADC_FLAG,ADC_START位,停止A/D转换

        MOV        A,ADC_DATA
        MOV        ADC_Channel_2_Result,A                ;保存AD转换结果
        POP        ACC
;        RET
;------------------------------------------------------------------------------
Delay:
        PUSH        02                                ;将寄存器组0的R2入栈
        PUSH        03                                ;将寄存器组0的R3入栈
        PUSH        04                                ;将寄存器组0的R4入栈
        MOV        R4,A
Delay_Loop0:
        MOV        R3,#200                                ;2 CLOCK
Delay_Loop1:
        MOV        2,#249                                ;2 CLOCK
Delay_Loop:
        DJNZ        R2,Delay_Loop                        ;4 CLOCK
        DJNZ        R3,Delay_Loop1                        ;4 CLOCK
        DJNZ        R4,Delay_Loop0                        ;4 CLOCK

;        POP        04
;        POP        03
;        POP        02
;        RET
END

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:LED电源,移动电源,充电器开发,PCBlayout, 电池研发设备开发,动力电池保护板 电池测试仪 QQ:551708558 E-mail:dy188@qq.com 淘宝:http://diy-power.taobao.com

0

主题

267

帖子

2

粉丝