STC8+蓝牙模块+蓝牙调试器

目录

一、材料

二、步骤

1.软件中定义数据包

2.软件中定义控件

3.数据包结构分析

4.代码流程

5.效果

 总结:

前言

最近要用到蓝牙,发现蓝牙调试器上自定义数据挺合适的,有点难,网上的教程都是基于stm32,看他们的代码研究思路,太折磨了。所以,写完后我就把我基于stc8的用法,以及思路写下。

一、材料

我所用到的是STC8A8K64S4A12核心板,蓝牙模块(HC-05),蓝牙调试器(手机软件)

二、步骤

1.软件中定义数据包

  1. 打开软件,点击下方导航栏的专业调试,来到图一。点击下方+号,可创建一个工程。点击新建的工程,点击通信设置。
  2. 来到图二,在这里可以定义发送和接收的数据包的结构,在接收数据包这,我定义了两个数据。
  3. 图三,通信模式的配置。(右上角的问号有详细介绍,下文会有用到)
图一
图二
图三

2.软件中定义控件

      按步骤,添加控件

图四
图五
图六

  1. 图七框中的三个参数分别是:接收还是发送,数据类型,数据名。(图片中控件有数据残留,那是因为,之前调试时留下的)
  2. 图八中,我添加了两个可编辑文本来接收,和一个按钮来发送。
  3. 图九,就是数据包的结构介绍。
图七
图八
图九

3.数据包结构分析

由图九可知,一个数据收发满足以下结构

  1. 包头:0xA5      (一个字节)
  2. 元数据:自定义(X个字节)
  3. 校验和:原始数据所有字节之和的低8bit数据   (一个字节)
  4. 包尾:0x5A       (一个字节)

例如我们要收发一个包含一个整型(占4个字节)一个浮点型(占4个字节)数据

那么收发的字节量就是:包头(1)+元数据(4+4)+校验和(1)+包尾(1)=11

4.代码流程

  1. 基础设置
    #define LY_Data_Len 11			//蓝牙数据包大小(长度)
    char LY_Data_Sz[LY_Data_Len];	//蓝牙数据包缓存区
    char LY_JSXY=0;		            //接收校验
  2. 蓝牙串口初始化函数,波特率9600。
    void LY_Init()
    {
    
    	PCON &= 0x7F;		//波特率不倍速
    	SCON = 0x50;		//8位数据,可变波特率
    	AUXR |= 0x40;		//定时器时钟1T模式
    	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
    	TMOD &= 0x0F;		//设置定时器模式
    	TMOD |= 0x20;		//设置定时器模式
    	TL1 = 0xDC;			//设置定时初始值
    	TH1 = 0xDC;			//设置定时重载值
    	
    	
    	ES=1;				//打开接收中断
    	EA=1;				//打开总中断
    	TR1=1;				//打开计数器
    }
  3. 串口中断
    void LY_Routine() interrupt 4
    {
    	int a;
    	int b=0x01;
    	if(RI==1)					//如果接收标志位为1,接收到了数据
    	{
    		a=SBUF;
    //		LY_SendByte(a);
    		if(a==0xA5) LY_JSXY=1;
    		if(LY_JSXY==1)
    		{
    			LY_Send_MA();
    		}
    		if(a==0x5A) LY_JSXY=0;
    		RI=0;					//接收标志位清0
    	}
    }
  4. 串口发送函数
    //单次发送
    void LY_SendByte(unsigned char Byte)
    {
    	SBUF=Byte;
    	while(TI==0);
    	TI=0;
    }
    
    //多次发送
    void LY_Send_For(char* Data,int Len)
    {
    	char fora=0;
    	while(fora<Len)
    	{
    		SBUF=Data[fora];
    		fora++;
    		while(TI==0);
    		TI=0;
    	}
    	
    }
  5. 装配函数(装配的目的,因为int型,float型的数据比较长有4个字节,而串口只能一个字节一个字节的发送,所以,要给这些长字节分段。)
    //整型装配
    //参数:要写入的int型的值,在蓝牙数据包位置
    void LY_Int(int num,char *byte)		
    {        
    	byte[3] = (num & 0xFF000000) >> 24;
    	byte[2] = (num & 0x00FF0000) >> 16;
    	byte[1] = (num & 0x0000FF00) >> 8;
    	byte[0] = (num & 0x000000FF);
    }
    
    //浮点型装配
    //参数:要写入的float型的值,在蓝牙数据包位置
    void LY_float(float num,char *byte)		
    {
        unsigned long longdata = 0;
    	longdata = *(unsigned long*)&num;       
    	byte[3] = (longdata & 0xFF000000) >> 24;
    	byte[2] = (longdata & 0x00FF0000) >> 16;
    	byte[1] = (longdata & 0x0000FF00) >> 8;
    	byte[0] = (longdata & 0x000000FF);
    }
    
    //计算校验和,并自动装配
    void LY_check()
    {
    	int LY_Zh=0;
    	char DataLen=LY_Data_Len-3,fora;
    	for(fora=1;fora<=DataLen;fora++)
    	{
    		LY_Zh=LY_Data_Sz[fora]+LY_Zh;
    	}
    	LY_Data_Sz[LY_Data_Len-2]=LY_Zh & 0xff;
    }
  6. 蓝牙发送主函数(串口触发事件)
    //蓝牙发送主函数
    void LY_Send_MA()	
    {
    	
    	LY_Data_Sz[0]=0xA5;
    	LY_Data_Sz[LY_Data_Len-1]=0x5A;
    	
    	LY_Int(1521,&LY_Data_Sz[1]);
    	LY_float(1.23,&LY_Data_Sz[5]);
    	
    	LY_check();
    	LY_Send_For(LY_Data_Sz,LY_Data_Len);
    }

5.效果

        当你按下发送按键后,就能得到返回数据(该数据是在上述代码中设置好的),并展示在连接在可编辑文本。        

 三、总结

        第一次写文章,总感觉有点拖沓了,不知道还有什么遗漏,见谅见谅。在摸索一下怎么把库文件发出来先。

我的蓝牙库:

链接:https://pan.baidu.com/s/1KJ4KfjjlL0i4a_JMfavFXg 
提取码:3wv5

  • 7
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 33
    评论
智能小车平台需要实现的功能:上位机无线遥控可发送速度、转向、行车时间、轨迹、测距、自动蔽障等控制命令,同时可以反馈实时速度、距离、电源电压、功率等状态数据。 硬件原理 1、电机驱动: 智能小车采用12V直流电机为后轮驱动力,6V步进电机为前轮转向控制提供动力,故智能车平台需驱动12V直流电机和6V步进电机。由于需要控制小车的车速以及小车行驶的方向(包括转向以及前进、后退、停车),直流电机驱动采用常用的H桥电路,通过控制信号选通对管与否实现电机的正反转,并改变所加电压的占空比来改变电机转速。这里采用电机驱动专用芯片L298N,该芯片可驱动两路5-36V的直流电机或者一路四拍的步进电机。同时在L298N与主控芯片间通过四路光耦TLP521-4隔离消除干扰信号。 搭建好电路后不要直接在小车上调试,外界一只相同电压的电机测试模块。在STC12C5A60S2上配置好串口、PWM,实现串口接收的数据直接赋值给PWM定时器CCAP1L、CCAP1H。利用串口调试助手发送控制信息给STC12C5A60S2,同时辅助外界电源更改L298N的IN1和IN2,共同完成L298N电机驱动模块的调试。 2、光电对管测速 光电对管采用TCRT5000,由一只特殊的发光二极管和光电三极管构成,当二极管发出的光打在光电三极管的基极B上时三极管CE导通。而正常情况下二极管的光不能到达光电管的基极上,故通过在车轮上贴反射片即可实现对小车的测速。假设车轮均匀贴有n片反射片,测得光电三极管的输出脉冲频率为f,则车速=f/n。为了提高测速的精度,在信号后级添加比较器调理信号为标准的方波,调节比较器运放的偏置电压使方波信号最适合于测速。 同样适用外界电机(已配有自制的编码盘),给电机加电让其带动编码盘旋转,将光电对管靠近编码盘,用示波器观测输出脉冲信号的有无与好坏,调节比较器偏置电压使脉冲最接近于方波且幅度大于3.3V。 3、超声测距 超声波测距的方法有多种:如往返时间检测法、相位检测法、声波幅值检测法。本设计采用往返时间检测法测距。其原理是超声波传感器发射一定频率的超声波,借助空气媒质传播,到达测量目标或障碍物后反射回来,经反射后由超声波接收器接收脉冲,其所经历的时间即往返时间,往返时间与超声波传播的路程的远近有关。测试传输时间可以得出距离。假定s为被测物体到测距仪之间的距离,测得的时间为T,超声波传播速度为V表示,则有关系式S=VT/2 。 超声波发射部分是为了让超声波发射换能器TCT40-16T能向外界发出40 kHz左右的方波脉冲信号。编程由单片机端口输出40 kHz左右的方波脉冲信号,由于单片机端口输出功率不够,40 kHz方波脉冲信号分成两路,送给一个由74HC04组成的推挽式电路进行功率放大以便使发射距离足够远,满足测量距离要求,最后送给超声波发射换能器TCT40-16T以声波形式发射到空气中。发射部分的电路,如图4所示。图中输出端上拉电阻R31,R32,一方面可以提高反向器74HC04输出高电平的驱动能力,另一方面可以增加超声换能器的阻尼效果,缩短其自由振荡的时间。 上述TCT40-16T发射的在空气中传播,遇到障碍物就会返回,超声波接收部分是为了将反射波(回波)顺利接收到超声波接收换能器TCT40-16R进行转换变成电信号,并对此电信号进行放大、滤波、整形等处理后,这里用索尼公司生产的集成芯片CX20106,得到一个负脉冲送给单片机的INT0引脚,以产生一个中断。 接在CX20106的第五脚上的电阻,用以设置带通滤波器的中心频率f0,阻值越大,中心频率越低。电路中采用一只粗调的可变电阻和一只精密调节的电阻串联而成。调节函数信号发生器产生40K的方波,接在超声发射电路的输入端,同时用示波器观测超声接收电路的输出端。用书本等模拟障碍物,调节两只电阻观测示波器看接收端否会产生电平跳变。 4、电源模块 对于小车而言电源是整个系统的咽喉,考虑到体积、重量、电能容量等。这里我们选取8节1.5V锂电池串联起来作为总电源输出(12V),采用LM78L05、LM317构成整个电源模块。 5、无线通信模块 无线通信采用现成的串行接口的蓝牙模块,只需要配置主从机、信道、通信密钥、波特率即可实现无线串行通信。这样PC和主控STC12C5A60S2只需将通信理解为串行通信,给程序构架带来便利。不过需要考虑通信接口的问题:STC12C5A60S2是5V电压供电,TXD和RXD的通信电信号自然是以5V为参考电平;蓝牙模块是3.3V电压供电,TXD和RXD的通信电信号自然是以3.3V为参考电平。所以我们需要添加电平转换,实现STC12C5A60S2与蓝牙模块的正常通信。一般电平转换可以使用专用的芯片74xHCT或164245,电阻分压法、OC/OD 器件法、晶体管上拉电阻法等。不过对
前言: 记得在上大二下的时候参加了2015全国电子设计大赛,题目刚下来便决定了做C题"多旋翼的自主飞行器"4天3夜拿到瑞萨最小系统后便开始写各个模块的驱动代码,因为有开发环境CUBE的神助攻,所以前期的驱动代码是还很顺利的。接下来便是飞行器的组装和电路板 制作,在一起就绪后花掉了2天时间,剩下的两天便疯狂调试,最苦恼的是电池供给跟不上,无奈只能调调停停,初次制作算法也还不够成熟,我直接用的以前做平衡车的经验。不过最后飞得也还算平稳,用的手机加蓝牙控制飞行(后来想一想也是胆大),但题目要求自主飞行,于是我便苦恼了,我便开始记录四旋翼起飞的油门,在起飞后直接给油门(危险)效果也还可以,就在比赛前一天晚上出事故了 一块刚充满电的电池 我装上做最后测试。电池电量过高 直接结果导致飞机飞太高撞到了天花板,结果将飞机撞坏了一个电机,桨就不用说了 惨,不过幸运的是人没事。队友也傻了,怎么办?此时已是凌晨1点。我们捡起“残骸”拍拍上面的灰,听了首“安河桥”便开始和队友一起埋头苦干。哈哈···最后在早上6点前飞机修好了 虽然效果大打折扣不过最基本的任务还算能够完成。第二天比赛,我们是下午开始。第一次参赛,试飞的时候发现异常,冷静后发现超声波线松了 排除故障后开始比赛,比赛结果就不往下写了。(。。。。。)无论怎样我很享受这个过程。比赛结束后便有了做一个小四轴的想法,于是便在网上搜索资料,偶然看到了STC的这个开源项目,于是便自己也动手做了一个,控制代码我也有重写,现分享给大家!!!一起交流!!! 功能概述: 本设计是基于STC15W4K61S4的微型四轴。以STC15W4K61S4为主控。硬件包括,mpu6050传感器,电源,nrf2401通信模块,720空心杯电机,PCB机架。姿态解算采用四元数,串级PID作为控制器,配合遥控器实现俯仰,横滚,偏航姿态控制。主要用于学习和理解四轴飞行器的基本原理。 实物图: 应用场景: 控制思路: 首先调整电机1,3同向 2,4同向 且相邻电机旋转反相在X型模式下首先通过mpu6050获取三轴加速度计和三轴陀螺仪数据 经过数据处理融合后 得到姿态角度pitch roll 以及Z轴陀螺仪积分出 yaw角。将得到的姿态角送入PID控制器计算输出对应的油门补偿对应的电机 从而使四旋翼平衡。简单来说飞机往那边沉 对应的电机就加速提高升力抵抗它下沉,它的下沉程度是通过角度来反映的而已,具体补偿多少合适,则是通过PID控制器计算的而已。单纯通过角度误差来控制,是属于单级的PID 控制。经过试验这种控制策略应用在小四轴效果不太理想,因此我们通常采用的串级PID控制小四轴,即引入了角速度环,通常内环使用PD(对象角速度)外环使用PI(对象角度&内环输出)这样的控制策略在测试中效果较好,但理想的参数调整比较难,因此需要耐心调试才能得到较好的效果。 系统框图: 本系统硬件设计组成: 主控:STC15W4K61S4 (封装:LQFP32) 传感器:MPU6050(三轴加速度计,三轴陀螺仪)(封装:QFN)https://www.datasheet5.com/pn-MPU-6050-1083104 电机:720空心杯 MOS管 AO3400A (封装:SOT23_M)https://www.datasheet5.com/pn-AO3400A-1215185 2.4G无线:NRF2401 (模块)https://www.datasheet5.com/datasheet/NRF2401/250319... 电源芯片: ME6219 (封装:SOT95)https://www.bom2buy.com/search/ME6219 BL8530-501SM(封装:SOT89)https://www.datasheet5.com/pdf/BL8532/1751621/BELLI... 元器件成本估算: 部分器件成本估算:https://www.bom2buy.com/list/1312-stc15w4k61s4 总结: 此项目在大三上完成,经过调试 能够实现基本飞行,同时也存在以下问题: 参数应该还不够理想(遥控器跟随效果不好)。 PCB设计过大 导致超重,因为担心手焊的MPU不好使故留了较多直插模块接口同时还考虑到十字和X型所以各留了一个这样的直插接口。 这是一次不错的动手经历吧,从原理图PCB到代码都是自己一个人完成,每当遇到问题就网上寻求答案,过程还是很坎坷的,不过也特别有意思。同时也学到很多知识,做事情也更加细心严谨! 测试结果: 手机里翻了半天总算找到了一点视频上传与大家分享,效果不太好希望勿喷。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值