51單片機PWM控制LED燈漸明漸暗實驗
1.概述
這篇文章介紹單片機的PWM通過占空比控制LED燈的漸明漸暗效果,通過該實驗掌握PWM的原理以及應用它做一些事情。
2.操作步驟
2.1.硬件電路
1.硬件準備
名稱 | 型號 | 數量 |
---|---|---|
單片機 | STC12C2052 | 1 |
LED彩燈 | 無 | 2 |
晶振 | 12MHZ | 1 |
電容 | 30pf | 2 |
電阻 | 100歐姆 | 2 |
面包板 | 無 | 1 |
連接線 | 無 | 5 |
2.電路圖原理圖
這次實驗使用了兩個LED燈交替閃爍,因此按照11號引腳接LED燈的方式在9號引腳同樣接入另一個LED燈即可。
2.2.程序代碼
/*************************************************************
* 程序名: PWM控制兩個LED燈亮度漸亮漸暗
* 編寫人: bruce
* 硬件支持:TC12C2052 外部12MHZ晶振
* 日 期: 2023-11-14
* 修改日志: 通過控制PWM占空比調控LED燈亮和滅實現亮度漸變效果
/*************************************************************/#include<STC12C2052AD.H>/*********************************************************************************************
函數名:PWM初始化函數
調 用:PWM_init();
參 數:無
返回值:無
結 果:將PCA初始化為PWM模式,初始占空比為0
備 注:需要更多路PWM輸出直接插入CCAPnH和CCAPnL即可
/**********************************************************************************************/
void PWM_init (void){CMOD=0x02; //設置PCA定時器CL=0x00; CH=0x00;CCAPM0=0x42; //PWM0設置PCA工作方式為PWM方式(0100 0010)CCAP0L=0x00; //設置PWM0初始值與CCAP0H相同CCAP0H=0x00; // PWM0初始時為0CCAPM1=0x42; //PWM1設置PCA工作方式為PWM方式(使用時刪除//)CCAP1L=0x00; //設置PWM1初始值與CCAP0H相同CCAP1H=0x00; // PWM1初始時為0//CCAPM2=0x42; //PWM2設置PCA工作方式為PWM方式//CCAP2L=0x00; //設置PWM2初始值與CCAP0H相同//CCAP2H=0x00; // PWM2初始時為0//CCAPM3=0x42; //PWM3設置PCA工作方式為PWM方式//CCAP3L=0x00; //設置PWM3初始值與CCAP0H相同//CCAP3H=0x00; // PWM3初始時為0CR=1; //啟動PCA定時器
}/*********************************************************************************************
函數名:PWM0占空比設置函數
調 用:PWM0_set();
參 數:0x00~0xFF(亦可用0~255)
返回值:無
結 果:設置PWM模式占空比,為0時全部高電平,為1時全部低電平
備 注:如果需要PWM1的設置函數,只要把CCAP0L和CCAP0H中的0改為1即可
/**********************************************************************************************/
void PWM0_set(unsigned char a){CCAP0L=a;CCAP0H=a;
}/*********************************************************************************************
函數名:PWM1占空比設置函數
調 用:PWM1_set();
參 數:0x00~0xFF(亦可用0~255)
返回值:無
結 果:設置PWM模式占空比,為0時全部高電平,為1時全部低電平
/**********************************************************************************************/
void PWM1_set(unsigned char a){CCAP1L=a;CCAP1H=a;
}/*********************************************************************************************
函數名:毫秒級CPU延時函數
調 用:DELAY_MS (?);
參 數:1~65535(參數不可為0)
返回值:無
結 果:占用CPU方式延時與參數數值相同的毫秒時間
備 注:應用于1T單片機時i<600,應用于12T單片機時i<125
/*********************************************************************************************/
void DELAY_MS (unsigned int a){unsigned int i;while( --a != 0){for(i = 0; i < 600; i++);}
}void main(void){//PWM初始化PWM_init();while(1){unsigned char a;for(a=0x00;a<0xff;a++){//設置PWM0占空比PWM0_set(a);//設置PWM1占空比PWM1_set(~a);DELAY_MS(8);}for(a=0xff;a>0x00;a--){//設置PWM0占空比PWM0_set(a);//設置PWM1占空比PWM1_set(~a);DELAY_MS(8);}}}
2.3.燒錄程序
使用Keil工具編譯程序,打開STC-ISP軟件選擇編譯后的hex文件,設置外部晶振,下載程序。將程序燒錄到單片機后,在給單片機冷啟動(斷掉5V電源在上電)使單片機切換為外部晶振,觀察兩個LED燈交替明暗變化。