|
#include<STC15.h>
#define LED_PIN P1_0
void init_PWM() {
TMOD |= 0x01; // 定時器0設(shè)置為16位定時器模式,以供PWM使用
ET0 = 1; //打開定時器中斷
TR0 = 1; //啟動定時器
}
void delay_nms(unsigned int n) { // 毫秒級延時函數(shù),可根據(jù)實際情況調(diào)節(jié)
unsigned int i,j;
for (i=0; i<n; i++) {
for (j=0; j<125; j++);
}
}
void main() {
unsigned char duty_cycle = 0; // 占空比,默認(rèn)為0
unsigned char flag = 0; // 標(biāo)志變量,用于判斷遞增還是遞減
init_PWM();
while(1) {
if(!flag) {
duty_cycle++;
if(duty_cycle == 255) {
flag = 1;
}
} else {
duty_cycle--;
if(duty_cycle == 0) {
flag = 0;
}
}
LED_PIN = (duty_cycle == 0 || duty_cycle == 255) ? 0 : 1; // 避免輸出高電平或低電平長時間照成LED損傷
delay_nms(10); // 延時10毫秒,可根據(jù)實際需求做出適當(dāng)調(diào)整
}
}
void timer0() interrupt 1 {
TH0 = 245; // 修改定時器初值
TL0 = 245;
PWM_OUT = duty_cycle; // 修改PWM占空比
}
在上述代碼中,循環(huán)呼吸燈的周期為500ms,可在 delay_nms() 函數(shù)中根據(jù)實際情況進(jìn)行調(diào)整。同時,在 main() 函數(shù)中使用 flag 變量控制 duty_cycle 的遞增和遞減,從而實現(xiàn)循環(huán)呼吸燈的效果。在 timer0() 中斷服務(wù)函數(shù)中,修改定時器初值并根據(jù)當(dāng)前占空比設(shè)置 PWM 輸出。 |
|