打印

STC12C5410AD的AD转换问题

[复制链接]
5288|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mxinfa|  楼主 | 2008-12-18 18:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调了一天STC12C5410AD的AD转换,结果始终不对,转换结果要么是00要么是FF,我用到了AD0-AD2,对结果我只使用了高8位。代码如下望指点,谢谢
void initADC()
{
P1M0 = 0x07;                //0000,0111用于A/D转换的P1.x口,先设为开漏
P1M1 = 0x07;                //0000,0111P1.0--P1.2先设为开漏。断开内部上拉电阻
ADC_CONTR = ADC_CONTR|0x80; //1000,0000打开A/D转换电源
Delay(10000); 
}

uchar Ad_Change(uchar channel)
{
uchar temp1,temp2;                             
ADC_CONTR = ADC_CONTR&0xE0; //1110,0000 清ADC_FLAG,ADC_START位和低3位
ADC_CONTR = ADC_CONTR|(channel&0x07); //设置当前通道号

ADC_CONTR = ADC_CONTR|0x08; //0000,1000ADCS = 1,启动转换

while((ADC_CONTR & 0x10)==0);   //0001,0000等待A/D转换结束

ADC_CONTR = ADC_CONTR&0xE7; //1110,0111清ADC_FLAG位,停止A/D转换


temp1=    ADC_DATA;
temp2=    ADC_LOW2;
return      temp1;

相关帖子

沙发
zyok| | 2008-12-18 18:40 | 只看该作者

在STC网站找个现成的来改一下就行了啊...

使用特权

评论回复
板凳
mxinfa|  楼主 | 2008-12-18 18:44 | 只看该作者

这个也是网上下载了之后修改的

使用特权

评论回复
地板
mxinfa|  楼主 | 2008-12-18 18:46 | 只看该作者

并且在stc的网站上也没有找到现成的

使用特权

评论回复
5
zyok| | 2008-12-18 18:55 | 只看该作者

试试这个行不

/*--------------头文件应定义的信息-----------------------
sfr P1M0  = 0x91;     //P1口模式设置寄存器
sfr P1M1  = 0x92;
sfr ADC_CONTR = 0xC5;//AD转换控制寄存器
sfr ADC_DATA  = 0xC6;//AD转换结果寄存器,高8位
sfr ADC_LOW2  = 0xBE;//AD转换结果寄存器,低2位
--------------------------------------------------------*/
/*************************************************************************************
 功能:A/D转换
 入口:channel = 通道号 .0~7:0通道;1:1通道。。。。。。。
 出口:AD_result: 10位的数据,无符号整型。
 说明:1、P1M0、P1M1为P1口模式设置寄存器,如作为A/D转换,则应设置为开漏模式,即相应为
         置1,eg:把P1.2设为AD,则应设置P1M0=#0000 0100B;    P1M1=#0000 0100B;
       2、DelayNms();软件延时
*************************************************************************************/
INT16U Ad_Change(INT8U channel)
{
    INT16U AD_Result_Temp = 0 ;

    ADC_CONTR=ADC_CONTR|0x80;        //1000,0000打开A/D转换电源
    P1M0=0xc0;                        //1100 0000,P1.6--P1.7先设为开漏。断开内部上拉电阻
    P1M1=0xc0;                       
    DelayNms(1);                      //延时1ms使电源稳定    
    ADC_CONTR=ADC_CONTR&0xE0;         //1110,0000 清ADC_FLAG,ADC_START位和低3位
    ADC_CONTR=ADC_CONTR|channel&0x07;//设置当前通道号
    delayNms(2);                    //延时2ms使输入电压达到稳定
    ADC_DATA=0;                       //清A/D转换结果寄存器
    ADC_LOW2=0;
    ADC_CONTR=ADC_CONTR|0x08;         //0000_1000启动A/D转换(ADC_START=1)  
    while((ADC_CONTR & 0x10)==0);     //0001,0000等待A/D转换结束(ADC_FLAG=1)
    ADC_CONTR=ADC_CONTR&0xE7;         //1110,0111清ADC_FLAG位,停止A/D转换
    AD_Result_Temp=((AD_Result_Temp|ADC_DATA)<<2)|(ADC_LOW2&0x03);//整合10位数据 
    return(AD_Result_Temp);
}

使用特权

评论回复
6
mxinfa|  楼主 | 2008-12-18 19:30 | 只看该作者

谢谢,试了之后反馈结果

不过感觉跟我那个程序好象没有本质区别,还是非常感谢

使用特权

评论回复
7
腾腾| | 2008-12-18 22:44 | 只看该作者

STC5410AD的Datasheet上面是汇编代码

使用特权

评论回复
8
mxinfa|  楼主 | 2008-12-18 22:45 | 只看该作者

发现可能不是软件的问题

可能前端调理电路设计的有问题,我另外开帖子向大家请教

使用特权

评论回复
9
born| | 2008-12-19 08:37 | 只看该作者

换通道时候 要延时一段时间

使用特权

评论回复
10
3.3v| | 2008-12-19 13:43 | 只看该作者

我这个是行的通的,试试,

//还有STC的AD别指望通道切换了,转换速度奇慢

void ADC_init(void)
{
  
  ADC_CONTR    |= 0x80;   //开电源
  P1M0          = 0x40;      //P1.6开漏
  P1M1          = 0x40;   //P1.6开漏
  ADC_CONTR    &= 0xf8;   //设置转换速度为最快
  ADC_CONTR    |= 0x06;      //设置引脚为P1.6
  ADC_CONTR     = 0xe6;      //清除标记和停止ADC 
}


uint ADC(void)


  uchar sertemp; 
  uint  adcout = 0x00;
  ADC_DATA_H   = 0x00; 
  ADC_DATA_L   = 0x00;
  ADC_CONTR   |= 0x08; //开始
  LOOP:
  sertemp      = 0x10;
  sertemp     &= ADC_CONTR;
  if (sertemp == 0x00)
  goto  LOOP;
  ADC_CONTR   &= 0xe6;   //清除标记,停止转换
  adcout       = ADC_DATA_H; //结果高8
  adcout     <<= 2; //搞成int 
  adcout      += ADC_DATA_L;  
 
   return adcout;
}

使用特权

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

本版积分规则

33

主题

198

帖子

1

粉丝