单片机智能蓝牙小车课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单
片
机
课
程
设
计
系别:电子信息工程班级:信10050 6 学号:信10050601 姓名:徐彬彬
引言
制作一个基于51单片机的控制的无线控制小车。
一、系统设计
由51单片机控制直流电机的正反转来控制小车的运动。
无线部分用来接收上位机(电脑或者手机)发出的信号,通过信号控制单片机调用函数程序来控制小车的运行状态。
无线部分:用蓝牙从机的TTL接口接收信号反馈给单片机,还可以通过电脑的无线局域网网卡来控制路由器的TTL串口来控制单片机的状态。由于蓝牙模块容易得到且接口方便,电压可以用+5V控制,携带方便,便于在小车上安装。
电机驱动:电机驱动需要大电流,较高的电压,考虑到单片机的负载能力,用L298N驱动模块来驱动电机,单片机输出逻辑信号控制L298N模块输出正反向电压,由此控制电机的正反转。
小车的运动状态:小车为四轮驱动,一侧的两个电机分为一组。
二、软件设计
单片机电路:
由p1口输出逻辑电平驱动L298N电路
L298N驱动电机电路,供给+5V和+12V电压
三、系统的仿真与调试
用简单程序仿真测试电路连接情况
汇编程序代码:
org 0000h
ajmp main
org 0080h
main:
mov a,#0ffh
mov p1,a ;不转
call delay ;延时
loop: mov a,#00ah ;正转
mov p1,a
call delay
mov a,#0ffh;停止
mov p1,a
call delay
mov a,#005h;反转
mov p1,a
call delay
mov a,#0ffh;停止
mov p1,a
call delay
jmp loop
delay: mov r5,#50 ;延时。
d1: mov r6,#40
d2: mov r7,#248
djnz r7,$
djnz r6,d2
djnz r5,d1
ret
end
仿真结果:电机正反转均正常
小车程序:
用单片机控制小车的四个状态,前进,后退,左转,右转。由四个函数实现,执行条件为中断。当蓝牙从机接收到数据传输到单片机时,单片机内部选择指令,调动while函数,判断指令数据,从而控制小车状态。
四、程序设计
循环函数,控制小车的状态
while(1)
{
switch(Buffer[0])
{
case 0: Moto_Stop(); break;
case 1: Moto_Forward(); break;
case 2: Moto_Backward(); break;
case 3: Moto_TurnLeft(); break; case 4: Moto_TurnRight(); break; default:break;
}
}
五、总结(心得体会)
是否完成
六、程序清单
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar Buffer[4] = {0}; //从串口接收的数据
uint i,j;
sbit Left_Positive=P1^0;
sbit Left_Negative=P1^1;
sbit Right_Positive=P1^2;
sbit Right_Negative=P1^3;
sbit LeftLight=P2^1;
sbit RightLight=P2^2;
/******************************************************************** * 名称: Delay_1ms()
* 功能: 延时子程序,延时时间为1ms * x
* 输入: x (延时一毫秒的个数)
* 输出: 无
********************************************************************* **/
void Delay_1ms(uint i)//1ms延时
{
uchar x,j;
for(j=0;j
for(x=0;x<=148;x++);
}
/******************************************************************** * 名称: Com_Int()
* 功能: 串口中断子函数
* 输入: 无
* 输出: 无
********************************************************************* **/
void Com_Int(void) interrupt 4
{
EA = 0;
if(RI == 1) //当硬件接收到一个数据时,RI会置位
{
Buffer[0] = SBUF - 48; //这里减去48是因为从电脑中发送过来的数据是ASCII