找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3085|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

強(qiáng)悍版智能小車

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:140725 發(fā)表于 2016-10-16 17:44 | 只看該作者 |只看大圖 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
    智能小車一直以來都是電子設(shè)計(jì)大賽題目的座上賓。尤其是難度高的那一類題目,讓不少單片機(jī)愛好者和參加大賽的學(xué)生頭疼。小車在各個模塊的協(xié)同作用下,可以上坡、測量和障礙物的距離,跨越障礙物如履平地。完美實(shí)現(xiàn)小車的控制:左轉(zhuǎn)、右轉(zhuǎn)、前進(jìn)、后退和停止等操作 。
    優(yōu)酷觀看視頻
         http://v.youku.com/v_show/id_XMzE0NTA5MzAw.html




所有資料打包下載:
智能小車原理圖和程序.zip (620.87 KB, 下載次數(shù): 13)

  1. /***********************************************************************************************************/
  2. //DZR-01A V2.0 超聲波測距模塊 DEMO 程序
  3. //晶振:11.0592MHz 單片機(jī):STC12C5A60S2
  4. //程序編寫:Roling
  5. //本程序在DZR-01A開發(fā)板上測試有效
  6. //接線:模塊TRIG接 P20  ECH0 接P21
  7. /***********************************************************************************************************/            
  8. #include <STC.h>
  9. #include <ConfigOfDZR01A.h>
  10. #include <InitConfigOfDZR01A.c>
  11. #include <intrins.h>

  12. #define  OFF        0 //關(guān)
  13. #define  ON          1 //開
  14. #define  ECHO  P21
  15. #define  TRIG  P20
  16. unsigned char code TableData[12] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F/*0-9*/,0x00/*無*/,0x40/*-*/};//數(shù)碼管數(shù)字0-9
  17. unsigned char code TableSeg [ 8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};         //數(shù)碼管位置0-7
  18. unsigned char disbuff[8] = { 10,10,10,10,11,11,11,11};                                                        //顯示數(shù)組
  19. bit        flag =0;        //時間溢出標(biāo)志位
  20. bit begin;          //啟動超聲波模塊標(biāo)志

  21. /***************************************************************************************
  22. ** 函數(shù)名稱: void Delay_ms(unsigned int ms)
  23. ** 功能描述: 延時函數(shù)
  24. ** 輸   入: unsigned int ms  延時時間
  25. ** 輸   出: 無
  26. ** 全局變量: 無
  27. ** 調(diào)用模塊: 無
  28. ****************************************************************************************
  29. void Delay_ms(unsigned int ms)
  30. {
  31.         unsigned char i;
  32.         for(;ms>0;ms--)
  33.                 for(i=127;i>0;i--)
  34.                         ;
  35. }
  36. ********************************************************/
  37. void Conut(void)
  38. {
  39.         unsigned int  time=0;
  40.         unsigned long S = 0;
  41.         time = TH0*256 + TL0;
  42.         TH0 = 0;
  43.         TL0 = 0;
  44.        
  45.         S = (time * 1.8445)/100;     //[1.85]算出來是CM,乘以1.085原因是采用11.0592M的晶振,12M晶振乘以1.0
  46.         if((S >= 700) || flag) //超出測量范圍顯示“-”
  47.         {         
  48.                 flag=0;
  49. //                disbuff[0]=11;           //“-”
  50. //                disbuff[1]=11;           //“-”
  51. //                disbuff[2]=11;           //“-”
  52.         }
  53.         else
  54.         {
  55.                 disbuff[0] = S%1000/100;
  56.                 disbuff[1] = S%1000%100/10;
  57.                 disbuff[2] = S%1000%10 %10;
  58.         }
  59. }
  60. /********************************************************/
  61. void  EnableUltrasonic() //啟動超聲波模塊
  62. {
  63.         unsigned char i;       
  64.         TR0  = 1;
  65.         TH0  = 0;
  66.         TL0  = 0;
  67.         while(!begin);
  68.         begin = 0;
  69.         TRIG = 1;                                        //800MS  啟動一次模塊
  70.         for(i=12;i>0;i--)
  71.         {
  72.                  _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
  73.                 _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
  74.         }
  75.         TRIG = 0;
  76. }
  77. /*********************************************************/

  78. void  main(  void  )
  79. {
  80.         InitConfigOfDZR01A();
  81.         TRIG = 0;
  82.         ECHO = 1;   
  83.         TMOD = 0x11;                           //設(shè)T0為方式1,GATE=1;         
  84.         ET1  = 1;                     //允許T0中斷
  85.         TR1  = 1;
  86.         EA   = 1;                                   //開啟總中斷
  87.         begin = 0;
  88.         while(1)
  89.         {
  90.                 EnableUltrasonic();
  91.                 while(1)
  92.                 {
  93.                         if(ECHO==1)        {TH0  = 0;TL0  = 0;TR0  = 1; break;}
  94.                         if(TH0&0x80){flag = 1; break;}
  95.                 }
  96.                 while(1)
  97.                 {
  98.                         if(ECHO==0)        {TR0  = 0; break;}
  99.                         if(TH0&0x80){flag = 1; break;}
  100.                 }
  101.                 Conut();                        //計(jì)算

  102.         }
  103. }
  104. /***************************************************************************************
  105. ** 函數(shù)名稱: void T1int() interrupt 3
  106. ** 功能描述: 定時器1中斷
  107. ** 輸   入: 無
  108. ** 輸   出: 無
  109. ** 全局變量: 無
  110. ** 調(diào)用模塊: 無
  111. ****************************************************************************************/
  112. void T1int() interrupt 3//定時器1中斷
  113. {
  114.         static unsigned char count=0;
  115.         unsigned char num;
  116.         TH1 = 0xFA;
  117.         TL1 = 0x00;
  118.         num = count %8;

  119.         NUX_DATA = TableData[disbuff[num]];//讀取數(shù)組第0個數(shù)據(jù),數(shù)據(jù)為數(shù)碼管字模0.  
  120.         NUX_CS_DUAN = 1;//段數(shù)據(jù)送入573
  121.         NUX_CS_DUAN = 0;//把段數(shù)據(jù)鎖存到573
  122.         NUX_DATA = TableSeg [num];// 1111 1110
  123.         NUX_CS_WEI = 1;//位數(shù)據(jù)
  124.         NUX_CS_WEI = 0;//
  125.         count++;
  126.         if(count==255){begin = 1;}       
  127. }
  128.                
復(fù)制代碼
  1. /****************************************************************************************
  2. **
  3. **                          (c) Copyright 2008,  DZR(電子人)
  4. **                                 All Rights Reserved
  5. **                                                      
  6. ** -------------------------------------文件信息---------------------------------------
  7. ** 文   件   名:  ConfigOfDZR01A.h
  8. ** 創(chuàng)   建   人:  劉家友
  9. ** 描       述:  DZR(電子人) 開發(fā)板硬件配置
  10. **
  11. ** ------------------------------------------------------------------------------------
  12. **
  13. ***************************************************************************************/
  14. #ifndef _DZR_01_CONFIG_H_
  15. #define _DZR_01_CONFIG_H_

  16. // DZR(電子人) 開發(fā)板硬件配置
  17. // 8*LED燈
  18. #define LED_CS                P25         // LED燈片選,高電平有效
  19. #define LED_DATA        P0                // LED燈數(shù)據(jù),1亮0滅。(共用數(shù)據(jù)引腳:LED,數(shù)碼管,液晶)
  20. // 共陰數(shù)碼管
  21. #define NUX_CS_DUAN        P27         // 數(shù)碼管段片選,此引腳高電平有效,
  22. #define NUX_CS_WEI        P26         // 數(shù)碼管位片選,此引腳高電平有效,
  23. #define NUX_DATA        P0          // 數(shù)碼管數(shù)據(jù)腳,數(shù)碼管為共陰數(shù)碼管,段數(shù)據(jù)給高有效        ,位數(shù)據(jù)給低有效

  24. // 獨(dú)立按鍵和中斷按鍵,中斷引腳為P33,采用外部中斷1
  25. #define KEY1                P34         // 按鍵1,默認(rèn)為高電平,鍵按下為低。此引腳和PS2鍵盤的PS2_DATA引腳共用,
  26.                                                         //        在用PS2鼠標(biāo)鍵盤的時候,此按鍵不能使用。
  27. #define KEY2                P32                // 按鍵2,默認(rèn)為高電平,鍵按下為低。此引腳為中斷0,和PS2鍵盤的PS2_CLK
  28.                                                         //        引腳共用,在用PS2鼠標(biāo)鍵盤的時候,此按鍵注意使用。
  29. #define KEY3                P12                // 按鍵3,默認(rèn)為高電平,鍵按下為低。此引腳和無線模塊的 NRF_CE 引腳共用
  30.                                                         //        ,在無線模塊使用的時候,此按鍵注意使用。
  31. #define KEY4                P10                // 按鍵4,默認(rèn)為高電平,鍵按下為低。此引腳具有第二功能:PWM,可以控制直
  32.                                                         //        流電機(jī)的轉(zhuǎn)速,作為電機(jī)控制的時候內(nèi)部IO設(shè)置為推挽狀態(tài)。
  33. // AD按鍵
  34. #define KEY_AD                P11                // STC12C5A60S2單片機(jī)的P1口具有AD的第二功能,開發(fā)板8個AD按鍵在此引腳讀
  35.                             //        取。本引腳為ADC的1通道。
  36. #define KEY_AD_UP    0x00        // AD按鍵“上”鍵值
  37. #define KEY_AD_DOWN  0x21        // AD按鍵“下”鍵值 20
  38. #define KEY_AD_LEFT         0x0B        // AD按鍵“左”鍵值 0C
  39. #define KEY_AD_RIGHT 0x3A        // AD按鍵“右”鍵值 3B
  40. #define KEY_AD_A            0x6F        // AD按鍵“A” 鍵值 6E
  41. #define KEY_AD_B         0xA3        // AD按鍵“B” 鍵值 A4
  42. #define KEY_AD_C         0xF4        // AD按鍵“C” 鍵值        F5
  43. #define KEY_AD_D         0xD6        // AD按鍵“D” 鍵值        D7

  44. // 鼠標(biāo)鍵盤口
  45. #define PS2_CLK         P32                 // PS2的時鐘線,接外部0號中斷INT0,和按鍵 KEY2共用。
  46. #define PS2_DATA         P34                // PS2的數(shù)據(jù)線,和按鍵KEY1共用。

  47. // 紅外遙控器接收口
  48. #define HS0038                P33                // 紅外中斷接收引腳,采用外部1號中斷INT1,和中斷按鍵共用中斷口。

  49. // 8*8點(diǎn)陣:采用了兩塊74HC595芯片串聯(lián),第一塊為控制點(diǎn)陣列(0有效),第二塊為控制點(diǎn)陣行(1有效),
  50. //          由于和DS1302和TEA5767共用數(shù)據(jù)線。
  51. #define LAT_SHCP        P37                // 74HC595移位寄存器時鐘輸入
  52. #define LAT_STCP        P35                // 74HC595存儲寄存器時鐘輸入
  53. #define LAT_SDI                P36         // 74HC595串行數(shù)據(jù)輸入

  54. // LCD1602字符液晶:兩行,一行16個字符,顯示ASCII碼字符和自定義字符,亮度調(diào)節(jié)按鈕往上。
  55. #define LCD_1602_BUSY        P07        // LCD1602檢測忙信號線
  56. #define LCD_1602_RS                P22        // LCD1602數(shù)據(jù)/命令(H/L)選擇端
  57. #define LCD_1602_RW                P24        // LCD1602讀/寫(H/L)選擇端
  58. #define LCD_1602_EN                P23        // LCD1602使能信號高有效
  59. #define LCD_1602_DATA        P0        // LCD1602并行數(shù)據(jù)線

  60. // LCD12864液晶:128列,64行,開發(fā)板提供圖形液晶和帶字庫液晶接口。
  61. #define LCD_12864_RS        P22        // LCD12864數(shù)據(jù)/命令(H/L)選擇端
  62. #define LCD_12864_RW        P24        // LCD12864讀/寫(H/L)選擇端
  63. #define LCD_12864_EN        P23        // LCD12864使能信號高有效
  64. #define LCD_12864_CSA        P21        // LCD12864左半屏選擇端
  65. #define LCD_12864_CSB        P20        // LCD12864右半屏選擇端
  66. #define LCD_12864_DATA        P0        // LCD12864并行數(shù)據(jù)線
  67. #define LCD_12864_BUSY        P07 // LCD12864忙信號位

  68. // TFT液晶128*160分辨率,65K色彩屏。
  69. #define TFT_RD                P24                // TFT液晶讀信號線
  70. #define TFT_WR                P23                // TFT液晶寫信號線
  71. #define TFT_RS                P22                // TFT液晶指令信號線
  72. #define TFT_CS1                P21                // TFT液晶片選信號線
  73. #define TFT_DATA        P0                // TFT液晶并行數(shù)據(jù)線

  74. // DS1302時鐘
  75. #define DS1302_RES        P13                // DS1302復(fù)位線,內(nèi)部帶40K的下拉電阻。
  76. #define DS1302_SCL        P35                // DS1302時鐘線
  77. #define DS1302_SDA        P36                // DS1302數(shù)據(jù)線

  78. // PCF8591:芯片內(nèi)部帶4 AD和1 DA,光敏電阻采用AIN0,熱敏電阻采用AIN1,DA輸出接了LED燈,可控制其亮度。
  79. //          本芯片采用IIC總線控制,由于和DS1302共用線,所以在一般使用的時候需把 DS1302_RES 引腳置
  80. //          低電平。
  81. #define PCF_SCL                P35                // PCF8591的IIC時鐘線
  82. #define PCF_SDA                P36                // PCF8591的IIC數(shù)據(jù)線

  83. // TEA5767收音機(jī):采用IIC總線控制,由于和DS1302共用線,所以在一般使用的時候需把 DS1302_RES 引腳置
  84. //          低電平。
  85. #define TEA_SDA                P36                // TEA5767的IIC時鐘線
  86. #define TEA_SCL                P35                // TEA5767的IIC數(shù)據(jù)線

  87. // nRF24L01無線模塊:采用SPI協(xié)議,可以直接使用STC12C5A60S2內(nèi)部SPI控制器控制,也可以用單片機(jī)模擬
  88. //          SPI總線原理。注意:NRF_CE和按鍵 KEY3 共用引腳,在使用無線模塊的時候,慎用KEY3。
  89. #define NRF_CE                P12         // RX 或TX 模式選擇
  90. #define NRF_CSN                P14                // SPI片選信號
  91. #define NRF_SCK                P17                // SPI時鐘信號
  92. #define NRF_MOSI        P15                // 從SPI數(shù)據(jù)輸入腳
  93. #define NRF_MISO        P16                // 從SPI數(shù)據(jù)輸出腳

  94. // SD卡:采用SPI協(xié)議,能完成SD卡的數(shù)據(jù)存取。注意:本數(shù)據(jù)口和nRF24L01無線模塊共用引腳,注意使用。
  95. #define SD_DO                 P16                // 從SPI數(shù)據(jù)輸出腳
  96. #define SD_CK                 P17                // SPI時鐘信號
  97. #define SD_DI                 P15                // 從SPI數(shù)據(jù)輸入腳
  98. #define SD_CS                 P14                // SPI片選信號
  99. //超聲波:由于超聲波模塊這兩根線是和LCD12864共用了線,所以在使用超聲波模塊時,P12短路冒要打到12864端
  100. #define Ultrasonic_R        P21        // 超聲波接收端
  101. #define Ultrasonic_T        P20        // 超聲波發(fā)送端
  102. // DS18B20溫度傳感器:單總線方式,控制A和B。注意:一般的單片機(jī)沒有P44口,STC12C5A60S2本芯片可以
  103. //          直接操作!
  104. #define DQ                                 P44                //DS18B20單總線
  105. #define SETDS18B20()        P4SW = 0x10        //設(shè)置STC單片機(jī)P44腳使能有效               
  106. //以下引腳和LED共用一個74HC573鎖存器,因此引腳共用
  107. #define MOTO_CS                P25                // motor片選,高電平有效
  108. #define MOTO                P0                // motor
  109. #define RELAY                P06                // 繼電器 1有效                       
  110. #define SPEAK                P05                  // 蜂鳴器 1有效
  111. #define MOTOA                P04                  // 步進(jìn)電機(jī)A引腳 1有效
  112. #define MOTOB                P03                   // 步進(jìn)電機(jī)B引腳 1有效
  113. #define MOTOC                P02                   // 步進(jìn)電機(jī)C引腳 1有效
  114. #define MOTOD                P01                  // 步進(jìn)電機(jī)D引腳 1有效
  115. #define DM                        P00                  // 直流電機(jī)引腳,注意P10有PWM功能,但是接P10需把P10設(shè)置為推挽方式。

  116. // DZR(電子人) 開發(fā)板硬件配置
  117. #endif
復(fù)制代碼



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

相關(guān)帖子

回復(fù)

使用道具 舉報

沙發(fā)
ID:57657 發(fā)表于 2016-10-16 19:21 | 只看該作者
本帖最后由 npn 于 2016-10-16 19:23 編輯

制作很簡單的吧,超聲波測距距離小于指定距離倒退到距離以外然后控制隨機(jī)轉(zhuǎn)向,否則繼續(xù)前行。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表