|
給位老師幫我看看下面程序,我需要實(shí)現(xiàn)1路pwm輸出,當(dāng)按鍵按下輸出電壓從4.5v降到2伏,在升到4.5伏。在30秒左右完成,
#include <STC12C5410AD.H>
#define unchar unsigned char
#define unint unsigned int
#define DUTYCYCLE(x) (256-(128*x/50))//占空比計(jì)算公式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) //延時(shí)子函數(shù)
{
unint y; //定義一個(gè)Y變量
for(;x>0;x--) //如果X大于0,那么X就減1.
for(y=500;y>0;y--);//給Y賦值為500,當(dāng)Y大于0那么Y就減1. *******注意前面的for的語(yǔ)句后面沒(méi)有引號(hào),那么會(huì)把后面的FOR語(yǔ)句
//也認(rèn)為是他的內(nèi)部語(yǔ)句。也就是說(shuō)X執(zhí)行一次那么Y就得執(zhí)行500次。
}
void MainInt() //
{
CMOD|=0x02;//選擇SYSCLK為PWM的時(shí)鐘源//控制PWM波的頻率
CCAPM0|=0x42;//允許比較器功能,開(kāi)啟PWM0
CCAPM1|=0x42;//允許比較器功能,開(kāi)啟PWM1
CL=0x00;//計(jì)數(shù)器清零
CH=0x00;
CCAP0L=0x33;//自動(dòng)裝入初始值,控制PWM占空比靠著兩個(gè),大于這個(gè)數(shù)輸出1,反之。。
CCAP0H=0x33; // CCAPOL CCAPOH 為PWM0的最高占空比和最低占空比。
CCAP1L=0x00; //猜也猜到了這個(gè)是PWM1的低占空比。
CCAP1H=0x00; //這個(gè)也是我猜的哈哈PWM1的高占空比。
CCON|=0;//啟動(dòng)PWM
CR = 1; //PCA 計(jì)時(shí)器啟動(dòng)運(yùn)行
}
// 按鍵檢查函數(shù),用來(lái)調(diào)節(jié)PWM的占空比0%-100%
void KeyScan(void)
{
if(KEY1==0)
{
Delay(500);
if(KEY1==0);
CYCLE0+=1;
if(CYCLE0>100)
CYCLE0=0;
CCAP0L=DUTYCYCLE(CYCLE0);//自動(dòng)裝入初始值,控制PWM占空比靠著兩個(gè),大于這個(gè)數(shù)輸出1,反之。。
CCAP0H=DUTYCYCLE(CYCLE0);//占空比計(jì)算公式256-(80/x=50/128)=XX,
CCAP1L=DUTYCYCLE(CYCLE1);
CCAP1H=DUTYCYCLE(CYCLE1);
}
}
void main(void)
{
MainInt();
CYCLE0=100;
while(1)
{
//****************下面語(yǔ)句是不斷加減CYCLE的數(shù)值來(lái)調(diào)節(jié)占空比輸出的。
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);//自動(dòng)裝入初始值,控制PWM占空比靠著兩個(gè),大于這個(gè)數(shù)輸出1,反之。。
CCAP0H=DUTYCYCLE(CYCLE0);//占空比計(jì)算公式256-(80/x=50/128)=XX,
CCAP1L=DUTYCYCLE(CYCLE1);
CCAP1H=DUTYCYCLE(CYCLE1);
}
}
|
|