[求助] STC单片机多路AD转换问题???

zhangli7322   2015-3-23 23:53 楼主
最近在学习STC12C2052AD单片机。我分别用2个电位器调节2路ADC转换后输出2路PWM信号调节LED灯的亮度,
可是只有P1.7口可以调节,而且是同时调节2个LED的亮度,P1.6口不起作用,
现在把程序贴出来,大家来帮忙看看吧!问题出在哪里?



/*2路A/D电位器调节PWM输出LED调光 8M晶振*/
#include //单片机头文件
#include //51基本运算(包括_nop_空函数)
#define uchar unsigned char
#define uint unsigned int
uint M;
uint C;
/*****************************************************************
函数名:毫秒级CPU延时函数
调  用:DELAY_MS(?);
参  数:1~65535(参数不可为0)
返回值:无
结  果:占用CPU方式延时与参数数值相同的毫秒时间
备  注:应用于1T单片机时i<400
/******************************************************************/
void DELAY_MS (uint a)
{  
        uint i;   
        while( a-- != 0)
        {   
                for(i = 0; i < 400; i++);  
        }
}  
/**********************************************************************************************/
void Read_init () //初始化A/D
{
  ADC_CONTR = 0x40;        //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)
  _nop_();
  ADC_CONTR |= 0x80; //启动A/D电源
  DELAY_MS(1); //使输入电压达到稳定(1ms即可)
}

/**********************************************************************************************/
uchar Read1 (void) //P1.6口A/D转换
{
        uchar AD_FIN=0; //存储A/D转换标志
        ADC_CONTR |= 0x06; //选择A/D当前通道
  ADC_CONTR |= 0x08; //启动A/D转换(0000 1000 令ADCS = 1)
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  while (AD_FIN ==0)//等待A/D转换结束
        {     
          AD_FIN = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否
  }
    ADC_CONTR &= 0xE7; //1110 0111 清ADC_FLAG位, 关闭A/D转换,
        return (ADC_DATA);   //返回A/D转换结果(8位)
}
/**********************************************************************************************/
uchar Read2 (void) //P1.7口A/D转换
{
        uchar AD_FIN=0; //存储A/D转换标志
        ADC_CONTR |= 0x07; //选择A/D当前通道
  ADC_CONTR |= 0x08; //启动A/D转换(0000 1000 令ADCS = 1)
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  while (AD_FIN ==0)//等待A/D转换结束
        {     
          AD_FIN = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否
  }
    ADC_CONTR &= 0xE7; //1110 0111 清ADC_FLAG位, 关闭A/D转换,
        return (ADC_DATA);   //返回A/D转换结果(8位)
}
/**********PWM初始化函数****************************************/
void PWM_init (void)
{  
        CMOD=0x02;    //PCA工作模式设定   
        CL=0x00;   //PCA计数器低8位置0   
        CH=0x00;   //PCA计数器高8位置0   
        CCAPM0=0x42;  //设置为脉宽调节PWM方式(0100 0010)
        CCAP0L=0x00;//CCAP0L复位
        CCAP0H=0x00;//CCAP0H复位
        CCAPM1=0x42; //PWM1设置PCA工作方式为PWM方式
        CCAP1L=0x00; //设置PWM1初始值与CCAP0H相同
        CCAP1H=0x00; // PWM1初始时为0
        CR=1;//启动PCA定时器
}

/**********PWM占空比赋值函数***********************************/
void PWM0_set(uchar a)//PWM0输出为可调方波
{
        CCAP0L=a;//CCAP0L赋值
        CCAP0H=a;//CCAP0H赋值
}
void PWM1_set(uchar b)//PWM1输出为可调方波
{
        CCAP1L=b;//CCAP0L赋值
        CCAP1H=b;//CCAP0H赋值
}

/****************************************************************
函数名:主函数
调  用:无
参  数:无
返回值:无
结  果:程序开始处,无限循环
备  注:
****************************************************************/
void main(void)
{
        Read_init();//初始化ADC
        PWM_init(); //初始化PWM
        P1M0=0xC0;//P1.6,P1.7:1100 0000(高阻)
        P1M1=0x00;//P1.6,P1.7:0000 0000
        while(1)
        {
                M=Read1();//P1.6口模拟量转换
                PWM0_set(M);//转换结果为PWM赋值
                C=Read2(); //P1.7口模拟量转换
                PWM1_set(C); //转换结果为PWM赋值
        }
}

回复评论 (8)

哪位大侠帮忙指点一下吧!
点赞  2015-3-24 15:21
明显是AD通道切换的问题,具体要看下手册...
点赞  2015-3-24 20:20
我也知道是AD通道切换问题,我在程序里也做了切换,可还是没有切换过来,手册上也没有这方面的资料,求救呀!
点赞  2015-3-24 22:56
程序的问题还是自已慢慢尝试一下修改……
点赞  2015-3-25 11:02
ADC_CONTR |= 0x07; //选择A/D当前通道
问题出现在通道选择这个地方,循环对P1.6和P1.7采集的时候,使用或逻辑,通道选择位会一直是 0x xxxx x111,采集通道就一直是P1.7,所以调节P1.6和P1.7的电位器只有P1.7可以调,而且是同时调两个,可以每次在选择通道的时候,先把原有的通道清零,然后再选择使用通道,即ADC_CONTR&=0xF4;ADC_CONTR=0xF6;
点赞  2016-1-27 13:37
ADC_CONTR&=0XF8;不是0Xf4
点赞  2016-1-27 13:42
引用: 昕林 发表于 2016-1-27 13:37
ADC_CONTR |= 0x07; //选择A/D当前通道
问题出现在通道选择这个地方,循环对P1.6和P1.7采集的时候,使用 ...

很赞!!!
点赞  2018-6-18 18:02
引用: 昕林 发表于 2016-1-27 13:37
ADC_CONTR |= 0x07; //选择A/D当前通道
问题出现在通道选择这个地方,循环对P1.6和P1.7采集的时候,使用 ...

很赞,遇到了同样的问题。
点赞  2018-6-18 18:02
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复