找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6050|回复: 19
收起左侧

STC单片机不断电下载程序

  [复制链接]
ID:60379 发表于 2020-10-8 15:02 | 显示全部楼层 |阅读模式
本帖最后由 无量寿经 于 2020-10-8 15:06 编辑

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


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


2.jpg
   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 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:328014 发表于 2020-10-8 16:19 | 显示全部楼层
这个在调试程序的时候,确实很方便,谢谢版主,牛逼
回复

使用道具 举报

ID:387856 发表于 2020-10-8 17:53 | 显示全部楼层
是不是程序里面加上这一段就可以了不断电下载了,调试OK后,再把这段程序删掉  是不是这样?
回复

使用道具 举报

ID:224104 发表于 2020-10-9 06:46 | 显示全部楼层
还有一种方法是通过ne555定时器电路自动断电再自动上电。免去第二片单片机,节省成本
回复

使用道具 举报

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

使用道具 举报

ID:191408 发表于 2020-10-9 09:48 | 显示全部楼层
在串口通讯程序里面加一个复位程序就可以实现了file:///C:/Users/zhang/Desktop/%E4%B8%8B%E8%BD%BD.png 下载.png
回复

使用道具 举报

ID:518902 发表于 2020-10-9 22:00 | 显示全部楼层
guysxpf 发表于 2020-10-9 06:46
还有一种方法是通过ne555定时器电路自动断电再自动上电。免去第二片单片机,节省成本

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

使用道具 举报

ID:448556 发表于 2020-10-16 10:57 | 显示全部楼层
这么麻烦干啥 弄个鼠标按键搞定
回复

使用道具 举报

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

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

使用道具 举报

ID:654797 发表于 2021-12-17 00:15 | 显示全部楼层
只是这方法写的程序老要带多一点代码?
回复

使用道具 举报

ID:654797 发表于 2021-12-17 00:18 | 显示全部楼层
这个方法老要带点一点没用的代码?芯片烧好程序了,就是多余的了,用来测试倒还有点用
回复

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

ID:65956 发表于 2021-12-17 08:22 | 显示全部楼层
这种只适用无校验位的程序,如果项目是偶校验或是其它的呢,能实现吗
回复

使用道具 举报

ID:548757 发表于 2021-12-17 09:17 | 显示全部楼层
好文章!谢谢分享!
回复

使用道具 举报

ID:137736 发表于 2021-12-18 21:10 | 显示全部楼层
验证通不过,IAP_CONTR   = 0Xe0也许可以
回复

使用道具 举报

ID:978751 发表于 2022-3-19 21:59 | 显示全部楼层
zhlzhang 发表于 2020-10-9 09:48
在串口通讯程序里面加一个复位程序就可以实现了

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

使用道具 举报

ID:1064915 发表于 2023-8-26 18:52 | 显示全部楼层
第一次需要断电,后续调试方便
回复

使用道具 举报

ID:1085441 发表于 2023-8-26 21:30 | 显示全部楼层
好办法,人多力量大,相互学习才能进步
回复

使用道具 举报

ID:195666 发表于 2023-11-6 16:23 | 显示全部楼层
可行,可字自定义字节内容和字节数
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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