单片机-自动往返小车

  • 格式:doc
  • 大小:55.00 KB
  • 文档页数:15

自动往返电动小汽车(高级组)设计报告部门院系:常州大学信息科学与工程学院目录1、设计任务 (3)1.1基本要求 (3)1.2发挥部分 (3)2、方案论证与选择 (4)2.1、系统总体框图 (4)2.2、各模块硬件选择 (4) (4) (5) (5) (5) (5)3、系统硬件原理与实现 (6)3.1、系统总体电路图 (6)3.2、系统各模块设计介绍 (7) (7) (8) (8) (9)4、统软件设计 (10)4.1 系统软件设计框图 (10)4.2 系统软件设计代码 (12)5、设计数据测量 (19)1、设计任务设计并制作一个能自动往返于起跑线与终点线间的小汽车。

允许用玩具汽车改装,但不能用人工遥控(包括有线和无线遥控)。

跑道宽度0.5m,表面贴有白纸,两侧有挡板,挡板与地面垂直,其高度不低于20cm。

在跑道的B、C、D、E、F、G各点处画有2cm宽的黑线,各段的长度如图1所示。

1.1基本要求1)车辆从起跑线出发(出发前,车体不得超出起跑线),到达终点线后停留10秒,然后自动返回起跑线(允许倒车返回)。

往返一次的时间应力求最短(从合上汽车电源开关开始计时)。

2)到达终点线和返回起跑线时,停车位置离起跑线和终点线偏差应最小(以车辆中心点与终点线或起跑线中心线之间距离作为偏差的测量值)。

3)D~E间为限速区,车辆往返均要求以低速通过,通过时间不得少于4秒,但不允许在限速区内停车。

1.2发挥部分1)自动记录、显示一次往返时间(记录显示装置要求安装在车上)。

2)自动记录、显示行驶距离(记录显示装置要求安装在车上)。

3)其它特色与创新。

2、方案论证与选择2.1、系统总体框图选定自动往返小车的题目后,我们决定购买一台符合尺寸要求的玩具小车,直接利用上面的直流电机的方法实现要求,由此节省自行安装和调试小车动力部分的时间。

根据设计任务要求,最终确定的系统设计框图如下:系统分为单片机控制模块、外部传感器模块、电机驱动模块、电源模块和LCD液晶显示模块。

2.2、各模块硬件选择控制模块负责接收传感器,控制液晶显示模块和PWM控制输出。

主流方案是采用FPGA芯片或者单片机。

采用可编程逻辑器件FPGA作为控制器。

FPGA 可以实现各种复杂的逻辑功能、规模大、密度高、体积小、稳定性高、IO资源丰富、易于进行功能扩展。

还可以采用Atmel公司的AT89S52单片机作为主控制器AT89S52是一个低功耗,高性能的51内核的CMOS 8位单片机,片内含8k空间的可反复擦些1000次的Flash只读存储器,具有256 bytes的随机存取数据存储器(RAM),32个IO口,2个16位可编程定时计数器。

考虑到本系统不需要复杂的逻辑功能,对数据的处理速度的要求也不是非常高。

且从使用及经济的角度考虑我们选择较为成熟的方案2。

这里有三个地方需要用到传感器,分别是检测黑线,检测车速,检测障碍物,我们分别用TCRT5000检测黑线与检测障碍物,用霍尔元件检测车速。

TCRT5000具有紧凑的结构发光灯和检测器安排在同一方向上,利用红外光谱发射对象存在另一个对象上,操作的波长大约是950毫米,调理电路简单,工作性能稳定;利用霍尔效应,在车轮的内侧装上二条细磁铁,把霍耳传感器同样装在车轮的内侧,测量霍尔传感器的输出就可以知道车轮转过的圈数,工作原理比较简单易懂。

这里我们有两种方案,一种是采用分立元件构成驱动电路;另一种是采用专用芯片L298N。

虽然分立元件构成电机驱动电路,结构简单,价格低廉,在实际应用中应用广泛。

但是这种电路工作性能不够稳定;而L298N是一个具有高电压大电流的全桥驱动芯片,它相应频率高,一片L298N可以分别控制两个直流电机,而且还带有控制使能端。

用该芯片作为电机驱动,操作方便,稳定性好,性能优良。

所以最后决定选用专用芯片L298N作为电机驱动模块。

电源模块作用时把外部电压降为5V,供给单片机和传感器使用。

这里我们有两种方案,一种是采用LCD1602液晶屏;另一种是采用8位数码管进行显示。

采用LCD1602液晶屏,该液晶屏可以两行显示数字、字母,显示清晰;采用8位数码管进行显示,数码管只能显示数字。

考虑到我们需要指示当前数值是小车行驶时间还是距离,因此决定采用能显示更多内容的LCD作为显示模块的主要硬件。

3、系统硬件设计与实现3.1、系统总体电路图89C52单片机P0接LCD液晶显示屏的7到14数据端口P2口分别接电机驱动模块的A1,A2,B1,B2,C1,C2,D1,D2P1口的P10接LCD液晶显示屏的数据命令选择端,P11接LCD液晶显示屏的读写选择端,P12接LCD液晶显示屏的使能端;P13到P16分别接电机驱动模块的电机a的使能控制端pwma,电机b的使能控制端pwmb,电机c的使能控制端pwmc,电机d的使能控制端pwmd;P17接寻迹传感器的OUT端,用来检测黑线;INT0接左边壁障模块的输出端。

INT1接右边壁障模块的输出端。

T0端接霍尔元件的输出端,设置T0为计数模块,根据计数值算出路程。

3.2、系统各模块设计介绍模块电路图如下:单片机在系统中起控制中心的作用,其内部代码见软件设计部分。

1、没有检测到黑线,则H4发光到白纸,光发射到H4接受端,H4接收端导通,则2脚比较器反相端T1接地=0;3脚比较器同相端为3v,同相端大雨反相端out1输出为1。

2、检测到黑线,则H4发光到黑线,完全被吸收,接受端没有收到任何信号,因为H4截止,则2脚比较器反相端T1=VCC.=5v,3脚比较器同相端为3v,反相端大于同相端out1输出为0.3、调试方法:黑色物体遮挡传感器检测T1脚电压变化是否正常,调节电位器R13,使得3脚电压介于T1电压的最大和最小之间。

模块电路图如下:电机驱动模块利用电池组供电。

单片机的两个端口输出“10”和“01”分别驱动小车向前和向后动,另外一个端口输出PWM波形,通过波形的占空比来控制直流电机的转速。

L298N是SGS公司的产品,内部同样包含4通道逻辑驱动电路。

可以方便的驱动两个直流电机,或一个两相步进电机。

L298N可接受标准TTL逻辑电平信号VSS,VSS可接4.5~7 V电压。

4脚VS接电源电压,VS电压范围VIH为+2.5~46 V。

输出电流可达2.5 A,可驱动电感性负载。

1脚和15脚下管的发射极分别单独引出以便接入电流采样电阻,形成电流传感信号。

L298可驱动2个电动机,OUT1,OUT2和OUT3,OUT4之间可分别接电动机,本实验装置我们选用驱动一台电动机。

5,7,10,12脚接输入控制电平,控制电机的正反转。

EnA,EnB接控制使能端,控制电机的停转。

模块电路图如下:LCD1602为工业字符型液晶,能够同时显示16*02即32个字符。

1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,只要在数据端输入相应的ASCII码,即可在LCD 上显示相应字符。

4、系统软件设计4.1 系统软件设计框图4.2 系统软件设计代码#include <reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table[]={"DISTANCE : . m"};//显示距离,单位:米uchar code table1[]={"TIME : s "};//显示运行时间,单位:秒uint code table_pwm[]={5,17,17,6,17,10,0,5,10,17,6,17,10,0};//每个区间的PWM值sbit lcdrs=P1^0;//数据命令选择端sbit lcdrw=P1^1;//读写选择端sbit lcde=P1^2;//使能端sbit pwma=P1^3;//电机a的使能控制端sbit pwmb=P1^4;//电机b的使能控制端sbit pwmc=P1^5;//电机c的使能控制端sbit pwmd=P1^6;//电机d的使能控制端sbit rpr=P1^7;//寻线传感器输入端信号uchar num;uint fx=0;//小车行进方向,0为前进,1为后退uint t=0;//时间系数uint n=0;//黑线的个数uint pwm_date;//pwm值float a1,b1;int a0,a2,a3,a4,b0,b2,b3;void delay(uint m)//延迟n (ms){int i,j;for(i=m;i>0;i--)for(j=110;j>0;j--);}void write_com(uchar com)//写命令{lcdrs=0;P0=com;delay(5);lcde=1;//使能信号端输入高脉冲delay(5);lcde=0;}void write_date(uchar date)//写数据{lcdrs=1;P0=date;delay(5);lcde=1;//使能信号端输入高脉冲delay(5);lcde=0;}void lcd_init()//lcd初始化{lcdrw=0;lcde=0;write_com(0x38);//设置16X2显示,5X7点阵,8位数据接口write_com(0x0c);//设置开显示,不显示光标write_com(0x06);//写一个字符后地址指针加1write_com(0x01);//显示清0,数据指针清0}void int0_ringht()interrupt 0//左边壁障模块检测到信号右转{if(rpr==1)//检测红外线是否检测到模块检测到黑线{n++;if(n==6)//到达终点线{fx++;P2=0x55;//电机反转delay(10000);//等待10sn++;}delay(100);}if(fx==0)P2=0x2a;//前进时右转elseP2=0x15;//后退时右转if(n==13){write_com(0x80+0x0a);//显示路程a0=TL0;a1=a0*0.102;a2=a1/10;a3=a1-a2*10;write_date(0x30+a2);//显示路程十位write_date(0x30+a3);//显示路程个位write_com(0x80+0x0d);a4=(a1-a2*10-a3)*10;write_date(0x30+a4);//显示路程十分位delay(1);write_com(0x80+0x09+0x40);//显示时间b0=t;b1=b0/50;b2=b1/10;b3=b1-b2*10;write_date(0x30+b2);//显示时间十位write_date(0x30+b3);//显示时间个位EA=0;//关cpu中断TR0=0;//关定时器0TR1=0;//关定时器1ET1=0;//关定时器1中断EX0=0;//关外部中断0EX1=0;//关外部中断1}}void int1_left()interrupt 2//右边壁障模块检测到信号左转{if(rpr==1)//检测红外线是否检测到模块检测到黑线{n++;if(n==6)//到达终点线{fx++;P2=0x55;//电机反转delay(10000);//等待10sn++;}delay(100);}if(fx==0)P2=0xa2;//前进时左转elseP2=0x51;//后退时左转if(n==13){write_com(0x80+0x0a);//显示路程a0=TL0;a1=a0*0.102;a2=a1/10;a3=a1-a2*10;write_date(0x30+a2);//显示路程十位write_date(0x30+a3);//显示路程个位write_com(0x80+0x0d);a4=(a1-a2*10-a3)*10;write_date(0x30+a4);//显示路程十分位delay(1);write_com(0x80+0x09+0x40);//显示时间b0=t;b1=b0/50;b2=b1/10;b3=b1-b2*10;write_date(0x30+b2);//显示时间十位write_date(0x30+b3);//显示时间个位EA=0;//关cpu中断u中断TR0=0;//关定时器0TR1=0;//关定时器1ET1=0;//关定时器1中断EX0=0;//关外部中断0EX1=0;//关外部中断1}}void T1_time()interrupt 3//定时中断子程序{t++;;TH1=(65533-18349)/256;//定时中断时间为20ms TL1=(65533-18349)%256;pwm_date=table_pwm[n];pwma=1;pwmb=1;pwmc=1;pwmd=1;delay(pwm_date);pwma=0;pwmb=0;pwmc=0;pwmd=0;}void main(){lcd_init();//lcd初始化write_com(0x80);for(num=0;num<16;num++){write_date(table[num]);delay(5);}write_com(0x80+0x40);for(num=0;num<16;num++){write_date(table1[num]);delay(5);}TMOD=0x15;//设置定时器0为计数模式//定时器1设置为定时中断模式,选择模式1 TH0=0x00;TL0=0x00;TH1=(65533-18349)/256;//定时中断时间为20msTL1=(65533-18349)%256;TR0=1;//开定时器0TR1=1;//开定时器1ET1=1;//开定时器1中断EX0=1;//开外部中断0EX1=1;//开外部中断1IT0=0;//设置外部中断0为低电平触发IT1=0;//设置外部中断1为低电平触发PT1=1;//设置定时器1为高优先级EA=1;//开cpu中断while(1){if(fx==0)P2=0xaa;//电机正转elseP2=0x55;//电机反转if(rpr==1)//检测红外线是否检测到模块检测到黑线{n++;if(n==6)//到达终点线{fx++;P2=0x55;//电机反转delay(10000);//等待10sn++;}delay(150);}if(n==13){write_com(0x80+0x0a);//显示路程a0=TL0;a1=a0*0.102;a2=a1/10;a3=a1-a2*10;write_date(0x30+a2);//显示路程十位write_date(0x30+a3);//显示路程个位write_com(0x80+0x0d);a4=(a1-a2*10-a3)*10;write_date(0x30+a4);//显示路程十分位delay(1);write_com(0x80+0x09+0x40);//显示时间b0=t;b1=b0/50;b2=b1/10;b3=b1-b2*10;write_date(0x30+b2);//显示时间十位write_date(0x30+b3);//显示时间个位EA=0;//关cpu中断u中断TR0=0;//关定时器0TR1=0;//关定时器1ET1=0;//关定时器1中断EX0=0;//关外部中断0EX1=0;//关外部中断1}}}5、设计数据测量步骤:在地上贴黑线模拟赛道,把小车放在赛道上测试。