找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 27845|回復(fù): 27
收起左側(cè)

51單片機(jī)成功產(chǎn)生PWM波的方法 含源代碼

  [復(fù)制鏈接]
ID:140725 發(fā)表于 2017-4-4 03:58 | 顯示全部樓層 |閱讀模式
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ā)生變化。

電路以及仿真效果如下圖:
0.png 0.png


//程序如下:
  1.     #include<reg52.h>
  2.     unsigned int a, b;
  3.     //------------------------------------------
  4.     void main()
  5.     {
  6.              TMOD = 0x01;                 //T0定時方式1
  7.              TH0 = (65536-50000) / 256;   //50ms@12MHz
  8.              TL0 = (65536-50000) % 256;
  9.              TR0 = 1;

  10.              ET0 = 1;
  11.              EX0 = 1; EX1 = 1;
  12.              IT0 = 1; IT1 = 1;
  13.              EA = 1;

  14.              a = 0;
  15.              b = 10;
  16.              while(1);
  17.     }
  18.     //------------------------------------------
  19.     void time0() interrupt 1
  20.     {
  21.              TL0 = (65536-50000) % 256;
  22.              TH0 = (65536-50000) / 256;   //50ms@12MHz
  23.              a++;
  24.              if(a == 20) a = 0;           //在這里調(diào)整周期.
  25.              if(a < b) P2 = 0xff;        //在這里調(diào)整占空比.
  26.              else   P2 = 0x00;
  27.              P0 = ((b / 10) << 4) + b % 10; //顯示占空比等級
  28.     }
  29.     //------------------------------------------
  30.     void X0_INT() interrupt 0
  31.     {
  32.              b++;
  33.              if(b > 19) b = 19;           //占空比等級最大為19
  34.     }
  35.     //------------------------------------------
  36.     void X1_INT() interrupt 2
  37.     {
  38.              b--;
  39.              if(b < 1) b = 1;             //占空比等級最小為1.
  40.     }
復(fù)制代碼

以上代碼下載:
代碼.rar (516 Bytes, 下載次數(shù): 401)


評分

參與人數(shù) 1黑幣 +1 收起 理由
siya42 + 1 淡定

查看全部評分

相關(guān)帖子

回復(fù)

使用道具 舉報

ID:185968 發(fā)表于 2017-4-4 11:03 | 顯示全部樓層
看了帖子有點啟發(fā),感謝分享
回復(fù)

使用道具 舉報

ID:225076 發(fā)表于 2017-9-27 14:19 | 顯示全部樓層
能不能把所有的代碼發(fā)給我看看
回復(fù)

使用道具 舉報

ID:267046 發(fā)表于 2018-1-24 19:12 | 顯示全部樓層
第一次,多謝啦
回復(fù)

使用道具 舉報

ID:267046 發(fā)表于 2018-1-24 20:43 | 顯示全部樓層
哥,代碼不全啊,附件
回復(fù)

使用道具 舉報

ID:272695 發(fā)表于 2018-3-9 10:39 | 顯示全部樓層
附件的代碼不全啊
回復(fù)

使用道具 舉報

ID:254356 發(fā)表于 2018-3-28 15:15 | 顯示全部樓層
感謝樓主
回復(fù)

使用道具 舉報

ID:254356 發(fā)表于 2018-4-3 16:56 | 顯示全部樓層
請問為什么我生成的方波是斜的?

回復(fù)

使用道具 舉報

ID:350208 發(fā)表于 2018-6-12 13:30 | 顯示全部樓層
不錯學(xué)習(xí)了呀
回復(fù)

使用道具 舉報

ID:258628 發(fā)表于 2018-7-2 10:56 | 顯示全部樓層
這b太黑了就差兩行
回復(fù)

使用道具 舉報

ID:366460 發(fā)表于 2018-7-6 19:28 來自觸屏版 | 顯示全部樓層
樓主請問怎么把占空比的值顯示在液晶屏內(nèi)
回復(fù)

使用道具 舉報

ID:366460 發(fā)表于 2018-7-6 21:28 來自觸屏版 | 顯示全部樓層
萌木頭 發(fā)表于 2018-7-2 10:56
這b太黑了就差兩行

就差一黑幣,難受
回復(fù)

使用道具 舉報

ID:366460 發(fā)表于 2018-7-6 22:46 來自觸屏版 | 顯示全部樓層
樓主,占空比等級怎么顯示到1602里?求教。。
回復(fù)

使用道具 舉報

ID:366460 發(fā)表于 2018-7-8 15:28 來自觸屏版 | 顯示全部樓層
若改成lcd顯示欲望比什么
回復(fù)

使用道具 舉報

ID:410024 發(fā)表于 2018-10-31 09:33 | 顯示全部樓層
看了帖子有點啟發(fā),感謝分享
回復(fù)

使用道具 舉報

ID:439757 發(fā)表于 2018-12-5 09:02 | 顯示全部樓層
stc89c51
回復(fù)

使用道具 舉報

ID:433613 發(fā)表于 2019-1-22 00:15 | 顯示全部樓層
你好,在仿真電機(jī)在最大的占空時的速度看起來有點慢,怎樣可以調(diào)快點
回復(fù)

使用道具 舉報

ID:297735 發(fā)表于 2019-4-15 22:16 | 顯示全部樓層
看看看看,嘿嘿  不錯哦
回復(fù)

使用道具 舉報

ID:578183 發(fā)表于 2019-7-8 19:23 | 顯示全部樓層
請問接lcd又該如何接呢
回復(fù)

使用道具 舉報

ID:586798 發(fā)表于 2019-7-19 11:37 | 顯示全部樓層
學(xué)習(xí)大神
回復(fù)

使用道具 舉報

ID:444215 發(fā)表于 2019-7-19 14:22 | 顯示全部樓層
代碼不全,沒看就損失幾個幣
回復(fù)

使用道具 舉報

ID:575976 發(fā)表于 2019-7-19 22:54 | 顯示全部樓層
我用STC15的硬件PWM可以做到帶加減速緩沖帶動2DM556的驅(qū)動2000的細(xì)分空轉(zhuǎn)工作在1000RPM,快還是慢啊?
回復(fù)

使用道具 舉報

ID:847157 發(fā)表于 2020-11-22 14:19 | 顯示全部樓層
感謝樓主,很有啟發(fā)
回復(fù)

使用道具 舉報

ID:851585 發(fā)表于 2020-12-11 13:26 | 顯示全部樓層
就這水平,坑我5黑幣,就一個框架,還不如自己寫的
回復(fù)

使用道具 舉報

ID:432653 發(fā)表于 2020-12-11 19:10 | 顯示全部樓層
mhxbyl 發(fā)表于 2018-7-6 21:28
就差一黑幣,難受

有幣也是白給的程序包里啥都沒有
回復(fù)

使用道具 舉報

ID:432653 發(fā)表于 2020-12-11 19:13 | 顯示全部樓層
能退幣嗎!最后5個幣給他收走了
回復(fù)

使用道具 舉報

ID:745698 發(fā)表于 2020-12-11 22:06 來自觸屏版 | 顯示全部樓層
液晶屏顯示怎么做的啊
回復(fù)

使用道具 舉報

ID:162664 發(fā)表于 2020-12-12 08:55 | 顯示全部樓層
額 想法是好的。這種事情我也做過,但是后邊很少做這種事情,原因下邊解釋。
凡是利用定時器io口翻轉(zhuǎn)的方式實現(xiàn)了PWM,頻率越高,頻繁的中斷會占用alu。
如果框架搭的不好,可能會有一定的影響。真的除非是你真的只用單片機(jī)實現(xiàn)一個功能。
想法有兩種。
1。短時間的定時器,中斷時間是 100us,甚至更短,中斷一個周期計數(shù),一個占空比計數(shù)。
2。調(diào)整中斷時間,也就是定時器,code主體中,調(diào)整進(jìn)入中斷的時間。
無論是怎么樣,只要是用定時器中斷做的pwm。理解之后code怎么實現(xiàn)是看個人的編程習(xí)慣,但是本質(zhì)是一樣的東西。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表