单片机蓝牙控制小车.docx
- 文档编号:12726623
- 上传时间:2023-06-07
- 格式:DOCX
- 页数:31
- 大小:570.81KB
单片机蓝牙控制小车.docx
《单片机蓝牙控制小车.docx》由会员分享,可在线阅读,更多相关《单片机蓝牙控制小车.docx(31页珍藏版)》请在冰点文库上搜索。
单片机蓝牙控制小车
单片机原理及应用课程设计
课 题:
基于单片机得蓝牙控制小车
专 业:
班级:
学 号:
姓名:
指导教师:
设计日期:
成 绩:
重庆大学城市科技学院电气信息学院
1、设计目得作用2
2、设计要求2
3、设计得具体实现ﻩ2
3、2系统设计ﻩ12
4、总结ﻩ19
参考文献20
附录21
附录2ﻩ22
C51蓝牙控制小车设计报告
1设计目得与意义
目得与意义:
提高学生动手能力,培养学生得思维,巩固理论知识,让我们能对单片机更加深入得了解,加深同学们对单片机得认识,通过自己动手让小车跑起来还能让同学们更加有积极性,参与感,成就感.让学生们亲自体验这门课程得神奇性。
因为无线技术得广泛使用,使蓝牙技术得发展成为了趋势之一,蓝牙可以发送与接受语音与数据,满足了大多数人得需求,它也融合了其她相关产品得特点,也就是这样技术变得更多样性。
实现了无线控制小车,摆脱了有线控制得不方便,更加智能。
2设计要求
SPP蓝牙串口调试助手---—》聊天窗口-—》
1、在Bluetooth_Car项目中添加超声波躲避障碍功能 (在小车前进得过程中,实时检测障碍物,一旦检测得距离,接近设定得值,触发蜂鸣器,报警系统工作,小车停止前进);
2、在Bluetooth_Car项目中得串口中断服务函数中,添加小车前进得8个方向,前后左右,左前,右前,左后,右后;
3、利用外部中断,强制停止小车运行(无论小车现在处于什么状态),蜂鸣器报警1s后,可再运行;
4、用手机得蓝牙串口调试助手来远程操作小车。
3、设计得具体实现
3、1设计原理
芯片常识:
STM8、C52 、STM32、ARM
C52:
主要做末端得控制 11、0592MHZ
STM32:
主要做工业控制领域--智能设备 168M
ARM:
主要做消费市场——手机
==============单片机小车==========
了解原理图与数据手册
一、软件建立工程
ﻩ建立工程时芯片选择—-》Atmel-—>AT89C52
ﻩ设置芯片频率,选择生成16进制可执行文件.
=============中断========
单片机获取外部数据得方式:
1、程序控制方式
a、无条件发送方式
单片机认为外部设备一直都就是准备好得,直接就拿数据使用。
b、条件判断方式
在满足一定条件才获取数据.
2、中断方式
由外部控制得,当有中断请求产生得时候,就可以在中断里面去实现获取数据。
3、DMA直接存储控制器
当需要从外界获取数据得时候,DMA可以向CPU申请获取数据,由DMA直接获取数据。
使用DMA可以绕过CPU处理数据,降低CPU得使用率。
中断:
当CPU正常运行得时候,突然收到一个中断请求(任务),完成中断任务之后立即返回原来得程序继续执行.中断源:
中断来源,发送中断得源头
中断请求:
中断发出得请求,申请执行任务
中断响应:
CPU响应中断请求,暂停正在执行得任务,转而执行中断任务
8个中断源:
ﻩINT0ﻩ外部中断0
ﻩINT1外部中断1
ﻩINT2外部中断2
ﻩINT3外部中断3
T0ﻩ定时器0
T1定时器1
ﻩT2ﻩ定时器2
Uart串口中断
中断有优先级:
分为4级,从0~3,数字越大优先级越高,高优先级得中断可以打断低优先级得中断。
中断得查询次序:
在中断优先级相同得情况下,并且两个中断同时产生得时候,会优先执行查询次序级别高得中断、查询次序不能打断中断、
中断服务函数:
voidINT1_func(void)interrupt2
{
ﻩif()
}
小车两轮驱动:
单片机得IO口不能直接驱动电机运行,必须使用驱动模块才可以。
电机转动原理:
电机得两条线一根接电源正极,一根接负极就可以转动,当电极得方向改变,转动得方向也会改变。
BIA=1;
BIB=0;
控制右轮电机,如果想让轮子转动,只需要设置以上两个引脚,一个为1,一个为0、
P0、0左轮 1
P0、1左轮 0
P0、2 右轮 1
P0、3右轮 0
如果轮子想要动起来,需要接电源线。
思考:
封装函数:
前进、后退、停止、左前转、右前转、左后转、右后转
=============定时器==============
定时器就就是定时,定时产生中断或者就是计数.
工作方式:
定时器:
主要产生定时中断
计数器:
计时计数
工作模式:
模式0:
12位寄存器
模式1:
16位寄存器
模式2:
8位自动重装载寄存器
模式3:
两个8位寄存器,T1无效
时钟周期:
就就是频率得倒数
假设晶振12M,时钟周期就是1/12us,实际上大多使用得就是:
1/11、0592
状态周期:
状态周期就是时钟周期得两倍:
1/12*2
机器周期:
12个时钟周期定为1个机器周期,如果晶振就是12M,那么一个机器周期就刚好就是1us。
寄存器:
TCON控制寄存器 TMOD 模式寄存器
定时器0作模式1:
TMOD、1=0 TMOD、0= 1
设置寄存器计数得初值:
TL0与TH0
50ms=(65536-初值)*(1/11、0592*12)
50000us=(65536-初值ﻩ) *1、08507
46080= 65536—初值
初值 = 19456==》 0x4C00
TH0 = 0x4C;
TL0=0x00;
=============串口==============
一、计算机内部通讯得方式:
UART(串口)、I2C、SPI、1-Write(单总线)
二、数据通讯方式
并行通讯:
多个任务同时进行,增加速度。
串行通讯:
数据只通过一根数据线传输,一位一位得传输数据。
三、串行通讯
同步通讯:
发送一位数据必须要接收一位数据,通过时钟线确定数据收发:
I2C、SPI
异步通讯:
可以独立收发数据,不需要发送数据得时候接收数据。
:
串口UART、1w总线
单工:
只能一方发送数据,一方接收数据(收音机)
半双工:
同一时刻只能一方发送数据,一方接收数据,但就是方向可以转换.(对讲机)
全双工:
数据在同一时刻可以收也可以发.(电话)
四、电平特性
TTL与RS232
TTL:
0V~5V 0V表示数据0 3、3V/5V表示数据1
RS232:
—15V~+15V3V~15V表示数据0-15V~-3V表示数据1
单片机直接使用得就是TTL电平:
VCC正极;GND负极;TXD数据发送; RXD数据接收
五、串行通讯得协议
六、单片机串口寄存器
SCON控制寄存器
串口选择方式1,8位UART,波特率可变。
设置SCON寄存器:
SCON= //01010000==》0x50
PCON电源管理寄存器,设置SMOD得值
SMOD默认值就就是0,也可以主动设置为0、
设置好之后需要开启总中断:
EA=1;ﻩES=1;
串口波特率计算:
波特率=(2^SMOD /32)*(定时器溢出率)
9600 =(1/32)*(11059200/12/(256—TH1))
9600=(1/32)* (921600/(256-TH1))
921600/(256-TH1) = 307200
(256-TH1) = 3
TH1=253==〉 0xFD
串口发送数据
SUBF='h’;//发送数据,还要判断就是否发送
3、2系统设计
项目框图:
3、3系统实现
程序代码如下:
#include〈reg52、h>ﻩ//器件配置文件
#include <intrins、h>
#defineuintunsignedint
#defineuchar unsignedchar
#defineLCM_Data P2
#define Busy0x80 //用于检测LCM状态字中得Busy标识
sbitRX=P1^1;
sbit TX =P1^2;
sbit LCM_RW = P0^3; //定义LCD引脚
sbit LCM_RS=P0^4;
sbitLCM_E=P0^2;
sbitFM =P0^7;//定义蜂鸣器
sbitAIA=P2^3; //定义电机
sbitAIB=P2^2;
sbitBIB=P2^1;
sbitBIA= P2^0;
void LCMInit(void);
voidDisplayOneChar(unsignedchar X,unsignedcharY,unsigned char DData);
voidDisplayListChar(unsignedchar X, unsigned charY,unsignedchar code *DData);
voidDelay5Ms(void);
voidDelay400Ms(void);
voidDecode(unsignedcharScanCode);
voidWriteDataLCM(unsignedcharWDLCM);
voidWritemandLCM(unsignedcharWCLCM,BuysC);
voidSendOneByte(unsignedcharc);
unsigned char ReadDataLCM(void);
unsignedcharReadStatusLCM(void);
unsigned charcodemcustudio[] ={"YueQian "};
unsignedcharcodeemail[] = {""};
unsignedcharcodeCls[]={" ”};
unsignedcharcodeASCII[15]={'0’,'1','2',’3’,’4','5’,'6',’7’,'8','9','、',’-','M'};
staticunsignedcharDisNum = 0; //显示用指针ﻩﻩﻩ
unsigned inttime=0;
unsigned long S=0;
bitflag=0;
unsignedchar disbuff[4]={0,0,0,0,};
voidInit_Int1(void)
{
ﻩIT1 =1; //下降沿触发
ﻩEX1=1;//开启外部中断1
ﻩEA= 1;//开启总中断
}
voiddelay_ms(uintx) //延时函数
{
ﻩuint i;
while(x--)
{
ﻩfor(i=0;i〈133;i++);
ﻩ}
}
voidcar_go()//控制小车得函数前进
{
ﻩ AIA=1; //运用电机得电位差来控制小车得前进方向
ﻩ AIB=0;
ﻩ BIA=1;
BIB= 0;
}
voidcar_back()//后退
{
AIA =0;
ﻩAIB= 1;
BIA= 0;
ﻩBIB =1;
}
void right() //右转
{
AIA= 1;
ﻩAIB=0;
BIA=1;
BIB=1;
}
voidleft() //左转
{
ﻩAIA=1;
ﻩAIB=1;
ﻩBIA=1;
ﻩBIB=0;
}
voidgo_right() //右转前进
{
AIA=1;
ﻩAIB= 0;
ﻩBIA =1;
ﻩBIB=1;
ﻩdelay_ms(500);
AIA =1;
ﻩAIB=0;
BIA= 1;
BIB=0;
}
voidgo_left() //左转前进
{ﻩ
ﻩAIA=1;
AIB =1;
BIA= 1;
BIB= 0;
ﻩdelay_ms(500);
ﻩAIA=1;
ﻩAIB =0;
ﻩBIA=1;
BIB= 0;
}
voidback_right() //右转后退
{
AIA=1;
ﻩAIB= 1;
BIA=1;
BIB=0;
delay_ms(500);
ﻩAIA=0;
AIB =1;
ﻩBIA=0;
BIB =1;
}
voidback_left()//左转后退
{
AIA=1;
AIB=0;
ﻩBIA=1;
BIB= 1;
delay_ms(500);
AIA=0;
ﻩAIB=1;
BIA=0;
BIB=1;
}
voidWriteDataLCM(unsignedcharWDLCM) //写数据
{
ReadStatusLCM(); //检测忙
ﻩLCM_Data = WDLCM;
LCM_RS=1;
ﻩLCM_RW =0;
ﻩLCM_E=0; //若晶振速度太高可以在这后加小得延时
LCM_E=0;//延时
ﻩLCM_E=1;
}
voidWritemandLCM(unsignedcharWCLCM,BuysC) //写指令 BuysC为0时忽略忙检测
{
if (BuysC)ReadStatusLCM(); //根据需要检测忙
ﻩLCM_Data=WCLCM;
ﻩLCM_RS= 0;
LCM_RW =0;
LCM_E=0;
ﻩLCM_E=0;
ﻩLCM_E=1;
}
unsignedcharReadDataLCM(void) //读数据
{
LCM_RS= 1;
LCM_RW= 1;
LCM_E=0;
ﻩLCM_E=0;
ﻩLCM_E=1;
ﻩreturn(LCM_Data);
}
unsigned char ReadStatusLCM(void) //读状态
{
LCM_Data= 0xFF;
ﻩLCM_RS=0;
LCM_RW= 1;
ﻩLCM_E =0;
ﻩLCM_E= 0;
LCM_E=1;
while(LCM_Data&Busy);//检测忙信号
return(LCM_Data);
}
void LCMInit(void) //LCM初始化
{
ﻩLCM_Data= 0;
ﻩWritemandLCM(0x38,0);//三次显示模式设置,不检测忙信号
Delay5Ms();
WritemandLCM(0x38,0);
Delay5Ms();
WritemandLCM(0x38,0);
Delay5Ms();
ﻩWritemandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
WritemandLCM(0x08,1); //关闭显示
ﻩWritemandLCM(0x01,1); //显示清屏
WritemandLCM(0x06,1); //显示光标移动设置
ﻩWritemandLCM(0x0F,1); //显示开及光标设置
}
//按指定位置显示一个字符
voidDisplayOneChar(unsignedchar X,unsignedchar Y,unsignedchar DData)
{
ﻩY &= 0x1;
X&=0xF; //限制X不能大于15,Y不能大于1
ﻩif(Y)X|=0x40; //当要显示第二行时地址码+0x40;
X|=0x80; //算出指令码
WritemandLCM(X,1);//发命令字
WriteDataLCM(DData); //发数据
}
//按指定位置显示一串字符
voidDisplayListChar(unsignedcharX,unsigned charY, unsignedcharcode*DData)
{
unsigned charListLength;
ListLength= 0;
Y&= 0x1;
X&= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]>0x19) //若到达字串尾则退出
ﻩﻩ{
ﻩﻩﻩif (X〈=0xF) //X坐标应小于0xF
ﻩﻩ{
ﻩDisplayOneChar(X,Y,DData[ListLength]); /显示单个字符
ﻩﻩﻩListLength++;
ﻩﻩX++;
ﻩﻩ}
}
}
voidDelay5Ms(void)//5ms延时
{
unsigned intTempCyc=5552;
while(TempCyc—-);
}
voidDelay400Ms(void) //400ms延时
{
ﻩunsignedcharTempCycA = 5;
unsignedintTempCycB;
while(TempCycA--)
ﻩﻩ{
TempCycB=7269;
while(TempCycB--);
ﻩﻩ};
}
/**************超声波测距函数*************************/
voidConut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1、87)/100; //算出来就是CM
/*
晶振为11、0592MHz时
|t(us)=计数*(12/11、0592)* (1/58)
|=计数*0、0187
| =(计数 *1、87)/100
*/
if((S>=700)||flag==1) //超出测量范围显示“-”
{ﻩ
flag=0;
DisplayOneChar(0,1,ASCII[11]);
DisplayOneChar(1,1,ASCII[10]); //显示点
DisplayOneChar(2,1,ASCII[11]);
DisplayOneChar(3,1,ASCII[11]);
DisplayOneChar(4, 1,ASCII[12]);//显示M
}
else
{
disbuff[0]=S%1000/100;
disbuff[1]=S%1000%100/10;
disbuff[2]=S%1000%10%10;
DisplayOneChar(0, 1,ASCII[disbuff[0]]);
DisplayOneChar(1,1,ASCII[10]);ﻩ//显示点
DisplayOneChar(2,1,ASCII[disbuff[1]]);
DisplayOneChar(3, 1, ASCII[disbuff[2]]);
DisplayOneChar(4,1,ASCII[12]); //显示M
}
}
/********************************************************/
/***********定时器T0中断服务函数***********/
voidTimer0IRQ()interrupt1 //T0中断用来计数器溢出,超过测距范围
{
flag=1;
}
/********************触发超声波模块************************************/
//超声波模块Trig控制端给大于10us得高电平触发模块测距
voidStartModule()ﻩ //启动模块
{
ﻩTX=1;ﻩ //启动一次模块
ﻩ_nop_();
ﻩ_nop_();
_nop_();
_nop_();
ﻩ_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
ﻩ_nop_();
_nop_();
ﻩ _nop_();
_nop_();
ﻩ_nop_();
ﻩ _nop_();
_nop_();
_nop_();
ﻩ _nop_();
ﻩ_nop_();
_nop_();
TX=0;
}
/********************************************************/
voiddelayms(unsignedintms)
{
unsignedchari=100,j;
for(;ms;ms—-)
{
ﻩwhile(--i)
{
ﻩﻩj=10;
ﻩﻩwhile(——j);
ﻩﻩ}
ﻩ}
}
/******************************/
voidSendOneByte(unsignedcharc) //发送单个字符
{
SBUF =c;
while(!
TI);
TI=0;
}
/*********************************************************/
voidmain(void)
{
ﻩunsignedcharTempCyc;
ﻩDelay400Ms(); //启动等待,等LCM讲入工作状态
LCMInit(); //LCM初始化
Delay5Ms(); //延时片刻(可不要)
DisplayListChar(0,0, mcustudio);
DisplayListChar(0,1,email);
ﻩReadDataLCM();//测试用句无意义
for(TempCyc=0;TempCyc<10;TempCyc++)
Delay400Ms(); //延时
ﻩDisplayListChar(0,1,Cls);
ﻩFM =1;ﻩ
// TMOD=0x01;ﻩ //设T0为方式1;
//TH0=0;
//ﻩTL0=0;
//ﻩET0=1; //允许T0中断
//EA=1;ﻩ //开启总中断ﻩ
TMOD=0x21;ﻩﻩ//设T0为方式1,定时器1方式2;//00100001
SCON=0x50;
ﻩTH1=0xFD;
T
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 蓝牙 控制 小车