找回密码
 立即注册

QQ登录

只需一步,快速开始

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

俩路pwm调速循迹小车 单片机源程序

[复制链接]
跳转到指定楼层
楼主
ID:437370 发表于 2019-5-31 09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
俩路pwm调速循迹小车

单片机源程序如下:
  1. /**********  循迹程序  ************************/
  2. //    P0.0和P0.1-----右电机
  3. //    P0.2和P0.3-----左电机
  4. //    P1.0-----------右1光电管
  5. //    P1.1-----------左1光电管
  6. /*****************************************************/
  7. #include<reg52.h>//包含必要头文件
  8. #define uchar unsigned char
  9. #define uint unsigned int
  10. void Init_Timer0(void);//定时器初始化
  11. sbit P10=P1^0;                                        //定义单片机控制左边电机的引脚
  12. sbit P11=P1^1;                                        //定义单片机控制左边电机的引脚
  13. sbit P12=P1^2;                                        //定义单片机控制右边电机的引脚
  14. sbit P13=P1^3;                                        //定义单片机控制右边电机的引脚
  15. sbit ENA=P3^0;
  16. sbit ENB=P3^1;
  17. #define Right_moto_pwm P3^0 //接驱动模块ENA使能端输入PWM信号调节速度
  18. #define Left_moto_pwm P3^1 //接驱动模块ENB使能端输入PWM信号调节速度

  19. #define Left_moto_back         {P10=0,P11=1;} //左电机后退
  20. #define Left_moto_go                 {P10=1,P11=0;} //左电机前进
  21. #define Left_moto_stop         {P10=1,P11=1;} //左电机停转
  22. #define Right_moto_back {P12=0,P13=1;} //右电机后退
  23. #define Right_moto_go         {P12=1,P13=0;} //右电机前转
  24. #define Right_moto_stop {P12=1,P13=1;} //右电机停转

  25. sbit y1=P2^0;                                        //定义单片机连接循迹板右边第一个光电管的引脚
  26. sbit z1=P2^1;                                        //定义单片机连接循迹板左边第一个光电管的引脚

  27. int pwm_val_left =0;
  28. int push_val_left =0; //左电机占空比N/10
  29. int pwm_val_right =0;
  30. int push_val_right=0; //右电机占空比N/10
  31. bit Right_moto_stp=1;
  32. bit Left_moto_stp =1;

  33. void delay(int z)                                //pwm中使用的延时函数
  34. {
  35.         int i,j;
  36.         for(i=2;i>0;i--)
  37.         for(j=z;j>0;j--);       
  38. }
  39. void qian()                                                //左右轮协同前进子函数
  40. {
  41.         push_val_left  =7.5; //PWM 调节参数1-20 1为最慢20是最快 改这个值可以改变其速度
  42.         push_val_right =7; //PWM 调节参数1-20 1为最慢20是最快 改这个值可以改变其速度

  43.         Left_moto_go ;     //左电机前进
  44.         Right_moto_go ;          //右电机前进
  45. }

  46. void you()                                                //左右轮协同  右转子函数
  47. {
  48.         push_val_left  =7; //PWM 调节参数1-20 1为最慢20是最快 改这个值可以改变其速度
  49.         push_val_right =7; //PWM 调节参数1-20 1为最慢20是最快 改这个值可以改变其速度

  50.         Left_moto_go ;     //左电机前进
  51.         Right_moto_back ;          //右电机前进
  52. }

  53. void zuo()                                                //左右轮协同  左转子函数
  54. {
  55.         push_val_left  =7; //PWM 调节参数1-20 1为最慢20是最快 改这个值可以改变其速度
  56.         push_val_right =7; //PWM 调节参数1-20 1为最慢20是最快 改这个值可以改变其速度

  57.         Left_moto_back ;     //左电机前进
  58.         Right_moto_go ;          //右电机前进
  59. }
  60. void ting()                                         //左右轮都停止转动
  61. {
  62.         Right_moto_stop;          //右电机停走
  63.         Left_moto_stop;          //左电机停走
  64. }

  65. void pwm_out_left_moto(void) //左电机调速,调节push_val_left的值改变电机转速,占空比
  66. {
  67.         if(Left_moto_stp)
  68.         {
  69.                 {
  70.                         if(pwm_val_left<=push_val_left)
  71.                         {
  72.                                 ENB=1;
  73.                         }
  74.                         else
  75.                         {
  76.                                 ENB=0;
  77.                         }
  78.                 }       

  79.                 {
  80.                         if(pwm_val_left>=20)
  81.                         {
  82.                                 pwm_val_left=0;
  83.                         }       
  84.                 }
  85.         }
  86.         else
  87.                 {
  88.                         ENB=0;
  89.                 }
  90. }


  91. void pwm_out_right_moto(void) //右电机调速,调节push_val_left的值改变电机转速,占空比
  92. {
  93.         if(Right_moto_stp)
  94.          {
  95.                 if(pwm_val_right<=push_val_right)
  96.                 {
  97.                         ENA=1;
  98.                 }
  99.                 else
  100.                 {
  101.                         ENA=0;
  102.                 }
  103.                 if(pwm_val_right>=20)
  104.                 {
  105.                         pwm_val_right=0;
  106.                 }
  107.          }
  108.         else
  109.          {
  110.                 ENA=0;
  111.          }       
  112. }


  113. void main()                                                //主函数
  114. {
  115.                 TMOD |=0X01;
  116.                 TH0= 0XFC; //2ms定时
  117.                 TL0= 0X30;
  118.                 TR0= 1;
  119.                 ET0= 1;
  120.                 EA = 1;
  121.           z1=1;
  122.           y1=1;

  123.                 while(1)                                                        //单片机不间断监测 (是个死循环)
  124.                 {                                                                             
  125.                                 qian();                                                //调用前进函数,使小车光电管不满足以下几个条件时都处于前进状态               
  126.                                 while(y1==1&z1==0)                                           
  127.                                 {       
  128.                                         you();                                                //
  129.                                         //zuo();
  130.                                 }
  131.                                 while(y1==0&z1==1)                                                                                                                                                                                                                                                   
  132.                                 {
  133.                                          zuo();                                        //       
  134.                                         //you();
  135.                                 }
  136.                                 while(y1==1&z1==1)                                                                                             
  137.                                 {                       
  138.                                         ting();                                          // 停止                               
  139.                                 }                                       
  140.                                 while(y1==0&z1==0)                                                        //判断当左边和右光电管都遇到黑线时
  141.                                 {                                                       
  142.                                         qian();                                        //调用前进函数
  143.                                 }                       
  144.                  }
  145. }

  146. void Init_Timer0()interrupt 1 using 2

  147. {


  148. TH0=0XFC; //2Ms定时

  149. TL0=0X30;

  150.                
  151. pwm_val_left++;

  152. pwm_val_right++;

  153. pwm_out_left_moto();

  154. pwm_out_right_moto();

  155. }
复制代码

所有资料51hei提供下载:
pwm调速正常慢速1.zip (23.5 KB, 下载次数: 15)



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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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