文档库 最新最全的文档下载
当前位置:文档库 › 第十二组实训报告

第十二组实训报告

智能循迹小车设计与制作报告

项目名称:智能寻迹小车的设计与制作

项目类型:实用型

成果形式: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);

相关文档
相关文档 最新文档