打印

STC12C2052AD关于AD转换求助!

[复制链接]
2612|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
baobei|  楼主 | 2008-5-19 10:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序如下,启动AD转换,结果通过串口送出,第一次转换结果是正确的,以后的数据全是错误的。
// ad test
#include <reg52.h>

/*A/D  SFR*/
//sfr ADC_LOW2  = 0xBE;
sfr ADC_CONTR = 0xC5;
sfr ADC_DATA  = 0xC6;
//sfr CLK_DIV   = 0xC7;
sfr P1M0            = 0x91;
sfr P1M1            = 0x92;

sbit led=P1^7;
sbit led2=P1^6;
unsigned char rec;

void delay(unsigned int i)
{
    while(i--);
    return;
}
void ad_init(void)
{
    ADC_CONTR = ADC_CONTR|0x80;            //启动AD转换电源
    delay(3000);                                            //延时大于1ms,使电源稳定
    
    P1M0 = P1M0|0x04;                                //00000100,设置P1.2为开漏
    P1M1 = P1M1|0x04;
    
    ADC_CONTR = ADC_CONTR|0xE2;            //11100010,设置P1.2为AD输入通道
    delay(600);                                            //切换AD通道后,延时200us,如果输入信号电压的内阻小于10K,可不用延时    
}
void set_nor(void)
{
    P1M0 = P1M0|0xfb;                                //11111011,设置P1.2为NORMAL模式
    P1M1 = P1M1|0xfb;
}
void start_ad(void)
{
    ADC_DATA = 0;
    ADC_CONTR = ADC_CONTR|0x08;            //00001000,启动AD转换
}
void stop_ad(void)
{
    ADC_CONTR = ADC_CONTR|0xef;            //11100111,停止AD转换,并清除AD FLAG
}
bit is_ad_ok(void)
{
    unsigned char tt;
    tt = ADC_CONTR;
    if(tt&0x10==1)
        return(1);
    else
        return(0);
}
void sendbyte(unsigned char dat)
{
    SBUF = dat;
    while(TI==0);
    TI = 0;
}
void uart(void) interrupt 4
{
    if(RI)
    {
        RI = 0;
        rec = SBUF;
    }
    if(TI)
    {
        TI = 0;
    }
}
void uartinit(void)
{
    TMOD = 0x21;
    TL1 = 0xFa;
    TH1 = 0xFa;
    SCON = 0x50;
    PCON = 0x00;
    TR1 = 1;
    ES = 1;
    //EA = 1;
}
void ad(void)
{
    ad_init();
    start_ad();
    delay(50000);
    sendbyte(ADC_DATA);
    stop_ad();
    set_nor();
}

void main(void)
{
    unsigned char i;
    uartinit();
    sendbyte(0x12);
    ad_init();
    start_ad();
    delay(50000);
    sendbyte(ADC_DATA);
    stop_ad();
    set_nor();
    while(1)
    {
        led = 0;
        if(rec==0x11)
        {
            //sendbyte(i++);
            led2 = !led2;
            rec = 0;
        }
        ad();
        delay(50000);
        led = 1;
        delay(50000);
    }
}

相关帖子

沙发
baobei|  楼主 | 2008-5-19 11:33 | 只看该作者

姚工不给支持,没法子啊!

STC的技术支持,一般般.

使用特权

评论回复
板凳
baobei|  楼主 | 2008-5-19 13:59 | 只看该作者

符号错了

找到错误了,
void stop_ad(void)
{
    ADC_CONTR = ADC_CONTR|0xef;            //11100111,停止AD转换,并清除AD FLAG
}
应为
void stop_ad(void)
{
    ADC_CONTR = ADC_CONTR&0xef;            //11100111,停止AD转换,并清除AD FLAG
}
符号错了

使用特权

评论回复
地板
gdjmlj| | 2008-6-17 22:47 | 只看该作者

stc12c2052ad

使用特权

评论回复
5
suizhouxh| | 2008-12-8 13:55 | 只看该作者

吸收下

谢谢!!参考下

使用特权

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

本版积分规则

10

主题

35

帖子

2

粉丝