panguoxian 发表于 2012-1-31 13:08:56

stc单片机不断电下载程序

不知有没有人发过但是我在坛内搜索找不到。。

莫老大我们的搜索功能好像不够强啊~~

我来发一个,网上转载,不记得出处了,呵呵~~

只要把下面主程序内 while(1) 上 面的放到主程序内,第一次需断电下载,后,下次下载程序按开发板的复位键就可以了。

但是程序必须包含此段程序。。

方法一:

stc单片机不断电下载程序(按复位键)(较实用)

//*******************stc单片机不断电下载程序******************
#include <REG52.H>
sfr ISP_CONTR=0xe7;          软复位寄存器声明

void main(void)
{
//////////////将这段代码嵌入到程序中////////////////
if((PCON&0x10)==0) //如果POF位=0
{
   PCON=PCON|0x10;//将POF位置1
   ISP_CONTR=0x60;//软复位,从ISP监控区启动
}
else
{
   PCON=PCON&0xef;//将POF位清零
}
//////////////////////////////////////////////
   
while(1)
{
         `
`         用户程序
`
}
}

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、。。。。。。。。。。。。。。
方法二:


stc单片机不断电下载程序(利用串口)(占用串口和一个定时器)(不实用)

第一步:编写串口操作程序。这种自动下载方法需要用到串口中断。所谓自动下载,就是说当前单片机已经在运行程序了,但这个程序必须具备串口中断功能,通过串口接收特定字符标志,使得单片机知道应该从运行用户程序状态退出,复位后进入监控状态(即ISP状态),为下载新的用户程序做好准备。所以,如果你总想不通过冷启动的办法来自动下载程序,就要求当前单片机运行的程序以及你将要下载的程序都具备串口中断及识别特定字符标志的功能,这就需要编写串口操作程序。首先利用定时器产生波特率信号,设置串口。建立头文件timer1.h:
#ifndef _timer1_h_
#define _timer1_h_
//定时器1初始化,串口波特率初始化
//自动ISP功能模块
void timer1_init(void)
{
//定时器T1工作在模式2,8位自动重装载模式
TMOD = (TMOD & 0X0F) | 0X20;
SCON = 0x50;
PCON |= 0x80;//波特率加倍
TH1 = 0xff;
TL1 = 0xff;
TR1 =1;
ES = 1;
EA = 1;
}
void delay(unsigned int time)
{
while(--time);
}
//自动ISP功能函数
void ISP_Check(unsigned char tmp)
{
    static isp_counter=0;
    //ISP标志字符
    unsigned char code isp_comm= {0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef,0x12,0x34,0x56,0x78,0x90,0xab,0xcd,0xef};
    if(tmp != isp_comm)
   {
   isp_counter = 0;
   return;
    }
    else if (isp_counter > 15)
   {
      EA = 0;
      delay(100000);
      ISP_CONTR = 0x60; //软复位进入ISP下载模式
    }
}
//串行接收中断
void Serial_int(void) interrupt 4 using 1
{
    unsigned char tmp;
    if (RI)
    {
      tmp = SBUF;
      ISP_Check(tmp);
      RI = 0;
    }
}
#endif
把上面的打包成timer1.h文件包含进工程文档,并在主程序中调用timer1.h内的初始化函数,

如下所示:

#include "STC89C51RC.H"
#include "timer1.h"
sbit beep=P1^7;//P1^7接扬声器驱动电路
void delay_ms(const unsigned int DELAY)
{
unsigned int x,y;
for(x=0;x<=DELAY;x++)
{
for(y=0;y<=120;y++);
}
}
main()
{
delay_ms(500);
timer1_init(); //timer1初始化,启用串口设置
while(1)
{
    beep=1;
    delay_ms(400);
    beep=0;
    delay_ms(400);
}
}
第二步:编译工程得到HEX文件,运行STC-ISP.exe。如下图:
http://cache.amobbs.com/bbs_upload782111/files_51/ourdev_715219VPVQNJ.jpg
(原文件名:0.jpg)

注意红线框内的自定义下载的参数设置,即串口和标志字符的设置,一定要与上面第一步在timer1.h文件中设置的一致。在Step1中,选定单片机型号;在Step2中,选定要下载的HEX文件;在Step3中,设置串口;在Step4中,通常使用默认设置。假设单片机正在运行程序(此程序的串口设置、标志字符和自定义下载的参数一致),点击自定义下载选项页的发送按钮,即可完成新的用户程序下载并运行之。
需要特别注意的是:(1)自定义下载选项页中的波特率设置很重要,不能有错;(2)主程序开始最好插入延时语句,避免串口通讯出现问题。(3)这种Auto ISP方式占用了串口和一个定时器,有一定局限性

Pony279 发表于 2012-1-31 13:29:41

回复【楼主位】panguoxian 墙外等红杏
-----------------------------------------------------------------------


给你三个免断电免手动的方案:

这个是我现在使用的方案,现在一直在用,很方便
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=5287022&bbs_page_no=1&search_mode=3&search_text=Pony279&bbs_id=9999

这里有个继电器的方案
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=5279682&bbs_page_no=1&bbs_id=1006

还有个网友在他的开发板上使用了MOS管的
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=5203339&bbs_page_no=1&search_mode=4&search_text=Pony279&bbs_id=9999

Pony279 发表于 2012-1-31 13:36:33

另外,方法一没必要去判断,直接置位就行了
IAP_CONTR |= (0x01<<6);

caoweidong 发表于 2012-1-31 16:07:55

这个不错 但是这个单片机烧写软件确实做的不敢恭维!

xieshuangok 发表于 2012-1-31 16:12:31

回复【3楼】caoweidong
-----------------------------------------------------------------------

ZLG公司开发的SmartPRO 软件就可以烧入STC,一键操作,不知道他们是怎么做的,难道破_解了STC的下载数据流?

weizizi 发表于 2012-2-2 00:15:03

我有普中科技的开发板和下载软件下载就是免断点的

lsd123 发表于 2012-2-8 15:20:56

谢楼主分享啊!!

prophet000 发表于 2012-2-14 13:23:19

mark

edkaifa 发表于 2012-5-15 20:20:49

回复收藏

liuchangkui 发表于 2012-5-15 21:02:46

{:handshake:}\(^o^)/~

jetli 发表于 2012-5-16 10:51:06

stc15,无硬件串口,就mcu自身,能否做到不断电isp ???

不外加论坛有帖子说的加继电器、监控mcu、等等方式。

BXAK 发表于 2012-5-16 11:09:45

jetli 发表于 2012-5-16 10:51 static/image/common/back.gif
stc15,无硬件串口,就mcu自身,能否做到不断电isp ???

不外加论坛有帖子说的加继电器、监控mcu、等等 ...

自然可以,得浪费1个IO:
1、用模拟串口;
2、用1个IO做按键,(当STC-ISP提示上电时)按下按键ISP_CONTR=0x60,软复位到ISP监控区

方法2方便些

jetli 发表于 2012-5-16 11:56:11

BXAK 发表于 2012-5-16 11:09 static/image/common/back.gif
自然可以,得浪费1个IO:
1、用模拟串口;
2、用1个IO做按键,(当STC-ISP提示上电时)按下按键ISP_CONTR ...

用了按键,就不是全自动isp了

stc12c4052、stc11、10、stc89,都可以做到 全自动isp,不需要手去按神马。。。

现在出的stc15就不行了。

看来还是用片so8封装的stc15f104做监控(不太暂用pcb面积),复位目标stc15芯片,,,,

feilongdz 发表于 2012-5-16 12:40:56

好东西,做个记号。

331086846 发表于 2012-5-20 12:35:32

是啊,昨天也在找,没搜索到 哦

yapu 发表于 2012-8-29 22:10:44

正在找

linucos 发表于 2012-8-29 22:37:32

多谢分享!

Vampireyifeng 发表于 2014-2-21 13:35:14

谢谢楼主{:biggrin:}

macp 发表于 2014-2-21 14:43:30

feilongdz 发表于 2012-5-16 12:40
好东西,做个记号。

头像霸气啊~

macp 发表于 2014-2-21 14:43:55

楼主看不明白诶。。。

feilongdz 发表于 2014-12-4 09:33:00

谢谢楼主

tangjiaqq 发表于 2014-12-9 20:10:49

不错呐,好久有空拿来试试
页: [1]
查看完整版本: stc单片机不断电下载程序