標(biāo)題: 51單片機(jī)成功產(chǎn)生PWM波的方法 含源代碼 [打印本頁(yè)]

作者: 51hei學(xué)習(xí)技術(shù)中    時(shí)間: 2017-4-4 03:58
標(biāo)題: 51單片機(jī)成功產(chǎn)生PWM波的方法 含源代碼
PWM 是“脈沖寬度調(diào)制”的意思。
PWM 實(shí)際上是在單片機(jī)的某個(gè)引腳輸出一系列的矩形波,其周期一般是固定的;而其高電平、低電平所占用的時(shí)間,是可以受控調(diào)整的。
高電平與周期占用的時(shí)間之比,稱(chēng)為占空比,其值為0~1之間。
PWM 的應(yīng)用很廣,簡(jiǎn)單的說(shuō),它可以控制燈光的亮度、可以控制直流電機(jī)的轉(zhuǎn)速,甚至還可以輸出語(yǔ)音信號(hào)。
新型的單片機(jī),往往都含有硬件的 PWM 模塊,編寫(xiě)程序就很簡(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 條線(xiàn)輸出 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)



作者: 925302604    時(shí)間: 2017-4-4 11:03
看了帖子有點(diǎn)啟發(fā),感謝分享
作者: 淺憶,汐辰!    時(shí)間: 2017-9-27 14:19
能不能把所有的代碼發(fā)給我看看
作者: buck198    時(shí)間: 2018-1-24 19:12
第一次,多謝啦
作者: buck198    時(shí)間: 2018-1-24 20:43
哥,代碼不全啊,附件
作者: Toda    時(shí)間: 2018-3-9 10:39
附件的代碼不全啊

作者: December    時(shí)間: 2018-3-28 15:15
感謝樓主
作者: December    時(shí)間: 2018-4-3 16:56
請(qǐng)問(wèn)為什么我生成的方波是斜的?


作者: hellopp2008    時(shí)間: 2018-6-12 13:30
不錯(cuò)學(xué)習(xí)了呀
作者: 萌木頭    時(shí)間: 2018-7-2 10:56
這b太黑了就差兩行
作者: mhxbyl    時(shí)間: 2018-7-6 19:28
樓主請(qǐng)問(wèn)怎么把占空比的值顯示在液晶屏內(nèi)
作者: mhxbyl    時(shí)間: 2018-7-6 21:28
萌木頭 發(fā)表于 2018-7-2 10:56
這b太黑了就差兩行

就差一黑幣,難受
作者: mhxbyl    時(shí)間: 2018-7-6 22:46
樓主,占空比等級(jí)怎么顯示到1602里?求教。。
作者: mhxbyl    時(shí)間: 2018-7-8 15:28
若改成lcd顯示欲望比什么
作者: 趙逗逗    時(shí)間: 2018-10-31 09:33
看了帖子有點(diǎn)啟發(fā),感謝分享
作者: 套你猴子    時(shí)間: 2018-12-5 09:02
stc89c51
作者: Marlboro    時(shí)間: 2019-1-22 00:15
你好,在仿真電機(jī)在最大的占空時(shí)的速度看起來(lái)有點(diǎn)慢,怎樣可以調(diào)快點(diǎn)

作者: Duo2048    時(shí)間: 2019-4-15 22:16
看看看看,嘿嘿  不錯(cuò)哦
作者: 懶惰的家伙    時(shí)間: 2019-7-8 19:23
請(qǐng)問(wèn)接lcd又該如何接呢

作者: baggio84    時(shí)間: 2019-7-19 11:37
學(xué)習(xí)大神
作者: 249449417@qq.co    時(shí)間: 2019-7-19 14:22
代碼不全,沒(méi)看就損失幾個(gè)幣
作者: zhxc531    時(shí)間: 2019-7-19 22:54
我用STC15的硬件PWM可以做到帶加減速緩沖帶動(dòng)2DM556的驅(qū)動(dòng)2000的細(xì)分空轉(zhuǎn)工作在1000RPM,快還是慢?
作者: 職業(yè)業(yè)余玩家    時(shí)間: 2020-11-22 14:19
感謝樓主,很有啟發(fā)
作者: 了解@    時(shí)間: 2020-12-11 13:26
就這水平,坑我5黑幣,就一個(gè)框架,還不如自己寫(xiě)的
作者: 夏一    時(shí)間: 2020-12-11 19:10
mhxbyl 發(fā)表于 2018-7-6 21:28
就差一黑幣,難受

有幣也是白給的程序包里啥都沒(méi)有
作者: 夏一    時(shí)間: 2020-12-11 19:13
能退幣嗎!最后5個(gè)幣給他收走了
作者: 15802426785    時(shí)間: 2020-12-11 22:06
液晶屏顯示怎么做的啊
作者: gxslxxm    時(shí)間: 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ì)是一樣的東西。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1