![]() |
發布時間: 2023-4-16 19:37
正文摘要:用的是stc15的芯片 ,程序沒看明白(希望可講解一下),這個程序只能從亮到暗,有沒有什么辦法是它循環起來(謝謝大家) |
1234590qwehjm 發表于 2023-4-17 12:07 好的,謝謝 |
man1234567 發表于 2023-4-17 11:14 這個獲取的AD值怎么轉換,怎么看自己用的是多少位的ad |
1234590qwehjm 發表于 2023-4-17 00:38 將AD值與占空比進行關聯就可以。 |
張大炮ie 發表于 2023-4-16 20:12 我想再問一下,怎么讓它和通過ad獲得的光敏電阻值結合,就是用光敏電阻的值去控制led的亮暗(值越小,燈越暗,值越大,燈越亮) |
張大炮ie 發表于 2023-4-16 20:12 謝謝大佬 |
#include<STC15.h> #define LED_PIN P1_0 void init_PWM() { TMOD |= 0x01; // 定時器0設置為16位定時器模式,以供PWM使用 ET0 = 1; //打開定時器中斷 TR0 = 1; //啟動定時器 } void delay_nms(unsigned int n) { // 毫秒級延時函數,可根據實際情況調節 unsigned int i,j; for (i=0; i<n; i++) { for (j=0; j<125; j++); } } void main() { unsigned char duty_cycle = 0; // 占空比,默認為0 unsigned char flag = 0; // 標志變量,用于判斷遞增還是遞減 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毫秒,可根據實際需求做出適當調整 } } void timer0() interrupt 1 { TH0 = 245; // 修改定時器初值 TL0 = 245; PWM_OUT = duty_cycle; // 修改PWM占空比 } 在上述代碼中,循環呼吸燈的周期為500ms,可在 delay_nms() 函數中根據實際情況進行調整。同時,在 main() 函數中使用 flag 變量控制 duty_cycle 的遞增和遞減,從而實現循環呼吸燈的效果。在 timer0() 中斷服務函數中,修改定時器初值并根據當前占空比設置 PWM 輸出。 |