找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3635|回复: 2
收起左侧

单片机pwm按键输出

[复制链接]
ID:358700 发表于 2018-7-15 19:19 | 显示全部楼层 |阅读模式
放暑假无聊就写了个给一个学弟学习,也适合新手
每一行都有代码注释
  1. #include<reg51.h>                                  //定义单片机库函数      


  2. #define uint unsigned int                    //定义无符号整形
  3. #define uchar unsigned char                        //定义无符号字节型                                 


  4. uchar time;                   //计算中间变量
  5. double count=20;        //定义占空比,并初始占空比为20%
  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 pwm_add();          //pwm加,即增加占空比
  12. void pwm_dec();           //pwm减,即减少占空比
  13. void timer0_init();                //定时器0初始化


  14. /*********主函数********************/
  15. void main()
  16. {         
  17.         timer0_init();           //定时器初始化
  18.         delayxms(5);        //延时
  19.         while(1)
  20.         {         pwm_add();           //pwm加
  21.              pwm_dec();           //pwm减
  22.         }
  23. }


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


  31. /****************pwm加**********************/
  32. void pwm_add()  //电机加速
  33. {
  34.   if(key_add==0)
  35.   {
  36.           delayxms(2); //此处时间不能太长,否者会的中断产生冲突
  37.   if(key_add==0)
  38.   {
  39.           count+=5;        //每按一次加速按键占空比加0.5
  40.    if(count>=100)            //限定占空比上限
  41.         {
  42.          count=100;
  43.         }
  44.   }
  45.         while(!key_add);  //松手检测
  46.   }
  47. }
  48. /****************pwm减**********************/
  49. void pwm_dec()//电机减速
  50. {
  51. if(key_dec==0)
  52. {
  53.   delayxms(2);//此处时间不能太长,否者会的中断产生冲突
  54.   if(key_dec==0)
  55.   {
  56.           count-=5;                 //每按一次减速按键占空比减0.5
  57.    if(count<=0)    //限定占空比下限
  58.    {
  59.         count=0;
  60.    }
  61.   }
  62.         while(!key_dec);//松手检测
  63.    }
  64. }


  65. /***********定时器0初始化***********/
  66. void timer0_init()
  67. {
  68.   TMOD=0x01; //定时器0工作于方式1
  69.   TH0=(65536-200)/256;                //设置100hz
  70.   TL0=(65536-200)%256;
  71.   TR0=1;                                         //打开定时器0
  72.   ET0=1;                                         //打开中断0
  73.   EA=1;                                                   //打开总中断
  74. }


  75. /**************定时0中断处理******************/
  76. void timer0_int() interrupt 1
  77. {
  78.       
  79.   TR0=0;    //设置定时器初值期间,关闭定时器
  80.   TH0=(65536-10)/256;                //设置100hz
  81.   TL0=(65536-10)%256;
  82.   TR0=1;                                           //打开定时器0
  83.          
  84.   time++;                                        //计算中间变量
  85.   if(time<count)          //count为占空比
  86.   {
  87.         PWM=1;           //输出高电平
  88.   }
  89.   else
  90.         PWM=0;      
  91.   if(time>=100)
  92.   {
  93.         time=0;
  94.   }
  95. }
复制代码



评分

参与人数 1黑币 +30 收起 理由
天才小能猫 + 30

查看全部评分

回复

使用道具 举报

ID:162590 发表于 2018-7-16 23:18 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:63317 发表于 2019-7-15 05:36 | 显示全部楼层
谢谢分享资料
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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