找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机pwm控制电机速度正反转(终极版)函数都已写好直接调用

  [复制链接]
跳转到指定楼层
楼主


用51单片机做的灭火机器人程序,pwm控制速度正反转,能够实现自动寻找火源并灭火。此机器人在电子竞赛中获

单片机源程序如下:
  1. #include<reg52.h>
  2. #include<math.h>
  3. #include<math.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char


  6. sbit IN_L1=P1^3;             //左轮电机控制1       //
  7. sbit IN_L2=P1^2;             //左轮电机控制2       //
  8. sbit IN_R1=P1^0;             //右轮电机控制1       //
  9. sbit IN_R2=P1^1;             //右轮电机控制2            //
  10. sbit PWMA=P1^6;              //左轮电机PWM波输出  //
  11. sbit PWMB=P1^5;              //右轮电机PWM波输出          //

  12. sbit HONG_L=P3^0;
  13. sbit HONG_M=P3^1;
  14. sbit HONG_R=P3^2;                                //红外避障,左,中,右
  15.   
  16. sbit S_L=P3^4;
  17. sbit S_R=P3^5;                                  //寻迹传感器,
  18. sbit J_L=P3^6;
  19. sbit J_R=P3^7;                                        //计数器,左轮,右轮

  20. sbit DJ=P0^0;                           //        电机
  21. sbit SPK=P2^1;                        //蜂鸣器
  22. sbit HUO_L=P2^3;
  23. sbit HUO_R=P2^4;                        //探测到火源 ,为低电位

  24. uchar SpeedTemp1=0;          //左轮电机速度锁定变量
  25. uchar SpeedTemp2=0;          //右轮电机速度锁定变量

  26. uchar SpeedLeft=0;          //左轮电机速度设定变量
  27. uchar SpeedRight=0;          //右轮电机速度设定变量

  28. uchar Timer0=0;           //定时器T0中断次数计数变量
  29. uint i,j,k,n;

  30. void Motor(uchar Select,char Speed)   //Select为电机选择,左轮为1,右轮为2                                  //Description:电机速度,正反转传递程序            
  31. {
  32.    if(Select==1)                      //对左轮电机的处理
  33.    {
  34.       SpeedLeft=abs(Speed);              //取速度的绝对值
  35.       if(Speed>=0)
  36.       {
  37.          IN_L1=0;
  38.          IN_L2=1;                     //如果速度为非负,则正转
  39.          }
  40.       else
  41.       {
  42.          IN_L1=1;
  43.          IN_L2=0;                     //如果速度为负,则反转      
  44.       }
  45.    }

  46.    if(Select==2)                      //对右轮电机的处理
  47.    {
  48.       SpeedRight=abs(Speed);              //取速度的绝对值
  49.       if(Speed>=0)
  50.       {
  51.          IN_R1=0;
  52.          IN_R2=1;                     //如果速度为非负,则正转
  53.          }
  54.       else
  55.       {
  56.          IN_R1=1;
  57.          IN_R2=0;                     //如果速度为负,则反转      
  58.       }
  59.    }

  60. }
  61. void Delay(uint n)   //Delay范围0 ~ 65535
  62. {
  63.    uint j;
  64.    while(n--!=0)         //延时次数
  65.    {
  66.       for(j=0;j<110;j++)    //延时1ms
  67.            ;
  68.    }
  69. }                           //总延时为Delay*1 ms


  70. void H_detect()
  71. {
  72.         if(HUO_L==0)
  73.         {       
  74.                 for(i=1;i<640;i++)
  75.                         for(k=1;k<110;k++)
  76.                 {       
  77.                         Motor(1,-50);
  78.                         Motor(2,0);
  79.                         DJ=1;
  80.                         j=1;
  81.                 }
  82.         }
  83.         else
  84.                 if(HUO_R==0)
  85.                 {
  86.                         for(i=1;i<640;i++)
  87.                                 for(k=1;k<110;k++)
  88.                                 {
  89.                                 Motor(1,0);
  90.                                 Motor(2,-50);
  91.                                 DJ=1;
  92.                                 j=2;
  93.                                 }
  94.                 }
  95.                 else
  96.                 {
  97.                         Motor(1,80);
  98.                         Motor(2,80);
  99.                         j=0;
  100.                 }
  101.         if((j==1)||(j==2))
  102.         {        DJ=1;
  103.                 for(i=0;i<500;i++)
  104.                         for(k=1;k<110;k++)
  105.                                 {
  106.                                 Motor(1,0);
  107.                                 Motor(2,0);
  108.                                 }
  109.                 if(j==1)
  110.                 {
  111.                         for(i=1;i<1150;i++)
  112.                                 for(k=1;k<110;k++)
  113.                                 {
  114.                                         Motor(1,50);
  115.                                         Motor(2,0);
  116.                                 }
  117.                 }
  118.                 else
  119.                 {
  120.                         for(i=1;i<1150;i++)
  121.                                 for(k=1;k<110;k++)
  122.                                 {
  123.                                         Motor(1,0);
  124.                                         Motor(2,50);
  125.                                 }                       
  126.                 }
  127.                 DJ=0;
  128.                 Delay(200);
  129.         }       
  130. }

  131. void Move()
  132. {
  133.         H_detect();
  134.         if((S_L==0)&&(S_R!=0))
  135.         {
  136.                 Motor(1,-10);
  137.                 Motor(2,80);
  138.         }
  139.         else
  140.         {
  141.                 if((S_R==0)&&(S_L!=0))
  142.                 {
  143.                         Motor(1,80);
  144.                         Motor(2,-10);
  145.                 }
  146.                 else
  147.                 {if((S_R==0)&&(S_L==0))
  148.                         {
  149.                                 Motor(1,80);
  150.                                 Motor(2,80);
  151.                         }
  152.                 }
  153.         }
  154. //        Delay(100);         
  155.         Motor(1,80);
  156.         Motor(2,80);
  157. }
  158. void Init()
  159. {
  160.    IN_L1=1;            
  161.    IN_L2=1;             //左轮电机刹车      
  162.    IN_R1=1;            
  163.    IN_R2=1;             //右轮电机刹车      

  164.         PWMA=0;            //左轮电机PWM波初始化
  165.         PWMB=0;             //右轮电机PWM波初始化
  166.    
  167.    TMOD=0x01;        // 设定T0的工作模式为1,GATE=0说明以TR0启动定时器,C/T为0说明选择了定时模式
  168.    TR0=0;             //关闭定时器0
  169.    TF0=0;             //定时器溢出复位
  170.    IE=0x00;             //所有中断关闭
  171.    TH0=(65536-1000)/256;               
  172.    TL0=(65536-1000)%256;      //装入TO定时初值,定时时间为50us
  173.    EA=1;             //开中断
  174.    ET0=1;            //开定时器0的中断   
  175.    TR0=1;            //启动定时器0
  176. }
  177. void main()
  178. {        Init();
  179.         DJ=0;
  180.         n=1;
  181.         while(n)
  182.         {
  183.                 Motor(1,80);
  184.                 Motor(2,80);
  185.                 if((S_R!=0)&(S_L!=0))
  186.                 {
  187.                         for(i=1;i<95;i++)
  188.                                 for(k=1;k<110;k++)
  189.                                         {
  190.                                                 Motor(1,80);
  191.                                                 Motor(2,0);
  192.                                         }                         //右转九十度
  193.                         n=0;
  194.                 }
  195.         }
  196.         Delay(200);
  197.            for(i=1;i<150;i++)
  198.                 for(k=1;k<110;k++)
  199.                         {
  200.                                 Move();
  201.                         }
  202.         for(i=1;i<180;i++)
  203.                                 for(k=1;k<110;k++)
  204.                                         {
  205.                                                 Motor(1,0);
  206.                                                 Motor(2,80);
  207.                                         }                         //zuo转九十度       
  208.         while(1)
  209.         {
  210.                 Move();
  211.         }       
  212. }
  213. void PwmTimer0() interrupt 1     //定时器0的中断服务程序来产生PWM波
  214. {     
  215.    TH0=(65536-1000)/256;
  216.    TL0=(65536-1000)%256;        //恢复定时器0的初值,定时时间50us
  217.    
  218.    if(Timer0==0)         //1个PWM周期完成后才会接受新数值 ,即500us内锁定速度
  219.    {
  220.     SpeedTemp1=SpeedLeft;  //锁定左轮电机的速度
  221.     SpeedTemp2=SpeedRight; //锁定右轮电机的速度
  222.     }
  223.    
  224.     if(Timer0<SpeedTemp1)
  225.        PWMA=1;
  226.     else
  227.        PWMA=0;       //产生左轮电机的PWM波
  228.    
  229.     if(Timer0<SpeedTemp2)
  230.        PWMB=1;
  231.     else
  232.        PWMB=0;      //产生右轮电机的PWM波

  233.     Timer0++;         //中断计数变量增1
  234.     if(Timer0>=100) //设定PWM波周期为500us
  235.     Timer0=0;       //中断计数变量清0
  236. }
复制代码

所有资料51hei提供下载:
用51单片机做的灭火机器人程序,能够实现自动寻找火源并灭火。此机器人在电子竞赛中获.rar (32.79 KB, 下载次数: 161)


评分

参与人数 1黑币 +8 收起 理由
2452873337 + 8 绝世好帖!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏11 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:129783 发表于 2017-11-10 18:25 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:323477 发表于 2018-5-6 15:15 | 只看该作者
非常需要,谢谢搂住
回复

使用道具 举报

地板
ID:146874 发表于 2018-5-8 09:23 | 只看该作者
谢谢分享
回复

使用道具 举报

5#
ID:324822 发表于 2018-5-8 10:11 | 只看该作者
谢谢大神
回复

使用道具 举报

6#
ID:41770 发表于 2018-7-3 14:53 | 只看该作者

谢谢分享
回复

使用道具 举报

7#
ID:33544 发表于 2018-9-18 14:36 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

8#
ID:34149 发表于 2018-10-16 18:12 | 只看该作者
太精彩了,久久不愿离开
回复

使用道具 举报

9#
ID:101014 发表于 2018-10-18 10:30 来自手机 | 只看该作者
楼主这是大爱啊
回复

使用道具 举报

10#
ID:413123 发表于 2018-11-14 09:36 | 只看该作者
完美的51hei
回复

使用道具 举报

11#
ID:333950 发表于 2018-11-16 10:23 | 只看该作者
大爱无言
回复

使用道具 举报

12#
ID:383498 发表于 2018-11-19 18:28 | 只看该作者

大爱无言
回复

使用道具 举报

13#
ID:426241 发表于 2018-11-21 11:07 来自手机 | 只看该作者
谢谢分享
回复

使用道具 举报

14#
ID:227908 发表于 2019-3-28 14:16 | 只看该作者
感谢分享,能不能看下原理图
回复

使用道具 举报

15#
ID:497553 发表于 2019-4-3 09:56 | 只看该作者
楼主,你确定 定时50us话,赋的初值是65536-1000?比如你的是12M晶振,怎么算都是65536-50吧?就算是11.0592的晶振,也绝不可能是这个数值。
回复

使用道具 举报

16#
ID:393828 发表于 2019-4-26 10:51 | 只看该作者
请问能不能发下硬件原理图
回复

使用道具 举报

17#
ID:362398 发表于 2019-4-26 12:15 | 只看该作者
楼主,你这个PWM里面的速度锁定变量是为了防止电机产生冲击吗,变速的时候
回复

使用道具 举报

18#
ID:725297 发表于 2020-4-9 09:19 | 只看该作者
非常需要,谢谢搂住
回复

使用道具 举报

19#
ID:725358 发表于 2020-4-9 10:34 | 只看该作者

好资料,51黑有你更精彩!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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