智能循迹小车设计与制作报告
项目名称:智能寻迹小车的设计与制作
项目类型:实用型
成果形式:1、研究报告;2、实用作品
学生:刘超、侯龙腾、何强、李洪伟
指导教师:谢志明、蒋雄
一、任务
设计一台智能寻迹小车,具有按键启动、前进、左拐、右拐、刹车、自动停车和速度调节等功能,能根据下图所提供的路线进行循迹。小车能在赛道上连续完成1圈的寻迹。
1、通过智能寻迹小车任务分析与功能设计,学习单片机的原理,制定出设计方案;
2、.通过智能寻迹小车硬件系统设计、制作与装调,学习单片机原理的运用,设计硬件并制作电路板;
3、通过智能寻迹小车软件系统设计整机调试,设计软件性能并仿真调试;
4、完成相应部分的文档。
二、要求
1.基本要求
(1)输入电源:9V;
(2)具有前进、左拐、右拐、刹车、自动停车和速度调节功能;
(3)能根据提供的循迹路线进行寻迹。
2.发挥部分
(1)按键启动;
(2)转向提示
(3)鸣号提示;
(4)液晶显示相关参数;
(5)其他。
三、计划
2010年10月11日---2010年10月25日,收集资料,确定研究内容、技术方案、研究路线。(由组内4人共同研究)。
2010年10月26日---2010年11月1日,完成小车硬件的电路制作(刘超负责小车整体方案确定、制作电路板,侯龙腾负责购买元器件和电路焊接,何强负责电路图绘制)。
2010年11月8日---2010年11月14日,完成小车软件的编写和小车整机调试。(三人共同协作完成)。
2010年10月11日---2010年11月14日,完成成果总结。
四、方案与论证
方案:采用AT89c51单片机,A T89c51 单片机是一种低功耗、高性能CMOS 8位微控制器,具有8K 在系统可编程存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。AT89c51有5个中断源,和3个定时计数器。
1.2 路面检测
我们采用检测黑线的方法来控制智能小车的行走轨迹,使用了两个红外对管来检测黑线,同时用超声波传感器检测小车周围的障碍物。
方案;采用光电探测器。光电探测器接收红外辐射后,由于红外光子直接把材料的束缚态电子激发成传导电子,由此引起电信号输出,信号大小与所吸收的光子数成比例。且这些红外光子的能量的大小(即红外光还必须满足一定的波长范围),必须满足一定的要求,才能激发束缚电子,起激发作用。光电探测器吸收的光子必须满足一定的波长,否则不能被吸收,所以受外界影响比较小,抗干扰比较强。
五、主要电路设计与分析
2.1系统结构框图
。
六、电路图
CUP模块
ISP程序下载模块
按键模块
电机模块
电源模块
检测板模块
鸣号模块
整机模块
整机PCB图
寻迹板PCB图
七、小结
通过为期一个月的综合实训,巩固了我们专业的基础:绘制电路图、制作PCB板、元器件的识别与焊接等等,最让我门头痛的是编程,因为平时不太接触,自己也不够努力钻研,在编程上遇到了许多困难,但最终通过上网查询,询问老师解决了。这次实训考验了我们的团队配合精神、耐心、细心,提高了我门的逻辑思维能力。也让我们清楚的认识到,做好一件事,一定要全神贯注、集中精力。在PCB布线的时候,因为一时的疏忽,出现了很多的错误,幸好检查之后及时发现,及时补救。实训也增加了师生互动,增进了师生感情。
八、软件程序
/*********************************************************
#include
#include
#include
#include
#include
//-----------------------------------------------
#define buzzer_led PORTB.0
#define LED1 PORTD.0
#define LED2 PORTD.1
#define LED3 PORTD.2
#define LED4 PORTD.3
#define lpwm_ff PORTB.4
#define lpwm_re PORTA.4
#define rpwm_ff PORTB.7
#define rpwm_re PORTA.5
#define black_l PINE.2
#define black_r PINE.3
#define metal_detect PINF.0
#define model PINF.2
//---------------------------------------- 液晶
#define uchar unsigned char
#define rs PORTA.7
#define rw PORTB.5
#define en PORTB.6
#define ret PORTA.6
//LCD数据数据口初始化
#define data PORTC
uchar command,data1,data2,com0;
uchar lcd_bufl,lcd_bufg;//定义显示缓冲区
//-----------------------------------------------
// Declare your global variables here
// This flag is set on USART0 Receiver buffer overflow bit left_run=0; //左走
bit right_run=0; //右走
bit left_ff=1; //左前进
bit right_ff=1; //右前进
bit left_pwm; //用于左PWM bit right_pwm; //用于右PWM //-----------
//---------------
bit filter_start=0; //数字滤波
bit filter_over=0; //数字滤波
bit black_l1=0; //左黑线1
bit black_l2=0; //左黑线2
bit black_r1=0; //右黑线1
bit black_r2=0; //右黑线2
bit left_turn=0; //左转
bit right_turn=0; //右转
bit metal1=0; //金属1
bit metal2=0; //金属2
bit mode=0; //测试模式
bit stop_point; //停车点
bit buzzer=0; //蜂鸣
bit lcd_dsp=0; //LCD刷新
bit read_over; //
bit gradient_set=0; //
bit stop_status=0; //
unsigned char speed_l; //left速度控制量unsigned char speed_r; //right速度控制量unsigned char filter_count; //数字滤波unsigned char excute_step1; //
unsigned char excute_step2; //
unsigned int bcd_temp0=0; //BCD 入口
//-------------------------------
unsigned char count1=0; //秒计时unsigned char count2=0; //转弯计时
unsigned int count3=0; //停止时间计时unsigned int count4=0; //
unsigned int count5=0; //
unsigned int stop_time=0; //停止时间
unsigned int gradient=0; //
unsigned int gradient2=0; //
unsigned int gradient_old; //
unsigned int gradient2_temp1[8]; //
unsigned int filter_temp1[50]; //数字滤波unsigned long int filter_sum;
unsigned int filter_temp3;
//------------------------------
unsigned char j1,k1; //公共循环变量
unsigned char bcd_temp[5]={0}; //BCD分解值
//-----------------------------------
unsigned int ahead_time=0; //前进时间unsigned int back_time=0; //倒退时间
//EEPROM-----------------------------------------
//-----------------------------------------
void bcd_con(unsigned char numb);
void clear_lcd();
void lcd_int();
void lcd_set();
void display();
void dis_code1();
void dis_code2();
void write_command(uchar command);
void write_data(uchar data0);
//-----------------------------------------
//----------------------------------------------
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
// Place your code here
}
// External Interrupt 4 service routine
interrupt [EXT_INT4] void ext_int4_isr(void)
{
TCNT3H=0x00;
TCNT3L=0x00;
}
// External Interrupt 5 service routine
interrupt [EXT_INT5] void ext_int5_isr(void)
{
if(filter_start==0)
{
filter_temp1[filter_count]=(unsigned int)TCNT3H*0xff+(unsigned int)TCNT3L; filter_count++;
if(filter_count==50) //60
{
filter_count=0;
filter_start=1;
}
}
if(filter_over==1)
{
filter_over=0;
gradient=filter_temp3;
read_over=1;
}
}
//-----------------------------------------------
// Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) {
//TCNT0=0x06;
left_pwm=~left_pwm;
if(left_pwm==1)
{
if(left_turn==1)
{
TCNT0=255-(speed_l/2);
}
else
{
TCNT0=255-speed_l;
}
}
else
{
if(left_turn==1)
{
TCNT0=speed_l/2; }
else
{
TCNT0=speed_l; }
}
if(left_run==1)
{
if(left_pwm==1) {
if(left_ff==1)
{
lpwm_ff=1;
lpwm_re=0;
}
else
{
lpwm_ff=0;
lpwm_re=1;
}
}
else
{
lpwm_ff=0;
lpwm_re=0;
}
else
{
lpwm_ff=0;
lpwm_re=0;
}
}
//-------------------------------------------------------------// Timer 1 overflow interrupt service routine interrupt [TIM1_OVF] void timer1_ovf_isr(void) {
// Place your code here
TCNT1H=0xff;
TCNT1L=0x06;
//------------------------前进时间
if(++count1>=128)
{
count1=0;
if(excute_step1==0&&excute_step2!=2)
{
ahead_time++;
}
if(excute_step1==2)
{
back_time++;
}
lcd_dsp=1;
//-------------
if(mode==1&&ahead_time<8)
{
gradient2_temp1[ahead_time]=gradient;
}
//------------------------
if(stop_point==1) //停车计时{
if(++count3>=128)
{
count3=0;
stop_time++;
lcd_dsp=1;
if( buzzer==1)
{
buzzer_led=~buzzer_led;
LED1=~LED1;
LED2=~LED2;
LED3=~LED3;
LED4=~LED4;
}
else
{
buzzer_led=1;
LED1=1;
LED2=1;
LED3=1;
LED4=1;
}
if(stop_time==5)
{
stop_point=0;
buzzer_led=1;
}
}
}
//------------------------ 检线停止
if(mode==1)
{
if(stop_status==0)
{
if(++count4>=35)
{
count4=0;
stop_status=1;
}
}
if(stop_status==1)
{
if(++count4>=200)
{
count4=0;
stop_status=0;
}
}
}
//------------------------
if(black_l==0) //左循迹{
if(black_l1==1) black_l2=1; black_l1=1;
}
else
{
black_l1=0;
black_l2=0;
right_turn=0;
count2=0;
}
if( black_l2==1&&right_turn==0)
{
right_turn=1;
}
if(right_turn==1)
{
if(++count2==150)
{
count2=0;
right_turn=0;
}
}
//-------------
if(black_r==0) //右循迹{
if(black_r1==1) black_r2=1; black_r1=1;
}
else
{
black_r1=0;
black_r2=0;
count2=0;
left_turn=0;
}
if( black_r2==1&&left_turn==0) {
left_turn=1;
}
if(left_turn==1)
{
if(++count2==150)
{
count2=0;
left_turn=0;
}
}
//------------- //金属传感器
if(metal_detect==0)
{
if(metal1==1) metal2=1;
metal1=1;
}
else
{
metal1=0;
metal2=0;
}
}
//-------------------------------------------
// Timer 2 overflow interrupt service routine interrupt [TIM2_OVF] void timer2_ovf_isr(void) {
// TCNT2=0xaf;
right_pwm=~right_pwm;
if(right_pwm==1)
{
if(right_turn==1)
{
TCNT2=255-speed_r/2;
}
else
{
TCNT2=255-speed_r;
}
}
else
{
if(right_turn==1) {
TCNT2=speed_r/2; }
else
{
TCNT2=speed_r; }
}
if(right_run==1) {
if(right_pwm==1) {
if(right_ff==1)
{
rpwm_ff=1; rpwm_re=0;
}
else
{
rpwm_ff=0; rpwm_re=1;
}
}
else
{
rpwm_ff=0; rpwm_re=0;
}
}
else
{
rpwm_ff=0;
rpwm_re=0;
}
}
//-----------------------------------------
// Timer 3 overflow interrupt service routine
interrupt [TIM3_OVF] void timer3_ovf_isr(void)
{
// Place your code here
//TCNT3H=0xff;
}
///////////////////////////////////////////////////// 液晶
//LCD初始化
void lcd_int(void)
{
ret=0;
//PORTG=PORTG&0b11110111;
delay_ms(2);
ret=1;
//PORTG=PORTG|0b00001000;
delay_us(1);
//psb=1;//将PSB置1,通信方式为8BIT数据并口
delay_us(1);
}
//LCD功能设置
void lcd_set(void)
{
command=0x34;//功能设置--8BIT控制界面,扩充指令集---这个可去掉write_command(command);