需要将晶振频率设置为11.0592MHz(ISP下载软件中设置)ISP最新软件最低波特率设置为2400(软件默认)
工作原理:【STC15F104W单片机没有硬件串口,所以只能模拟串口】
因为ISP在下载程序之前会以最低波特率向目标单片机连续发送0X7F握手信号,基于此,在STC15F104W
单片机中模拟串口接收上位机发送的0X7F,当连续检测到有16个0X7F时候就认为是需要下载程序了,此时
P34脚输出高电平,而使外部的S8550三极管截至,目标单片机失电(模仿给单片机断电),延时600ms后再
给单片机上电,就可以下载程序了。此制作在不下载以及下载完程序时目标单片机一直得电,并且不妨碍
串口调试,不占用单片机硬件串口。供电用三极管采用S8550,最大工作电流1.5A,而电脑USB输出电流最
大500ma左右,所以正常情况下电路不会出现问题。【T0模拟串口时钟,T2用作延时计数器】
实物图
从家里找了一片STC89C52RC单片机,连续写了1000多次,没有一次失败,下面是视频
单片机源程序如下:
- #include "init.h"
- extern u8 cnt7f; //连续接收到0X7F的次数计数器
- extern u16 t2cnt; //T2定时计数值
- extern u8 RBUF; //接收缓冲区
- extern u8 RDAT; //接收数据
- extern u8 RCNT; //接收计数器
- extern u8 RBIT; //接收位数
- extern bit RING; //正在接收标志
- extern bit REND; //接收完成标志
- /*T2初始化*/
- void Timer2Init(void) //1毫秒@11.0592MHz
- {
- AUXR |= 0x04; //定时器时钟1T模式
- T2L = T1MS; //初始化计时值
- T2H = T1MS >> 8;
- IE2 |= 0x04; //使能定时器2中断
- }
- /*全局初始化*/
- void all_init(void)
- {
- TMOD=0x00; //定时器0在16位自动重装模式
- AUXR=0x80; //定时器0在1T模式
- TL0=65536-FOSC/3/BAUD;
- TH0=(65536-FOSC/3/BAUD)>>8;//初始化定时器0并设定重装值
- TR0=1; //定时器0开始运行
- ET0=1; //使能定时器0中断
- PT0=1; //定时计数器0中断高优先级
- EA=1; //开总中断
-
- RING=0;
- REND=0;
- RCNT=0;
- Timer2Init();
- cnt7f=0;
- P3M1 &= 0XEF; //1110 1111设置P3.4为强推挽输出
- P3M0 |= 0X10; //0001 0000设置P3.4为强推挽输出
- enable = 0; //确定给目标单片机供电
-
- AUXR |= 0x10; //定时器2开始计时
- while(t2cnt<300); //等待 使系统稳定
- AUXR &= 0xEF; //关定时器2计时
- t2cnt = 0; //清零T2计数值
- }
复制代码
所有资料51hei提供下载:
STC15F104W模拟串口实现自动下载.rar
(394.15 KB, 下载次数: 111)
|