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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4383|回復: 1
打印 上一主題 下一主題
收起左側

自動入庫避障智能小車的單片機源程序以及車庫圖和視頻等資料分享

[復制鏈接]
跳轉到指定樓層
樓主
很有用!
匯編程序僅僅可以進入一號庫
C語言通過調節參數可以進入不同車庫

引腳:  P2.0超聲接收
    P2.1超聲發射
    P1.2-P1.7步進電機
   
下面是自動入庫避障智能小車視頻截圖:


車庫圖:


單片機源程序如下:
  1.             /*
  2. * 【實驗平臺】: QX-MCS51 單片機開發板 & QX-A51智能小車
  3. * 【外部晶振】: 11.0592mhz        
  4. * 【主控芯片】: STC89C52
  5. * 【編譯環境】: Keil μVisio4
  6. * ********************************【接線說明】********************************
  7.              以下"A_"表示智能小車底板~~~"B_"表示開發板     
  8. *開發板供電線  :A_J5-VCC~~~B_VCC或5V0    A_J6-GND~~~B_GND (一共使用2根杜邦線)
  9. *電機控制線    :A_J10-P1.2至P1.7 對應接到B_P1.2至P1.7 (一共使用6根杜邦線)
  10. *超聲波模塊反饋線:A_J2-P20~~~B_P20    A_J2-P21~~~B_P21 (一共使用2根杜邦線)
  11.                         使用前請先以正確方式接上超聲波模塊與1602液晶
  12. ******************************************************************************
  13. * 【程序功能】:QX-A51智能小車超聲波避障實驗                                                                                   
  14. * 【使用說明】:接線無誤后,燒寫程序打開電源開、按下S2按鍵后蜂鳴器發出提示音1秒后啟動小車
  15. * 【注意事項】:避免小車撞向障礙物或小車輪子堵轉,小車電壓不能低于6V
  16.                                 此程序只做參考,實際運行效果需根據不同實驗場地進行不同調試
  17.                                 使用前請插接上1602液晶。如果液晶上無顯示字符,請順時針調節液晶對比度電位器。
  18.                                 如果顯示字符過濃,請逆時針調節液晶對比度電位器
  19.                                 ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
  20.         ☆☆☆☆☆☆☆☆☆☆        如果沒有使用1602液晶,請把P07接到GND上,否則無法運行☆☆☆☆☆☆☆☆☆☆
  21.                                 ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
  22. **********************************************************************************/
  23. #include <reg52.h> //51頭文件
  24. #include <intrins.h>   //包含nop等系統函數
  25. #include <QXA51.h>//QX-A51智能小車配置文件

  26. sbit DU = P2^6;//數碼管段選
  27. sbit RX = P2^0;//ECHO超聲波模塊回響端
  28. sbit TX = P2^1;//TRIG超聲波模塊觸發端
  29. sbit LCM_RW = P3^6;     //定義LCD引腳
  30. sbit LCM_RS = P3^5;
  31. sbit LCM_E = P3^4;
  32. #define LCM_Data  P0   //定義液晶屏數據口
  33. #define Busy    0x80   //用于檢測LCM狀態字中的Busy標識

  34. unsigned char pwm_left_val = 150;//左電機占空比值 取值范圍0-170,0最快
  35. unsigned char pwm_right_val = 150;//右電機占空比值取值范圍0-170 ,0最快
  36. unsigned char pwm_t;//周期
  37. unsigned int  time = 0;//傳輸時間
  38. unsigned long S = 0;//距離
  39. bit      flag = 0;//超出測量范圍標志位

  40. unsigned char code Range[] ="==Range Finder==";//LCD1602顯示格式
  41. unsigned char code ASCII[13] = "0123456789.-M";
  42. unsigned char code table[]="Distance:000.0cm";
  43. unsigned char code table1[]="!!! Out of range";
  44. unsigned char disbuff[4] = { 0,0,0,0};//距離顯示緩存
  45. unsigned int q=0;
  46. unsigned int w;
  47. unsigned int z=1;
  48. unsigned int u=0;
  49. unsigned int o=1;
  50. unsigned int v=0;
  51. void delay(unsigned int z)//毫秒級延時
  52. {
  53.         unsigned int x,y;
  54.         for(x = z; x > 0; x--)
  55.                 for(y = 114; y > 0 ; y--);
  56. }

  57. void Delay10us(unsigned char i)            //10us延時函數 啟動超聲波模塊時使用
  58. {
  59.    unsigned char j;
  60.         do{
  61.                 j = 10;
  62.                 do{
  63.                         _nop_();
  64.                 }while(--j);
  65.         }while(--i);
  66. }

  67. void cmg88()//關數共陰極碼管
  68. {
  69.     DU=1;            
  70.     P0=0X00;//共陰極數碼管陽極給低電平,全部熄滅
  71.     DU=0;
  72. }

  73. /************************************LCD1602液晶屏驅動函數************************************************/
  74. //*******************讀狀態*************************//
  75. unsigned char ReadStatusLCM(void)
  76. {
  77.         LCM_Data = 0xFF;
  78.         LCM_RS = 0;
  79.         Delay10us(1);
  80.         LCM_RW = 1;
  81.         Delay10us(1);
  82.         do{
  83.         LCM_E = 0;
  84.         Delay10us(1);
  85.         LCM_E = 0;
  86.         Delay10us(1);
  87.         LCM_E = 1;
  88.         Delay10us(1);
  89.         }
  90.         while (LCM_Data & Busy); //檢測忙信號
  91.         return(LCM_Data);
  92. }

  93. /****************寫數據************************/
  94. void WriteDataLCM(unsigned char WDLCM)
  95. {
  96.         ReadStatusLCM(); //檢測忙
  97.         LCM_Data = WDLCM;
  98.         LCM_RS = 1;
  99.         Delay10us(1);
  100.         LCM_RW = 0;
  101.         Delay10us(1);
  102.         LCM_E = 0; //若晶振速度太高可以在這后加小的延時
  103.         Delay10us(1);
  104.         LCM_E = 0; //延時
  105.         Delay10us(1);
  106.         LCM_E = 1;
  107.         Delay10us(1);
  108. }

  109. //****************寫指令*************************//
  110. void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC為0時忽略忙檢測
  111. {
  112.         if (BuysC) ReadStatusLCM(); //根據需要檢測忙
  113.         LCM_Data = WCLCM;
  114.         LCM_RS = 0;
  115.         Delay10us(1);
  116.         LCM_RW = 0;        
  117.         Delay10us(1);
  118.         LCM_E = 0;
  119.         Delay10us(1);
  120.         LCM_E = 0;
  121.         Delay10us(1);
  122.         LCM_E = 1;
  123.         Delay10us(1);
  124. }



  125. //*******************LCM初始化**********************//
  126. void LCMInit(void)
  127. {
  128.         LCM_Data = 0;
  129.         WriteCommandLCM(0x38,0); //三次顯示模式設置,不檢測忙信號
  130.         delay(5);
  131.         WriteCommandLCM(0x38,0);
  132.         delay(5);
  133.         WriteCommandLCM(0x38,0);
  134.         delay(5);

  135.         WriteCommandLCM(0x38,1); //顯示模式設置,開始要求每次檢測忙信號
  136.         WriteCommandLCM(0x08,1); //關閉顯示
  137.         WriteCommandLCM(0x01,1); //顯示清屏
  138.         WriteCommandLCM(0x06,1); // 顯示光標移動設置
  139.         WriteCommandLCM(0x0c,1); // 顯示開及光標設置
  140. }

  141. //*********************按指定位置顯示一個字符***********************//
  142. void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
  143. {
  144.         Y &= 0x1;
  145.         X &= 0xF; //限制X不能大于15,Y不能大于1
  146.         if (Y) X |= 0x40; //當要顯示第二行時地址碼+0x40;
  147.         X |= 0x80; //算出指令碼
  148.         WriteCommandLCM(X, 1); //發命令字
  149.         WriteDataLCM(DData); //發數據
  150. }

  151. //**********************按指定位置顯示一串字符*************************//
  152. void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
  153. {
  154.         unsigned char ListLength;

  155.   ListLength = 0;
  156.         Y &= 0x1;
  157.         X &= 0xF; //限制X不能大于15,Y不能大于1
  158.         while (DData[ListLength]>0x19) //若到達字串尾則退出
  159.                 {
  160.                         if (X <= 0xF) //X坐標應小于0xF
  161.                                 {
  162.                                         DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符
  163.                                         ListLength++;
  164.                                         X++;
  165.                                 }
  166.                 }
  167. }


  168. /***************************************************************************/

  169. /*定時器0中斷*/
  170. void timer0() interrupt 1        //T0中斷用來計數器溢出,超過測距范圍
  171. {
  172.         flag=1;                                                         //中斷溢出標志                        
  173. }
  174. void  StartModule()                          //啟動超聲波模塊
  175. {
  176.           TX=1;                                             //啟動一次模塊
  177.       Delay10us(2);
  178.           TX=0;
  179. }
  180.         
  181. /*小車前進*/
  182. void forward()
  183. {
  184.         left_motor_go; //左電機前進
  185.         right_motor_go; //右電機前進
  186. }

  187. /*PWM控制使能 小車后退*/
  188. void backward()
  189. {
  190.         left_motor_back; //左電機后退
  191.         right_motor_back; //右電機后退        
  192. }

  193. /*小車左轉*/
  194. /*小車停止*/
  195. void stop()
  196. {
  197.         right_motor_stops;//右電機停止
  198.         left_motor_stops; //左電機停止        
  199. }

  200. /*PWM控制使能 小車高速左轉*/
  201. void left_rapidly()
  202. {
  203.         left_motor_back;
  204.         right_motor_go;        
  205. }

  206. void right_rapidly()
  207. {
  208.         left_motor_go;
  209.         right_motor_back;        
  210. }

  211. /*定時器1中斷輸出PWM信號*/
  212. void timer1() interrupt 3
  213. {
  214.         pwm_t++;//周期計時加
  215.         if(pwm_t == 255)
  216.                 pwm_t = EN1 = EN2 = 0;
  217.         if(pwm_left_val == pwm_t)//左電機占空比        
  218.                 EN1 = 1;               
  219.         if(pwm_right_val == pwm_t)//右電機占空比
  220.                 EN2 = 1;                        
  221. }
  222. /*判斷S2是否被按下*/
  223. void keyscan()
  224. {
  225.         for(;;)        //死循環
  226.         {
  227.                 if(key_s2 == 0)// 實時檢測S2按鍵是否被按下
  228.                 {
  229.                         delay(5); //軟件消抖
  230.                         if(key_s2 == 0)//再檢測S2是否被按下
  231.                         {
  232.                                 while(!key_s2);//松手檢測
  233.                                 beep = 0;        //使能有源蜂鳴器
  234.                                 delay(200);//200毫秒延時
  235.                                 beep = 1;        //關閉有源蜂鳴器
  236.                                 break;                //退出FOR死循環
  237.                         }
  238.                 }
  239.         }        
  240. }

  241. /*計算超聲波所測距離并顯示*/
  242. void Conut(void)
  243. {
  244.         time=TH0*256+TL0;
  245.         TH0=0;
  246.         TL0=0;
  247.         
  248.         S=(float)(time*1.085)*0.17;     //算出來是MM
  249.         if((S>=7000)||flag==1) //超出測量范圍
  250.         {         
  251.                 flag=0;
  252.                 DisplayListChar(0, 1, table1);//1602顯示數組table1
  253.         }
  254.         else
  255.         {
  256.                 disbuff[0]=S/1000; //距離數值千位
  257.                 disbuff[1]=S%1000/100;//距離數值百位
  258.                 disbuff[2]=S%100/10;//距離數值十位
  259.                 disbuff[3]=S%10; //距離數值個位
  260.             DisplayListChar(0, 1, table); //顯示:Distance:000.0cm
  261.             DisplayOneChar(9, 1, ASCII[disbuff[0]]); //顯示千位
  262.             DisplayOneChar(10, 1, ASCII[disbuff[1]]);        
  263.             DisplayOneChar(11, 1, ASCII[disbuff[2]]);
  264.         DisplayOneChar(12, 1, ASCII[10]);                //顯示 .        
  265.             DisplayOneChar(13, 1, ASCII[disbuff[3]]);
  266.         }
  267. }

  268. /*超聲波避障*******************************************************************/
  269. void        Avoid()
  270. {        
  271. if(u==0)
  272. {
  273.         if(S <180)//設置避障距離 ,單位毫米        剎車距離
  274.         {
  275.                 //beep = 0;//使能蜂鳴器
  276.                 stop();//停車
  277.                 backward();//后退
  278.                 delay(100);//后退時間越長、距離越遠。后退是為了留出車輛轉向的空間
  279.                
  280.                 do{
  281.                         
  282.                         right_rapidly();//高速右轉
  283.                         delay(200);//時間越長 轉向角度越大,與實際行駛環境有關
  284.                         stop();//停車
  285.                         delay(100);//時間越長 停止時間越久

  286.                         StartModule();        //啟動模塊測距,再次判斷是否
  287.                         while(!RX);                //當RX(ECHO信號回響)為零時等待
  288.                         TR0=1;                            //開啟計數
  289.                         while(RX);                        //當RX為1計數并等待
  290.                         TR0=0;                                //關閉計數
  291.                         Conut();                        //計算距離
  292.                         if(S<200)                                          /**************************小車左掉頭180*********************************************/
  293.                         {
  294.                         left_rapidly();//高速左轉
  295.                         delay(310);//時間越長 轉向角度越大,與實際行駛環境有關        
  296.                         stop();//停車
  297.                         delay(100);//時間越長 停止時間越久長
  298.                         z=z+1;
  299.                         }        
  300.                         if(z>=3)
  301.                         {
  302.                         forward();//前進        
  303.                         u=1;
  304.                         }
  305.                         StartModule();        //啟動模塊測距,再次判斷是否
  306.                         while(!RX);                //當RX(ECHO信號回響)為零時等待
  307.                         TR0=1;                            //開啟計數
  308.                         while(RX);                        //當RX為1計數并等待
  309.                         TR0=0;                                //關閉計數
  310.                         Conut();
  311.                         }while(S < 140);//判斷前面障礙物距離
  312.                 beep = 1;//關閉蜂鳴器
  313.        }
  314.         else
  315.         {
  316.                 forward();//前進
  317.         }        
  318. }


  319. else
  320.          {
  321.                  if(v==0)
  322.                 {
  323.                 if(S<530)
  324.                         {
  325.                         u=1;                 /********************************************************************/
  326.                     stop();//停車
  327.                     backward();//后退
  328.                     delay(100);//后退時間越長、距離越遠。后退是為了留出車輛轉向的空間
  329.                         left_rapidly();//高速左轉
  330.                         delay(200);//時間越長 轉向角度越大,與實際行駛環境有關
  331.                         stop();//停車
  332.                         delay(100);//時間越長 停止時間越久
  333.                         v=1;
  334.                         }
  335.                         else
  336.                                 forward();//前進
  337.                         
  338.                 }
  339.            else
  340.            {
  341.          if(S < 500)//設置避障距離 ,單位毫米        剎車距離
  342.           {
  343.                 //beep = 0;//使能蜂鳴器
  344.                 stop();//停車
  345.                 backward();//后退
  346.                 delay(100);//后退時間越長、距離越遠。后退是為了留出車輛轉向的空間
  347.                         do{
  348.                         right_rapidly();//高速右轉
  349.                         delay(200);//時間越長 轉向角度越大,與實際行駛環境有關
  350.                         stop();//停車
  351.                         delay(100);//時間越長 停止時間越久
  352.                         forward();//前進
  353.                         delay(400);
  354.                         left_rapidly();//高速左轉
  355.                         delay(310);//時間越長 轉向角度越大,與實際行駛環境有關        
  356.                         stop();//停車
  357.                         delay(100);//時間越長 停止時間越久長
  358.                          o=0;               
  359.                         }while(S < 140);//判斷前面障礙物距離
  360.         }
  361.           else
  362.             {
  363.                 forward();//前進
  364.          }
  365.          }               
  366.     }
  367. }
  368. void main()
  369. {

  370.         
  371.         cmg88();//關數碼管
  372.         LCMInit(); //LCM初始化
  373.         delay(5);//延時片刻

  374.         DisplayListChar(0, 0, Range);//1602第一行顯示Range數組內容
  375.         DisplayListChar(0, 1, table);//1602第二行顯示table數組內容
  376.         keyscan();//等待按下S2啟動小車
  377.         delay(1000);//延時1秒
  378.         TMOD |= 0x20;//定時器1工作模式2,8位自動重裝。用于產生PWM
  379.         TMOD |= 0x01;//定時器0工作模塊1,16位定時模式。T0用測ECH0脈沖長度
  380.         TH1 = 220; //
  381.         TL1 = 220; //100HZ T1
  382.         TH0        = 0;
  383.     TL0        = 0;//T0,16位定時計數用于記錄ECHO高電平時間         
  384.     ET1        = 1;//允許T1中斷
  385.         ET0 = 1;//允許T0中斷
  386.         TR1 = 1;//啟動定時器1
  387. ……………………

  388. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼



所有資料51hei提供下載:
智能小車.rar (11.62 MB, 下載次數: 49)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:187963 發表于 2018-9-1 10:07 | 只看該作者
厲害啊大佬
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美在线视频 | 国产羞羞视频在线观看 | 日韩毛片在线视频 | 国内精品视频在线 | 中文精品视频 | 一区二区久久电影 | 亚洲精品久久久久久久久久久久久 | 日韩久久久久久久 | 日韩中文字幕视频在线 | 91久久久精品国产一区二区蜜臀 | 黄网站免费观看 | 美女久久| 国产在线不卡视频 | av中文网 | 国产精品一区二区在线 | 国产精品高潮呻吟久久av黑人 | 欧美aaa级 | 国产精品久久片 | 中文字幕在线精品 | 欧美性久久久 | 中文字幕不卡 | 欧美久久国产 | 久久久久国产一区二区三区四区 | www.婷婷| 亚洲欧美日本在线 | 亚洲h在线观看 | 久久综合狠狠综合久久综合88 | 中文字幕在线观看av | 欧美在线观看一区二区 | 亚洲性人人天天夜夜摸 | 国产欧美一区二区三区久久人妖 | av网站免费观看 | 夜夜摸夜夜操 | 亚洲不卡| 日韩中文av在线 | 天天干免费视频 | 91九色porny首页最多播放 | 日韩在线精品 | 天天久久 | 欧美精品一区二区三区在线 | 国产成人精品免费视频大全最热 |