maikluo 发表于 2010-11-22 21:18:20

跪求STC12C5608AD的AD转换与PWM的问题

我现正使用STC12C5608AD,跪求:用AD功能把P1.0(ADC0/CLKOUT1/P1.0)脚输入电压转过来的值,用P3.7脚(PWMO/PCA0)生成PWM输出,
我P1.0的电压随光敏电阻变化的。
程式写成这样,不知怎修改,
#include "STC12C5620AD.H"
sbitVACCT=P3^5;
sbitPWM0=P3^7;
sbitSYSPOWER=P1^3;
sbitPCSW=P1^2;
sbit   Lightness=P1^0;

//---------------------------------------------------------------------
//以下选择 ADC 转换速率,只能选择其中一种
                        //          SPEED1 SPEED0A/D转换所需时间
#define AD_SPEED   0x60 //0110,0000   1      1   270个时钟周期转换一次,
                        //                         CPU工作频率27MHz时,
                        //                         A/D转换速度约100KHz
//#define AD_SPEED   0x40 //0100,0000   1      0   540个时钟周期转换一次
//#define AD_SPEED   0x20 //0010,0000   0      1   810个时钟周期转换一次
//#define AD_SPEED   0x00 //0000,0000   0      0   1080个时钟周期转换一次
//---------------------------------------------------------------------


#define uchar unsigned char
unsigned charaa,bb;
void delay(uchar dd)
{
int x,y;
for(x=dd;x>0;x--)
for(y=100;y>0;y--);
}

void PWMInitial( void )    // 初始化PWM
{
CMOD = 0x05;    // 设置PWM的时钟源 : T0溢出 并置位ECF开启PCA计数器阵列溢出标志   

CL   = 0x00;    // PCA初值
CH   = 0x00;

// PWM0 控制
CCAP0L = 0xc0;    // 设置比较值控制脉宽
CCAP0H = 0xc0;    // CCAPnL 与 CCAPnH 值应相同
CCAPM0 = 0x42;    // 模块工作模式设置为PWM输出
    PCA_PWM0 = 0x00;    // 清零PWM模式下的第9位

// EPCA_LVD = 1;    // 允许PCA中断及低压检测中断此位不打开将无法产生PCA中断

CR = 1;    // 开启PWM
}

unsigned char Read_ADC(unsigned char adcvcc)
{
//将P1.0--P1.1设置成适合AD转换的模式
ADC_CONTR = ADC_CONTR|0x80; //1000,0000打开A/D转换电源
delay(20);//20ms
ADC_CONTR = ADC_CONTR&0xE0; //1110,0000 清ADC_FLAG,ADC_START位和低3位
ADC_CONTR = ADC_CONTR&0xf8|adcvcc; //设置当前通道号
delay(10);//延时使输入电压达到稳定
ADC_DATA = 0;//清A/D转换结果寄存器
ADC_CONTR = ADC_CONTR|0x08; //0000,1000ADCS = 1,启动转换
do { ; }
while((ADC_CONTR & 0x10)==0); //0001,0000等待A/D转换结束
ADC_CONTR = ADC_CONTR&0xE7; //1110,0111清ADC_FLAG和ADC_START位,停止A/D转换
return ADC_DATA;
}
void main()
{
CLK_DIV = 0x00;    // 时钟分频 :不分频

    //里要加上设置ADC的端口,如,P1.1设为ADC口的话:
    P1M0 = 0x03; //0000,0011用于A/D转换的P1.x口,先设为开漏
P1M1 = 0xC3; //0000,0011P1.0--P1.1先设为开漏。断开内部上拉电阻
bb=0x01;
   


   PCSW=1;            
delay(0x2000);



while(1)
{
   
   if(!VACCT)
{
    SYSPOWER=0;   
    delay(0x10);
PCSW=0;
delay(0x10);
      PCSW=1;

aa=Read_ADC(1); //第一路A/D转换;如要改别的路,只要把代入通道改一下.
         P3=aa;//这是让A/D的数据显示在P3口的LED上.

if(VACCT==0)
{
delay(0x10);
if(VACCT==0)
{
delay(0x2000); //这个延时代定
PCSW=0;
   delay(0x10);
       PCSW=1;
    }

delay(0x2000);
SYSPOWER=1;
}
}
   
}
}

maikluo 发表于 2010-11-22 21:21:43

请大侠们指点。。跪谢了。。

maikluo 发表于 2010-11-22 21:29:52

P3=aa;//这是让A/D的数据显示在P3口的LED上.。。。。我本意是要把A/D的数据,用PWM0(P3.7)显示出来。。不知怎转过去,我用P3=aa代。求大侠们指点。。。跪谢

dengxiaofeng 发表于 2010-11-23 08:28:22

路过我讨厌 S-T-C

dmxfeng 发表于 2010-11-23 09:01:50

路过!我讨厌你那个跪字。

jrcsh 发表于 2010-11-23 10:27:12

回复【4楼】dmxfeng
路过!我讨厌你那个跪字。
-----------------------------------------------------------------------

flyhouse 发表于 2010-11-23 11:36:32

把跪下的叉出去,刖刑伺候!反正lz也不需要了。

maikluo 发表于 2010-11-25 21:22:46

没大侠们来指点,,。。????

maikluo 发表于 2010-11-25 21:28:18

我现改成这样是否可行,请高手指点一二,
unsigned char Read_ADC(unsigned char adcvcc)
{
                                                                //将P1.0--P1.1设置成适合AD转换的模式
        ADC_CONTR = ADC_CONTR|0x80; //1000,0000打开A/D转换电源
        delay(20);                                       //20ms
        ADC_CONTR = ADC_CONTR&0xE0; //1110,0000 清ADC_FLAG,ADC_START位和低3位
        ADC_CONTR = ADC_CONTR&0xf8|adcvcc; //设置当前通道号
        delay(10);                                                       //延时使输入电压达到稳定
        ADC_DATA = 0;                                               //清A/D转换结果寄存器
        ADC_CONTR = ADC_CONTR|0x08; //0000,1000ADCS = 1,启动转换
        do { ; }
        while((ADC_CONTR & 0x10)==0); //0001,0000等待A/D转换结束
        ADC_CONTR = ADC_CONTR&0xE7; //1110,0111清ADC_FLAG和ADC_START位,停止A/D转换
        return ADC_DATA;
}





void main()
{
        CLK_DIV = 0x00;    // 时钟分频 :不分频                  时钟选的4MZH

/*        AUXR = AUXR | 0x80;    // 设置为1T模式
    TMOD = 0x02;    // 定时器模式1 :16位定时器
        TH0=(65536-50000)/256;          // 定时器赋初值
        TL0=(65536-50000)%256;
       
        EA=1;          // 开启总中断
        ET0=1;
        TR0=1;       // 开启定时器0                */




                   //里要加上设置ADC的端口,如,P1.1设为ADC口的话:
    P1M0 = 0x03; //0000,0011用于A/D转换的P1.x口,先设为开漏
        P1M1 = 0xC3; //0000,0011P1.0--P1.1先设为开漏。断开内部上拉电阻
        bb=0x01;

   PCSW=1;                                                                
       delay(1000);

        while(1)
        {
          
                  if(!VACCT)
                {
                  SYSPOWER=0;               
                  delay(10);
                        PCSW=0;
                        delay(10);
                PCSW=1;
                       
                       bb=Read_ADC(1); //第一路A/D转换;如要改别的路,只要把代入通道改一下.
                
                        CMOD = 0x05;    // 设置PWM的时钟源 : T0溢出 并置位ECF开启PCA计数器阵列溢出标志

    bb=Read_ADC(1); //第一路A/D转换;如要改别的路,只要把代入通道改一下.

        CL   = bb;    // PCA初值
        CH   = bb;

        // PWM0 控制
        CCAP0L = 0xc0;    // 设置比较值控制脉宽
        CCAP0H = 0xc0;    // CCAPnL 与 CCAPnH 值应相同
        CCAPM0 = 0x42;    // 模块工作模式设置为PWM输出
    PCA_PWM0 = 0x00;    // 清零PWM模式下的第9位

        EPCA_LVD = 1;    // 允许PCA中断及低压检测中断此位不打开将无法产生PCA中断

        CR = 1;    // 开启PWM
                       
                       
                //       P3=aa;//这是让A/D的数据显示在P3口的LED上.

maikluo 发表于 2010-11-25 21:37:24

ADC转换出来的值bb是赋给PCA        初值,还是赋给CCAPOL和CCAPOH,高手,大侠们帮忙指点下。,不胜感激                        
                       
    bb=Read_ADC(1); //第一路A/D转换;如要改别的路,只要把代入通道改一下.

        CL   = bb;    // PCA初值
        CH   = bb;

        // PWM0 控制
        CCAP0L = 0xc0;    // 设置比较值控制脉宽
        CCAP0H = 0xc0;    // CCAPnL 与 CCAPnH 值应相同
        CCAPM0 = 0x42;    // 模块工作模式设置为PWM输出
    PCA_PWM0 = 0x00;    // 清零PWM模式下的第9位

        EPCA_LVD = 1;    // 允许PCA中断及低压检测中断此位不打开将无法产生PCA中断

        CR = 1;    // 开启PWM

maikluo 发表于 2010-11-26 18:57:04

怎没人回应呀

cuikai12345 发表于 2010-11-27 14:53:46

mark

GDYJ 发表于 2010-11-27 15:35:55

AD采样是8位的吗?是的话,加入采样后的数是F0H,那你直接送到CCAPOH寄存器中去,也就是pwm高电平输出的时间,CCAPOL的值自然是FF-F0了,这个值你可以在开启PWM前写好减法程序;

maikluo 发表于 2010-11-29 12:56:49

休息了两天,看到12楼兄台的指点,多谢。

ARMVSAVR 发表于 2011-9-8 22:34:41

MARK

mzbhy 发表于 2011-9-8 22:53:04

程序够牙碜的。

陈纪友103 发表于 2012-5-13 19:11:12

MART{:smile:}

i7gly 发表于 2012-5-13 23:47:12

if(电压==xV)CCAP0=CCAP1=0xxx;

yangbing2020 发表于 2013-8-1 00:00:41

MARK下{:lol:}
页: [1]
查看完整版本: 跪求STC12C5608AD的AD转换与PWM的问题