基于51单片机的智能小车设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本人保证自写文档,文档不足之处请谅解
目录
一、设计的目的------------------1
二、设计的模块------------------1
三、程序的流程------------------6
四、元器件清单------------------8
五、成品的制作------------------8
六、注意事项--------------------9
七、设计的总结------------------9
设计的目的
智能遥控车地目的主要突出在智能与遥控上,遥控意思明显就是通过某种控制手段使得小车能够实现由控制者控制前进后退等操作;智能可以体现为功能上的智能化。本作的目的是实现控制小车移动时对前方所存在的威胁进行报警提醒。
设计的模块
此次设计的硬件电路模块大致为五大类,分别是51单片机最小系统模块、电源模块、电机工作驱动模块、超声波报警系统模块、无线控制发射接收模块。
下图为硬件电路框图:
1、单片机最小系统
此模块式是本设计的控制核心模块,单片机最小系统由三部分组成:STC89C52芯片部分、复位部分(由按键开关、极性电容、
10K电阻组成)、晶振部分(由12M石英晶振、两个30PF的瓷片电容组成)。主要起程序的输入与控制、程序的复位、时间频率控制
的作用。
2、无线控制模块
本设计的无线控制模块是由编码芯片PT2262和解码芯片PT2272组成的电路模块组成,工作方式是编码芯片PT2262 发出的编码信号由:地址码、数据码、同步码组成一个完整的码字,解码芯片PT2272 接收到信号后,其地址码经过两次比较核对后,VT
脚才输出高电平,与此同时相应的数据脚也输出高电平,如果发送端一直按住按键,编码芯片也会连续发射。
3、电机驱动模块
本设计是采用了L298N电机驱动模块来驱动减速电机工作;
L298N是ST公司生产的一种高电压、大电流电机驱动芯片。该芯
片采用15脚封装。主要特点是:工作电压高,最高工作电压可达
46V;输出电流大,瞬间峰值电流可达3A,持续工作电流为2A;额定功率25W。含两个H桥的高电压大电流全桥式驱动器,可以用来
驱动直流电动机和步进电动机、继电器线圈等感性负载;采用标准逻辑电平信号控制;具有两个使能控制端,在不受输入信号影响的情况下允许或禁止器件工作有一个逻辑电源输入端,使部逻辑电路部分在低电压下工作;可以外接检测电阻,将变化量反馈给控制电路。
4、超声波测距报警模块
超声波是一种频率比较高的声音,指向性强.超声波测距的原理是利用超声波在空气中的传播速度为已知,测量声波在发射后遇到
障碍物反射回来的时间,根据发射和接收的时间差计算出发射点到
障碍物的实际距离。由此可见,超声波测距原理与雷达原理是一样
的。本设计的超声波测距模块是专为智能小车设计的,适合小围,
小空间,封闭空间的场合。
5、电源模块
本设计的电源供给需要三组电源,无线遥控需要一组5V左右的电源供给;小车分两组供电,一为单片机供电所需5V电源(与
无线遥控器的电源值一致),二为L298N电机驱动模块供电所需
9V电源。单片机有正负极排针,左负右正,单片机供电线在小车
后方红线,接右边排针接通5V电源;9V供电开关在小车左边下
板。
程序的流程
上图为单片机程序的流程图
PWM电机脉冲程序:
PWM脉冲程序是驱动电动机工作的程序,PWM程序的编写方式有多种,主要有以定时器控制时间的方式和以占空比产生频率的方式,因为使用定时器的方式不利于后续发展,故而使用占空比的方式来编写PWM程序;以下是部分PWM 程序控制电机的示例:
IN1=1;
IN2=0;
for(i=0;i<200;i++)//PWM程序
{
delay(10);
IN1=~IN1;
}
超声波测距距离计算程序:
超声波测距模块只是起到超声波的发射与接收,对于反射信号的距离并不能检测,这时就需要给系统设定一个计算距离的时间值;下面的程序就是为了用来计算距离而设定的程序:
void Conut(void)
{
time=TH0*256+TL0; //读出T0的计时数值
TH0=0;
TL0=0; //清空计时器
S=(time*1.7)/100; //算出来是CM
if(Mode==0) //非设置状态时
{
if((S>=700)||flag==1) //超出测量围显示“-”
{
Feng=0; //蜂鸣器报警
flag=0;
disbuff[0]=10; //“-”
disbuff[1]=10; //“-”
disbuff[2]=10; //“-”
}
else
{
//距离小于报警距
if(S<=BJS)
{
Feng=0; //报警
}
else //大于
{
Feng=1; //关闭报警
}
disbuff[0]=S%1000/100; //将距离数据拆成单个位赋值
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10 %10;
}
}
else
{
Feng=1;
disbuff_BJ[0]=BJS%1000/100;
disbuff_BJ[1]=BJS%1000%100/10;
disbuff_BJ[2]=BJS%1000%10 %10;
}
}