STC51单片机实现蓝牙无线下载程序

时间:2022-03-11 15:25:22

STC51单片机一般是通过串口线下载程序到MCU。但是,有时候单片机放在作品上,串口线不够长,不方便下载,或者频繁拔插单片机,也不方便。

本方法,通过笔记本蓝牙,蓝牙串口模块HC-05,即可实现STC51单片机无线下载程序到MCU。


需要以下准备:

  1. 有蓝牙模块的笔记本。

  2. 蓝牙串口模块HC-05

  3. STC51单片机

  4. STC-ISP V6.53(只要能任意选择COM口的都行。)

  5. USB转串口模块


第一步:

 打开笔记本蓝牙模块。首先你要确定你有蓝牙模块和装好相应的驱动,这里我就不详细展开了。不同笔记本打开方式不同。我的联想Y笔记本如图1:

STC51单片机实现蓝牙无线下载程序

第二步:

将USB转串口和HC-05的VCC,GND,相连,TXD接RXD,RXD接TXD。将USB转串口模块插入笔记本。此时HC-05指示灯应该是快速闪烁。

如上图,点击添加设备,搜索到HC-05后连接,输入设备的配对码 1234 ,如图2,

STC51单片机实现蓝牙无线下载程序

然后就连接成功,在 控制面板\硬件和声音\设备和打印机 里便可以看到HC-05了。在HC-05上右键,属性,硬件,便可以看到COM口号,COM28,如图3。

STC51单片机实现蓝牙无线下载程序


第三步:

将HC-05模块的PIO11置高(我买的模块有个按键),上电,模块便进入AT命令响应模式。此时HC-05指示灯应该是慢速地闪烁。

此时可以打开任意串口助手软件,如STC-ISP的串口助手,设置波特率38400,数据位8位,停止位1位,无校验位,无流控制。

串口发送字符: AT(后面要加个回车键,我之前不知道,以为没进入AT模式),成功则返回OK。

接下来设置HC-05工作模式:波特率9600,数据位8位,停止位1位,偶校验,无流控制。串口发送字符:AT+UART=9600,0,2

然后就可以关闭串口了。

STC51单片机实现蓝牙无线下载程序


第四步:

将HC-05插到单片机上,还是一样,VCC,GND,相连,TXD接RXD,RXD接TXD。

硬件部分就完成了。


第五步:

在单片机程序中加入ISP.c,ISP.h,在程序开关调用函数 UARTInit(); 实现STC51单片机的ISP。

/******************************************************************************
* 文 件: ISP.c
* 原作者: 李锋源
* 修 改: ZhnJa
* 创建日期: 2011-7-15
* 修改日期: 2013-8-01
* 说 明: 原文件为阿土开发板的Driver.c,提取出来的ISP下载程序。
******************************************************************************/

#include "ISP.h"
#include "STC12C5A60S2.h"
#include <intrins.h>

#ifdefSelf_Define_ISP_Download//如果有自定义ISP下载功能
unsigned char bufptr;
code unsigned char passward[]={ICPCODE};
unsigned char buf[sizeof(passward)*2];//静态串口缓冲区
#endif

/******************************************************************************
* UART初始化
*描 述:串口初始化函数, 通常是在使用串口前调用本函数来进行初始化, 通常是在
* main函数中调用。
*入口参数:无
*返 回:无
*注 意:串口使用的是中断模式
******************************************************************************/
void UARTInit(void)
{
#define Fclk 11059200UL//晶振 11.059M 不可以写成11059200
#define BitRate 9600UL//9600b/s
unsigned char i;
unsigned int j;
#ifdefSelf_Define_ISP_Download //自定义下载使用到
bufptr = 0;
for( i=0; i<sizeof(buf); i++)
{
buf[i] = 0;
}
#endif
EA=0; //暂时关闭中断
TMOD &= 0x0F;
TMOD |=0x20; //定时器1工作在模式2,自动重装模式
SCON=0x50; //串口工作在模式1
TH1=256-(Fclk/(BitRate*12*16)); //计算定时器重装值
TL1=256-(Fclk/(BitRate*12*16));
PCON|=0x80; //串口波特率加倍
// ES=1; //串行中断允许
TR1=1; //启动定时器1
REN=1; //允许接收
EA=1; //允许中断

for(i=0;i<8;i++) //短暂延时判断有无ISP下载命令
{
for(j=0;j<40000;j++)
{
if(RI)
{
RI = 0;
IAP_CONTR = 0x60; //复位到IAP
}
}
}
ES=1; //串行中断允许
}


/******************************************************************************
* 延时1s函数
*描 述:延时1s函数,在UartInit()调用供ISP延时。
*入口参数:无
*返 回:无
*注 意:
******************************************************************************/
void delay1s(void)
{
unsigned char i,j,k;
for(i=0;i<200;i++)
{
for(j=0;j<200;j++)
{
k = 10;
while(k--);
}
}
}
/******************************************************************************
* 发送一个字符
*描 述:向串口发送一个字符。
*入口参数:要发送的字符
*返 回:无
*注 意:
******************************************************************************/
void SendByte(unsigned char c)
{
SBUF = c;
while(!TI);
TI = 0;
}
/******************************************************************************
* 发送一个字符串
*描 述:向串口发送一个字符串
*入口参数:*s要发送的字符串
*返 回:无
*注 意:
******************************************************************************/
void SendStr(char *s)
{
while(*s)
{
SendByte(*s++);
}
}

/******************************************************************************
* 串口0中断
*描 述:串口0(UART0)中断。
*入口参数:无
*返 回:无
*注 意:
******************************************************************************/
void UartISR(void) interrupt 4
{
#ifdef Self_Define_ISP_Download

unsigned char ptScr,ptDst;
if(RI)
{
RI = 0;//清标志位
buf[bufptr] = SBUF;
ptScr = bufptr;
if(bufptr==sizeof(buf))
{
bufptr = 0;
}
else
{
bufptr++;
}
while(buf[ptScr] == passward[ptDst])
{
if(ptScr == 0)
{
ptScr = sizeof(buf)-1;
}
else
{
ptScr--;
}
if(ptDst == 0)
{
//reset();
delay1s();
//复位前提示程序
IAP_CONTR = 0x60; //复位到IAP
}
else
{
ptDst--;
}
}
//用户程序开始


//用户程序结束
}//End if(RI)
if(TI)//发送完成
{
TI = 0;//清标志位
}
#else //如果不使用自定义ISP下载程序
if(RI)
{
RI = 0;
}
else
{
TI = 0;
}
#endif
}

/*======================End Of File====================*/

/******************************************************************************
* 文 件: ISP.h
* 原作者: 李锋源
* 修 改: ZhnJa
* 创建日期: 2011-7-15
* 修改日期: 2013-8-01
******************************************************************************/
#ifndef__ISP_H__
#define __ISP_H__

#include "STC12C5A60S2.h"
//系统配置
#define Self_Define_ISP_Download//ISP下载
#define ICPCODE0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF
#define FOSC11059000UL
#define T100HZ (FOSC/12/100)


//函数声明

//串口
void UARTInit(void);
void UARTInit(void);

void SendByte(unsigned char c);
void SendStr(char *s);

void delay1s(void);


#endif

第六步:

先用普通的正常下载方式将包含有ISP功能的程序下载到STC51单片机上。

打开STC-ISP(V6.53),设置如图,点击发送自定义下载命令即可实现远程下载。

补充:最高,最低波特率要设置为9600

STC51单片机实现蓝牙无线下载程序


说明1: ISP,即In-System Programming,在线编程。 具有ISP功能的单片机芯片,可以通过简单的下载线直接在电路板上给芯片写入或者擦除程序,并且支持在线调试。 说明2: 须先下载一次有ISP功能的程序到单片机,之后才能实现冷启动下载程序,即ISP功能。