找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 925|回复: 0
打印 上一主题 下一主题
收起左侧

单片机pwm设计案例

[复制链接]
跳转到指定楼层
楼主
ID:991158 发表于 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. /************函数声明**************/
  10. void delayxms(uint z); //延时
  11. void Motor_add();          //电机加速,即增加占空比
  12. void Motor_dec();           //电机减速,即减少占空比
  13. void timer0_init();                //定时器0初始化

  14. /*********主函数********************/
  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); //此处时间不能太长,否者会的中断产生冲突
  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);//此处时间不能太长,否者会的中断产生冲突
  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空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表