电子工程训练课程实验报告无线蓝牙小车.docx
《电子工程训练课程实验报告无线蓝牙小车.docx》由会员分享,可在线阅读,更多相关《电子工程训练课程实验报告无线蓝牙小车.docx(26页珍藏版)》请在冰豆网上搜索。
![电子工程训练课程实验报告无线蓝牙小车.docx](https://file1.bdocx.com/fileroot1/2023-1/30/cde3a93d-25d4-4d59-a326-80f9865f99b1/cde3a93d-25d4-4d59-a326-80f9865f99b11.gif)
电子工程训练课程实验报告无线蓝牙小车
题目:
基于STC15W4K32S4的蓝牙智能小车
课程名称:
学院(系):
专业:
班级:
学号:
实验序号:
学生姓名:
成绩:
2016年11月4日
成绩评定
项目
各项总分
得分
焊接
30
最小系统与电源
10
功能实现
45
实验报告
10
出勤
5
总分
电子安装实验室安全守则
(请在下一页手抄一份安全守则)
1、每次实验前,认真预习准备,仔细阅读实验安全守则,严格按照安全规范进行实验,确保实验安全;
2、桌面要保持整洁,不允许有杂物,禁止将水杯、瓶装水放在桌面;
3、电烙铁在使用前,必须检查电源线有无烫损漏线情况,一经发现,立即找老师进行安全处理;
4、电烙铁长时间不使用,应将电源线拔掉;电烙铁使用后,应放回烙铁架中,以免烫伤物品;
5、实验结束后,必须拔掉电烙铁的电源线;已经加热的电烙铁,必须冷却后再放入抽屉中;
6、焊锡中含铅,不要含在口中,实验结束后要洗手;
7、稳压电源在使用前,应先调好要使用的电压,再进行线路连接,并确保连接的极性正确;
8、抢救触电人员时,应首先切断电源或用绝缘物体挑开电源线,使触电者脱离电源,千万不要用手拖拉触电人员,以免连环触电;
9、实验结束后,必须关闭桌面电源开关,将桌面收拾干净,工具物品整理好。
题目:
1设计要求
以STC15W4K32S4单片机为核心,设计焊接并且调试一个实际的单片机控制系统,通过蓝牙实现用手机控制小车的动作状态。
(1)焊接:
在实现基本功能的前提下焊接好设计的系统,尽量使其稳定焊点稳定,焊接美观。
(2)最小系统与电源:
利用7505稳压芯片实现输入电压转为五伏稳压电源输出。
(3)功能实现:
实现用手机自制app或者蓝牙串口助手控制小车前进方向以及行驶速度。
2设计分析及系统方案设计
围绕STC15W4K32S4单片机,把系统的设计规划分为两部分
硬件部分:
(1)设计并且绘制原理图
(2)按照原理图焊接电路板
软件部分:
(1)编写实验程序
(2)系统调试
将单片机的p0口用于驱动lcd1602,p4.5,p2.7,p2.3,p2.2用于输出pwm控制电机。
P3.0与p3.1用于与主机通信并且用于蓝牙串口通信。
3各功能模块硬件电路设计
(1)最小系统
由于STC15W4K32S4的性能已经进行了优化,所以不同于以往所接触的单片机,它的晶振已经集成化,不用再搭建最小系统电路。
(2)电源电路
将输入电压转为5v稳压电源输出
(3)LCD液晶屏电路
使用P1.0~P1.7与D0~D7相接,EN,RW,RS分别与P0.7,P0.6,P0.5相接
(4)蓝牙与单片机连接
这里直接用P3.0,P3.1与主机的串口通信和与蓝牙共用串口。
(5)LN298模块
4系统软件设计
#include"reg51.h"
#include"intrins.h"
#include"stdio.h"
#include"stdlib.h"
#defineMAIN_Fosc11059200L//定义主时钟
/*************变量声明**************/
typedefunsignedcharu8;
typedefunsignedintu16;
typedefunsignedlongu32;
typedefunsignedcharBYTE;
typedefunsignedintWORD;
#defineucharunsignedchar
#defineuintunsignedint
#defineelifelseif
#definePWMC(*(unsignedintvolatilexdata*)0xfff0)
#definePWMCH(*(unsignedcharvolatilexdata*)0xfff0)
#definePWMCL(*(unsignedcharvolatilexdata*)0xfff1)
#definePWMCKS(*(unsignedcharvolatilexdata*)0xfff2)
#definePWM2T1(*(unsignedintvolatilexdata*)0xff00)
#definePWM2T1H(*(unsignedcharvolatilexdata*)0xff00)
#definePWM2T1L(*(unsignedcharvolatilexdata*)0xff01)
#definePWM2T2(*(unsignedintvolatilexdata*)0xff02)
#definePWM2T2H(*(unsignedcharvolatilexdata*)0xff02)
#definePWM2T2L(*(unsignedcharvolatilexdata*)0xff03)
#definePWM2CR(*(unsignedcharvolatilexdata*)0xff04)
#definePWM3T1(*(unsignedintvolatilexdata*)0xff10)
#definePWM3T1H(*(unsignedcharvolatilexdata*)0xff10)
#definePWM3T1L(*(unsignedcharvolatilexdata*)0xff11)
#definePWM3T2(*(unsignedintvolatilexdata*)0xff12)
#definePWM3T2H(*(unsignedcharvolatilexdata*)0xff12)
#definePWM3T2L(*(unsignedcharvolatilexdata*)0xff13)
#definePWM3CR(*(unsignedcharvolatilexdata*)0xff14)
#definePWM4T1(*(unsignedintvolatilexdata*)0xff20)
#definePWM4T1H(*(unsignedcharvolatilexdata*)0xff20)
#definePWM4T1L(*(unsignedcharvolatilexdata*)0xff21)
#definePWM4T2(*(unsignedintvolatilexdata*)0xff22)
#definePWM4T2H(*(unsignedcharvolatilexdata*)0xff22)
#definePWM4T2L(*(unsignedcharvolatilexdata*)0xff23)
#definePWM4CR(*(unsignedcharvolatilexdata*)0xff24)
#definePWM5T1(*(unsignedintvolatilexdata*)0xff30)
#definePWM5T1H(*(unsignedcharvolatilexdata*)0xff30)
#definePWM5T1L(*(unsignedcharvolatilexdata*)0xff31)
#definePWM5T2(*(unsignedintvolatilexdata*)0xff32)
#definePWM5T2H(*(unsignedcharvolatilexdata*)0xff32)
#definePWM5T2L(*(unsignedcharvolatilexdata*)0xff33)
#definePWM5CR(*(unsignedcharvolatilexdata*)0xff34)
#definePWM6T1(*(unsignedintvolatilexdata*)0xff40)
#definePWM6T1H(*(unsignedcharvolatilexdata*)0xff40)
#definePWM6T1L(*(unsignedcharvolatilexdata*)0xff41)
#definePWM6T2(*(unsignedintvolatilexdata*)0xff42)
#definePWM6T2H(*(unsignedcharvolatilexdata*)0xff42)
#definePWM6T2L(*(unsignedcharvolatilexdata*)0xff43)
#definePWM6CR(*(unsignedcharvolatilexdata*)0xff44)
#definePWM7T1(*(unsignedintvolatilexdata*)0xff50)
#definePWM7T1H(*(unsignedcharvolatilexdata*)0xff50)
#definePWM7T1L(*(unsignedcharvolatilexdata*)0xff51)
#definePWM7T2(*(unsignedintvolatilexdata*)0xff52)
#definePWM7T2H(*(unsignedcharvolatilexdata*)0xff52)
#definePWM7T2L(*(unsignedcharvolatilexdata*)0xff53)
#definePWM7CR(*(unsignedcharvolatilexdata*)0xff54)
sfrPWMCFG=0xf1;
sfrPWMCR=0xf5;
sfrPWMIF=0xf6;
sfrPWMFDCR=0xf7;
sfrTH2=0xD6;
sfrTL2=0xD7;
sfrIE2=0xAF;
sfrINT_CLKO=0x8F;
sfrAUXR=0x8E;
sfrAUXR1=0xA2;
sfrP_SW1=0xA2;
sfrP_SW2=0xBA;
sfrPIN_SW2=0xBA;
sfrS2CON=0x9A;
sfrS2BUF=0x9B;
sfrP4=0xC0;
sfrP5=0xC8;
sfrP6=0xE8;
sfrP7=0xF8;
sfrP1M1=0x91;//PxM1.n,PxM0.n=00--->Standard,01--->push-pull
sfrP1M0=0x92;//=10--->pureinput,11--->opendrain
sfrP0M1=0x93;
sfrP0M0=0x94;
sfrP2M1=0x95;
sfrP2M0=0x96;
sfrP3M1=0xB1;
sfrP3M0=0xB2;
sfrP4M1=0xB3;
sfrP4M0=0xB4;
sfrP5M1=0xC9;
sfrP5M0=0xCA;
sfrP6M1=0xCB;
sfrP6M0=0xCC;
sfrP7M1=0xE1;
sfrP7M0=0xE2;
sbitP00=P0^0;
sbitP01=P0^1;
sbitP02=P0^2;
sbitP03=P0^3;
sbitP04=P0^4;
sbitP05=P0^5;
sbitP06=P0^6;
sbitP07=P0^7;
sbitP10=P1^0;
sbitP11=P1^1;
sbitP12=P1^2;
sbitP13=P1^3;
sbitP14=P1^4;
sbitP15=P1^5;
sbitP16=P1^6;
sbitP17=P1^7;
sbitP20=P2^0;
sbitP21=P2^1;
sbitP22=P2^2;
sbitP23=P2^3;
sbitP24=P2^4;
sbitP25=P2^5;
sbitP26=P2^6;
sbitP27=P2^7;
sbitP30=P3^0;
sbitP31=P3^1;
sbitP32=P3^2;
sbitP33=P3^3;
sbitP34=P3^4;
sbitP35=P3^5;
sbitP36=P3^6;
sbitP37=P3^7;
sbitP40=P4^0;
sbitP41=P4^1;
sbitP42=P4^2;
sbitP43=P4^3;
sbitP44=P4^4;
sbitP45=P4^5;
sbitP46=P4^6;
sbitP47=P4^7;
sbitP50=P5^0;
sbitP51=P5^1;
sbitP52=P5^2;
sbitP53=P5^3;
sbitP54=P5^4;
sbitP55=P5^5;
sbitP56=P5^6;
sbitP57=P5^7;
/*************收发定义**************/
#defineBaudrate19600L//波特率
#defineUART1_BUF_LENGTH32
u8TX1_Cnt;//发送计数
u8RX1_Cnt;//接收计数
bitB_TX1_Busy;//发送忙标志
voidUART1_config(u8brt);//选择波特率,2:
使用Timer2做波特率,其它值:
使用Timer1做波特率.
voidPrintString1(u8*puts);
u8idataRX1_Buffer[UART1_BUF_LENGTH];//接收缓冲
/*************IO口定义**************/
sbitP_HC595_SER=P4^0;//pin14SERdatainput
sbitP_HC595_RCLK=P5^4;//pin12RCLkstore(latch)clock
sbitP_HC595_SRCLK=P4^3;//pin11SRCLKShiftdataclock
/*************本地变量声明**************/
voiddelay_ms(u8ms);
voidDisableHC595(void);
voidInitialize_LCD(void);
voidWrite_AC(u8hang,u8lie);
voidWrite_DIS_Data(u8DIS_Data);
voidClearLine(u8row);
u8BIN_ASCII(u8tmp);
voidPutString(u8row,u8column,u8*puts);
voidWriteChar(u8row,u8column,u8dat);
/*************变量声明**************/
#defineCYCLE0x1000L//定义PWM周期(最大值为32767)
u8DirLeft[15]={"DirLeft"};
u8DirRight[15]={"DirRight"};
u8DirUp[15]={"DirUp"};
u8DirDown[15]={"DirDown"};
u8HSpeed[15]={"SpeedNormal"};
u8NSpeed[15]={"SpeedHight"};
intflag=0;
sbitPdir1=P2^1;
sbitPdir2=P2^2;
sbitPfir1=P2^3;
sbitPfir2=P2^7;
voidIoInit(void);
voidSendMegBack(void);
voidENpwm(WORDDUTY1,WORDDUTY2,WORDoutch,WORDouten);
voidclosepwm();
WORDSpeed1=75L;
WORDSpeed2=80L;
WORDFspeed1=75l;
WORDFspeed2=80L;
bitDir=0;
//===========================================
voidmain(void)
{
IoInit();//初始化端口
Initialize_LCD();//初始化端口lcd
UART1_config
(1);//选择波特率,2:
使用Timer2做波特率,其它值:
使用Timer1做波特率.
EA=1;//允许总中断
while
(1)
{
flag=SBUF;
SendMegBack();
switch(flag){
case'0':
ClearLine
(1);
PutString(1,0,DirLeft);
Fspeed1=Speed1;Fspeed2=18*Speed2/32;
break;
case'1':
ClearLine
(1);
PutString(1,0,DirRight);
Fspeed1=19*Speed1/32;Fspeed2=Speed2;
break;
case'2':
ClearLine
(1);
PutString(1,0,DirUp);
Fspeed1=Speed1;Fspeed2=Speed2;
Dir=0;
break;
case'3':
ClearLine
(1);
PutString(1,0,DirDown);
Fspeed1=Speed1;Fspeed2=Speed2;
Dir=1;
break;
case'4':
ClearLine(0);
PutString(0,0,NSpeed);
Speed1=95L;Speed2=100L;
Fspeed1=Speed1;Fspeed2=Speed2;
break;
case'5':
ClearLine(0);
PutString(0,0,HSpeed);
Speed1=75L;Speed2=80L;
Fspeed1=Speed1;Fspeed2=Speed2;
break;
case'6':
ClearLine(0);
PutString(0,0,NSpeed);
Speed1=Speed1-2l;Speed2=Speed2-2l;
Fspeed1=Speed1;Fspeed2=Speed2;
break;
case'7':
ClearLine(0);
PutString(0,0,NSpeed);
Speed1=Speed1+2l;Speed2=Speed2+2l;
Fspeed1=Speed1;Fspeed2=Speed2;
break;
default:
ClearLine(0);
PutString(0,0,HSpeed);
Speed1=75L;Speed2=80L;
Fspeed1=Speed1;Fspeed2=Speed2;
break;
}
if(Dir==0)
{
ENpwm(Fspeed1,Fspeed2,0x00,0x0a);
Pdir2=0;
Pfir2=0;
}
else
{
ENpwm(Fspeed1,Fspeed2,0x00,0x05);Pdir1=0;Pfir1=0;
}
delay_ms(20);
}
}
/**********************************************/
voidIoInit(void){
P0M1=0;P0M0=0;//设置为准双向口
P1M1=0;P1M0=0;//设置为准双向口
P2M1=0;P2M0=0;//设置为准双向口
P3M1=0;P3M0=0;//设置为准双向口
P4M1=0;P4M0=0;//设置为准双向口
P5M1=0;P5M0=0;//设置为准双向口
P6M1=0;P6M0=0;//设置为准双向口
P7M1=0;P7M0=0;//设置为准双向口
}
voidSendMegBack(void){
if((TX1_Cnt!
=RX1_Cnt)&&(!
B_TX1_Busy))//收到数据,发送空闲
SBUF=RX1_Buffer[TX1_Cnt];//把收到的数据远样返回
B_TX1_Busy=1;
if(++TX1_Cnt>=UART1_BUF_LENGTH)TX1_Cnt=0;
}
voidENpwm(WORDDUTY1,WORDDUTY2,WORDoutch,WORDouten)
{
PIN_SW2|=0x80;//使能访问XSFR
PWMCFG=0x00;//配置PWM的输出初始电平为低电平
PWMCKS=0x00;//选择PWM的时钟为Fosc/(0+1)
PWMC=CYCLE;//设置PWM周期
PWM3T1=CYCLE*DUTY1/100;//设置PWM2第1次反转的PWM计数
PWM4T1=CYCLE*DUTY1/100;//设置PWM2第2次反转的PWM计数
PWM5T1=CYCLE*DUTY2/100;//设置PWM3第1次反转的PWM计数
PWM2T2=CYCLE*DUTY1/100;//设置PWM3第2次反转的PWM计数
PWM2CR=0x08;//选择PWM2输出引脚,不使能PWM2中断
PWM3CR=0x00;
PWM4CR=0x00;
PWM5CR=0x00;
PWMCR=outen;//使能PWM信号输出
PWMCR|=0x80;//使能PWM