|
代碼雖然簡單,但效果是杠杠的。
51單片機(jī)源碼:
- #include <reg52.h>
- typedef unsigned char uint8;
- typedef unsigned int uint16;
- sbit led = P1^0;
- /* 占空比控制 */
- uint16 t = 0;
- uint16 PWM = 0;
- bit up = 1;
- /* 此值越大,單次調(diào)整的幅度越小(越精細(xì))*/
- uint16 MaxL = 200;
- /* 步長,值越大,PWM改變?cè)铰ㄗ⒁釳axL要能被s整除!!!) */
- uint8 s = 100;
- void main()
- {
- //T0工作方式2
- TMOD = 0x02;
- //單次溢出30us
- TH0 = 0xe4;
-
- //全局中斷、T0中斷允許
- IE = 0x82;
- //開啟T0定時(shí)器
- TCON = 0x10;
- while(1);
- }
- /* 定時(shí)器0中斷 */
- void timer0() interrupt 1
- {
- /* 按固定時(shí)間間隔調(diào)整PWM大小 */
- // 最初按網(wǎng)上的代碼把PWM動(dòng)態(tài)賦值放到main中,結(jié)果出現(xiàn)丟楨現(xiàn)象,
- // 就是會(huì)出現(xiàn)LED燈亮度漸變過程中突然閃爍一下,在proteus上檢查
- // 波形也能看到不定時(shí)出現(xiàn)跨周期的低電平,相當(dāng)違和,經(jīng)分析,確
- // 認(rèn)問題出在PWM數(shù)值同步上,于是將2者均放在中斷內(nèi),從而實(shí)現(xiàn)了
- // 完美呼吸燈效果。
- if((t % s) == 0)
- {
- PWM = up ? PWM+1 : PWM-1;
- if (PWM == MaxL) up = 0;
- if (PWM == 0) up = 1;
- }
- //PWM輸出
- if(t == PWM)
- {
- led = 1;
- }
- if(t == MaxL)
- {
- t = 0;
- led = 0;
- }
-
- t++;
- }
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|