电子工程训练课程实验报告无线蓝牙小车_第1页
电子工程训练课程实验报告无线蓝牙小车_第2页
电子工程训练课程实验报告无线蓝牙小车_第3页
电子工程训练课程实验报告无线蓝牙小车_第4页
电子工程训练课程实验报告无线蓝牙小车_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、题目:基于STC15W4K32S4的蓝牙智能小车课程名称: 学院(系): 专 业: 班 级: 学 号: 实验序号: 学生姓名: 成 绩: 2016 年 11月 4日成绩评定项目各项总分得分焊接30最小系统与电源10功能实现45实验报告10出勤5总分电子安装实验室安全守则(请在下一页手抄一份安全守则)1、 每次实验前,认真预习准备,仔细阅读实验安全守则,严格按照安全规范进行实验,确保实验安全;2、 桌面要保持整洁,不允许有杂物,禁止将水杯、瓶装水放在桌面;3、 电烙铁在使用前,必须检查电源线有无烫损漏线情况,一经发现,立即找老师进行安全处理;4、 电烙铁长时间不使用,应将电源线拔掉;电烙铁使用后

2、,应放回烙铁架中,以免烫伤物品;5、 实验结束后,必须拔掉电烙铁的电源线;已经加热的电烙铁,必须冷却后再放入抽屉中;6、 焊锡中含铅,不要含在口中,实验结束后要洗手;7、 稳压电源在使用前,应先调好要使用的电压,再进行线路连接,并确保连接的极性正确;8、 抢救触电人员时,应首先切断电源或用绝缘物体挑开电源线,使触电者脱离电源,千万不要用手拖拉触电人员,以免连环触电;9、 实验结束后,必须关闭桌面电源开关,将桌面收拾干净,工具物品整理好。题目:1 设计要求以STC15W4K32S4单片机为核心,设计焊接并且调试一个实际的单片机控制系统,通过蓝牙实现用手机控制小车的动作状态。(1) 焊接:在实现基

3、本功能的前提下焊接好设计的系统,尽量使其稳定焊点稳定,焊接美观。(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 各功能模块硬件电

4、路设计(1) 最小系统由于STC15W4K32S4的性能已经进行了优化,所以不同于以往所接触的单片机,它的晶振已经集成化,不用再搭建最小系统电路。(2) 电源电路将输入电压转为5v稳压电源输出(3) LCD液晶屏电路使用P1.0P1.7与D0D7相接,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"

5、;#include "stdlib.h"#define MAIN_Fosc 11059200L /定义主时钟/* 变量声明 */ typedef unsigned char u8;typedef unsigned int u16;typedef unsigned long u32;typedef unsigned char BYTE;typedef unsigned int WORD;#define uchar unsigned char#define uint unsigned int#define elif else if#define PWMC (*(unsigned

6、 int volatile xdata *)0xfff0)#define PWMCH (*(unsigned char volatile xdata *)0xfff0)#define PWMCL (*(unsigned char volatile xdata *)0xfff1)#define PWMCKS (*(unsigned char volatile xdata *)0xfff2)#define PWM2T1 (*(unsigned int volatile xdata *)0xff00)#define PWM2T1H (*(unsigned char volatile xdata *)

7、0xff00)#define PWM2T1L (*(unsigned char volatile xdata *)0xff01)#define PWM2T2 (*(unsigned int volatile xdata *)0xff02)#define PWM2T2H (*(unsigned char volatile xdata *)0xff02)#define PWM2T2L (*(unsigned char volatile xdata *)0xff03)#define PWM2CR (*(unsigned char volatile xdata *)0xff04)#define PWM

8、3T1 (*(unsigned int volatile xdata *)0xff10)#define PWM3T1H (*(unsigned char volatile xdata *)0xff10)#define PWM3T1L (*(unsigned char volatile xdata *)0xff11)#define PWM3T2 (*(unsigned int volatile xdata *)0xff12)#define PWM3T2H (*(unsigned char volatile xdata *)0xff12)#define PWM3T2L (*(unsigned ch

9、ar volatile xdata *)0xff13)#define PWM3CR (*(unsigned char volatile xdata *)0xff14)#define PWM4T1 (*(unsigned int volatile xdata *)0xff20)#define PWM4T1H (*(unsigned char volatile xdata *)0xff20)#define PWM4T1L (*(unsigned char volatile xdata *)0xff21)#define PWM4T2 (*(unsigned int volatile xdata *)

10、0xff22)#define PWM4T2H (*(unsigned char volatile xdata *)0xff22)#define PWM4T2L (*(unsigned char volatile xdata *)0xff23)#define PWM4CR (*(unsigned char volatile xdata *)0xff24)#define PWM5T1 (*(unsigned int volatile xdata *)0xff30)#define PWM5T1H (*(unsigned char volatile xdata *)0xff30)#define PWM

11、5T1L (*(unsigned char volatile xdata *)0xff31)#define PWM5T2 (*(unsigned int volatile xdata *)0xff32)#define PWM5T2H (*(unsigned char volatile xdata *)0xff32)#define PWM5T2L (*(unsigned char volatile xdata *)0xff33)#define PWM5CR (*(unsigned char volatile xdata *)0xff34)#define PWM6T1 (*(unsigned in

12、t volatile xdata *)0xff40)#define PWM6T1H (*(unsigned char volatile xdata *)0xff40)#define PWM6T1L (*(unsigned char volatile xdata *)0xff41)#define PWM6T2 (*(unsigned int volatile xdata *)0xff42)#define PWM6T2H (*(unsigned char volatile xdata *)0xff42)#define PWM6T2L (*(unsigned char volatile xdata

13、*)0xff43)#define PWM6CR (*(unsigned char volatile xdata *)0xff44)#define PWM7T1 (*(unsigned int volatile xdata *)0xff50)#define PWM7T1H (*(unsigned char volatile xdata *)0xff50)#define PWM7T1L (*(unsigned char volatile xdata *)0xff51)#define PWM7T2 (*(unsigned int volatile xdata *)0xff52)#define PWM

14、7T2H (*(unsigned char volatile xdata *)0xff52)#define PWM7T2L (*(unsigned char volatile xdata *)0xff53)#define PWM7CR (*(unsigned char volatile xdata *)0xff54)sfr PWMCFG = 0xf1;sfr PWMCR = 0xf5;sfr PWMIF = 0xf6;sfr PWMFDCR = 0xf7;sfr TH2 = 0xD6;sfr TL2 = 0xD7;sfr IE2 = 0xAF;sfr INT_CLKO = 0x8F;sfr A

15、UXR = 0x8E;sfr AUXR1 = 0xA2;sfr P_SW1 = 0xA2;sfr P_SW2 = 0xBA;sfr PIN_SW2 =0xBA;sfr S2CON = 0x9A;sfr S2BUF = 0x9B;sfr P4 = 0xC0;sfr P5 = 0xC8;sfr P6 = 0xE8;sfr P7 = 0xF8;sfr P1M1 = 0x91; /PxM1.n,PxM0.n =00->Standard, 01->push-pullsfr P1M0 = 0x92; / =10->pure input, 11->open drainsfr P0M1

16、 = 0x93;sfr P0M0 = 0x94;sfr P2M1 = 0x95;sfr P2M0 = 0x96;sfr P3M1 = 0xB1;sfr P3M0 = 0xB2;sfr P4M1 = 0xB3;sfr P4M0 = 0xB4;sfr P5M1 = 0xC9;sfr P5M0 = 0xCA;sfr P6M1 = 0xCB;sfr P6M0 = 0xCC;sfr P7M1 = 0xE1;sfr P7M0 = 0xE2;sbit P00 = P00;sbit P01 = P01;sbit P02 = P02;sbit P03 = P03;sbit P04 = P04;sbit P05

17、= P05;sbit P06 = P06;sbit P07 = P07;sbit P10 = P10;sbit P11 = P11;sbit P12 = P12;sbit P13 = P13;sbit P14 = P14;sbit P15 = P15;sbit P16 = P16;sbit P17 = P17;sbit P20 = P20;sbit P21 = P21;sbit P22 = P22;sbit P23 = P23;sbit P24 = P24;sbit P25 = P25;sbit P26 = P26;sbit P27 = P27;sbit P30 = P30;sbit P31

18、= P31;sbit P32 = P32;sbit P33 = P33;sbit P34 = P34;sbit P35 = P35;sbit P36 = P36;sbit P37 = P37;sbit P40 = P40;sbit P41 = P41;sbit P42 = P42;sbit P43 = P43;sbit P44 = P44;sbit P45 = P45;sbit P46 = P46;sbit P47 = P47;sbit P50 = P50;sbit P51 = P51;sbit P52 = P52;sbit P53 = P53;sbit P54 = P54;sbit P55

19、= P55;sbit P56 = P56;sbit P57 = P57;/* 收发定义 */#define Baudrate1 9600L/波特率#define UART1_BUF_LENGTH 32u8 TX1_Cnt; /发送计数u8 RX1_Cnt; /接收计数bit B_TX1_Busy; /发送忙标志void UART1_config(u8 brt); / 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.void PrintString1(u8 *puts);u8 idata RX1_BufferUART1_BUF_LENGTH; /接收缓冲/*

20、IO口定义 */sbit P_HC595_SER = P40; /pin 14 SER data inputsbit P_HC595_RCLK = P54; /pin 12 RCLk store (latch) clocksbit P_HC595_SRCLK = P43; /pin 11 SRCLK Shift data clock/* 本地变量声明 */void delay_ms(u8 ms);void DisableHC595(void);void Initialize_LCD(void);void Write_AC(u8 hang,u8 lie);void Write_DIS_Data(

21、u8 DIS_Data);void ClearLine(u8 row);u8 BIN_ASCII(u8 tmp);void PutString(u8 row, u8 column, u8 *puts);void WriteChar(u8 row, u8 column, u8 dat);/* 变量声明 */#define CYCLE 0x1000L /定义PWM周期(最大值为32767)u8 DirLeft15="Dir Left"u8 DirRight15="Dir Right"u8 DirUp15="Dir Up"u8 DirDow

22、n15="Dir Down"u8 HSpeed15="Speed Normal"u8 NSpeed15="Speed Hight"int flag = 0;sbit Pdir1 =P21;sbit Pdir2 =P22;sbit Pfir1 =P23;sbit Pfir2 =P27;void IoInit(void);void SendMegBack(void);void ENpwm(WORD DUTY1,WORD DUTY2,WORD outch,WORD outen);void closepwm();WORD Speed1=75L

23、;WORD Speed2=80L;WORD Fspeed1=75l;WORD Fspeed2=80L;bit Dir=0;/=void main(void)IoInit(); /初始化端口 Initialize_LCD();/初始化端口lcdUART1_config(1); / 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率. EA = 1; /允许总中断 while(1) flag=SBUF;SendMegBack();switch(flag)case '0': ClearLine(1); PutString(1,0,DirLeft); F

24、speed1=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); Fspe

25、ed1=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

26、); 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; Fspeed

27、1=Speed1;Fspeed2=Speed2; break;if(Dir=0)ENpwm(Fspeed1,Fspeed2,0x00,0x0a);Pdir2=0;Pfir2=0;elseENpwm(Fspeed1,Fspeed2,0x00,0x05);Pdir1=0;Pfir1=0;delay_ms(20); /*/void IoInit(void)P0M1 = 0; P0M0 = 0; /设置为准双向口 P1M1 = 0; P1M0 = 0; /设置为准双向口 P2M1 = 0; P2M0 = 0; /设置为准双向口 P3M1 = 0; P3M0 = 0; /设置为准双向口 P4M1 = 0

28、; P4M0 = 0; /设置为准双向口 P5M1 = 0; P5M0 = 0; /设置为准双向口 P6M1 = 0; P6M0 = 0; /设置为准双向口 P7M1 = 0; P7M0 = 0; /设置为准双向口void SendMegBack(void)if(TX1_Cnt != RX1_Cnt) && (!B_TX1_Busy) /收到数据, 发送空闲SBUF = RX1_BufferTX1_Cnt; /把收到的数据远样返回 B_TX1_Busy = 1; if(+TX1_Cnt >= UART1_BUF_LENGTH) TX1_Cnt = 0;void ENpwm

29、(WORD DUTY1,WORD DUTY2,WORD outch,WORD outen)PIN_SW2 |= 0x80; /使能访问XSFRPWMCFG = 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

30、计数PWM2T2 =CYCLE * DUTY1/ 100 ; /设置PWM3第2次反转的PWM计数PWM2CR = 0x08; /选择PWM2输出引脚,不使能PWM2中断PWM3CR = 0x00; PWM4CR = 0x00; PWM5CR = 0x00; PWMCR = outen; /使能PWM信号输出PWMCR |= 0x80; /使能PWM模块PIN_SW2 &= 0x80;/占空比为(PWM2T2-PWM2T1)/PWMCvoid closepwm()PIN_SW2 |= 0x80; /使能访问XSFRPWMCR = 0x00; /使能PWM信号输出PWMCR |= 0x8

31、0; /使能PWM模块PIN_SW2 &= 0x80;Pfir1=0;Pfir2=0;Pdir1=0;Pdir2=0;void delay_ms(u8 ms) unsigned int i; do i = MAIN_Fosc / 13000; while(-i) ; /14T per loop while(-ms);void DisableHC595(void) u8 i; P_HC595_SER = 1; for(i=0; i<20; i+) P_HC595_SRCLK = 1; P_HC595_SRCLK = 0; P_HC595_RCLK = 1; P_HC595_RCLK

32、 = 0; /锁存输出数据 P_HC595_RCLK = 1; P_HC595_RCLK = 0; /锁存输出数据/ 函数: void RTC(void)/ 描述: RTC演示函数/ 参数: none./ 返回: none./ 版本: VER1.0/ 日期: 2013-4-1/ 备注: /=/* LCD1602相关程序 */8位数据访问方式 LCD1602 标准程序 梁工编写 2014-2-21#define LineLength 16 /16x2/* Pin define */sfr LCD_BUS = 0x90; /P0-0x80, P1-0x90, P2-0xA0, P3-0xB0sbi

33、t LCD_B7 = LCD_BUS7; /D7 - Pin 14 LED- - Pin 16 sbit LCD_B6 = LCD_BUS6; /D6 - Pin 13 LED+ - Pin 15sbit LCD_B5 = LCD_BUS5; /D5 - Pin 12 Vo - Pin 3sbit LCD_B4 = LCD_BUS4; /D4 - Pin 11 VDD - Pin 2sbit LCD_B3 = LCD_BUS3; /D3 - Pin 10 VSS - Pin 1sbit LCD_B2 = LCD_BUS2; /D2 - Pin 9sbit LCD_B1 = LCD_BUS1;

34、/D1 - Pin 8sbit LCD_B0 = LCD_BUS0; /D0 - Pin 7sbit LCD_ENA = P07; /Pin 6sbit LCD_RW = P06; /Pin 5 /LCD_RS R/W DB7-DB0 FOUNCTIONsbit LCD_RS = P05; /Pin 4 / 0 0 INPUT write the command to LCD model / 0 1 OUTPUT read BF and AC pointer from LCD model / 1 0 INPUT write the data to LCD model / 1 1 OUTPUT

35、read the data from LCD model/*total 2 lines, 16x2= 32first line address: 015second line address: 6479*/#define C_CLEAR 0x01 /clear LCD#define C_HOME 0x02 /cursor go home#define C_CUR_L 0x04 /cursor shift left after input#define C_RIGHT 0x05 /picture shift right after input#define C_CUR_R 0x06 /curso

36、r shift right after input#define C_LEFT 0x07 /picture shift left after input#define C_OFF 0x08 /turn off LCD#define C_ON 0x0C /turn on LCD#define C_FLASH 0x0D /turn on LCD, flash #define C_CURSOR 0x0E /turn on LCD and cursor#define C_FLASH_ALL 0x0F /turn on LCD and cursor, flash#define C_CURSOR_LEFT

37、 0x10 /single cursor shift left#define C_CURSOR_RIGHT 0x10 /single cursor shift right#define C_PICTURE_LEFT 0x10 /single picture shift left#define C_PICTURE_RIGHT 0x10 /single picture shift right#define C_BIT8 0x30 /set the data is 8 bits#define C_BIT4 0x20 /set the data is 4 bits#define C_L1DOT7 0x

38、30 /8 bits,one line 5*7 dots#define C_L1DOT10 0x34 /8 bits,one line 5*10 dots#define C_L2DOT7 0x38 /8 bits,tow lines 5*7 dots#define C_4bitL2DOT7 0x28 /4 bits,tow lines 5*7 dots#define C_CGADDRESS0 0x40 /CGRAM address0 (addr=40H+x)#define C_DDADDRESS0 0x80 /DDRAM address0 (addr=80H+x)#define LCD_Del

39、ayNop() _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();#define LCD_BusData(dat) LCD_BUS = dat/=void CheckBusy(void) u16 i; for(i=0; i<5000; i+) if(!LCD_B7) break; /check the LCD busy or not. With time out/ whil

40、e(LCD_B7); /check the LCD busy or not. Without time outvoid IniSendCMD(u8 cmd) LCD_RW = 0; LCD_BusData(cmd); LCD_DelayNop(); LCD_ENA = 1; LCD_DelayNop(); LCD_ENA = 0; LCD_BusData(0xff);void Write_CMD(u8 cmd) LCD_RS = 0; LCD_RW = 1; LCD_BusData(0xff); LCD_DelayNop(); LCD_ENA = 1; CheckBusy(); /check

41、the LCD busy or not. LCD_ENA = 0; LCD_RW = 0; LCD_BusData(cmd); LCD_DelayNop(); LCD_ENA = 1; LCD_DelayNop(); LCD_ENA = 0; LCD_BusData(0xff);void Write_DIS_Data(u8 dat) LCD_RS = 0; LCD_RW = 1; LCD_BusData(0xff); LCD_DelayNop(); LCD_ENA = 1; CheckBusy(); /check the LCD busy or not. LCD_ENA = 0; LCD_RW

42、 = 0; LCD_RS = 1; LCD_BusData(dat); LCD_DelayNop(); LCD_ENA = 1; LCD_DelayNop(); LCD_ENA = 0; LCD_BusData(0xff);void Initialize_LCD(void) LCD_ENA = 0; LCD_RS = 0; LCD_RW = 0; delay_ms(100); IniSendCMD(C_BIT8); /set the data is 8 bits delay_ms(10); Write_CMD(C_L2DOT7); /tow lines 5*7 dots delay_ms(6)

43、; Write_CMD(C_CLEAR); /clear LCD RAM Write_CMD(C_CUR_R); /Curror Shift Right Write_CMD(C_ON); /turn on LCDvoid ClearLine(u8 row) u8 i; Write_CMD(row & 1) << 6) | 0x80); for(i=0; i<LineLength; i+) Write_DIS_Data(' ');void WriteChar(u8 row, u8 column, u8 dat) Write_CMD(row & 1

44、) << 6) + column) | 0x80); Write_DIS_Data(dat);void PutString(u8 row, u8 column, u8 *puts) Write_CMD(row & 1) << 6) + column) | 0x80); for ( ; *puts != 0; puts+) /遇到停止符0结束 Write_DIS_Data(*puts); if(+column >= LineLength) break; /* LCD20 Module END */* 串口部分*/=/ 函数: void PrintString1(u8 *puts)/ 描述: 串口1发送字符串函数。/ 参数: puts: 字符串指针./ 返回: none./ 版本: VER1.0/ 日期: 2014-11-28/ 备注: /=void PrintString1(u8 *puts) /发送一个字符串 for (; *pu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论