给位老师帮我看看下面程序,我需要实现1路pwm输出,当按键按下输出电压从4.5v降到2伏,在升到4.5伏。在30秒左右完成,
#include <STC12C5410AD.H>
#define unchar unsigned char
#define unint unsigned int
#define DUTYCYCLE(x) (256-(128*x/50))//占空比计算公式256-(80/x=50/128)=XX, ** 占空比**
unchar yi=1;
unchar er=0;
sbit KEY0=P1^6;
sbit KEY1=P1^7;
unint CYCLE0,CYCLE1;
void Delay(unint x) //延时子函数
{
unint y; //定义一个Y变量
for(;x>0;x--) //如果X大于0,那么X就减1.
for(y=500;y>0;y--);//给Y赋值为500,当Y大于0那么Y就减1. *******注意前面的for的语句后面没有引号,那么会把后面的FOR语句
//也认为是他的内部语句。也就是说X执行一次那么Y就得执行500次。
}
void MainInt() //
{
CMOD|=0x02;//选择SYSCLK为PWM的时钟源//控制PWM波的频率
CCAPM0|=0x42;//允许比较器功能,开启PWM0
CCAPM1|=0x42;//允许比较器功能,开启PWM1
CL=0x00;//计数器清零
CH=0x00;
CCAP0L=0x33;//自动装入初始值,控制PWM占空比靠着两个,大于这个数输出1,反之。。
CCAP0H=0x33; // CCAPOL CCAPOH 为PWM0的最高占空比和最低占空比。
CCAP1L=0x00; //猜也猜到了这个是PWM1的低占空比。
CCAP1H=0x00; //这个也是我猜的哈哈PWM1的高占空比。
CCON|=0;//启动PWM
CR = 1; //PCA 计时器启动运行
}
// 按键检查函数,用来调节PWM的占空比0%-100%
void KeyScan(void)
{
if(KEY1==0)
{
Delay(500);
if(KEY1==0);
CYCLE0+=1;
if(CYCLE0>100)
CYCLE0=0;
CCAP0L=DUTYCYCLE(CYCLE0);//自动装入初始值,控制PWM占空比靠着两个,大于这个数输出1,反之。。
CCAP0H=DUTYCYCLE(CYCLE0);//占空比计算公式256-(80/x=50/128)=XX,
CCAP1L=DUTYCYCLE(CYCLE1);
CCAP1H=DUTYCYCLE(CYCLE1);
}
}
void main(void)
{
MainInt();
CYCLE0=100;
while(1)
{
//****************下面语句是不断加减CYCLE的数值来调节占空比输出的。
if(yi==1)
{
Delay(30);
CYCLE0--;
if(CYCLE0==1)
er=1,yi=0;
}
if(er==1)
{
Delay(50);
CYCLE0++;
if(CYCLE0==30)
er=0,yi=1;
}
CCAP0L=DUTYCYCLE(CYCLE0);//自动装入初始值,控制PWM占空比靠着两个,大于这个数输出1,反之。。
CCAP0H=DUTYCYCLE(CYCLE0);//占空比计算公式256-(80/x=50/128)=XX,
CCAP1L=DUTYCYCLE(CYCLE1);
CCAP1H=DUTYCYCLE(CYCLE1);
}
}
|