学习单片机的朋友都知道,STC单片机虽然便宜,但是每次下载程序都需要冷启动,才能下载程序,一个成品,需要调试N次,如果每次都要用手按,实在无语啊,我在数码之家论坛,21IC电子论坛,阿莫论坛都看见有制作贴子。这个日志介绍我制作的stc单片机自动下载器
自动下载器工作原理:
在STC单片机中有两个程序区,用户程序区与ISP程序区。单片机上电后(冷启动,并非外部手动复位或看门狗复位),先会运行ISP程序,检测是否有合法的下载命令流,占时几十毫秒到几百毫秒,如果没有合法的下载命令流,则立即运行用户程序。
如果有合法的下载命令流,则ISP监控程序开始与ISP下载软件通信,软件也会进入编程模式,向监控程序发送程序码,监控程序接收程序码,并将其写入用户程序区中。在编程完毕,对程序校验成功后,用户程序立即生效,开始运行用户程序。
STC-ISP尝试与MCU握手连接的时候,是以“最低波特率”设置项中的波特率不断的从串口发送“0x7F”信号,直到MCU上电冷启(或者软复位至ISP)经几十毫秒到几百毫秒检测下载命令流后,MCU做出响应,STC-ISP才停止发送“0x7F”信号开始烧写。
我的stc单片机自动下载器电路图

制作好的图片




stc单片机自动下载器程序
/***********************************
********STC单片机自动下载器********
**********MCU STC15F104W***11.0592MHZ********
**************荆棘鸟***************
**********************************/
#include <reg52.h>//52系列单片机特殊寄存器头文件
#define uint unsigned int//宏定义
#define uchar unsigned char
/********单片机I/O功能声明*********/
sbit DYKZD=P3^4;//电源控制端
sbit XZXHD=P3^3;//下载信号检测端
uchar x;//下载信号低电平个数
/**************初始化**************/
void init()//初始化子函数
{
DYKZD=0;//电源控制端打开
XZXHD=1;
INT1= 1;
IT1= 1; //设置INT1的中断类型 (1:仅下降沿 0:上升沿和下降沿)
EX1= 1; //使能INT1中断
EA = 1;//打开总中断开关
}
/*************延时函数*************/
void delayms(uint xms)//延时子函数
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
/************外部中断ITN1********/
void exint1() interrupt 2 //INT1中断入口
{
x++;
}
/**************主程序************/
void main() //主程序
{
init();
while(1)
{
if(x>60)
{
DYKZD=1;
delayms(500);
DYKZD=0;
delayms(60000);
x=0;
}
}
}
下载速度还是比较快,如果程序太大,可能会下载失败,我的设置最高波特率也能下载,偶然也会失败
|