7758|8

37

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

STC单片机多路AD转换问题??? [复制链接]

最近在学习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赋值
        }
}
此帖出自单片机论坛

最新回复

很赞,遇到了同样的问题。  详情 回复 发表于 2018-6-18 18:02
点赞 关注
 

回复
举报

37

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
哪位大侠帮忙指点一下吧!
此帖出自单片机论坛
 
 

回复

4005

帖子

0

TA的资源

版主

板凳
 
明显是AD通道切换的问题,具体要看下手册...
此帖出自单片机论坛
 
 
 

回复

37

帖子

0

TA的资源

一粒金砂(中级)

4
 
我也知道是AD通道切换问题,我在程序里也做了切换,可还是没有切换过来,手册上也没有这方面的资料,求救呀!
此帖出自单片机论坛
 
 
 

回复

1298

帖子

0

TA的资源

纯净的硅(高级)

5
 
程序的问题还是自已慢慢尝试一下修改……
此帖出自单片机论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

6
 
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;
此帖出自单片机论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

7
 
ADC_CONTR&=0XF8;不是0Xf4
此帖出自单片机论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

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

很赞!!!
此帖出自单片机论坛
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

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

很赞,遇到了同样的问题。
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表