maikluo 发表于 2010-11-26 21:06:28

求STCAD转换后,再由PWM输出问题?

电路图ourdev_600615G33BKZ.rar(文件大小:6K) (原文件名:STC12C5608AD.rar)

maikluo 发表于 2010-11-26 21:14:09

想法是:ADC0采集来的数据,随光敏电阻变化的,把采集来的数据传给PWM0,来控制LED灯亮度变化。PWM0上接的LED灯,

maikluo 发表于 2010-11-26 21:16:13

#include "STC12C5620AD.H"

#define uint unsigned int
#define uchar unsigned char
sbitVACCT=P3^5;
sbitPWM0=P3^7;
sbitSYSPOWER=P1^3;
sbitPCSW=P1^2;
sbit   Lightness=P1^0;
                                          //拔码开关选择
sbit K1=P2^0;               //这个延时30秒
sbit K2=P2^1;               //这个延时5分钟
sbit K3=P2^2;                //        这个延时15分钟
sbit K4=P2^3;                //这个延时30分钟
//---------------------------------------------------------------------
//以下选择 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个时钟周期转换一次
//---------------------------------------------------------------------


uint aa;
uchar dd, bb;
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);       
}


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()
{
        aa=0;
        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先设为开漏。断开内部上拉电阻

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

这样转换不可行。。求大侠指点。。。新手学习。。。

maikluo 发表于 2010-11-26 21:21:00

程式没贴没,接着贴,

        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计数器阵列溢出标志

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

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

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

        CR = 1;    // 开启PWM

youlongam 发表于 2010-11-27 08:47:46

好像是可以的,你的用示波器看一下PWM的宽度在变没有

cuikai12345 发表于 2010-11-27 14:15:09

mark

bg8wj 发表于 2011-1-13 23:05:35

哈哈 你整的这个特别像好像前几天一个想吃白食的大哥叫我免费帮他搞得东西啊,也是要求ad0采0-5v的电压量,pwm dac输出比例0-5v的模拟控制电压。
你的程序很难看懂,不过可以看出你的pwm部分程序肯定不会工作,dd=readadc(0) 就直接给 pwm输出。先不说你的adc函数是否正确,pwm转换dac输出不是比例输出的。这个不是adc0809+c51+dac那种用法。(怎么感觉你和那个吃白食的大哥想法一样)pwm的dac 不是真正的dac只是低成本的简易dac,pwm控制字CCAPxx是要自己算的。
页: [1]
查看完整版本: 求STCAD转换后,再由PWM输出问题?