电子工程训练课程实验报告无线蓝牙小车Word下载.docx
《电子工程训练课程实验报告无线蓝牙小车Word下载.docx》由会员分享,可在线阅读,更多相关《电子工程训练课程实验报告无线蓝牙小车Word下载.docx(26页珍藏版)》请在冰豆网上搜索。
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"
intrins.h"
stdio.h"
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);
EA=1;
//允许总中断
while
(1)
{
flag=SBUF;
SendMegBack();
switch(flag){
case'
0'
:
ClearLine
(1);
PutString(1,0,DirLeft);
Fspeed1=Speed1;
Fspeed2=18*Speed2/32;
break;
1'
PutString(1,0,DirRight);
Fspeed1=19*Speed1/32;
Fspeed2=Speed2;
break;
2'
PutString(1,0,DirUp);
Dir=0;
3'
PutString(1,0,DirDown);
Dir=1;
4'
ClearLine(0);
PutString(0,0,NSpeed);
Speed1=95L;
Speed2=100L;
5'
PutString(0,0,HSpeed);
Speed1=75L;
Speed2=80L;
6'
Speed1=Speed1-2l;
Speed2=Speed2-2l;
7'
Speed1=Speed1+2l;
Speed2=Speed2+2l;
default:
}
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