久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11170|回復: 2
打印 上一主題 下一主題
收起左側

51單片機兩種定時器方式輸出pwm原理分析與代碼實現

[復制鏈接]
跳轉到指定樓層
樓主
51單片機除了一部分型號可以自帶pwm波輸出,其他型號只有用軟件模擬輸出。而其中一般用定時器中斷的方式來設置。
第一種方式是用兩個相同周期的定時器來產生。
先產生兩個高低數字信號


兩個定時器輸出的信號值不一樣,但其初相相同。若先產生高電平,則后面的輸出全為低電平,同理相反。





如果這樣的話只有兩種輸出結果,要么恒為1要么恒為0沒有什么意義,而我們要實現占空比的話,只有控制其初相。




代碼實現
  1. #include<reg52.h>
  2. sbit abc=P1^3;
  3. void ab(int);
  4. void yanchi(int);
  5. int ac=0;
  6. void main(){
  7. int a=0;
  8. abc=1;
  9. TMOD=0X22;//設置兩個定時器的工作方式16位
  10. EA=1;
  11. while(1){
  12. yanchi(5);
  13. ab(a);
  14. a++;
  15. if(a==100)
  16. a=0;
  17. }

  18. }
  19. void ab(int a){//a為占空比,也就是上面兩個定時器輸出信號的時間差

  20. ET0=0;
  21. TR0=0;
  22. ET1=0;
  23. TR1=0;
  24. abc=1;
  25. TH0=(65536-1100)/256;
  26. TL0=(65536-1100)%256;
  27. TH1=(65536-a*11)/256;
  28. TL1=(65536-a*11)%256;
  29. ET0=1;
  30. TR0=1;
  31. ET1=1;
  32. TR1=1;
  33. }
  34. void T0TIME()interrupt 1
  35. {
  36. abc=1;
  37. TH0=(65536-1100)/256;
  38. TL0=(65536-1100)%256;
  39. }
  40. void T1TIME()interrupt 3
  41. {
  42. abc=0;
  43. TH1=(65536-1100)/256;
  44. TL1=(65536-1100)%256;
  45. }
  46. void yanchi(int a){
  47. int b,c;
  48. for(b=0;b<=a;b++)
  49. for(c=0;c<=110;c++);
  50. }
復制代碼

第二種實現方法只用一個定時器來實現
用一個定時器產生一個確定周期的數字信號,在其中斷程序中進行操作,下面以產生兩路pwm信號來說明。
程序如下
  1. #include<reg52.h>
  2. sbit ja=P1^3;
  3. sbit ja1=P1^4;
  4. void pwmkz(int);
  5. void pwmkz1(int);
  6. void yanchi(int);
  7. int a=0,b=0;
  8. int c=0;
  9. void main(){
  10. int f=0;
  11. TMOD=0x22;
  12. TH0=(65536-11)/256;
  13. TL0=(65536-11)%256;
  14. EA=1;
  15. ET0=1;
  16. TR0=1;
  17. while(1){
  18. f+=5;
  19. if(f==100)
  20. f=0;
  21. pwmkz(f);
  22. yanchi(15);
  23. //pwmkz1(100);

  24. }

  25. }
  26. void pwmkz(int d){
  27. a=d;
  28. }
  29. void pwmkz1(int e){
  30. b=e;
  31. }
  32. void pwmdin()interrupt 1
  33. {
  34.   c++;
  35. TH0=(65536-11)/256;//初值控制中斷周期
  36. TL0=(65536-11)%256;//
  37. if(c==100)//100為控制輸出信號的周期的常量 輸出周期=中斷周期*100(可以改變)
  38. c=0;
  39. if(c<a)//a為第一路的占空比
  40. ja=1;//控制電平
  41. else
  42. ja=0;
  43. if(c<b)//b為第二路占空比
  44. ja1=1;
  45. else
  46. ja1=0;
  47. }
  48. void yanchi(int a){
  49. int b,c;
  50. for(b=0;b<=a;b++)
  51. for(c=0;c<=110;c++);
  52. }
復制代碼

捕獲3.PNG (22.02 KB, 下載次數: 73)

捕獲3.PNG

評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:483579 發表于 2019-5-12 14:17 來自手機 | 只看該作者
謝謝分享。用兩個定時器怎么輸出占空比和頻率可調的pwm波呢?加下q27568737747可以嗎?
回復

使用道具 舉報

板凳
ID:527981 發表于 2019-5-24 22:48 | 只看該作者
寧小小 發表于 2019-5-12 14:17
謝謝分享。用兩個定時器怎么輸出占空比和頻率可調的pwm波呢?加下q27568737747可以嗎?

上面的第二種方式就是兩個同周期定時器,通過控制兩定時器啟動時間差來調節占空比,雖然說理論是這樣,但是上面的代碼總是不能輸出正確的pwm波,這個問題我也是很疑惑,你想產生pwm波的話,還是建議采用一個定時器來輸出。
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产乱码精品1区2区3区 | 亚洲精品一区二区三区丝袜 | 亚洲国产一区二区三区在线观看 | 精品国产久 | 国产精品永久免费观看 | 请别相信他免费喜剧电影在线观看 | 成人av高清在线观看 | 亚洲欧洲视频 | 国产高清一区二区三区 | 亚洲五码在线 | 欧美日韩高清在线观看 | 久久久久成人精品亚洲国产 | 国产福利久久 | 日本一区二区高清不卡 | 欧美激情国产精品 | 精品视频免费在线 | 欧美日韩电影免费观看 | 黄色免费观看网站 | 伊人影院在线观看 | 久久高清 | 国产成人综合一区二区三区 | 九九久久免费视频 | av黄色在线| 在线播放亚洲 | 国产激情网站 | 久久99精品久久久久久秒播九色 | 国产福利在线视频 | 爱爱免费视频 | 久久国产成人 | 色综合久| 久久精品欧美视频 | 久久久国| 欧美日韩国产精品 | 精品国产乱码久久久久久牛牛 | 国产三级一区二区三区 | 成人av在线播放 | 日本一区二区三区在线观看 | 理论片87福利理论电影 | 日韩国产中文字幕 | 91精品国产91综合久久蜜臀 | 成人亚洲性情网站www在线观看 |