|
PWM 是“脈沖寬度調(diào)制”的意思。
PWM 實際上是在單片機(jī)的某個引腳輸出一系列的矩形波,其周期一般是固定的;而其高電平、低電平所占用的時間,是可以受控調(diào)整的。
高電平與周期占用的時間之比,稱為占空比,其值為0~1之間。
PWM 的應(yīng)用很廣,簡單的說,它可以控制燈光的亮度、可以控制直流電機(jī)的轉(zhuǎn)速,甚至還可以輸出語音信號。
新型的單片機(jī),往往都含有硬件的 PWM 模塊,編寫程序就很簡單;而老式的MCS-51系列,就不具備這個條件。
其實,在沒有 PWM 硬件的單片機(jī)上實現(xiàn) PWM,也并不難,只需一個定時器,令其工作在中斷方式即可。
題目:AT89C52單片機(jī)輸出可調(diào) PWM 波。
要求:
1。單片機(jī)的晶振是12MHz,輸出周期為1s。
2。用兩個開關(guān)控制占空比的增加和減少,分20等級。
針對這個題目,做而論道設(shè)計了一個簡單的實驗電路:
在 P2 口的 8 條線輸出 PWM 波形;
在 /INT1、/INT0 外接了兩個按鍵,用來調(diào)整占空比;
在 P0 口外接了兩個 BCD 數(shù)碼顯示器,用來顯示當(dāng)前的占空比的等級。
實驗的時候,可以使用示波器來觀察 P2 口輸出的波形。
如果把 PWM 波形的頻率提高,也可以用 LED 觀察到漸亮漸暗的效果,目前看,只是閃爍的時間發(fā)生變化。
電路以及仿真效果如下圖:
//程序如下:
- #include<reg52.h>
- unsigned int a, b;
- //------------------------------------------
- void main()
- {
- TMOD = 0x01; //T0定時方式1
- TH0 = (65536-50000) / 256; //50ms@12MHz
- TL0 = (65536-50000) % 256;
- TR0 = 1;
- ET0 = 1;
- EX0 = 1; EX1 = 1;
- IT0 = 1; IT1 = 1;
- EA = 1;
- a = 0;
- b = 10;
- while(1);
- }
- //------------------------------------------
- void time0() interrupt 1
- {
- TL0 = (65536-50000) % 256;
- TH0 = (65536-50000) / 256; //50ms@12MHz
- a++;
- if(a == 20) a = 0; //在這里調(diào)整周期.
- if(a < b) P2 = 0xff; //在這里調(diào)整占空比.
- else P2 = 0x00;
- P0 = ((b / 10) << 4) + b % 10; //顯示占空比等級
- }
- //------------------------------------------
- void X0_INT() interrupt 0
- {
- b++;
- if(b > 19) b = 19; //占空比等級最大為19
- }
- //------------------------------------------
- void X1_INT() interrupt 2
- {
- b--;
- if(b < 1) b = 1; //占空比等級最小為1.
- }
復(fù)制代碼
以上代碼下載:
代碼.rar
(516 Bytes, 下載次數(shù): 401)
2017-4-4 03:57 上傳
點擊文件名下載附件
|
評分
-
查看全部評分
|