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

QQ登錄

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

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

51單片機(jī)PWM精確輸出按鍵可調(diào)輸出周期占空比1602顯示程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:455286 發(fā)表于 2018-12-26 23:59 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
51PWM精確輸出按鍵可調(diào)輸出周期占空比,誤差可以達(dá)到零點(diǎn)幾以內(nèi)。1602顯示當(dāng)前輸出PWM周期占空比。

單片機(jī)源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>       
  3. #include "lcd.h"
  4. unsigned char code ASCII[10] =    {'0','1','2','3','4','5','6','7','8','9'};
  5. unsigned char period[]="Period:";
  6. unsigned char high[]="Duty:";
  7. unsigned char disbuff[10];
  8. unsigned int peri =1000;
  9. unsigned int value=600; //初始占空比為60% 周期為1ms
  10. sbit PWM=P2^1; //PWM輸出口
  11. sbit K1=P1^0; //占空比增加鍵
  12. sbit K2=P1^1; //占空比減小鍵
  13. sbit K3=P1^2; //周期增加鍵
  14. sbit K4=P1^3; //周期減小鍵

  15. void TimerInit()
  16. {
  17.         TMOD=0X11;

  18.         TH0 = (unsigned int)(65536-peri)/256;
  19.         TL0 = (unsigned int)(65536-peri)%256;     //1ms周期

  20.         TH1 = (unsigned int)(65536-value)/256;
  21.         TL1 = (unsigned int)(65536-value)%256;     //600us高電平時(shí)間
  22.                
  23.         ET0=1;//打開(kāi)定時(shí)器0中斷允許
  24.         ET1=1;

  25.         TR0=1;//打開(kāi)定時(shí)器
  26.         TR1=0;//打開(kāi)定時(shí)器       
  27.        
  28.         EA=1;//打開(kāi)總中斷               
  29. }

  30. void delay(unsigned int i)
  31. {
  32.         while(i--);
  33. }
  34. void Key_Scan()
  35. {
  36. if(K1==0)
  37.         {
  38.                 delay(1000);
  39.                 if(K1==0)
  40.                 {
  41.                         value+=20;        //占空比增加
  42.                         if(value>=peri)
  43.                         {
  44.                                 value=peri;
  45.                         }
  46.                 }
  47.                 while(!K1);
  48.         }
  49. if(K2==0)
  50.         {
  51.                 delay(1000);
  52.                 if(K2==0)
  53.                 {
  54.                         value-=20;        //占空比減小
  55.                         if(value<=0)
  56.                         {
  57.                                
  58.                                 value=0;
  59.                         }
  60.                 }
  61.                 while(!K2);
  62.         }
  63. if(K3==0)
  64.         {
  65.                 delay(1000);
  66.                 if(K3==0)
  67.                 {
  68.                         peri+=100;//周期增加100us       
  69.                 }
  70.                 while(!K3);
  71.         }
  72. if(K4==0)
  73.         {
  74.                 delay(1000);
  75.                 if(K4==0)
  76.                 {
  77.                         peri-=100;        //周期減小100us
  78.                 }
  79.                 while(!K4);
  80.         }
  81.        
  82. }
  83.                          
  84. void main(void)
  85. {


  86.         InitLcd1602();       
  87.    TimerInit();
  88.        
  89.         while(1)
  90.         {
  91.                         int zhanbi;
  92.                         Key_Scan();
  93.       LcdShowStr(0,0,period);          //顯示周期         
  94.       LcdShowStr(0,1,high);          //顯示占空比

  95.       disbuff[0]=peri/10000;
  96.       disbuff[1]=peri%10000/1000;
  97.       disbuff[2]=peri%1000/100;
  98.                         disbuff[3]=peri%100/10;
  99.                         disbuff[4]=peri%10;

  100.                 DisplayOneChar(7,0,ASCII[disbuff[0]]);                  
  101.                 DisplayOneChar(8,0,ASCII[disbuff[1]]);
  102.                 DisplayOneChar(9,0,ASCII[disbuff[2]]);
  103.                 DisplayOneChar(10,0,ASCII[disbuff[3]]);
  104.                 DisplayOneChar(11,0,ASCII[disbuff[4]]);

  105.                 DisplayOneChar(12,0,'u');
  106.                 DisplayOneChar(13,0,'s');

  107.                 zhanbi=(value/10*100)/(peri/10);
  108.                 disbuff[0]=zhanbi/10;
  109.                 disbuff[1]=zhanbi%10;
  110.                 DisplayOneChar(7,1,ASCII[disbuff[0]]);
  111.                 DisplayOneChar(8,1,ASCII[disbuff[1]]);
  112.                 DisplayOneChar(9,1,'%');


  113.         }
  114. }       

  115. void Time0(void) interrupt 1   
  116. {
  117.         TH0 = (unsigned int)(65536-peri+30)/256;  //加30彌補(bǔ)中斷事件,具體可通過(guò)調(diào)節(jié)數(shù)值達(dá)到彌補(bǔ)效果
  118.         TL0 = (unsigned int)(65536-peri+30)%256;   //通過(guò)改變peri改變周期大小
  119.         PWM=1;
  120.         TR1=1;

  121. }               

  122. void Time1(void) interrupt 3   
  123. {
  124.         TH1 = (unsigned int)(65536-value+20)/256;         //加20彌補(bǔ)中斷事件,具體可通過(guò)調(diào)節(jié)數(shù)值達(dá)到彌補(bǔ)效果
  125.         TL1 = (unsigned int)(65536-value+20)%256;   //通過(guò)改變value改變占空比
  126.         PWM=0;
  127.         TR1=0;
  128. }       
  129. //經(jīng)示波器測(cè)定占空比誤差百分之一左右通過(guò)自己調(diào)節(jié)彌補(bǔ)值大小可以達(dá)到誤差百分之零點(diǎn)五以下
復(fù)制代碼

所有資料51hei提供下載:
PWM輸出修改版.zip (55.03 KB, 下載次數(shù): 195)



評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏11 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:156220 發(fā)表于 2018-12-27 09:06 | 只看該作者
謝謝樓主的分享,學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

板凳
ID:456168 發(fā)表于 2018-12-27 10:17 | 只看該作者
可以外部產(chǎn)生方波 單片機(jī)解析并控制電機(jī)正反轉(zhuǎn)嗎
回復(fù)

使用道具 舉報(bào)

地板
ID:456168 發(fā)表于 2018-12-27 10:18 | 只看該作者
可以用NE555電路產(chǎn)生方波給單片機(jī)控制電機(jī)轉(zhuǎn)動(dòng)嗎?
回復(fù)

使用道具 舉報(bào)

5#
ID:449566 發(fā)表于 2018-12-30 11:24 | 只看該作者
Melbourne 發(fā)表于 2018-12-27 10:18
可以用NE555電路產(chǎn)生方波給單片機(jī)控制電機(jī)轉(zhuǎn)動(dòng)嗎?

這樣得不償失,為什么不直接用單片機(jī)來(lái)控制?
回復(fù)

使用道具 舉報(bào)

6#
ID:604927 發(fā)表于 2019-8-28 22:10 | 只看該作者
哪位能下載的,可以發(fā)給我一份嗎,謝謝。黑幣不夠了,我的郵箱3211131912@qq.com
回復(fù)

使用道具 舉報(bào)

7#
ID:604927 發(fā)表于 2019-8-31 20:55 | 只看該作者
求一下電路圖,順便問(wèn)一下,按照程序里的引腳定義接線后,下載程序后,為什么沒(méi)有輸出
回復(fù)

使用道具 舉報(bào)

8#
ID:744346 發(fā)表于 2020-5-23 15:59 | 只看該作者
學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

9#
ID:1040396 發(fā)表于 2022-7-26 00:02 | 只看該作者
很好。 這個(gè)代碼可以用ADC采集過(guò)來(lái)的變量控制空占比。 實(shí)現(xiàn)自動(dòng)調(diào)速。感謝
回復(fù)

使用道具 舉報(bào)

10#
ID:841708 發(fā)表于 2022-7-27 13:41 | 只看該作者
main函數(shù)下初始化里少了這個(gè)代碼導(dǎo)致1602不顯示

        P1 &= 0xf0;                                        //屏蔽低四位

加上數(shù)碼管就顯示了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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