智能小车一直以来都是电子设计大赛题目的座上宾。尤其是难度高的那一类题目,让不少单片机爱好者和参加大赛的学生头疼。小车在各个模块的协同作用下,可以上坡、测量和障碍物的距离,跨越障碍物如履平地。完美实现小车的控制:左转、右转、前进、后退和停止等操作 。
优酷观看视频
http://v.youku.com/v_show/id_XMzE0NTA5MzAw.html
所有资料打包下载:
智能小车原理图和程序.zip
(620.87 KB, 下载次数: 13)
- /***********************************************************************************************************/
- //DZR-01A V2.0 超声波测距模块 DEMO 程序
- //晶振:11.0592MHz 单片机:STC12C5A60S2
- //程序编写:Roling
- //本程序在DZR-01A开发板上测试有效
- //接线:模块TRIG接 P20 ECH0 接P21
- /***********************************************************************************************************/
- #include <STC.h>
- #include <ConfigOfDZR01A.h>
- #include <InitConfigOfDZR01A.c>
- #include <intrins.h>
- #define OFF 0 //关
- #define ON 1 //开
- #define ECHO P21
- #define TRIG P20
- unsigned char code TableData[12] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F/*0-9*/,0x00/*无*/,0x40/*-*/};//数码管数字0-9
- unsigned char code TableSeg [ 8] = {0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; //数码管位置0-7
- unsigned char disbuff[8] = { 10,10,10,10,11,11,11,11}; //显示数组
- bit flag =0; //时间溢出标志位
- bit begin; //启动超声波模块标志
- /***************************************************************************************
- ** 函数名称: void Delay_ms(unsigned int ms)
- ** 功能描述: 延时函数
- ** 输 入: unsigned int ms 延时时间
- ** 输 出: 无
- ** 全局变量: 无
- ** 调用模块: 无
- ****************************************************************************************
- void Delay_ms(unsigned int ms)
- {
- unsigned char i;
- for(;ms>0;ms--)
- for(i=127;i>0;i--)
- ;
- }
- ********************************************************/
- void Conut(void)
- {
- unsigned int time=0;
- unsigned long S = 0;
- time = TH0*256 + TL0;
- TH0 = 0;
- TL0 = 0;
-
- S = (time * 1.8445)/100; //[1.85]算出来是CM,乘以1.085原因是采用11.0592M的晶振,12M晶振乘以1.0
- if((S >= 700) || flag) //超出测量范围显示“-”
- {
- flag=0;
- // disbuff[0]=11; //“-”
- // disbuff[1]=11; //“-”
- // disbuff[2]=11; //“-”
- }
- else
- {
- disbuff[0] = S%1000/100;
- disbuff[1] = S%1000%100/10;
- disbuff[2] = S%1000%10 %10;
- }
- }
- /********************************************************/
- void EnableUltrasonic() //启动超声波模块
- {
- unsigned char i;
- TR0 = 1;
- TH0 = 0;
- TL0 = 0;
- while(!begin);
- begin = 0;
- TRIG = 1; //800MS 启动一次模块
- for(i=12;i>0;i--)
- {
- _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
- _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
- }
- TRIG = 0;
- }
- /*********************************************************/
- void main( void )
- {
- InitConfigOfDZR01A();
- TRIG = 0;
- ECHO = 1;
- TMOD = 0x11; //设T0为方式1,GATE=1;
- ET1 = 1; //允许T0中断
- TR1 = 1;
- EA = 1; //开启总中断
- begin = 0;
- while(1)
- {
- EnableUltrasonic();
- while(1)
- {
- if(ECHO==1) {TH0 = 0;TL0 = 0;TR0 = 1; break;}
- if(TH0&0x80){flag = 1; break;}
- }
- while(1)
- {
- if(ECHO==0) {TR0 = 0; break;}
- if(TH0&0x80){flag = 1; break;}
- }
- Conut(); //计算
- }
- }
- /***************************************************************************************
- ** 函数名称: void T1int() interrupt 3
- ** 功能描述: 定时器1中断
- ** 输 入: 无
- ** 输 出: 无
- ** 全局变量: 无
- ** 调用模块: 无
- ****************************************************************************************/
- void T1int() interrupt 3//定时器1中断
- {
- static unsigned char count=0;
- unsigned char num;
- TH1 = 0xFA;
- TL1 = 0x00;
- num = count %8;
- NUX_DATA = TableData[disbuff[num]];//读取数组第0个数据,数据为数码管字模0.
- NUX_CS_DUAN = 1;//段数据送入573
- NUX_CS_DUAN = 0;//把段数据锁存到573
- NUX_DATA = TableSeg [num];// 1111 1110
- NUX_CS_WEI = 1;//位数据
- NUX_CS_WEI = 0;//
- count++;
- if(count==255){begin = 1;}
- }
-
复制代码
|