PWM 是“脈沖寬度調制”的意思。
PWM 實際上是在單片機的某個引腳輸出一系列的矩形波,其周期一般是固定的;而其高電平、低電平所占用的時間,是可以受控調整的。
高電平與周期占用的時間之比,稱為占空比,其值為0~1之間。
PWM 的應用很廣,簡單的說,它可以控制燈光的亮度、可以控制直流電機的轉速,甚至還可以輸出語音信號。
新型的單片機,往往都含有硬件的 PWM 模塊,編寫程序就很簡單;而老式的MCS-51系列,就不具備這個條件。
其實,在沒有 PWM 硬件的單片機上實現 PWM,也并不難,只需一個定時器,令其工作在中斷方式即可。
題目:AT89C52單片機輸出可調 PWM 波。
要求:
1。單片機的晶振是12MHz,輸出周期為1s。
2。用兩個開關控制占空比的增加和減少,分20等級。
針對這個題目,做而論道設計了一個簡單的實驗電路:
在 P2 口的 8 條線輸出 PWM 波形;
在 /INT1、/INT0 外接了兩個按鍵,用來調整占空比;
在 P0 口外接了兩個 BCD 數碼顯示器,用來顯示當前的占空比的等級。
實驗的時候,可以使用示波器來觀察 P2 口輸出的波形。
如果把 PWM 波形的頻率提高,也可以用 LED 觀察到漸亮漸暗的效果,目前看,只是閃爍的時間發生變化。
電路以及仿真效果如下圖:
0.png (142.85 KB, 下載次數: 163)
下載附件
2017-4-4 03:56 上傳
0.png (203.64 KB, 下載次數: 144)
下載附件
2017-4-4 03:56 上傳
//程序如下:
- #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; //在這里調整周期.
- if(a < b) P2 = 0xff; //在這里調整占空比.
- 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.
- }
復制代碼
以上代碼下載:
代碼.rar
(516 Bytes, 下載次數: 401)
2017-4-4 03:57 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|