找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機pwm設計案例

[復制鏈接]
跳轉到指定樓層
樓主
ID:991158 發(fā)表于 2021-12-12 11:23 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. #include<reg51.h>


  2. #define uint unsigned int
  3. #define uchar unsigned char                                                         

  4. uchar time;
  5. double count=26;        //定義占空比,并初始占空比為26%
  6. sbit PWM=P2^0;      //P2^0口輸出PWM
  7. sbit key_add=P3^4;   //電機加速的按鍵 的I/O口
  8. sbit key_dec=P3^5;   //電機減速的按鍵 的I/O口


  9. /************函數(shù)聲明**************/
  10. void delayxms(uint z); //延時
  11. void Motor_add();          //電機加速,即增加占空比
  12. void Motor_dec();           //電機減速,即減少占空比
  13. void timer0_init();                //定時器0初始化

  14. /*********主函數(shù)********************/
  15. void main()
  16. {         
  17.         timer0_init();
  18.         delayxms(5);
  19.         while(1)
  20.         {
  21.          Motor_add();
  22.          Motor_dec();
  23.         }
  24. }

  25. /****************延時處理**********************/
  26. void delayxms(uint z) //延時xms程序
  27. {
  28.     uint x,y;
  29.         for(y=z;x>0;x--)
  30.                 for(y=110;y>0;y--);
  31. }


  32. void Motor_add()  //電機加速
  33. {
  34.   if(key_add==0)
  35.   {
  36.           delayxms(2); //此處時間不能太長,否者會的中斷產(chǎn)生沖突
  37.   if(key_add==0)
  38.   {
  39.           count+=0.5;        //每按一次加速按鍵占空比加0.5
  40.    if(count>=32)            //限定占空比上限
  41.         {
  42.          count=32;
  43.         }
  44.   }
  45.         while(!key_add);
  46.   }
  47. }

  48. void Motor_dec()//電機減速
  49. {
  50. if(key_dec==0)
  51. {
  52.   delayxms(2);//此處時間不能太長,否者會的中斷產(chǎn)生沖突
  53.   if(key_dec==0)
  54.   {
  55.           count-=0.5;                 //每按一次減速按鍵占空比減0.5
  56.    if(count<=25)    //限定占空比下限
  57.    {
  58.         count=25;
  59.    }
  60.   }
  61.         while(!key_dec);
  62.    }
  63. }

  64. /***********定時器0初始化***********/
  65. void timer0_init()
  66. {
  67.   TMOD=0x01; //定時器0工作于方式1
  68.   TH0=(65536-10)/256;
  69.   TL0=(65536-10)%256;
  70.   TR0=1;
  71.   ET0=1;
  72.   EA=1;
  73. }

  74. /**************定時0中斷處理******************/
  75. void timer0_int() interrupt 1
  76. {
  77.         
  78.   TR0=0;    //設置定時器初值期間,關閉定時器
  79.   TH0=(65536-10)/256;
  80.   TL0=(65536-10)%256;
  81.   TR0=1;
  82.          
  83.   time++;
  84.   if(time<count)          //count為占空比
  85.   {
  86.         PWM=1;           //輸出高電平
  87.   }
  88.   else
  89.         PWM=0;        
  90.   if(time>=100)
  91.   {
  92.         time=0;
  93.   }
  94. }
復制代碼


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

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表