求STCAD转换后,再由PWM输出问题?
电路图ourdev_600615G33BKZ.rar(文件大小:6K) (原文件名:STC12C5608AD.rar) 想法是:ADC0采集来的数据,随光敏电阻变化的,把采集来的数据传给PWM0,来控制LED灯亮度变化。PWM0上接的LED灯, #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先设为开漏。断开内部上拉电阻 这样转换不可行。。求大侠指点。。。新手学习。。。 程式没贴没,接着贴,
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 好像是可以的,你的用示波器看一下PWM的宽度在变没有 mark 哈哈 你整的这个特别像好像前几天一个想吃白食的大哥叫我免费帮他搞得东西啊,也是要求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]