最近在学习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赋值
}
}
我也知道是AD通道切换问题,我在程序里也做了切换,可还是没有切换过来,手册上也没有这方面的资料,求救呀!
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;