久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1299|回復: 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)
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美综合视频在线 | 色噜噜狠狠色综合中国 | 欧美日韩综合一区 | 日韩一区在线视频 | 国产成人综合在线 | 午夜影院在线 | 伊人色综合久久天天五月婷 | 日韩伦理一区二区 | 国产色婷婷精品综合在线手机播放 | 自拍偷拍亚洲视频 | 成人在线一区二区 | 欧美v日韩v| 欧美激情a∨在线视频播放 成人免费共享视频 | 日韩乱码一二三 | 国户精品久久久久久久久久久不卡 | 欧美大片久久久 | 欧美国产精品 | 成人精品一区亚洲午夜久久久 | 日韩精品一区二区三区在线观看 | www.日韩| 久久不卡日韩美女 | 成人视屏在线观看 | 成人亚洲| 99re国产| 91精品久久久久 | 黄色精品 | 免费在线观看一区二区三区 | a在线视频 | 综合五月婷 | 亚洲国产精品久久 | 成人在线小视频 | 国产网站在线播放 | 久久精品免费观看 | 一区二区三区欧美大片 | 国产精品免费视频一区 | 亚洲国产欧美精品 | 嫩草视频在线免费观看 | 黄色欧美在线 | 亚洲欧美精品在线观看 | 亚洲va在线va天堂va狼色在线 | 97avcc|