標(biāo)題: 單片機(jī)pwm設(shè)計(jì)案例 [打印本頁(yè)]

作者: 不叫什么1212    時(shí)間: 2021-12-12 11:23
標(biāo)題: 單片機(jī)pwm設(shè)計(jì)案例
  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;   //電機(jī)加速的按鍵 的I/O口
  8. sbit key_dec=P3^5;   //電機(jī)減速的按鍵 的I/O口


  9. /************函數(shù)聲明**************/
  10. void delayxms(uint z); //延時(shí)
  11. void Motor_add();          //電機(jī)加速,即增加占空比
  12. void Motor_dec();           //電機(jī)減速,即減少占空比
  13. void timer0_init();                //定時(shí)器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. /****************延時(shí)處理**********************/
  26. void delayxms(uint z) //延時(shí)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()  //電機(jī)加速
  33. {
  34.   if(key_add==0)
  35.   {
  36.           delayxms(2); //此處時(shí)間不能太長(zhǎng),否者會(huì)的中斷產(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()//電機(jī)減速
  49. {
  50. if(key_dec==0)
  51. {
  52.   delayxms(2);//此處時(shí)間不能太長(zhǎng),否者會(huì)的中斷產(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. /***********定時(shí)器0初始化***********/
  65. void timer0_init()
  66. {
  67.   TMOD=0x01; //定時(shí)器0工作于方式1
  68.   TH0=(65536-10)/256;
  69.   TL0=(65536-10)%256;
  70.   TR0=1;
  71.   ET0=1;
  72.   EA=1;
  73. }

  74. /**************定時(shí)0中斷處理******************/
  75. void timer0_int() interrupt 1
  76. {
  77.         
  78.   TR0=0;    //設(shè)置定時(shí)器初值期間,關(guān)閉定時(shí)器
  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. }
復(fù)制代碼







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