前一阵子用单片机开发一个小东西,其应用在一个非常潮湿的环境,以至于电脑和人员没发接近,但是又需要很长时间来调整参数,才能将设备设定好。另外设备一直在转动,这又导致不能通过电缆下载程序。在此时,我想到了无线烧写单片机程序的方法,其最方便的便是蓝牙模块。由于我的电脑没有蓝牙,所以找来一对HC-05蓝牙模块来充当无线下载器。HC-05是主从一体,可以相互连接。这里需要注意一下,市面上很多蓝牙模块只能当做从机,不能跟自己同款模块连接。

用蓝牙模块进行无线烧写过程中发现很多问题,而且跟单片机型号、时钟稳定性等因素有关。除了手头上原有的STC89最小系统外,又焊接了STC8、STC15、STC12、STC11四块最小系统,进行了统一测试。

. 绑定蓝牙模块

HC-05蓝牙模块有6个引脚,在此只需其中四根线:两个为电源线(注意,电源需要是5V)、两个为串口线。

1.用USB转串口线直接连接蓝牙模块,并将USB转串口线连接到电脑上。此时蓝牙模块上面指示灯在快速闪烁,说明HC-05在寻找配对蓝牙。之后,我们按住蓝牙模块上的小按钮,不要松手,重新给HC-05模块上电后,再松手。看到指示灯缓慢闪烁,此时蓝牙模块正在等待AT指令。

2.打开串口助手,设定串口参数如下:

发送数据” AT\r\n”后,接收到”OK”,则说明蓝牙模块已经进入调试模式。

设定蓝牙名字(这一步可以跳过):

AT+NAME=HC05A9600\r\n

设置蓝牙串口波特率:9600 ,1 停止位,无校验位

AT+UART=9600,0,0\r\n

设置蓝牙密码:

AT+PSWD=1234\r\n

设置蓝牙的主从模式(0—从, 1—主,一个蓝牙设置为主模式,另一个设置为从模式):

AT+ROLE=0\r\n

指定蓝牙地址连接:

AT+CMODE=0\r\n

互相绑定对方地址时:

(1)首先查询自身的蓝牙地址:

AT+ADDR?\r\n

返回的信息为自身蓝牙地址(例如98d3,37,9e02),需要记下备用。

并用同样的方法查询另一块儿蓝牙的地址,并记下来。

(2)绑定对方地址:

AT+BIND=98d3,35,b736\r\n

注意:蓝牙地址用逗号隔开!

等两块蓝牙模块都设定好后(一个设置为主模式、一个为从模式;相互绑定对方地址),重新上电(上电前不用按小按钮),等几秒后,蓝牙模块信号灯为快速连续闪烁两次,然后熄灭两秒,则表示相互连接好。

. 设定单片机可以通过串口触发软件复位

STC单片机ISP程序下载需要单片机复位才能实现,所以我们设定一个字符或者数字,等到单片机接收到该字符后,便会执行软件复位。从用户程序软复位到ISP的参考代码如下:

Sfr IAP_CONTR=0xC7; // STC89/STC90/STC12C54xx/STC2052系列的SFR地址为 0E7H

在单片机串口中断函数中添加:

if(SBUF==0xf1)  //0xf1为自己设定复位触发字符

IAP_CONTR = 0x60;  //软件复位

将以上代码编译后,烧写到单片机。之后,在串口助手给单片机发送f1就能实现单片机复位。注意:波特率设定为9600(与蓝牙模块的波特率一致)。

资源传送门:https://download.csdn.net/download/fengyuzhe13/85273462

. 蓝牙程序下载测试

由于STC单片机型号繁多,在此取出五款单片机进行测试:STC89(STC89C52RC)、STC11(STC11F04E)、STC12(STC12LE5204AD)、STC15(STC15W408AS)、STC8G(STC8G1K17)等五款型号进行测试。其都是外接晶振11.0592M。

(1)测试1。设定串口波特率为9600,无校验,1停止位。蓝牙模块波特率设定也是9600,无校验,1停止位。在STC-ISP软件中设置如下:

图中自定义命令“f1”就是复位指令。此时,点击“下载/编程”按钮。发现STC89C52RC可以实现蓝牙无线下载,而其他型号的单片机则实现不了。接下来更改蓝牙模块参数,重新测试。

(2)测试2。设定串口波特率为9600,偶校验,1停止位。蓝牙模块波特率设定也是9600,偶校验,1停止位(AT指令:AT+UART=9600,0,2\r\n)。在STC-ISP软件中设置如下:

点击“下载/编程”按钮。发现除了STC89C52RC不能实现蓝牙无线下载,而其他型号的单片机都可以实现。

. 总结

STC89C52RC内部没有RC振荡器,只能用外部晶振,其在使用ISP下载时,不需要设定串行通信校验位。而STC8、STC15、STC12、STC11内部集成了RC,而且精度不如外部晶振,其在通信时可能会发生错误。因此这些单片机(尤其是使用IRC时)进行ISP时,需要加入校验位(偶校验),那么对应的蓝牙模块也要设置为偶校验。

另外,测试还发现IRC时钟在串行通信时,单个字符的发送与接收还是比较稳定;而连续大量字符发送时,可能就会发送错误。所以在做连续大规模数据传输时,建议采用外接晶振。

. 补充

(1)我平时习惯了串口无校验位通信,而采用STC8、STC15、STC12、STC11等单片机通过蓝牙下载后,必须将串口的为工作方式3,才能跟PC正常通信(不然蓝牙模块只能当下载器用,一旦单片机开始工作后,就无法和蓝牙模块通讯)。设定:

SCON = 0xd0;

发送串行数据时:

ACC=dat;  //dat为待发送数据,ACC为累加器

TB8=P;  //TB8存放PSW中的奇偶校验位

SBUF=dat; //串口发送数据

而接收数据时,可以进行偶验证,也可以直接读SBUF。

(2)由于串口中断函数中,增加了复位指令,所以在PC给单片机发送控制指令时,不要发送能触发复位的指令。尽量发送ASCII字符(ASCII码值只有128个,其码值小于0x80),以规避复位指令。

. 后记

通过无线模块烧写STC程序,总共花费了我一个多星期的时间,甚是感慨。有人会问,为什么为了这么简单的东西花了这么长时间?答曰:走弯路了,而且还是大弯路。一月份的时候首次用STC15W408AS(无晶振)模块进行蓝牙模块下载,当时设定的蓝牙模块为无校验位,不管怎么重启和尝试就是不能下载,很是郁闷,折腾了一天放弃了(但也学会了如何绑定两个蓝牙模块和单片机软件复位)。现在疫情爆发,封闭到家里面,就开始再次研究这个问题。

当时想着可能是内部IRC精度不高造成,毕竟用串口线给其烧写程序时,经常失败。所以我手动焊接了一块儿带外接晶振的STC15W408AS,结果还是不能通过蓝牙模块下载程序,又吃了一个闭门羹。然后我想起来之前有一块儿STC89的最小系统板,然后就拿过来测试。结果发现一键下载,异常的丝滑,让我顿时来了精神。我觉得89系列能下载,这说明蓝牙模块做无线下载应该没有问题。紧接着我又开始捣鼓STC15,当时从网上搜索“STC15无线下载”,但是没有得到有效的信息。此时,我就愈发对ISP协议感兴趣,从网上找了ISP一些协议来研究,并用三个USB转串口模块,来窃取STC15在烧写程序时的通讯数据。结果发现这些数据不恒定,当时还觉得ISP协议还是加密的,且跟烧写次数以及烧写时间有关,很是牛(现在知道了是因为,用无校验位的串口去窃取,其本身就不稳定)。而且还发现把某些通讯数据慢慢发送给STC-ISP也能触发其“检验MCU”,但是一旦发送的快了就不行。此时觉得应该是蓝牙模块数据阻塞的原因,蓝牙发送数据不是匀速,应该一个个数据包进行的,导致上位机采集不均匀(到此时,我还是没有察觉是校验位的问题)。之后用STM32进行数据的转送,以均匀的速度将数据一个个发送出去,但是其只能完成一小步烧写流程,到“重新握手”就卡死了。此后还尝试了wifi模块、超再生模块、脱机下载器等等一些方法。直到仔细查看STC15数据手册时,在其ISP脱机下载程序(“利用主控芯片对从芯片(限STC15系列)进行ISP下载”)中有一行:

这是一语惊醒梦中人,但是其下面的TMOD=0x00;是明显的错误。尽管不能保证其一定是偶校验,但是数据手册上的利用主控芯片对从芯片(限STC15系列)进行ISP下载的程序绝对是有问题。之后将蓝牙模块加上偶校验,下载STC程序,一切正常。为了结束这么长时间的摸索,所以我又一口气焊接了STC8、STC12、STC11三款带晶振的最小系统板。并进行了测试,发现他们也得增加偶校验才能无线烧写程序,因而我觉得应该是STC公司将所有IRC芯片都设置了ISP偶校验通讯。之后,在网上搜索“STC无线下载”时,发现有用STC12成功的,其就是增加了偶校验。哎,如果当时能认真搜素且认真阅读每一个信息,就应该不会走这个大弯路了吧。

STC单片机蓝牙无线下载-烧写程序ISP(STC8 STC15 STC12 STC11 STC89)相关推荐

  1. Stm32开发1-蓝牙实现STM32的无线烧写程序 ISP模式 串口1不受影响 无线下载

    最近研究如何实现Stm32的无线烧写程序.从CSDN上看到大部分的无线烧写方法,大都是采用ESP8266+CMSIS-DAP的方式,其能下载也能调试程序,也能通过虚拟串口通信.但是其串口应该是用软件实 ...

  2. 飞思卡尔MKL系列单片机用jlink烧写程序出现的Kinetis (connect): Timeout while halting CPU. CPU does not stop.问题

    最近用Jlink烧写飞思卡尔MKL16Z128单片机时发现经常出现不能连接成功的情况,用的是SWD接口,排查了好久后来发现问题在单片机的RESET脚上,因为之前用SWD接口的时候只接4线(SWD.SC ...

  3. 51单片机usb烧录电路_51单片机怎么用usb烧写程序 - 全文

    单片机怎样用usb烧写程序 首先,需要安装keil软件和STC_ISP程序下载软件. 先对你想要实现对单片机的功能用keil编程,然后用STC_ISP下载软件下载到单片机上,最后打开给单片机提供电源就 ...

  4. 给单片机焼写程序需要什么东西_单片机怎么烧写程序

    1.单片机怎么烧写程序 STC系列单片机为例:首先,需要安装keil软件和STC_ISP程序下载软件.先对你想要实现对单片机的功能用keil编程,然后用STC_ISP下载软件下载到单片机上,最后打开给 ...

  5. C语言烧写C51单片机的线,51单片机烧写程序过程以及详细说明【图文】

    Step 1:Keil软件的安装 1.选中文件夹中的C51V900安装程序并打开,如图: 2.在安装对话框里一直选择Next,直到Finish完成Keil的安装. Step 2: 安装USB转串口线的 ...

  6. STM32、51单片机如何使用USB转TTL烧写程序?

    STM32.51单片机如何使用USB转TTL烧写程序? 一个好的程序员就要有钻研的精神,有串口工具就要用! 下面给大家介绍一下除了用J/ST-LINK烧写程序的另一种方法. 废话不多,按步骤一步步来! ...

  7. hc05与单片机连接图_小白学单片机:单片机烧写器及烧写软件的使用

    一.为什么叫烧写 早期一般是将调试好的单片机程序写入到ROM.EPROM中,这种操作就像刻制光盘一样,实在高电压方式下写入,PROM是一次性写入,存储内部发生变化,有些线路或元件就被烧断,不可再恢复, ...

  8. 单片机片内存储器烧写

    单片机片内存储器烧写(ROM编程) (纯粹个人理解,收集资料总结,如有不妥还请指出) 单片机应用系统由硬件和软件组成,软件的载体是硬件的程序存储器,程序存储器采用只读存储器,这种存储器在电源关闭后,仍 ...

  9. STC单片机高速下载电路改进

    01改进的思路 在2020年5月20日,收到了来自STC公司发送过来更新后的STC8H技术手册,其中对于原来连接在UART-TTL转换RS232芯片与STC8H下载端口的二极管和电阻可以去掉了. 这两 ...

最新文章

  1. 由MessageBox和AfxMessageBox的使用异同所感
  2. 告别2010,迎来2011
  3. 推荐一款 最方便的 阅读blog的软件---SharpReader!
  4. 获取远程服务器代码到本地文件,获取远程服务器代码到本地文件
  5. 批量删除数据库中有特定开始字符的表、视图和存储过程
  6. 大型网站典型故障案例分析
  7. 通俗易懂,C#如何安全、高效地玩转任何种类的内存之Span的脾气秉性(二)
  8. 如何写出安全的API接口(参数加密+超时处理+私钥验证+Https)- 续(附demo)
  9. InnoDB 事务/锁/多版本分析?你了解多少?
  10. Mint-UI 移动首页开发 - header导航、banner轮播图
  11. RocketMQ的架构设计详解
  12. NIS 病毒库 更新 地址
  13. 斑马zebra GX420d打印机的Labview程序
  14. wacom win10 未连接任何设备 驱动的问题 解决影拓3手绘板等老设备驱动无法在win10使用的问题
  15. python人口普查数据显示_如何使用FCC的API在Python中查找人口普查数据块并遍历dict列表?...
  16. Python利用requests库爬取百度文库文章
  17. node之cookie-parser
  18. 仿网易云PC端项目-vue
  19. 关于文件句柄数和文件描述符的区分
  20. 先验概率、后验概率、条件概率的形象解释

热门文章

  1. 安卓系统应用程序开发!华为Android面试真题解析,内含福利
  2. 怎样对平面中的点进行顺时针或者逆时针排序
  3. 在linux下搭建私有云
  4. 湘潭大学计算机考研复试题,湘潭大学信息工程学院2019年考研复试程序设计练习题...
  5. mysql查询数量语句_mysql语句统计总数_一条sql语句实现统计查询_MySQL
  6. 与bootstrap相配合使用的插件
  7. 并发底层原理:线程、资源共享、volatile 关键字
  8. 爱立信高级副总裁柯瑞东:爱立信的“中国任务”
  9. 线控转向系统的carsim与simulink联合仿真
  10. Yarn新的资源调度策略-label based scheduling