找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4591|回复: 19
打印 上一主题 下一主题
收起左侧

STC单片机不断电下载程序

  [复制链接]
跳转到指定楼层
楼主
本帖最后由 无量寿经 于 2020-10-8 15:06 编辑

时间长了,居然把这个简单实用的功能忘了,重新整理了下,适用于STC89、STC12、STC15、STC8等所有型号的STC单片机快速高效下载程序。完整工程可查看附件。


STC单片机不断电下载程序.rar (723.45 KB, 下载次数: 54)
原理:先测试出STC-ISP下载软件下发的串口命令,在程序中开启串口中断,中断接收得到下载命令就执行一条单片机复位命令,程序就自动下载进去了,整个过程不断电,也不需要操作复位按钮,下载过程不需要触碰硬件。

   1   下载最低波特率9600



   2   接收波特率9600
接收波特率9600,接收到的连续数据为7F,接收波特率不同,结果也会不一样。
知道了STC-ISP软件下发的数据,我们程序开启串口接收中断,判断接收的数据如果是这里7F,让单片机执行一条复位命令,程序就下载进去了。

#include "STC15W4K.H"      // 包含 "STC15W4K.H"寄存器定义头文件

unsigned  char num=0;       // 存放接收到的1个字节的数据
void delay500ms(void)
{
   unsigned char i,j,k;
  for(i=93;i>0;i--)     //注意后面没分号
  for(j=235;j>0;j--)    //注意后面没分号
  for(k=125;k>0;k--);    //注意后面有分号
}
void UART_init(void)
{        
    // 下面代码设置定时器2
    T2H  = 0xFD;  //波特率:9600 /22.1184MHZ,1T
    T2L  = 0xC0;  //波特率:9600 /22.1184MHZ,1T
    AUXR = 0x15;    // 0001 0101,T2R=1启动T2运行,T2x12=1,定时器2按1T计数,S1ST2=1
    // 下面代码设置定串口1
    SCON = 0x50;  // 0101 0000 SM0.SM1=01(最普遍的8位通信),REN=1(允许接收)
    // 下面代码设置中断
    ES   = 1;     //开串口1中断
    EA   = 1;     //开总中断
}

void main()
{
    UART_init();
    P00=0;
    delay500ms();
    P00=1;
    while(1)
    {
       P01=!P01;
       delay500ms();
    }
}  

void UART1(void) interrupt 4 // 串行口1中断函数
{
    if(TI)
    {
       TI = 0;           
    }
    if(RI)
    {
       RI = 0;
       num = SBUF;
       if (num==0x7F)  
       {
           IAP_CONTR   =    0x60;   //0110,0000  软复位到系统ISP监控区
       }      
    }
}




评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏11 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:328014 发表于 2020-10-8 16:19 | 只看该作者
这个在调试程序的时候,确实很方便,谢谢版主,牛逼
回复

使用道具 举报

板凳
ID:387856 发表于 2020-10-8 17:53 | 只看该作者
是不是程序里面加上这一段就可以了不断电下载了,调试OK后,再把这段程序删掉  是不是这样?
回复

使用道具 举报

地板
ID:224104 发表于 2020-10-9 06:46 | 只看该作者
还有一种方法是通过ne555定时器电路自动断电再自动上电。免去第二片单片机,节省成本
回复

使用道具 举报

5#
ID:65956 发表于 2020-10-9 09:10 | 只看该作者
你这种只适用不带串口通讯的工程或项目,如果有用到串口通讯就不可能用这样就能解决的事,因为在通讯过程中也完全有接到7F这个字符的数据
回复

使用道具 举报

6#
ID:191408 发表于 2020-10-9 09:48 | 只看该作者
在串口通讯程序里面加一个复位程序就可以实现了file:///C:/Users/zhang/Desktop/%E4%B8%8B%E8%BD%BD.png
回复

使用道具 举报

7#
ID:518902 发表于 2020-10-9 22:00 | 只看该作者
guysxpf 发表于 2020-10-9 06:46
还有一种方法是通过ne555定时器电路自动断电再自动上电。免去第二片单片机,节省成本

您好 您的这种做法是ne555的延时器的应用吗? 这样子不还是要重新上电吗、。。。。
回复

使用道具 举报

8#
ID:448556 发表于 2020-10-16 10:57 | 只看该作者
这么麻烦干啥 弄个鼠标按键搞定
回复

使用道具 举报

9#
ID:137736 发表于 2021-12-16 21:42 | 只看该作者
aking991 发表于 2020-10-9 09:10
你这种只适用不带串口通讯的工程或项目,如果有用到串口通讯就不可能用这样就能解决的事,因为在通讯过程中 ...

连续重复检测进行计数,可以避免
回复

使用道具 举报

10#
ID:654797 发表于 2021-12-17 00:15 | 只看该作者
只是这方法写的程序老要带多一点代码?
回复

使用道具 举报

11#
ID:654797 发表于 2021-12-17 00:18 | 只看该作者
这个方法老要带点一点没用的代码?芯片烧好程序了,就是多余的了,用来测试倒还有点用
回复

使用道具 举报

12#
ID:654797 发表于 2021-12-17 00:27 | 只看该作者
aking991 发表于 2020-10-9 09:10
你这种只适用不带串口通讯的工程或项目,如果有用到串口通讯就不可能用这样就能解决的事,因为在通讯过程中 ...

这个可以发送多个同样的字节就行了,网上有人做出来了,收到十个7f才下启动下载
回复

使用道具 举报

13#
ID:654797 发表于 2021-12-17 00:32 | 只看该作者
aking991 发表于 2020-10-9 09:10
你这种只适用不带串口通讯的工程或项目,如果有用到串口通讯就不可能用这样就能解决的事,因为在通讯过程中 ...

有种USB转UART接口的下载器,我测试过了,他们做的是接收到40个7F就自动断电重启的方法下载的
回复

使用道具 举报

14#
ID:65956 发表于 2021-12-17 08:22 | 只看该作者
这种只适用无校验位的程序,如果项目是偶校验或是其它的呢,能实现吗
回复

使用道具 举报

15#
ID:548757 发表于 2021-12-17 09:17 | 只看该作者
好文章!谢谢分享!
回复

使用道具 举报

16#
ID:137736 发表于 2021-12-18 21:10 | 只看该作者
验证通不过,IAP_CONTR   = 0Xe0也许可以
回复

使用道具 举报

17#
ID:978751 发表于 2022-3-19 21:59 | 只看该作者
zhlzhang 发表于 2020-10-9 09:48
在串口通讯程序里面加一个复位程序就可以实现了

刚试了一下的确可行.
回复

使用道具 举报

18#
ID:1064915 发表于 2023-8-26 18:52 | 只看该作者
第一次需要断电,后续调试方便
回复

使用道具 举报

19#
ID:1085441 发表于 2023-8-26 21:30 | 只看该作者
好办法,人多力量大,相互学习才能进步
回复

使用道具 举报

20#
ID:195666 发表于 2023-11-6 16:23 | 只看该作者
可行,可字自定义字节内容和字节数
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表