找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机小车测速程序问题,静止状态的情况下速度不归零

[复制链接]
跳转到指定楼层
楼主
ID:616526 发表于 2019-11-5 17:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小车测速通电后速度直接变成255CM/S,过了蛮久才会变化,而且静止状态的情况下速度不归零。

单片机源程序如下:
  1. #include<AT89x51.H>
  2. #include <intrins.h>
  3. #include "LCD1602display.h"
  4.         #include<HJ-4WD_PWM.H>                  //包含HL-1蓝牙智能小车驱动IO口定义等函数
  5. /*   右电机测速线接 P3.2    左电机测速线接 P3.3*/
  6.   #define Left_1_led        P3_7         // 左循迹传感器       由于测速程序  必须使用外部中断  所以之前的循迹传感器IO由P3.3改为P3.7
  7.         #define Right_1_led       P3_6         //右循迹传感器                    由于测速程序  必须使用外部中断  所以之前的循迹传感器IO由P3.2改为P3.6
  8.             

  9.   unsigned char disbuff[10]={0};//用于分别存放速度的值的值       
  10.         unsigned char  time=0;                                                                                          //显示缓存
  11.   unsigned char  i =0;                  //定义扫描数码管字数
  12.         unsigned int  count1=0;            //计右电机码盘脉冲值
  13.         unsigned int  count2=0;            //计左电机码盘脉冲值
  14.         bit count3=0;       
  15.         bit count5=0;
  16.         unsigned int  count4=0;
  17.         unsigned int   V1=0;                   //定义右电机其速度
  18.         unsigned int   V2=0;                   //定义左电机其速度
  19.   unsigned int   V3=0;
  20.         void Delay400Ms(void);//延时400毫秒函数

  21. unsigned char code Range[] ="==Range Finder==";//LCD1602显示格式
  22. unsigned char code ASCII[15] ="0123456789CM S";
  23. unsigned char code ASCII1[11] ="0123456789S";
  24.        
  25. unsigned char code ASCIIR[13] = "RMspeed:";
  26. unsigned char code ASCIIL[13] = "T:";
  27.        
  28. unsigned char code ASCIIL1[13] = "L:";
  29. unsigned char code ASCII2[12] ="0123456789CM";

  30. unsigned char code table[]="Distance:001.0cm";
  31. unsigned char code table1[]="!!! Out of range";

  32. void Count(void);//距离计算函数
  33. void  Display_LCD();                          

  34. unsigned long S=0;//用于存放距离的值
  35. bit  flag =0; //量程溢出标志位
  36. bit  turn_right_flag;
  37.    
  38. /************************************************************************/
  39. ///*TIMER0中断服务子函数产生2MS定时扫描数码管与产生0。5S*/
  40.         void timer0()interrupt 1   using 2
  41. {
  42.       TH0=(65536-1850)/256;                //2MS定时
  43.       TL0=(65536-1850)%256;

  44.          time++;
  45. //         Display_SMG();
  46.          if(time>=250)        //250次即是,0。5S
  47.          {
  48.           time=0;
  49.           //V1=count1*2;         //计数公式:轮子直径*3.14/20格码盘=6.5Cm*3.14/20约=1cm  即一个脉冲走1CM距离
  50.                          //圆周长公式     C = 2πr          所以将圆严格20等分  自然 一格就是约 1CM左右
  51.                          // 0.5S  到了   计算在0.5S时间内的         脉冲数   因为1个脉冲基本是1CM  根据 S=VT公式  算出  V = S/T
  52.                                          // 即  ((count1*1CM))/0.5S= (count1*2)CM/S          
  53.           //count1=0;                 //清计数    0.5S  时间内  测一次速度     然后清0  重新 计数
  54.                 V1=V3/V2;

  55.                  
  56.           disbuff[0]=V1/100;                 //右电机速度值百位
  57.           disbuff[1]=V1%100/10;                //右电机速度值十位
  58.     disbuff[2]=V1%100%10;                //右电机速度值个位

  59.                  
  60.                  
  61.                 if(count3==1)
  62.                 {
  63.           V2=count2/2;         //计数公式:轮子直径*3.14/20格码盘=6.5Cm*3.14/20约=1cm  即一个脉冲走1CM距离
  64.                          //圆周长公式     C = 2πr          所以将圆严格20等分  自然 一格就是约 1CM左右
  65.                          // 0.5S  到了   计算在0.5S时间内的         脉冲数   因为1个脉冲基本是1CM  根据 S=VT公式  算出  V = S/T
  66.                                                  // 即  ((count1*1CM))/0.5S= (count1*2)CM/S
  67.           count2++;                   //清计数    0.5S  时间内  测一次速度     然后清0  重新 计数
  68.                                                                                                                                                                                                                                                                                                             
  69.           disbuff[3]=V2/100;                 //左电机速度值百位
  70.           disbuff[4]=V2%100/10;                 //左电机速度值十位
  71.     disbuff[5]=V2%100%10;                //左电机速度值个位
  72.           count3=0;
  73.                 }
  74.                
  75.                 if(count5==1)
  76.                 {
  77.           V3=count4/3;         //计数公式:轮子直径*3.14/20格码盘=6.5Cm*3.14/20约=1cm  即一个脉冲走1CM距离
  78.                        //圆周长公式     C = 2πr          所以将圆严格20等分  自然 一格就是约 1CM左右
  79.                        // 0.5S  到了   计算在0.5S时间内的         脉冲数   因为1个脉冲基本是1CM  根据 S=VT公式  算出  V = S/T
  80.                                                // 即  ((count1*1CM))/0.5S= (count1*2)CM/S
  81.           count4++;                 //清计数    0.5S  时间内  测一次速度     然后清0  重新 计数
  82.                                                                                                                                                                                                                                                                                                             
  83.           disbuff[6]=V3/1000;                 //左电机速度值百位
  84.           disbuff[7]=V3%1000/100;                 //左电机速度值十位
  85.     disbuff[8]=V3%100/10;                //左电机速度值个位
  86.           disbuff[9]=V3%100%10;
  87.           count5=0;
  88.                 }
  89.                
  90.          }
  91. }
  92. void  Display_LCD()
  93. {
  94. //          unsigned char code ASCII[15] ="0123456789CM S";
  95. //    unsigned char code ASCIIR[13] = "RMspeed:";
  96. //    unsigned char code ASCIIL[13] = "Time:";
  97. //          unsigned char code table[]="Distance:001.0cm";
  98. //    unsigned char code table1[]="!!! Out of range";
  99. //    unsigned char code ASCIIL1[13] = "L:";
  100. //    unsigned char code ASCII2[12] ="0123456789CM";
  101.     DisplayOneChar(0, 1, ASCIIR[0]);          //
  102.           DisplayOneChar(1, 1, ASCIIR[1]);          //
  103.           DisplayOneChar(2, 1, ASCIIR[2]);          //
  104.           DisplayOneChar(3, 1, ASCIIR[3]);          //
  105.           DisplayOneChar(4, 1, ASCIIR[4]);          //
  106.           DisplayOneChar(5, 1, ASCIIR[5]);          //
  107.           DisplayOneChar(6, 1, ASCIIR[6]);          //
  108.           DisplayOneChar(7, 1, ASCIIR[7]);          //

  109.           DisplayOneChar(8, 1, ASCII[disbuff[0]]);          //右电机速度值百位
  110.           DisplayOneChar(9, 1, ASCII[disbuff[1]]);          //右电机速度值十位
  111.           DisplayOneChar(10, 1, ASCII[disbuff[2]]);           //右电机速度值个位
  112.           DisplayOneChar(11, 1, ASCII[10]);           //
  113.           DisplayOneChar(12, 1, ASCII[11]);           //
  114.           DisplayOneChar(13, 1, 0x2f);          //根据1602的字符表找到 /
  115.           DisplayOneChar(14, 1, ASCII[13]);           //

  116.           DisplayOneChar(0, 0, ASCIIL[0]);          //
  117.           DisplayOneChar(1, 0, ASCIIL[1]);          //

  118.           DisplayOneChar(2, 0, ASCII1[disbuff[3]]);           //左电机速度值百位
  119.           DisplayOneChar(3, 0, ASCII1[disbuff[4]]);           //左电机速度值十位
  120.           DisplayOneChar(4, 0, ASCII1[disbuff[5]]);           //左电机速度值个位
  121.     DisplayOneChar(5, 0, ASCII1[10]);           //
  122.                
  123.                 DisplayOneChar(7, 0, ASCIIL1[0]);          //
  124.           DisplayOneChar(8, 0, ASCIIL1[1]);
  125.                
  126.                 DisplayOneChar(9, 0, ASCII2[disbuff[6]]);          
  127.           DisplayOneChar(10, 0, ASCII2[disbuff[7]]);         
  128.           DisplayOneChar(11, 0, ASCII2[disbuff[8]]);          
  129.                 DisplayOneChar(12, 0, ASCII2[disbuff[9]]);          
  130.     DisplayOneChar(13, 0, ASCII2[10]);           //
  131.     DisplayOneChar(14, 0, ASCII2[11]);

  132.           

  133. }
  134. /***************************************************/
  135. //外部0中断用于计算左轮的脉冲
  136.    void intersvr1(void) interrupt 0 using 1

  137. {
  138.     count1++;
  139.           count4++;
  140.           count3=1;
  141.           count5=1;
  142.        
  143. }
  144.    void intersvr2(void) interrupt 2 using 2

  145. {
  146.     count2++;
  147.   
  148. }
  149. /************************************************************************/


  150. /*********************************************************************/                 
  151. /*--主函数--*/
  152.         void main(void)
  153. {
  154.            //cmg88();//关数码管
  155.         Delay1ms(400); //启动等待,等LCM讲入工作状态
  156.         LCMInit(); //LCM初始化
  157.         Delay1ms(5);//延时片刻

  158.     TMOD=0X11;
  159.     TH0=(65536-2000)/256;                //2MS定时
  160.     TL0=(65536-2000)%256;
  161.         TR0= 1;
  162.         ET0= 1;

  163.         TH1= 0XFc;                  //1ms定时
  164.     TL1= 0X18;
  165.     TR1= 1;
  166.     ET1= 1;

  167.         EX0=1;           //开启外部中断0
  168.     IT0=1;           //下降沿有效
  169.         IE0=0;

  170.         EX1=1;           //开启外部中断1
  171.     IT1=1;           //下降沿有效
  172.         IE1=0;
  173.         EA = 1;         
  174. //   run();
  175.        
  176.         while(1)
  177.         {
  178.            Display_LCD();                
  179.                          //有信号为0  没有信号为1
  180.          
  181.               if(Left_1_led==0&&Right_1_led==0)

  182.                           run();   //调用前进函数

  183.                           else
  184.                          {                          
  185.                                                if(Left_1_led==1&&Right_1_led==0)            //左边检测到黑线
  186.                                   {
  187.                                            leftrun();                  //调用小车左转  函数

  188.                              }
  189.                           
  190.                                                              if(Right_1_led==1&&Left_1_led==0)                //右边检测到黑线
  191.                                   {          
  192.                                       rightrun();                   //调用小车右转        函数

  193.                                   }
  194.                                                       if(Right_1_led==1&&Left_1_led==1)                //悬空
  195.                                   {          
  196.                                       stop();                   //调用小车停止        函数

  197.                                   }

  198.                         }

  199.                                          
  200.          }

  201. }
  202.        
复制代码

所有资料51hei提供下载:
13. ZYWIFI0939-3循迹 测速程序(PWM加强版 1602显示速度).rar (50.33 KB, 下载次数: 9)

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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