找回密码
 立即注册

QQ登录

只需一步,快速开始

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

强悍版智能小车

[复制链接]
跳转到指定楼层
楼主
    智能小车一直以来都是电子设计大赛题目的座上宾。尤其是难度高的那一类题目,让不少单片机爱好者和参加大赛的学生头疼。小车在各个模块的协同作用下,可以上坡、测量和障碍物的距离,跨越障碍物如履平地。完美实现小车的控制:左转、右转、前进、后退和停止等操作 。
    优酷观看视频
         http://v.youku.com/v_show/id_XMzE0NTA5MzAw.html




所有资料打包下载:
智能小车原理图和程序.zip (620.87 KB, 下载次数: 13)

  1. /***********************************************************************************************************/
  2. //DZR-01A V2.0 超声波测距模块 DEMO 程序
  3. //晶振:11.0592MHz 单片机:STC12C5A60S2
  4. //程序编写:Roling
  5. //本程序在DZR-01A开发板上测试有效
  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 //关
  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/*-*/};//数码管数字0-9
  17. unsigned char code TableSeg [ 8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};         //数码管位置0-7
  18. unsigned char disbuff[8] = { 10,10,10,10,11,11,11,11};                                                        //显示数组
  19. bit        flag =0;        //时间溢出标志位
  20. bit begin;          //启动超声波模块标志

  21. /***************************************************************************************
  22. ** 函数名称: void Delay_ms(unsigned int ms)
  23. ** 功能描述: 延时函数
  24. ** 输   入: unsigned int ms  延时时间
  25. ** 输   出: 无
  26. ** 全局变量: 无
  27. ** 调用模块: 无
  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;                           //设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();                        //计算

  102.         }
  103. }
  104. /***************************************************************************************
  105. ** 函数名称: void T1int() interrupt 3
  106. ** 功能描述: 定时器1中断
  107. ** 输   入: 无
  108. ** 输   出: 无
  109. ** 全局变量: 无
  110. ** 调用模块: 无
  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]];//读取数组第0个数据,数据为数码管字模0.  
  120.         NUX_CS_DUAN = 1;//段数据送入573
  121.         NUX_CS_DUAN = 0;//把段数据锁存到573
  122.         NUX_DATA = TableSeg [num];// 1111 1110
  123.         NUX_CS_WEI = 1;//位数据
  124.         NUX_CS_WEI = 0;//
  125.         count++;
  126.         if(count==255){begin = 1;}       
  127. }
  128.                
复制代码
  1. /****************************************************************************************
  2. **
  3. **                          (c) Copyright 2008,  DZR(电子人)
  4. **                                 All Rights Reserved
  5. **                                                      
  6. ** -------------------------------------文件信息---------------------------------------
  7. ** 文   件   名:  ConfigOfDZR01A.h
  8. ** 创   建   人:  刘家友
  9. ** 描       述:  DZR(电子人) 开发板硬件配置
  10. **
  11. ** ------------------------------------------------------------------------------------
  12. **
  13. ***************************************************************************************/
  14. #ifndef _DZR_01_CONFIG_H_
  15. #define _DZR_01_CONFIG_H_

  16. // DZR(电子人) 开发板硬件配置
  17. // 8*LED灯
  18. #define LED_CS                P25         // LED灯片选,高电平有效
  19. #define LED_DATA        P0                // LED灯数据,1亮0灭。(共用数据引脚:LED,数码管,液晶)
  20. // 共阴数码管
  21. #define NUX_CS_DUAN        P27         // 数码管段片选,此引脚高电平有效,
  22. #define NUX_CS_WEI        P26         // 数码管位片选,此引脚高电平有效,
  23. #define NUX_DATA        P0          // 数码管数据脚,数码管为共阴数码管,段数据给高有效        ,位数据给低有效

  24. // 独立按键和中断按键,中断引脚为P33,采用外部中断1
  25. #define KEY1                P34         // 按键1,默认为高电平,键按下为低。此引脚和PS2键盘的PS2_DATA引脚共用,
  26.                                                         //        在用PS2鼠标键盘的时候,此按键不能使用。
  27. #define KEY2                P32                // 按键2,默认为高电平,键按下为低。此引脚为中断0,和PS2键盘的PS2_CLK
  28.                                                         //        引脚共用,在用PS2鼠标键盘的时候,此按键注意使用。
  29. #define KEY3                P12                // 按键3,默认为高电平,键按下为低。此引脚和无线模块的 NRF_CE 引脚共用
  30.                                                         //        ,在无线模块使用的时候,此按键注意使用。
  31. #define KEY4                P10                // 按键4,默认为高电平,键按下为低。此引脚具有第二功能:PWM,可以控制直
  32.                                                         //        流电机的转速,作为电机控制的时候内部IO设置为推挽状态。
  33. // AD按键
  34. #define KEY_AD                P11                // STC12C5A60S2单片机的P1口具有AD的第二功能,开发板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. // 鼠标键盘口
  45. #define PS2_CLK         P32                 // PS2的时钟线,接外部0号中断INT0,和按键 KEY2共用。
  46. #define PS2_DATA         P34                // PS2的数据线,和按键KEY1共用。

  47. // 红外遥控器接收口
  48. #define HS0038                P33                // 红外中断接收引脚,采用外部1号中断INT1,和中断按键共用中断口。

  49. // 8*8点阵:采用了两块74HC595芯片串联,第一块为控制点阵列(0有效),第二块为控制点阵行(1有效),
  50. //          由于和DS1302和TEA5767共用数据线。
  51. #define LAT_SHCP        P37                // 74HC595移位寄存器时钟输入
  52. #define LAT_STCP        P35                // 74HC595存储寄存器时钟输入
  53. #define LAT_SDI                P36         // 74HC595串行数据输入

  54. // LCD1602字符液晶:两行,一行16个字符,显示ASCII码字符和自定义字符,亮度调节按钮往上。
  55. #define LCD_1602_BUSY        P07        // LCD1602检测忙信号线
  56. #define LCD_1602_RS                P22        // LCD1602数据/命令(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并行数据线

  60. // LCD12864液晶:128列,64行,开发板提供图形液晶和带字库液晶接口。
  61. #define LCD_12864_RS        P22        // LCD12864数据/命令(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并行数据线
  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液晶并行数据线

  74. // DS1302时钟
  75. #define DS1302_RES        P13                // DS1302复位线,内部带40K的下拉电阻。
  76. #define DS1302_SCL        P35                // DS1302时钟线
  77. #define DS1302_SDA        P36                // DS1302数据线

  78. // PCF8591:芯片内部带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数据线

  83. // TEA5767收音机:采用IIC总线控制,由于和DS1302共用线,所以在一般使用的时候需把 DS1302_RES 引脚置
  84. //          低电平。
  85. #define TEA_SDA                P36                // TEA5767的IIC时钟线
  86. #define TEA_SCL                P35                // TEA5767的IIC数据线

  87. // nRF24L01无线模块:采用SPI协议,可以直接使用STC12C5A60S2内部SPI控制器控制,也可以用单片机模拟
  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数据输入脚
  93. #define NRF_MISO        P16                // 从SPI数据输出脚

  94. // SD卡:采用SPI协议,能完成SD卡的数据存取。注意:本数据口和nRF24L01无线模块共用引脚,注意使用。
  95. #define SD_DO                 P16                // 从SPI数据输出脚
  96. #define SD_CK                 P17                // SPI时钟信号
  97. #define SD_DI                 P15                // 从SPI数据输入脚
  98. #define SD_CS                 P14                // SPI片选信号
  99. //超声波:由于超声波模块这两根线是和LCD12864共用了线,所以在使用超声波模块时,P12短路冒要打到12864端
  100. #define Ultrasonic_R        P21        // 超声波接收端
  101. #define Ultrasonic_T        P20        // 超声波发送端
  102. // DS18B20温度传感器:单总线方式,控制A和B。注意:一般的单片机没有P44口,STC12C5A60S2本芯片可以
  103. //          直接操作!
  104. #define DQ                                 P44                //DS18B20单总线
  105. #define SETDS18B20()        P4SW = 0x10        //设置STC单片机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                  // 步进电机A引脚 1有效
  112. #define MOTOB                P03                   // 步进电机B引脚 1有效
  113. #define MOTOC                P02                   // 步进电机C引脚 1有效
  114. #define MOTOD                P01                  // 步进电机D引脚 1有效
  115. #define DM                        P00                  // 直流电机引脚,注意P10有PWM功能,但是接P10需把P10设置为推挽方式。

  116. // DZR(电子人) 开发板硬件配置
  117. #endif
复制代码



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

使用道具 举报

沙发
ID:57657 发表于 2016-10-16 19:21 | 只看该作者
本帖最后由 npn 于 2016-10-16 19:23 编辑

制作很简单的吧,超声波测距距离小于指定距离倒退到距离以外然后控制随机转向,否则继续前行。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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