給位老師幫我看看下面程序,我需要實現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);
}
}
|