找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 27935|回復(fù): 27
打印 上一主題 下一主題
收起左側(cè)

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

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
PWM 是“脈沖寬度調(diào)制”的意思。
PWM 實(shí)際上是在單片機(jī)的某個(gè)引腳輸出一系列的矩形波,其周期一般是固定的;而其高電平、低電平所占用的時(shí)間,是可以受控調(diào)整的。
高電平與周期占用的時(shí)間之比,稱為占空比,其值為0~1之間。
PWM 的應(yīng)用很廣,簡(jiǎn)單的說(shuō),它可以控制燈光的亮度、可以控制直流電機(jī)的轉(zhuǎn)速,甚至還可以輸出語(yǔ)音信號(hào)。
新型的單片機(jī),往往都含有硬件的 PWM 模塊,編寫程序就很簡(jiǎn)單;而老式的MCS-51系列,就不具備這個(gè)條件。
其實(shí),在沒(méi)有 PWM 硬件的單片機(jī)上實(shí)現(xiàn) PWM,也并不難,只需一個(gè)定時(shí)器,令其工作在中斷方式即可。

題目:AT89C52單片機(jī)輸出可調(diào) PWM 波。
要求:
1。單片機(jī)的晶振是12MHz,輸出周期為1s。
2。用兩個(gè)開(kāi)關(guān)控制占空比的增加和減少,分20等級(jí)。
針對(duì)這個(gè)題目,做而論道設(shè)計(jì)了一個(gè)簡(jiǎn)單的實(shí)驗(yàn)電路:
 在 P2 口的 8 條線輸出 PWM 波形;
 在 /INT1、/INT0 外接了兩個(gè)按鍵,用來(lái)調(diào)整占空比;
 在 P0 口外接了兩個(gè) BCD 數(shù)碼顯示器,用來(lái)顯示當(dāng)前的占空比的等級(jí)。
 實(shí)驗(yàn)的時(shí)候,可以使用示波器來(lái)觀察 P2 口輸出的波形。
 如果把 PWM 波形的頻率提高,也可以用 LED 觀察到漸亮漸暗的效果,目前看,只是閃爍的時(shí)間發(fā)生變化。

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



//程序如下:
  1.     #include<reg52.h>
  2.     unsigned int a, b;
  3.     //------------------------------------------
  4.     void main()
  5.     {
  6.              TMOD = 0x01;                 //T0定時(shí)方式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; //顯示占空比等級(jí)
  28.     }
  29.     //------------------------------------------
  30.     void X0_INT() interrupt 0
  31.     {
  32.              b++;
  33.              if(b > 19) b = 19;           //占空比等級(jí)最大為19
  34.     }
  35.     //------------------------------------------
  36.     void X1_INT() interrupt 2
  37.     {
  38.              b--;
  39.              if(b < 1) b = 1;             //占空比等級(jí)最小為1.
  40.     }
復(fù)制代碼

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


評(píng)分

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

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏10 分享淘帖 頂3 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:185968 發(fā)表于 2017-4-4 11:03 | 只看該作者
看了帖子有點(diǎn)啟發(fā),感謝分享
回復(fù)

使用道具 舉報(bào)

板凳
ID:225076 發(fā)表于 2017-9-27 14:19 | 只看該作者
能不能把所有的代碼發(fā)給我看看
回復(fù)

使用道具 舉報(bào)

地板
ID:267046 發(fā)表于 2018-1-24 19:12 | 只看該作者
第一次,多謝啦
回復(fù)

使用道具 舉報(bào)

5#
ID:267046 發(fā)表于 2018-1-24 20:43 | 只看該作者
哥,代碼不全啊,附件
回復(fù)

使用道具 舉報(bào)

6#
ID:272695 發(fā)表于 2018-3-9 10:39 | 只看該作者
附件的代碼不全啊
回復(fù)

使用道具 舉報(bào)

7#
ID:254356 發(fā)表于 2018-3-28 15:15 | 只看該作者
感謝樓主
回復(fù)

使用道具 舉報(bào)

8#
ID:254356 發(fā)表于 2018-4-3 16:56 | 只看該作者
請(qǐng)問(wèn)為什么我生成的方波是斜的?

回復(fù)

使用道具 舉報(bào)

9#
ID:350208 發(fā)表于 2018-6-12 13:30 | 只看該作者
不錯(cuò)學(xué)習(xí)了呀
回復(fù)

使用道具 舉報(bào)

10#
ID:258628 發(fā)表于 2018-7-2 10:56 | 只看該作者
這b太黑了就差兩行
回復(fù)

使用道具 舉報(bào)

11#
ID:366460 發(fā)表于 2018-7-6 19:28 來(lái)自觸屏版 | 只看該作者
樓主請(qǐng)問(wèn)怎么把占空比的值顯示在液晶屏內(nèi)
回復(fù)

使用道具 舉報(bào)

12#
ID:366460 發(fā)表于 2018-7-6 21:28 來(lái)自觸屏版 | 只看該作者
萌木頭 發(fā)表于 2018-7-2 10:56
這b太黑了就差兩行

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

使用道具 舉報(bào)

13#
ID:366460 發(fā)表于 2018-7-6 22:46 來(lái)自觸屏版 | 只看該作者
樓主,占空比等級(jí)怎么顯示到1602里?求教。。
回復(fù)

使用道具 舉報(bào)

14#
ID:366460 發(fā)表于 2018-7-8 15:28 來(lái)自觸屏版 | 只看該作者
若改成lcd顯示欲望比什么
回復(fù)

使用道具 舉報(bào)

15#
ID:410024 發(fā)表于 2018-10-31 09:33 | 只看該作者
看了帖子有點(diǎn)啟發(fā),感謝分享
回復(fù)

使用道具 舉報(bào)

16#
ID:439757 發(fā)表于 2018-12-5 09:02 | 只看該作者
stc89c51
回復(fù)

使用道具 舉報(bào)

17#
ID:433613 發(fā)表于 2019-1-22 00:15 | 只看該作者
你好,在仿真電機(jī)在最大的占空時(shí)的速度看起來(lái)有點(diǎn)慢,怎樣可以調(diào)快點(diǎn)
回復(fù)

使用道具 舉報(bào)

18#
ID:297735 發(fā)表于 2019-4-15 22:16 | 只看該作者
看看看看,嘿嘿  不錯(cuò)哦
回復(fù)

使用道具 舉報(bào)

19#
ID:578183 發(fā)表于 2019-7-8 19:23 | 只看該作者
請(qǐng)問(wèn)接lcd又該如何接呢
回復(fù)

使用道具 舉報(bào)

20#
ID:586798 發(fā)表于 2019-7-19 11:37 | 只看該作者
學(xué)習(xí)大神
回復(fù)

使用道具 舉報(bào)

21#
ID:444215 發(fā)表于 2019-7-19 14:22 | 只看該作者
代碼不全,沒(méi)看就損失幾個(gè)幣
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

23#
ID:847157 發(fā)表于 2020-11-22 14:19 | 只看該作者
感謝樓主,很有啟發(fā)
回復(fù)

使用道具 舉報(bào)

24#
ID:851585 發(fā)表于 2020-12-11 13:26 | 只看該作者
就這水平,坑我5黑幣,就一個(gè)框架,還不如自己寫的
回復(fù)

使用道具 舉報(bào)

25#
ID:432653 發(fā)表于 2020-12-11 19:10 | 只看該作者
mhxbyl 發(fā)表于 2018-7-6 21:28
就差一黑幣,難受

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

使用道具 舉報(bào)

26#
ID:432653 發(fā)表于 2020-12-11 19:13 | 只看該作者
能退幣嗎!最后5個(gè)幣給他收走了
回復(fù)

使用道具 舉報(bào)

27#
ID:745698 發(fā)表于 2020-12-11 22:06 來(lái)自觸屏版 | 只看該作者
液晶屏顯示怎么做的啊
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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