找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机循迹小车的程序错误,求解答

[复制链接]
回帖奖励 200 黑币 回复本帖可获得 20 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:1106201 发表于 2024-4-10 13:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下是我参照论坛内大佬的代码写的单片机代码,在仿真上出现了以下错误
1.在没有信号时,其不能完全停止。motor仍显示在转动,但较为缓慢。(void stop)不知道是仿真的问题还是程序的问题。(全部给的反转,速度全部为0)
2.我写的六个运动方式,分别为:停止(stop),直走zhizou)、左大转(dazhuan1)、右大转(dazhuan2)、左微调(weitiao1)、右微调(weitiao2)
   现在的问题是除左大转外,其余的运转方式都成功,左大转的左电机管脚出出现闪烁,疑似信号冲突,但我没有找到冲突的点在哪?
3.我尝试过将左大转的正反转函数将0换成1,结果其运行正常,求解
请求各位大佬的帮助,搞了几天,真的看不到冲突的点在哪里.(还有,模拟红外传感器的按钮松开表示有信号1,按下默认为0)
程序写的很乱,但是希望各位大佬能耐心看完,指出问题所在。急需。
在此,感激不尽。祝生活愉快,万事如意。
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. extern void Motor_Left_Q(bit ReverOrCoro, unsigned char DutyCycle); //????????
  5. extern void Motor_Left_H(bit ReverOrCoro, unsigned char DutyCycle);
  6. extern void Motor_Right_Q(bit ReverOrCoro, unsigned char DutyCycle); //????????
  7. extern void Motor_Right_H(bit ReverOrCoro, unsigned char DutyCycle);
  8. extern void stop(void);

  9. void Timer0Config(); //        ?????0

  10. void zhizou();
  11. void dazhuan1();
  12. void dazhuan2();
  13. void weitiao1();
  14. void weitiao2();


  15. sbit ENA1 = P1^5; //???????                                   
  16. sbit ENB1= P1^6;
  17. sbit ENA2 = P2^5; //???????                                   
  18. sbit ENB2= P2^6;
  19. sbit led = P2^4;//???
  20. uchar a;

  21. uchar Infrared; //??P0?????   ?????
  22. void scan(void);
  23. sbit inputL1=P0^0;   //?1
  24. sbit inputL2=P0^1;    //?2
  25. sbit inputR1=P0^2;      //?2
  26. sbit inputR2=P0^3;      //?1

  27. void main()
  28. {
  29.         Timer0Config();
  30.         ENA1 = 1;
  31.     ENB1 = 1;
  32.     ENA2 = 1;
  33.     ENB2 = 1;
  34.     while(1)
  35.         {               
  36.          scan();
  37.         }
  38. }


  39. void scan()           
  40. {
  41.           if(inputL1==0&&inputR1==0&&inputL2==0&&inputR2==0)        //0000
  42.           {
  43.                         stop();
  44.            }
  45.           if(inputL1==1&&inputL2==0&&inputR1==0&&inputR2==0) //1000
  46.           {
  47.                         dazhuan1();
  48.            }
  49.           if(inputL1==0&&inputL2==1&&inputR1==0&&inputR2==0)  //0100
  50.           {
  51.                         weitiao1();
  52.            }
  53.             if(inputL1==0&&inputL2==0&&inputR1==1&&inputR2==0) //0010
  54.           {
  55.                         weitiao2();
  56.            }
  57.       if(inputL1==0&&inputL2==0&&inputR1==0&&inputR2==1)        //0001
  58.           {
  59.                         dazhuan2() ;
  60.            }
  61.        else
  62.       {
  63.            zhizou();
  64.       }
  65. }


  66. void zhizou()
  67. {
  68.      Infrared = inputL1==1&&inputL2==1&&inputR1==1&&inputR2==1;
  69.          Motor_Left_Q(1, 100), Motor_Right_Q(1, 100);
  70.      Motor_Left_H(1, 100), Motor_Right_H(1, 100);
  71.          
  72. }
  73. void dazhuan1()       //左大转/    1000
  74. {
  75.             Motor_Left_Q(0, 200); Motor_Right_Q(1, 200);
  76.             Motor_Left_H(0, 200); Motor_Right_H(1, 200);
  77.       
  78.     }

  79.     void dazhuan2()    //右大转/   0001
  80. {
  81.         
  82.                 Motor_Left_Q(1, 200); Motor_Right_Q(0, 200);
  83.         Motor_Left_H(1, 200); Motor_Right_H(0, 200);   
  84.      }
  85. void weitiao1()     //左微调/  0100
  86. {
  87.         
  88.                 Motor_Left_Q(1, 10); Motor_Right_Q(1, 100);
  89.         Motor_Left_H(1, 10); Motor_Right_H(1, 100);
  90.         Infrared = inputL1==0&&inputL2==1&&inputR1==0&&inputR2==0;
  91.                
  92. }


  93. void weitiao2()//右微调/   0010
  94. {

  95.                 Motor_Left_Q(1, 100); Motor_Right_Q(1, 10);
  96.         Motor_Left_H(1, 100); Motor_Right_H(1, 10);//60
  97.         Infrared = inputL1==0&&inputL2==0&&inputR1==1&&inputR2==0;
  98. }               

  99. void stop()
  100. {
  101.          Motor_Left_Q(1, 0), Motor_Right_Q(1, 0);
  102.      Motor_Left_H(1, 0), Motor_Right_H(1, 0);  
  103. }
  104. void Timer0Config()
  105. {
  106.         TMOD &= 0xF0;
  107.         TMOD |= 0x01;
  108.         TH0 = 0xFF;
  109.         TL0 = 0x7E;
  110.         EA = 1;
  111.         ET0 = 1;
  112.         TR0 = 1;
  113. }
复制代码
  1. #include<reg51.h>

  2. sbit IN1 = P1^0; //定义左前电机控制引脚   
  3. sbit IN2 = P1^1; //                     
  4. sbit IN3 = P1^2; //定义左后电机控制引脚   
  5. sbit IN4 = P1^3; //                     
  6. sbit IN5 = P2^0; //定义右前电机控制引脚   
  7. sbit IN6 = P2^1; //                     
  8. sbit IN7 = P2^2; //定义右后电机控制引脚   
  9. sbit IN8 = P2^3; //                     

  10. void Motor_Left_Q(bit ReverOrCoro, unsigned char DutyCycle);  //左前边电机控制函数
  11. void Motor_Right_Q(bit ReverOrCoro, unsigned char DutyCycle); //右前边电机控制函数
  12. void Motor_Left_H(bit ReverOrCoro, unsigned char DutyCycle);  //左后边电机控制函数
  13. void Motor_Right_H(bit ReverOrCoro, unsigned char DutyCycle); //右后边电机控制函数

  14. unsigned char cnt = 0;

  15. void Motor_Left_Q(bit ReverOrCoro, unsigned char DutyCycle) //传递正反转(1为正转,0为反转)、占空比参数    左前
  16. {
  17.         if(ReverOrCoro == 1)
  18.         {
  19.                 IN1 = 1;
  20.                 if(cnt <= DutyCycle)
  21.                 {
  22.                         IN2 = 0;
  23.                 }
  24.                 else
  25.                 {
  26.                         IN2 = 1;
  27.                 }
  28.         }
  29.         else
  30.         {
  31.                 IN2 = 1;
  32.                 if(cnt <= DutyCycle)
  33.                 {
  34.                         IN1 = 0;
  35.                 }
  36.                 else
  37.                 {
  38.                         IN1 = 1;
  39.                 }
  40.         }
  41. }

  42. void Motor_Left_H(bit ReverOrCoro, unsigned char DutyCycle) //传递正反转(1为正转,0为反转)、占空比参数DutyCycle   左后
  43. {
  44.         if(ReverOrCoro == 1)
  45.         {
  46.                 IN3 = 1;
  47.                 if(cnt <= DutyCycle)
  48.                 {
  49.                         IN4 = 0;
  50.                 }
  51.                 else
  52.                 {
  53.                         IN4 = 1;
  54.                 }
  55.         }
  56.         else
  57.         {
  58.                 IN4 = 1;
  59.                 if(cnt <= DutyCycle)
  60.                 {
  61.                         IN3 = 0;
  62.                 }
  63.                 else
  64.                 {
  65.                         IN3 = 1;
  66.                 }
  67.         }
  68. }

  69. void Motor_Right_Q(bit ReverOrCoro, unsigned char DutyCycle) //传递正反转(1为正转,0为反转)、占空比参数    右前
  70. {
  71.         if(ReverOrCoro == 1)
  72.         {
  73.                 IN5 = 1;
  74.                 if(cnt <= DutyCycle)
  75.                 {
  76.                         IN6 = 0;
  77.                 }
  78.                 else
  79.                 {
  80.                         IN6 = 1;
  81.                 }
  82.         }
  83.         else if(ReverOrCoro == 0)
  84.         {
  85.                 IN6 = 1;
  86.                 if(cnt <= DutyCycle)
  87.                 {
  88.                         IN5 = 0;
  89.                 }
  90.                 else
  91.                 {
  92.                         IN5 = 1;
  93.                 }
  94.         }
  95. }

  96. void Motor_Right_H(bit ReverOrCoro, unsigned char DutyCycle) //传递正反转(1为正转,0为反转)、占空比参数    右后
  97. {
  98.         if(ReverOrCoro == 1)
  99.         {
  100.                 IN7 = 1;
  101.         IN8 = 0;
  102.                 /*if(cnt <= DutyCycle)
  103.                 {
  104.                         
  105.                 }
  106.                 else
  107.                 {
  108.                         IN8 = 1;
  109.                 }*/
  110.         }
  111.         else if(ReverOrCoro == 0)
  112.         {
  113.                 IN8 = 1;
  114.         IN7 = 0;
  115.                 /*if(cnt <= DutyCycle)
  116.                 {
  117.                         
  118.                 }
  119.                 else
  120.                 {
  121.                         IN7 = 1;
  122.                 }*/
  123.         }
  124. }
  125. void InterruptTimer0() interrupt 1  
  126. {
  127.         TH0 = 0xFF;
  128.         TL0 = 0x7E;
  129.         cnt++;
  130.         if(cnt >= 100)
  131.         {
  132.                 cnt = 0;
  133.         }
  134. }
复制代码

motor,test.zip

25.55 KB, 下载次数: 4

仿真

程序测试.zip

106.07 KB, 下载次数: 3

其中的个人尝试为原文件

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

使用道具 举报

沙发
ID:79094 发表于 2024-4-11 09:00 | 只看该作者
硬件 连接有没有问题
回复

使用道具 举报

板凳
ID:161164 发表于 2024-4-11 11:31 | 只看该作者
程序附件里只有keil的项目档
没有C档H档
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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