单片机自动往返小车.docx
- 文档编号:13567940
- 上传时间:2023-06-15
- 格式:DOCX
- 页数:24
- 大小:214.08KB
单片机自动往返小车.docx
《单片机自动往返小车.docx》由会员分享,可在线阅读,更多相关《单片机自动往返小车.docx(24页珍藏版)》请在冰点文库上搜索。
单片机自动往返小车
自动往返电动小汽车
(高级组)
设计报告
部门院系:
常州大学信息科学与工程学院
1、设计任务…………………………………………………………………………3
1.1基本要求…………………………………………………………………………3
1.2发挥部分…………………………………………………………………………3
2、方案论证与选择………………………………………………………………4
2.1、系统总体框图…………………………………………………………………4
2.2、各模块硬件选择………………………………………………………………4
2.2.1、控制模块………………………………………………………………………4
2.2.2、外部传感器模块………………………………………………………………5
2.2.3、电机驱动模块………………………………………………………………….5
2.2.4、电源模块…………………………………………………………………………5
2.2.5、显示模块…………………………………………………………..……………5
3、系统硬件原理与实现………………………………………………………………….6
3.1、系统总体电路图…………………………………………………………………….6
3.2、系统各模块设计介绍……………………………………………………………..7
3.2.1、单片机控制模块………………………………………………………………….7
3.2.2、外部传感器模块………………………………………………………………….8
3.2.3、电机驱动模块……………………………………………………………………8
3.2.4、LCD液晶显示模块………………………………………………….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、各模块硬件选择
2.2.1、控制模块
控制模块负责接收传感器,控制液晶显示模块和PWM控制输出。
主流方案是采用FPGA芯片或者单片机。
采用可编程逻辑器件FPGA作为控制器。
FPGA可以实现各种复杂的逻辑功能、规模大、密度高、体积小、稳定性高、IO资源丰富、易于进行功能扩展。
还可以采用Atmel公司的AT89S52单片机作为主控制器AT89S52是一个低功耗,高性能的51内核的CMOS8位单片机,片内含8k空间的可反复擦些1000次的Flash只读存储器,具有256bytes的随机存取数据存储器(RAM),32个IO口,2个16位可编程定时计数器。
考虑到本系统不需要复杂的逻辑功能,对数据的处理速度的要求也不是非常高。
且从使用及经济的角度考虑我们选择较为成熟的方案2。
2.2.2、外部传感器模块
这里有三个地方需要用到传感器,分别是检测黑线,检测车速,检测障碍物,我们分别用TCRT5000检测黑线与检测障碍物,用霍尔元件检测车速。
TCRT5000具有紧凑的结构发光灯和检测器安排在同一方向上,利用红外光谱发射对象存在另一个对象上,操作的波长大约是950毫米,调理电路简单,工作性能稳定;利用霍尔效应,在车轮的内侧装上二条细磁铁,把霍耳传感器同样装在车轮的内侧,测量霍尔传感器的输出就可以知道车轮转过的圈数,工作原理比较简单易懂。
2.2.3、电机驱动模块
这里我们有两种方案,一种是采用分立元件构成驱动电路;另一种是采用专用芯片L298N。
虽然分立元件构成电机驱动电路,结构简单,价格低廉,在实际应用中应用广泛。
但是这种电路工作性能不够稳定;而L298N是一个具有高电压大电流的全桥驱动芯片,它相应频率高,一片L298N可以分别控制两个直流电机,而且还带有控制使能端。
用该芯片作为电机驱动,操作方便,稳定性好,性能优良。
所以最后决定选用专用芯片L298N作为电机驱动模块。
2.2.4、电源模块
电源模块作用时把外部电压降为5V,供给单片机和传感器使用。
2.2.5、显示模块
这里我们有两种方案,一种是采用LCD1602液晶屏;另一种是采用8位数码管进行显示。
采用LCD1602液晶屏,该液晶屏可以两行显示数字、字母,显示清晰;采用8位数码管进行显示,数码管只能显示数字。
考虑到我们需要指示当前数值是小车行驶时间还是距离,因此决定采用能显示更多内容的LCD作为显示模块的主要硬件。
3、系统硬件设计与实现
3.1、系统总体电路图
89C52单片机
P0接LCD液晶显示屏的7到14数据端口
P2口分别接电机驱动模块的A1,A2,B1,B2,C1,C2,D1,D2
P1口的P10接LCD液晶显示屏的数据命令选择端,P11接LCD液晶显示屏的读写选择端,P12接LCD液晶显示屏的使能端;
P13到P16分别接电机驱动模块的电机a的使能控制端pwma,电机b的使能控制端pwmb,电机c的使能控制端pwmc,电机d的使能控制端pwmd;
P17接寻迹传感器的OUT端,用来检测黑线;
INT0接左边壁障模块的输出端。
INT1接右边壁障模块的输出端。
T0端接霍尔元件的输出端,设置T0为计数模块,根据计数值算出路程。
3.2、系统各模块设计介绍
3.2.1、单片机控制模块
模块电路图如下:
单片机在系统中起控制中心的作用,其内部代码见软件设计部分。
3.2.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电压的最大和最小之间。
3.2.3、电机驱动模块
模块电路图如下:
电机驱动模块利用电池组供电。
单片机的两个端口输出“10”和“01”分别驱动小车向前和向后动,另外一个端口输出PWM波形,通过波形的占空比来控制直流电机的转速。
L298N是SGS公司的产品,内部同样包含4通道逻辑驱动电路。
可以方便的驱动两个直流电机,或一个两相步进电机。
L298N可接受标准TTL逻辑电平信号VSS,VSS可接4.5~7V电压。
4脚VS接电源电压,VS电压范围VIH为+2.5~46V。
输出电流可达2.5A,可驱动电感性负载。
1脚和15脚下管的发射极分别单独引出以便接入电流采样电阻,形成电流传感信号。
L298可驱动2个电动机,OUT1,OUT2和OUT3,OUT4之间可分别接电动机,本实验装置我们选用驱动一台电动机。
5,7,10,12脚接输入控制电平,控制电机的正反转。
EnA,EnB接控制使能端,控制电机的停转。
3.2.4、LCD液晶显示模块
模块电路图如下:
LCD1602为工业字符型液晶,能够同时显示16*02即32个字符。
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,只要在数据端输入相应的ASCII码,即可在LCD上显示相应字符。
4、系统软件设计
4.1系统软件设计框图
黑线数量加1
限速
结束限速
停车
计时10s
再启动
结束限速
限速
4.2系统软件设计代码
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[]={"DISTANCE:
.m"};//显示距离,单位:
米
ucharcodetable1[]={"TIME:
s"};//显示运行时间,单位:
秒
uintcodetable_pwm[]={5,17,17,6,17,10,0,5,10,17,6,17,10,0};//每个区间的PWM值
sbitlcdrs=P1^0;//数据命令选择端
sbitlcdrw=P1^1;//读写选择端
sbitlcde=P1^2;//使能端
sbitpwma=P1^3;//电机a的使能控制端
sbitpwmb=P1^4;//电机b的使能控制端
sbitpwmc=P1^5;//电机c的使能控制端
sbitpwmd=P1^6;//电机d的使能控制端
sbitrpr=P1^7;//寻线传感器输入端信号
ucharnum;
uintfx=0;//小车行进方向,0为前进,1为后退
uintt=0;//时间系数
uintn=0;//黑线的个数
uintpwm_date;//pwm值
floata1,b1;
inta0,a2,a3,a4,b0,b2,b3;
voiddelay(uintm)//延迟n(ms)
{
inti,j;
for(i=m;i>0;i--)
for(j=110;j>0;j--);
}
voidwrite_com(ucharcom)//写命令
{
lcdrs=0;
P0=com;
delay(5);
lcde=1;//使能信号端输入高脉冲
delay(5);
lcde=0;
}
voidwrite_date(uchardate)//写数据
{
lcdrs=1;
P0=date;
delay(5);
lcde=1;//使能信号端输入高脉冲
delay(5);
lcde=0;
}
voidlcd_init()//lcd初始化
{
lcdrw=0;
lcde=0;
write_com(0x38);//设置16X2显示,5X7点阵,8位数据接口
write_com(0x0c);//设置开显示,不显示光标
write_com(0x06);//写一个字符后地址指针加1
write_com(0x01);//显示清0,数据指针清0
}
voidint0_ringht()interrupt0//左边壁障模块检测到信号右转
{
if(rpr==1)//检测红外线是否检测到模块检测到黑线
{
n++;
if(n==6)//到达终点线
{
fx++;
P2=0x55;//电机反转
delay(10000);//等待10s
n++;
}
delay(100);
}
if(fx==0)
P2=0x2a;//前进时右转
else
P2=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;//关定时器0
TR1=0;//关定时器1
ET1=0;//关定时器1中断
EX0=0;//关外部中断0
EX1=0;//关外部中断1
}
}
voidint1_left()interrupt2//右边壁障模块检测到信号左转
{
if(rpr==1)//检测红外线是否检测到模块检测到黑线
{
n++;
if(n==6)//到达终点线
{
fx++;
P2=0x55;//电机反转
delay(10000);//等待10s
n++;
}
delay(100);
}
if(fx==0)
P2=0xa2;//前进时左转
else
P2=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;//关定时器0
TR1=0;//关定时器1
ET1=0;//关定时器1中断
EX0=0;//关外部中断0
EX1=0;//关外部中断1
}
}
voidT1_time()interrupt3//定时中断子程序
{
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;
}
voidmain()
{
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;//定时中断时间为20ms
TL1=(65533-18349)%256;
TR0=1;//开定时器0
TR1=1;//开定时器1
ET1=1;//开定时器1中断
EX0=1;//开外部中断0
EX1=1;//开外部中断1
IT0=0;//设置外部中断0为低电平触发
IT1=0;//设置外部中断1为低电平触发
PT1=1;//设置定时器1为高优先级
EA=1;//开cpu中断
while
(1)
{
if(fx==0)
P2=0xaa;//电机正转
else
P2=0x55;//电机反转
if(rpr==1)//检测红外线是否检测到模块检测到黑线
{
n++;
if(n==6)//到达终点线
{
fx++;
P2=0x55;//电机反转
delay(10000);//等待10s
n++;
}
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;//关定时器0
TR1=0;//关定时器1
ET1=0;//关定时器1中断
EX0=0;//关外部中断0
EX1=0;//关外部中断1
}
}
}
5、设计数据测量
步骤:
在地上贴黑线模拟赛道,把小车放在赛道上测试。
结果:
见下表(限速区时间为秒表所测)
测试次数
总时间
限速区时间
总路程(m)
实际往返距离(m)
1
2
3
结论:
小车性能基本满足设计任务要求
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 自动 往返 小车