下载器给单片机iap下载器下程序时单片机iap下载器引脚需要连外围电路吗比如复位电路,晶振电路

51单片机的基本外围电路设计以及相关C语言程序(免积分)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
51单片机的基本外围电路设计以及相关C语言程序(免积分)
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩58页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢查看: 14579|回复: 0
单片机系统设计|复位电路设计
昨天讲解了单片机系统正常工作所需要的基本配置,也就是最小系统。单片机的最小系统包括:复位电路、晶振电路、电源电路、下载电路。从今天开始讲解每个电路,并结合实际设计,展示实际电路。
1什么是单片机的复位电路
单片机的复位电路就是在单片机的复位引脚产生一个复位信号,使单片机处于复位状态,使单片机的程序从头执行,从而避免了单片机程序的跑飞。
2单片机复位电路的作用是什么
单片机复位的主要作用是把特殊功能寄存器的数值加载为默认值,由于单片机在运算过程中受外界干扰造成寄存器中数据混乱不能使其正常继续执行程序(称死机)或单片机的指令不按照程序执行而指向了未知位置(俗称跑飞),这时候就需要单片机复位一下,以使程序重新开始运行。
3单片机复位有哪几种方式
单片机的复位一般有三种方式:上电复位,看门狗复位,手动复位等。
上电复位:单片机在上电瞬间,给复位引脚一个复位信号(一定时间的高电平或者低电平),以实现单片机的复位,待稳定后,单片机开始执行程序。
看门狗复位:看门狗复位不同于上电复位,上电复位是单片机从头开始执行程序;而看门狗复位时当某一个程序块不受控制时,将程序计数器清零,使该段程序从头执行,为了使单片机系统正常运行要在程序中定时喂狗。
手动复位:在单片机的复位引脚接一个按键,手动按下该按键使单片机复位。
4单片机的复位电平
不同的单片机其复位电平不同,有的单片机是高电平复位,有的单片机是低电平复位。下面就看复位电路。
单片机上电高电平复位电路:
上电高电平复位电路上电瞬间,由于电容两端的电压不能发生突变,所以电容两端的电位都是VCC(此时充电电流最大,电容相当于短路),即RST是高电平,而随着VCC通过RC电路对电容充电,当电容两端的电压达到VCC时,电容相当于断路(此时电容充电电流为0,即隔直流),RST的电平为低电平,单片机正常工作。
单片机上电低电平复位电路:
上电低电平复位电路上电瞬间,由于电容两端的电压不能发生突变,所以电容两端的电位都是GND,即RST是低电平,而随着VCC通过RC电路对电容充电,当电容两端的电压达到VCC时,RST的电平为高电平,单片机正常工作。
手动复位电路:
手动平复位电路该电路同时也是一个上电高电平复位电路。单片机正常工作时,如果按下按键S1,复位引脚RST得到高电平,从而实现复位。
这一节的复位电路有没有讲清楚,欢迎加QQ群讨论:。明天介绍晶振电路。
Powered by编辑整理!欢迎分享!转载请注明出处:
●【更多精彩内容,下一页更精彩】●
点击排行榜
栏目ID=20的表不存在(操作类型=0)导读:本科生课程设计(论文),本次设计我们选取了霍尔传感器来进行里程测量,本次设计选取了霍尔集成电路来测量里程,送到单片机,经过单片机的计算处理,霍尔传感器小磁铁单片机车轮图3.2传感器测距示意图,它被设计在交变磁场中运行,可以直接接到单片机的IO端口上,只要将霍尔传感器的信号输出端接到单片机的端口上便可以实现距离检测,单片机的P3.2(INT0)引脚作为信号的输入端,霍尔传感器检测并输出信号到单片 本科生课程设计(论文) 3.2 测距单元 本次设计我们选取了霍尔传感器来进行里程测量。 霍尔器件是一种磁传感器。用它们可以检测磁场及其变化,可在各种与磁场有关的场合中使用。霍尔器件以霍尔效应为其工作基础。 霍尔器件具有许多优点,它们的结构牢固,体积小,重量轻,寿命长,安装方便,功耗小,频率高,耐震动,不怕灰尘、油污、水汽及盐雾等的污染或腐蚀。 霍尔器件分为:霍尔组件和霍尔集成电路两大类,前者是一个简单的霍尔片,使用时常常需要将获得的霍尔电压进行放大。后者将霍尔片和它的信号处理电路集成在同一个芯片上。本次设计选取了霍尔集成电路来测量里程。 里程测量是通过将霍尔传感器的集成电路安装在车轮上方的铁板上,将磁铁安装在车轮上,旋转的车轮将磁铁对准集成电路时,霍尔传感器会输出一个脉冲信号,送到单片机,经过单片机的计算处理,将行驶的里程送到显示单元并显示出来。 其原理示意图3.2如下。
霍尔传感器小磁铁单片机车轮 图3.2
传感器测距示意图
A44E是一种利用霍尔效应做成的半导体集成电路器件,它被设计在交变磁场中运行,特别是能在低电源电压和长时间运行温度范围可达到125℃。这种霍尔IC可用作各种类型的传感器(速度传感器、位移传感器、转速传感器等等),接触开关以及相类似的应用场合。其工作电压比较宽(2.5~20V),可运行在较大的温度范围内(-20℃~125℃), 其输出的信号符合TTL电平标准,可以直接接到单片机的IO 端口上,而且其最高检测频率可达到1MHZ。 27
本科生课程设计(论文)
A44E霍尔传感器输出特性
霍尔传感器的特性如图3.3所示,其中BOP为工作点“开”的磁感应强度,BRP为释放点“关”的磁感应强度。当外加的磁感应强度超过动作点BOP时,传感器输出低电平,当磁感应强度降到动作点BOP以下时,传感器输出电平不变,一直要降到释放点BRP时,传感器才由低电平跃变为高电平。BOP与BRP之间的滞后使开关动作更为可靠。 U18集成霍耳开关由稳压器A、霍耳电势发生器(即硅霍耳片)B、差分放大器C、施密特触发器D和OC门输出E五个基本部分组成。 在输入端输入电压VCC,经稳压器稳压后加在霍尔电势发生器的两端,根据霍尔效应原理,当霍尔片处在磁场中时,在垂直于磁场的方向通以电流,则与这二者相垂直的方向上将会产生霍尔电势差VH输出,该VH信号经放大器放大后送至施密特触发器整形,使其成为方波输送到OC门输出。当施加的磁场达到工作点(即Bop)时,触发器输出高电压(相对于地电位),使三极管导通,此时OC门输出端输出低电压,三极管截止,使OC门输出高电压,这种状态为关。这样两次电压变换,使霍尔开关完成了一次开关动作。 A44E霍尔传感器有3个外接口,2个是电源的正负极接口,最后一个是脉冲信号输出口,只要将霍尔传感器的信号输出端接到单片机的端口上便可以实现距离检测。其中,单片机的P3.2(INT0)引脚作为信号的输入端,采用外部中断0进行计数。车轮每转一圈,霍尔传感器就产生一个脉冲信号,根据霍尔效应原理,当霍尔片处在磁场中时,霍尔传感器的输出端输出低电平。当车轮转动一圈时小磁铁提供一个磁场,则霍尔传感器输出一次低电平完成一次数据采集,从而产生信号。霍尔传感器检测并输出信号到单片机的INT0或INT1计算脉冲输入端,引起单27
本科生课程设计(论文) 片机的中断,对脉冲计数,当计数达到特定的次数时,里程就会增加,单片机对里程进行计算后,通过接口电路将计算好的结果传送到数码管并显示出来。 3.3 按键单元 本设计的按键单元电路(如图3.4)有5个按键,功能分别是:S1是空车时查询上次金额和里程以及等待时间,结账时查询本次金额和里程以及等待时间;S2功能键,不按时空车指示灯亮而且数码管显示实时时间,按下时可设置单双程,此时再按S3可进行单程和双程之间切换,再按S1可确认单双程,双程时双程指示灯亮并开始计价;按下S4可对本次金额、里程以及等待时间进行查询;S5为清零键,按下时清零之前数据消除以及存储本次信息。
S1P3.0S2P1.0S3P1.1S4P1.2S5P1.3GND
图3.4 按键单元电路 3.4 时钟单元 本设计采用基于DS1302的时钟电路(如图3.5)对时间进行实时显示,单片机掉电对其没有影响。用数码管表现出来,当出租车空车时就显示时间,给人时间提示。 U281VCC1VCC2XX12C433pfrstsclkio576RSTSCLKI/ODSpfGND 图3.5 时钟单元电路 27
本科生课程设计(论文) 3.5 显示单元 本设计显示单元包括两部分:数码管显示(图3-7)和二极管指示显示(图3-8)。数码管显示部分使用两个四位一体的LED数码管,LED显示器是由LED发光二极管发展过来的一种显示器件,是发光二极管的改型。LED是发光二极管的简称,是一种将电能转换成光能的设备。本身也是一种光源。LED显示器是由发光二极管排列组成的显示器件。它采用低电压扫描驱动,具有:耗电少、使用寿命长、成本低、故障少、视角大、可视距离远等特点。此外,它的响应时间短(一般不超过0.1us),亮度也比较高。它的缺点是工作电流比较大,每一段的工作电流在10mA左右。 其中每位数码管是由8个发光二极管演变而来,其中7个发光二极管构成7笔字形,另一个构成小数点,称为8段LED。8段LED数码管是利用7个LED(发光二极管)外加一个小数点的LED组合而成的显示设备,可以显示0~9等10个数字和小数点,使用非常广泛。 这类数码管可以分为共阳极(8个发光二极管的阳极接在―起)与共阴极(8个发光二极管阴极连在一起)两种,共阳极就是把所有LED的阳极连接到共同接点,而每个LED的阴极分别为a、b、c、d、e、f、g及dp(小数点);共阴极则是把所有LED的阴极连接到共同接点,而每个LED的阳极分别为a、b、c、d、e、f、g及dp(小数点),如图3.6所示。
图3.6 共阳和共阴数码管结构 27
本科生课程设计(论文) 通过控制这个公共端,可使该位亮或暗。如共阴极端接地或共阳极接高电平,则该位显示器有效,反之无效。本设计采用共阴LED数码管。 数码管有静态显示和动态显示两种,这里采用动态显示。它具有低功耗、接口少等特点。如图3.7两个四位一体数码管接P0口作为段选,接P2口作为位选。空车时显示时间,开始计价时前四位显示路程,后四位显示价钱。当查询等待时间时显示为等待时间。
RP1RESPACK-8ABCDEFGDPABCDEFGDP91234 图3.7 显示单元(数码管显示部分)
二极管指示部分包括空车指示灯、等待时间查询指示、开始计时指示和双程指示如图3.8。
D1R2100ΩR6100ΩR5100ΩR7100ΩD4P1.7D2P1.5D3P1.6P1.4
图3.8 显示单元(二极管指示部分)
这些指示灯能对出租车的每一种状态进行指示,空车时空车指示灯亮,查询等待时间时等待时间查询指示灯亮,当汽车速度小于5km/h时开始计时,计时指示灯亮。计价前如果按下双程键双程指示灯亮,表示为双程。 3.6 储存单元 存储单元的作用是储存上一次的里程、金额和等待时间。AT24C02 是Atmel公司的1KB的电可擦除存储芯片,采用两线串行的总线和单片机通讯,电压最低可以到2.5V,额定电流为1mA,静态电流10uA(5.5V),芯片内的资料可以在断电的情况下保存40年以上,而且采用8脚的DIP封装,使用方便。 27
包含总结汇报、资格考试、办公文档、教程攻略、文档下载、人文社科、旅游景点、考试资料、出国留学、经管营销、专业文献、教学研究以及单片机课设出租车计价器设计2等内容。本文共6页
相关内容搜索查看: 37218|回复: 239
STC免手动下载程序电路图(自动断电冷启动) + 程序,有需要的就进来看看吧
基于STC15F104E制作的 STC免手动下载程序控制电路
原理详见:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4855735&bbs_page_no=1&search_mode=1&search_text=自动下载&bbs_id=1006
电路图如下:
(原文件名:STC免手动烧写电路图(最佳版).jpg)
(原文件名:实物图1.jpg)
(原文件名:实物图2.jpg)
注意事项:
(原文件名:注意事项.jpg)
/***************************************************************
& & & & 作品:STC免手动烧写控制程序
&&单片机:STC15F104E(A版)
& & 晶振:11.0592M
编译环境:Keil uVision4 V9.00
& & 注意:宏定义BAUD的波特率 要与 STC-ISP软件中的“最低波特率” 一致
***************************************************************/
#define uint8 unsigned char& & & &
#include &STC15F104E.H&
//#define BAUD& &&&0xF400& && &// 1200bps @ 11.0592MHz
//#define BAUD& &&&0xFA00& && &// 2400bps @ 11.0592MHz
&&#define BAUD& &&&0xFD00& && &// 4800bps @ 11.0592MHz
sbit RXB& &= P3^4;
sbit Key& &= P3^1; & & & & & & & & & & & && & //自动/手动开关(根据需要使用)
sbit Relay = P3^3;
sbit LED& &= P3^0;
uint8 RBUF;& & & & //接收缓存
uint8 RDAT;& & & & //接收数据暂存
uint8 RCNT;& & & & //接收计数器
uint8 RBIT;& & & & //接收比特数
bit& ˚& & & & //开始接收标志
bit& &REND;& & & & //接收完成标志
uint8& & & & //重启计数器
bit& &START;//重启标志
void YS100ms(uint8 n)
&&uint8 i,a,b,c;
&&for(i=n;i&0;i--)
&&for(c=89;c&0;c--)
&&for(b=230;b&0;b--)
&&for(a=12;a&0;a--);
void UART_INIT()
& &RING = 0;
& &REND = 0;
& &RCNT = 0;
void main()
& &P3M1 = 0x00;
& &P3M0 = 0x09;& & & & & & & &&&//P3.0、P3.3推挽输出
& &Relay = 0;& & & & & & & &&&//断开继电器
& &LED&&= 0;& & & & & & & &&&//关LED
& &TMOD = 0x00;& && &//T0处于16位自动重装模式
& &AUXR = 0x80;& && &//T0工作在1T模式
& &TL0 = BAUD;
& &TH0 = BAUD&&8;& & //初始化Timer0和设定重载值
& &TR0 = 1;& && && &
& &ET0 = 1;& && && &
& &PT0 = 1;& && && & //提高Timer0的中断优先级
& &EA&&= 1;& && && &&&
& &UART_INIT();
& &while(1)
& &{& && && && && && && && && && && &&&
& && &if(START)
& & & && &{
& & & & & & & &&&START = 0;
& & & & & & & &&&if(Key)
& & & & & & & &&&{
& & & & & & & && &&&ET0 = 0;
& & & & & & & && &&&Relay = 1;& & & & & & & &&&//继电器吸合
& & & & & & & && &&&LED = 1;
& & & & & & & && &&&YS100ms(50);& & & &&&//从『加载HEX』到『提示上电』有5秒
& & & & & & & && &&&Relay = 0;
& & & & & & & && &&&LED = 0;
& & & & & & & && &&&YS100ms(15);
& & & & & & & && &&&ET0 = 1;
& & & & & & & && &&&UART_INIT();
& & & & & & & &&&}
& & & && &}
void tm0() interrupt 1 using 1
& &if(RING)
& && &if(--RCNT == 0)
& && && &RCNT = 3;& && && && & //复位接收波特率计数器
& && && &if(--RBIT == 0)
& && && &{
& && && && &RBUF = RDAT;& && & //保存数据到RBUF
& && && && &RING = 0;& && && & //停止接收
& && && && &REND = 1;& && && & //接收完成标志
& && && &}
& && && &else
& && && &{
& && && && &RDAT &&= 1;
& && && && &if(RXB)RDAT |= 0x80; //RX数据转移到RX缓冲区
& && && &}
& &else if(!RXB)& & & & & & & & & & & && & //是否检测到低电平
& && &RING = 1;& && && && && & //设置开始接收标志
& && &RCNT = 4;& && && && && & //初始接收波特率计数器
& && &RBIT = 9;& && && && && & //初化始接收比特数(8个数据位+1个停止位)
& &if(REND)
& && &REND = 0;
& && &if(RBUF == 0x7F){ if(++cnt & 30)START=1; } //“0x7F”连续 & 30次,则打开重启标志
& & & && &else cnt = 0;
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
用STC-ISP V6.03、STC-ISP V4.88默认的最低波特率不同,
懒得每次修改,
重新写了个程序,
自动适应3种最低波特率:1200bps/2400bps/4800bps
/***************************************************************
& & & & 作品:STC免手动烧写控制程序
&&单片机:STC15F104E(A版)
& & 晶振:11.0592M
编译环境:Keil uVision4 V9.00
& & & & 注意:STC-ISP软件中的“最低波特率” 可选“1200bps/2400bps/4800bps”,
& & & && && & 本程序自动检测适应。
***************************************************************/
#define uint8&&unsigned char
#define uint16 unsigned int& & & &
#include &STC15F104E.H&
sbit RXB& &= P3^4;
sbit Key& &= P3^1;& &//自动/手动开关(根据需要使用)
sbit Relay = P3^3;& & & &&&//继电器
sbit LED& &= P3^0;
uint8 RBUF;& & & &&&//接收缓存
uint8 RDAT;& & & &&&//接收数据暂存
uint8 RCNT;& & & &&&//接收计数器
uint8 RBIT;& & & &&&//接收比特数
bit& ˚& & & &&&//开始接收标志
bit& &REND;& & & &&&//接收完成标志
uint8& & & &&&//重启计数器
bit& &START; //重启标志
uint16& & & && &//波特率切换计数器
uint8&&S//波特率状态
bit& & NEW;& & & && &//波特率更新标志
void YS100ms(uint8 n)
&&uint8 a,b,c;
&&while(n--)
& &&&for(c=89;c&0;c--)
& &&&for(b=230;b&0;b--)
& &&&for(a=12;a&0;a--);
void UART_INIT()
& &RING = 0;
& &REND = 0;
& &RCNT = 0;
& &cnt = 0;
& &cn&&= 0;
void main()
& &P3M1 = 0x00;
& &P3M0 = 0x09;& & & & & & & &&&//P3.0、P3.3推挽输出
& &Key& & & & = 1;
& &Relay= 0;& & & & & & & &&&//断开继电器
& &LED&&= 0;& & & & & & & &&&//关LED
& &TMOD = 0x00;& && &//T0处于16位自动重装模式
& &AUXR = 0x80;& && &//T0工作在1T模式
& &TL0 = 0x00;& & & & & & & &&&//初始化Timer0和设定重载值
& &TH0 = 0xFA;& && & //默认 2400bps @ 11.0592MHz
& &TR0 = 1;& && && &
& &ET0 = 1;& && && &
& &PT0 = 1;& && && & //提高Timer0的中断优先级
& &EA&&= 1;& && && &&&
& &UART_INIT();
& &while(1)
& &{& && && && && && && && && && && &&&
& && &if(START)
& & & && &{
& & & & & & & &&&START = 0;
& & & & & & & &&&if(Key)
& & & & & & & &&&{
& & & & & & & && &&&ET0 = 0;
& & & & & & & && &&&Relay = 1;& & & & & & & &&&//继电器吸合
& & & & & & & && &&&LED = 1;
& & & & & & & && &&&YS100ms(50);& & & &&&//从『加载HEX』到『提示上电』有5秒
& & & & & & & && &&&Relay = 0;
& & & & & & & && &&&LED = 0;
& & & & & & & && &&&YS100ms(30);
& & & & & & & && &&&UART_INIT();
& & & & & & & & & & & & ET0 = 1;
& & & & & & & &&&}
& & & && &}
& & & && &if(NEW)
& & & && &{
& & & & & & & &&&NEW = 0;
& & & & & & & &&&TR0 = 0;
& & & & & & & &&&if(++Status & 2)Status=0;
& & & & & & & &&&switch(Status)
& && && &{
& & & & & & & && &&&case 0:TL0=0x00; TH0=0xFA; & & & && &// 2400bps @ 11.0592MHz
& & & & & & & & & & & & & & & && & //P31=0;P32=1;P35=1;& & & && &//状态指示灯(根据需要使用)
& & & & & & & & & & & & & & & && &
& & & & & & & & & & & & case 1:TL0=0x00; TH0=0xFD; & & & && &// 4800bps @ 11.0592MHz
& && && && && && & //P31=1;P32=0;P35=1;& & & && &//状态指示灯(根据需要使用)
& & & & & & & & & & & & & & & && &
& & & & & & & & & & & & case 2:TL0=0x00; TH0=0xF4;& & & && &// 1200bps @ 11.0592MHz
& && && && && && & //P31=1;P32=1;P35=0;& & & && &//状态指示灯(根据需要使用)
& & & & & & & & & & & & & & & && &
& & & & & & & &&&}
& & & & & & & &&&UART_INIT();
& & & & & & & &&&TR0 = 1;
& & & && &}
void tm0() interrupt 1
& &if(RING)
& && &if(--RCNT == 0)
& && && &RCNT = 3;& && && && & //复位接收波特率计数器
& && && &if(--RBIT == 0)
& && && &{
& && && && &RBUF = RDAT;& && & //保存数据到RBUF
& && && && &RING = 0;& && && & //停止接收
& && && && &REND = 1;& && && & //接收完成标志
& && && &}
& && && &else
& && && &{
& && && && &RDAT &&= 1;
& && && && &if(RXB)RDAT |= 0x80; //RX数据转移到RX缓冲区
& && && &}
& &else if(!RXB)& & & & & & & & & & & && & //是否检测到低电平
& && &RING = 1;& && && && && & //设置开始接收标志
& && &RCNT = 4;& && && && && & //初始接收波特率计数器
& && &RBIT = 9;& && && && && & //初化始接收比特数(8个数据位+1个停止位)
& &if(REND)
& && &REND = 0;
& && &if(RBUF == 0x7F)
& & & && &{
& & & && && &cnt++;
& & & && && &if(cnt & 1)cn=0;& & & && & //“0x7F”连续 & 1,则清切换计数器
& & & & & & & &&&if(cnt & 100)START=1; //“0x7F”连续 & 100,则打开重启标志
& & & && &}
& & & && &else cnt = 0;
& &if(++cn&600){ cn=0; NEW=1; }//切换计数器 & 600,则打开更新标志
//有一旧时期的STC-ISP_4.88版的引导信号间隔时间有差异( 需要切换计数器 & 800 ),建议用最新时期的
最新版本:
(原文件名:STC免手动烧写+逻辑分析仪电路图(初始版).jpg)
(原文件名:STC免手动烧写+逻辑分析仪电路图(改进版).jpg)
(原文件名:a.jpg)
(原文件名:.jpg)
// 作品:STC免手动烧写(自适应波特率自动冷启) + 简易逻辑分析仪
// 芯片:STC15F104E
// 晶振:45MHz
// 编译:Keil uVision4 V9.00
// 说明:自适应STC-ISP软件最低波特率(1200bps/2400bps/4800bps)
//& & & & & & & &&&3种模式:①自动烧写&&(默认)& & & && & 【LED_key不亮:模式① ,LED亮:通电 ,LED不亮:关电】
//& & & & & & & && && && &&&②逻辑分析仪(正向波形) 【LED_key亮&&:模式② ,LED亮:预备 ,LED不亮:采样】
//& & & & & & & && && && &&&③逻辑分析仪(反向波形) 【LED_key闪烁:模式③ ,LED亮:预备 ,LED不亮:采样】
//& && & ①②③模式下,系统板都可以正常串口通信。
//& && & ②③模式下,也可以烧写程序(手动烧写),不过正在“采样”时请不要烧写程序以及系统板串口通信。
// & & & &&&注:建议烧写程序时启动看门狗(预分频数256,约2.2S @ 45MHz)
//& & & &&&另:关于STC-ISP V4.88版本,发现用PL2303HX芯片烧写STC15系列很难成功,最低/高波特率都选用4800bps才可以烧写。
//& & & & & & & &&&关于STC-ISP V6.06版本,用PL2303HX芯片烧写STC15系列非常好(直接用默认的最低/高波特率),
//& && & 但V6.06版本内部R/C振荡器最高只可以选33.1776MHz。
//& & & & & & & &&&用FT232芯片烧写,则通杀STC-ISP所有版本(直接用默认的最低/高波特率)。
#include &STC15F104E.H&
#include &MY_SET.h&
sbit LED& &= P3^0;& & & &&&//指示灯
sbit KEY& &= P3^1;& &//按键
sbit RXB& &= P3^2;& && && && && && && &&&
sbit TXB& &= P3^3;
sbit PNP& &= P3^4;& & & &&&//PNP三极管
sbit IO_in = P3^5;& & & &&&//分析仪采样引脚
uint8& &M& & & & & & & &&&//模式
bit& & & & & & & & B_& & & & & & & &&&//初始化标志
uint8& &KEY_V & & & &&&//按键消抖计数
bit& & & && &&&ON;& & & & & & & & & & & &&&//按键标志
bit& & & & & & & & LED_& & & &&&//模式指示灯(在按键上扩展)
uint16&&C& & & & & & & &&&//闪烁计数
bit& &&&P_N;& & & & & & & &&&//正向标志
uint8& &BIT8,cnt,D
uint8 TBUF,RBUF;& & & &&&//发送/接收缓存
uint8 TDAT,RDAT;& & & &&&//发送/接收数据暂存
uint8 TCNT,RCNT;& & & &&&//发送/接收计数器
uint8 TBIT,RBIT;& & & &&&//发送/接收比特数
bit& &TING,RING;& & & &&&//开始发送/接收标志
bit& &TEND,REND;& & & &&&//发送/接收完成标志
bit& &START;& && && &//重启标志
uint8 Correct_& & & &&&//『连续正确』计数器
uint8 Error_& & & &&&//错误累加计数器
uint8 S& && &&&//波特率状态
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:延时
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void YS(uint8 n)
&&uint8 a,b,c;
&&while(n--)
& & & &&&for(c=66;c&0;c--)
& &&&for(b=100;b&0;b--)
& &&&for(a=100;a&0;a--);
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:串口初始化
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void UART_INIT()
& &TING = 0;
& &RING = 0;
& &TEND = 1;
& &REND = 0;
& &TCNT = 0;
& &RCNT = 0;
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:逻辑分析仪初始化
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void Analyzer_Init()& & & & & & & &
& &TR1 = 0;
& &TF1 = 0;
& &Time = 0;
& &BIT8 = 0;
& &TL0 = 0x7E; & & & &&&//初始化T0和设定重载值
& &TH0 = 0xFF;& & & &&&//修改成 115200bps
& &LED = 0;& & & & & & & &&&//指示灯开
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:自动烧写模式下波特率切换(定时器0模拟)
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void UART_Change()
& &if(++Status & 2)Status=0;
& &switch(Status)
& & & &&&case 0: TL0=(00/1200); TH0=(00/1200)&&8; // 1200bps
& & & &&&case 1: TL0=(00/2400); TH0=(00/2400)&&8; // 2400bps
& & & &&&case 2: TL0=(00/4800); TH0=(00/4800)&&8; // 4800bps
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:重启程序
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void Restart()
{& & & & & & & &&&& & & &&&
&&if(START)
& & & &&&START = 0;
& & & & & & & & & & & & & & & &&&
& & & &&&TR0 = 0;
& & & &&&PNP = 1;& & & & & & & && &&&//关电
& & & &&&LED = 1;
& & & &&&YS(10);& & & && && && &//从『加载HEX』到『提示上电』有5秒,但不必等到『提示上电』
& & & &&&WDT_CONR |= 0x10;&&//清看门狗(预分频数256,约2.2S @ 45MHz)
& & & &&&PNP = 0;& & & & & & & && &&&//通电
& & & &&&LED = 0;
& & & &&&YS(30);
& & & &&&WDT_CONR |= 0x10;&&//清看门狗(预分频数256,约2.2S @ 45MHz)
& & & &&&TR0 = 1;
& & & &&&RING = 0;
& &&&REND = 0;
& &&&RCNT = 0;
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:主程序
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void main()
& &P33 & & & & = 1;
& &WDT_CONR |= 0x10; //清看门狗(预分频数256,约2.2S @ 45MHz)& & & &
& &PNP = 0;& & & & & & & && && &//通电
& &LED&&= 0;
& &LED_key = 1;& & & & & & & &&&//关
& &for(i=0;i&30;i++){ YS(1); LED = ~LED; } //冷启/低压复位 指示
& &WDT_CONR |= 0x10; //清看门狗(预分频数256,约2.2S @ 45MHz)
& && & & & & & & && &
& &TMOD = 0x00;& && &//T0、T1处于16位自动重装模式
& &AUXR = 0xC0;& && &//T0、T1工作在1T模式
& &TL1 = ();
& &TH1 = ()&&8;& & & && && & & & & & & & & & & && &&&
& &UART_Change();
& &TR0 = 1;&&
& &EA&&= 1;& && &&&
& &ET0 = 1;&&
& &PT0 = 1;& && && & //提高T0的中断优先级
& &ET1 = 1;& && && && && &&&& & & & & & & & & & & && &
& &UART_INIT();
& &Mode = 0;
& &while(1)
& &{& && && && && && && && && &&&
& & & &&&switch(Mode)
& & & && &&&case 0: if(B_init)
& & & & & & & && && && &{
& & & & & & & & & & & & & & & && & B_init=0;
& & & & & & & & & & & & & & & && & TR1=0;
& && && && && && & PNP = 0;& & & & & & & && && &//通电
& & & & & & & & & & & & & & & && & LED=0;
& & & & & & & & & & & & & & & && & UART_Change();
& & & & & & & & & & & & & & & && & UART_INIT();
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & Restart();& & & &
& & & & & & & & & & & && &&&LED_key = 1;& & & && & & & & & & & & & & & & && && && &
& & & & & & & && && && &&&
& & & && &&&case 1: if(B_init){ B_init=0; P_N=1; Analyzer_Init(); }
& & & & & & & && && && &if(!IO_in){ TR1=1; LED=1;&&}& && &&&//启动定时器1,采样开始
& & & && && && && & if(Over)&&
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & && & Over=0;
& & & & & & & & & & & & & & & && & if(++Time & 3320)Analyzer_Init();//约16.6秒(5ms * 3320),即每次采集完,过4秒(16.6S-12.6S)后重新工作
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & LED_key = 0;& & & & & & & & & & & & & & & & & & & && && &
& & & & & & & && && && &
& & & & & & & & case 2: if(B_init){ B_init=0; P_N=0; Analyzer_Init(); }
& & & & & & & && && && &if(!IO_in){ TR1=1; LED=1;&&}& && &&&
& & & && && && && & if(Over)
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & && & Over=0;
& & & & & & & & & & & & & & & && & if(++Time & 3320)Analyzer_Init();
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & if(++Count &10000){ Count=0; LED_key=!LED_} //闪烁
& & & & & & & && && && &
& & & & & & & & default:Mode=0;
& & & & & & & && && && && & & & & & & &
& & & &&&//按键检测
& & & &&&KEY = 1;& & & & & & & && &//拉高电平
& & & &&&NOP12();& & & & & & & && &//稍微延时
& & & &&&if(!KEY)
& & & &&&{
& & & & & & & & if(ON==0)KEY_Value++;
& & & & & & & & if(KEY_Value & 200)
& & & && &&&{
& & & && && &&&KEY_Value = 0;
& & & & & & & && & ON = 1;& & & && && & //按键标志置“1”& & & && &
& & & & & & & && & if(++Mode & 2)Mode=0;
& & & & & & & && & B_init = 1;& & & && &//『初始化标志』置“1”
& & & && &&&}
& & & &&&}
& & & &&&else { KEY_Value=0; ON=0; }
& & & & & & & & & & & & & & & & & & & & & & & && &&&
& & & &&&//恢复指示灯状态
& & & &&&if(LED_key)KEY=1;
& & & &&&else& && & KEY=0;
& & & &&&WDT_CONR |= 0x10;& &&&//清看门狗(预分频数256,约2.2S @ 45MHz)
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:定时器0中断程序,模拟串口
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void tm0() interrupt 1 using 1
{& & & & & & & & & & & & & & & & & & & &
& &if(RING)
& && &if(--RCNT == 0)
& && && &RCNT = 3;& && && && & //复位接收波特率计数器
& && && &if(--RBIT == 0)
& && && &{& & & & & & & && &
& && && && &RBUF = RDAT;& && & //保存数据到RBuf管理
& && && && &RING = 0;& && && & //停止接收
& && && && &REND = 1;& && && & //设置接收完成标志
& && && &}
& && && &else
& && && &{
& && && && &RDAT &&= 1;
& && && && &if(RXB) RDAT |= 0x80; //RX数据转移到RX缓冲区
& && && &}
& &else if(!RXB)& & & & & & & & & & & && & //是否检测到低电平
& && &RING = 1;& && && && && & //设置开始接收标志
& && &RCNT = 4;& && && && && & //初始接收波特率计数器
& && &RBIT = 9;& && && && && & //初化始接收比特数(8个数据位+1个停止位)
& &if(--TCNT == 0)
& && &TCNT = 3;& && && && && & //复位发送波特率计数器
& && &if(TING)& && && && && &&&//判断是否发送
& && && &if(TBIT == 0)
& && && &{
& && && && &TXB = 0;& && && &&&//发送起始位
& && && && &TDAT = TBUF;& && & //加载数据从TBUF至TDAT
& && && && &TBIT = 9;& && && & //初化始发送比特数(8位数据位+1个停止位)
& && && &}
& & & & & & & &&&else
& && && &{
& && && && &TDAT &&= 1;& && &&&//位移数据至CY
& && && && &if(--TBIT == 0)
& && && && &{
& && && && && &TXB = 1;
& && && && && &TING = 0;& && & //停止发送
& && && && && &TEND = 1;& && & //设置发送完成标志
& && && && &}
& && && && &else
& && && && &{
& && && && && &TXB = CY;& && & //写CY至TX端口
& && && && &}
& && && &}
& & & & & & & & & & & & & & & & & & & && &
& &if((Mode==0) && REND)& & & & & & & & & & & &
& &{& & & & & & & & & & & & & & & && &
& && &REND = 0;
& && &if(RBUF == 0x7F)
& & & && &{ & & & & & & & && & & & & && & & & & &&&
& & & & & & & &&&if(++Correct_nums & 10)
& & & & & & & &&&{& & & & & & & & & & & & & & & &&&
& & & & & & & && &&&START=1;& && && && &
& & & & & & & & & & & & Correct_nums=0;& & & &
& & & & & & & & & & & & Error_nums=0;
& & & & & & & &&&}
& & & && &}
& & & && &else & & & & & & & && &
& & & && &{
& & & && && &Correct_nums=0;
& & & & & & & &&&if(++Error_nums & 6)
& & & & & & & &&&{
& & & & & & & && &&&TR0 = 0;
& & & & & & & & & & & & Error_nums=0;
& & & & & & & & & & & & Correct_nums=0;& & & &
& & & & & & & & & & & & UART_Change();
& && && && &RING = 0;
& && && && &REND = 0;
& && && && &RCNT = 0;
& & & & & & & & & & & & TR0 = 1;
& & & & & & & &&&}
& & & && &}
/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
函数:定时器1中断程序
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈*/
void tm1() interrupt 3& && && &
{& & & & & & & & & & & & & & & & & & & & & & & && &
& & & & if(IO_in)Dat |= 0x01;& &
& & & & if(++BIT8 == 8) & & & & & & & &&&//每采集8次发送一次
& & & && &if(P_N)TBUF =&&D& & & &&&//正向输出
& & & && &else& & & &&&TBUF = ~D& & & &&&//反向输出
& && &TING = 1;
& & & && &BIT8 = 0;
&&& & & & }
& & & & Dat &&= 1;& & & & & & & & & & & &&&
& & & & if(++cnt == 0)Over=1;& &&&//约5ms置1一次
回复【60楼】ppc888
-----------------------------------------------------------------------
【主位的电路,11.0592M】
那个是旧版本,电路图也有些不妥(应该把10Ω电阻去掉),下载“最低波特率”固定,而且没有逻辑分析仪功能
【32楼的电路,11.0592M】
在旧版上改进:自动适应STC-ISP软件中的“最低波特率” 3种波特率,可选“1200bps/2400bps/4800bps”
但也没有逻辑分析仪功能
【49楼的电路,45M】
程序全新修改;
自动适应STC-ISP软件中的“最低波特率” 3种波特率,可选“1200bps/2400bps/4800bps”;
增加简易单路逻辑分析仪。
STC-ISP软件中选用不同型号的STC时,默认的下载“最低波特率”不同,比如:
STC89系列:默认 最低波特率 1200bps
STC12系列:默认 最低波特率 2400bps
STC15系列:默认 最低波特率 4800bps
懒得每次选择,所以增加自适应3种最低波特率“1200bps/2400bps/4800bps”功能
& && &&&在STC单片机中有两个程序区,用户程序区与ISP程序区。单片机上电后(冷启动,并非外部手动复位或看门狗复位),先会运行ISP程序,检测是否有合法的下载命令流,占时几十毫秒到几百毫秒,如果没有合法的下载命令流,则立即运行用户程序。
& && & 如果有合法的下载命令流,则ISP监控程序开始与ISP下载软件通信,软件也会进入编程模式,向监控程序发送程序码,监控程序接收程序码,并将其写入用户程序区中。在编程完毕,对程序校验成功后,用户程序立即生效,开始运行用户程序。
& && &&&STC-ISP尝试与MCU握手连接的时候,是以“最低波特率”设置项中的波特率不断的从串口发送“0x7F”信号,直到MCU上电冷启(或者软复位至ISP)经几十毫秒到几百毫秒检测下载命令流后,MCU做出响应,STC-ISP才停止发送“0x7F”信号开始烧写。
用简易单路逻辑分析仪捕捉,STC-ISP下载程序前的串口命令流
(原文件名:STC-ISP串口命令流.jpg)
本帖最后由 BXAK 于
22:33 编辑
这个程序构思不完善,主要是自动适应波特率部分有些BUG,
如果是固定程序中的最低波特率(对应STC-ISP的最低波特率选项,最高波特率选项任意),这个程序就运行很好,
但这样就不方便了,因为STC-ISP不同版本及不同型号默认最低波特率选项不同,懒得每次更换都改下STC-ISP的最低波特率选项。
所以使用新方案解决:
不再用硬件串口/模拟串口捕捉数据,先直接用计时器捕捉TXD上一定数量的连续电平数据,然后分析电平数据(比如:低电平时间相等,0x7F次数,……等等多重验证),
如果符合条件就重启(断电几百ms后上电,隔&1.5S恢复监测);
如果不符合条件则重新监测。
上面这个方案几近完美,负责监控的STC15F104E也不需要超频到45M了,22.1184M就可以,
同时自动适STC-ISP的最低波特率选项范围更宽1200bps/2400bps/4800bps/9600bps,
完美版的方案就是这样,挺简单的,程序就不传了
本帖最后由 BXAK 于
14:49 编辑
zyyn123 发表于
我的USB转TTL下载线烧写程序正常,按您提供的图接线只能手动下载,不能自动下载。按我改过的那张图接线可 ...
发现问题所在了,电路图、连接图没错,是程序的引脚定义弄反了,
sbit RXB& &= P3^2;& && && && && && && &&&
sbit TXB& &= P3^3;
sbit TXB& &= P3^2;& && && && && && && &&&
sbit RXB& &= P3^3;
(707.56 KB, 下载次数: 380)
14:48 上传
点击文件名下载附件
图文并茂,支持一下
牛人.用继电器控制,哪触点容易失效吧,
stc不是可以自定义下载吗?
哈哈。。好像有一块开发板上面有类似的功能。。看看哈
老妖要给楼主版权费了
回复【4楼】wenjin0386&&
-----------------------------------------------------------------------
自定义下载占用串口、占用定时器,而且每个程序都要加入代码,麻烦
那个板其实是不需要的,只修改在通讯程序里监控有没有7F,就给IAP_CONTR=0x60就可以了,如果你的波特率是9600,将STC_ISP软件的最低波特率改为9600就可以,做一块板,多一个成本!
不错,我的开发板已经用上了,是stm8+mos管
为什么不用光耦或者MOS或者三极管做开关呢???
头像被屏蔽
不错,改天我做个,改成mos管控制的。
回复【4楼】wenjin0386
-----------------------------------------------------------------------
一开始以为stc15F100系列无法 自动isp,其它自带串口的都可以,现在看来lz有心了!不错!
建议lz修改下标题,改为“STC15系列免手动下载程序。。。。。”为宜
仔细看了下,还是要靠一个“外部断电”来实现,原以为lz实现了纯软件不断电下载stc15F100系列呐。
虽然不算纯软件方式,但很不错了!
回复【13楼】fyx710
-----------------------------------------------------------------------
三极管有0.几的压降,手头MOS管一个也没有,多余的5V继电器倒是搁了老久,就干脆用上,也算是清仓了
回复【15楼】zaixian 来来
-----------------------------------------------------------------------
好像你理解错了诶,
是用某一单片机(图中用的是STC15F104)来实现自动断电冷启动,免手动烧写各种型号的STC单片机
这个有问题:
硬件有问题如果usb口不够输出电流当你连上要下载的单片机时会不能启动继电器,
还有如果你使用被下载的单片机P3.0口有可能收不到0x7f。经验之谈,交流交流。
回复【20楼】downtoearth
-----------------------------------------------------------------------
1、驱动5V继电器需要60mA左右的电流,USB驱动能力500mA。
& &再说了USB下载线主要是用来烧写程序用的,不是用来做大功率实验的
2、STC-ISP尝试与MCU握手连接的时候,是以“最低波特率”设置项中的波特率不断的向单片机发送“0x7F”信号,
& &直到上电冷启(或者软复位至ISP)才停止发送“0x7F”信号。
被下载的单片机P3.0口有可能收不到0x7f,你是指那个10Ω电阻短路 被下载单片机VCC与GND 的原因吗?
但我这段时间一直用着没问题,目前还没有下载失败过
5v继电器电流蛮大的
回复【22楼】dzng11 原子3号
-----------------------------------------------------------------------
是蛮大的,用三极管、COMS管、还用是继电器,反正根据个人需要就好了
回复【23楼】BXAK
-----------------------------------------------------------------------
主要是继电器的体型比较让人感觉不爽...
不错, 一开始我还是为是网上流传的把软件复位的代码嵌入到单片机程序里的那种, 呵呵, 赞一个~
回复【8楼】BXAK
回复【4楼】wenjin0386& &
-----------------------------------------------------------------------
自定义下载占用串口、占用定时器,而且每个程序都要加入代码,麻烦
-----------------------------------------------------------------------
其实我觉得这个也不麻烦
STC有独立的波特率发生器, 所以占用的只是一个串口, 要做的只是在单片机一开始的初始化工作
不过对于没有专用仿真器的STC来说, 占了个串口关系是挺大的, 我的程序基本上都是要借助串口来调试的
我现在用方法是的是单片机一启动检测RXD引脚, 如果有低电平立刻ISP启动, 也就是要手动按复位键来下载的方案,
这个是比较不占用资源的, 不过还是需要手动去按复位键, 只是免了断电
我可以结合你的方案, 不使用继电器, 不过代价就是mian函数的一开始要检测RXD引脚
只要把继电器改成给目标单片机复位引脚一个复位信号, 这样也可以实现自动下载了, 呵呵
其实核心就是监听串口的内容了~
usb口台机有500mA有可能,但笔记本就一定没有了。如果被下载方有使用P3.0口,stc15f104e有可能收不到0x7f,
干扰了stc15f104e的接收端。
回复【27楼】downtoearth
-----------------------------------------------------------------------
如果被下载方有使用P3.0口,stc15f104e有可能收不到0x7f,干扰了stc15f104e的接收端。
能再具体点吗,举个例子
最近也想搞个这个,通过监听串口数据来自动上电、断电。。。
回复【28楼】BXAK
-----------------------------------------------------------------------
刚做了个实验,
被下载方烧写了个程序:P3.0口输出38KHz脉冲,
stc15f104e也由原先需要“连续”0x7f到30次才重启(中间有 != 0x7f作废)也改为要连续0x7f到100次才重启……
没有出现“如果被下载方有使用P3.0口,stc15f104e有可能收不到0x7f,干扰了stc15f104e的接收端”
最终的程序如下:
/***************************************************************
& & & & 作品:STC免手动烧写控制程序(STC15F104E监控串口数据流)
&&单片机:STC15F104E(A版)
& & 晶振:11.0592M
编译环境:Keil uVision4 V9.00
& & & & 注意:STC-ISP软件中的“最低波特率” 可选“1200bps/2400bps/4800bps”,本程序自动检测适应。
& & 原理:& & 在STC单片机中有两个程序区,用户程序区与ISP程序区。单片机上电后(冷启动,&&
& && && &并非外部手动复位或看门狗复位),先会运行ISP程序,检测是否有合法的下载命令流,占&&
& && && &时几十毫秒到几百毫秒,如果没有合法的下载命令流,则立即运行用户程序。如果有合法的&&
& && && &下载命令流,则ISP监控程序开始与ISP下载软件通信,软件也会进入编程模式,向监控程&&
& && && &序发送程序码,监控程序接收程序码,并将其写入用户程序区中。在编程完毕,对程序校验&&
& && && &成功后,用户程序立即生效,开始运行用户程序。
&&& & & & & & & && && &STC-ISP尝试与MCU握手连接的时候,是以“最低波特率”设置项中的波特率不断的从串口
& && && &发送“0x7F”信号,直到上电冷启(或者软复位至ISP)经几十毫秒到几百毫秒检测下载命令流后,
& && && &才停止发送“0x7F”信号。
***************************************************************/
#define uint8&&unsigned char
#define uint16 unsigned int& & & &
#include &STC15F104E.H&
sbit RXB& &= P3^4;
sbit Key& &= P3^1;& &//自动/手动开关(根据需要使用)
sbit Relay = P3^3;& & & &&&//继电器(可用三极管、MOS管代替)
sbit LED& &= P3^0;
uint8 RBUF;& & & &&&//接收缓存
uint8 RDAT;& & & &&&//接收数据暂存
uint8 RCNT;& & & &&&//接收计数器
uint8 RBIT;& & & &&&//接收比特数
bit& ˚& & & &&&//开始接收标志
bit& &REND;& & & &&&//接收完成标志
uint8& & & &&&//重启计数器
bit& &START; //重启标志
uint16 CN;& & & && &//波特率切换计数器
uint8&&S//波特率状态
bit& & NEW;& & & && &//波特率更新标志
void YS100ms(uint8 n)
&&uint8 a,b,c;
&&while(n--)
& &&&for(c=89;c&0;c--)
& &&&for(b=230;b&0;b--)
& &&&for(a=12;a&0;a--);
void UART_INIT()
& &RING = 0;
& &REND = 0;
& &RCNT = 0;
& &cnt = 0;
& &CN&&= 0;
void main()
& &P3M1 = 0x00;
& &P3M0 = 0x09;& & & & & & & &&&//P3.0、P3.3推挽输出
& &Key& & & & = 1;
& &Relay= 0;& & & & & & & &&&//断开继电器
& &LED&&= 0;& & & & & & & &&&//关LED
& &TMOD = 0x00;& && &//T0处于16位自动重装模式
& &AUXR = 0x80;& && &//T0工作在1T模式
& &TL0 = 0x00;& & & & & & & &&&//初始化Timer0和设定重载值
& &TH0 = 0xFA;& && & //默认 2400bps @ 11.0592MHz
& &TR0 = 1;& && && &
& &ET0 = 1;& && && &
& &PT0 = 1;& && && & //提高Timer0的中断优先级
& &EA&&= 1;& && && &&&
& &UART_INIT();
& &while(1)
& &{& && && && && && && && && && && &&&
& && &if(START)
& & & && &{
& & & & & & & &&&START = 0;
& & & & & & & &&&if(Key)
& & & & & & & &&&{
& & & & & & & && &&&ET0 = 0;
& & & & & & & && &&&Relay = 1;& & & & & & & &&&//继电器吸合
& & & & & & & && &&&LED = 1;
& & & & & & & && &&&YS100ms(10);& & & &&&//从『加载HEX』到『提示上电』有5秒,但不必等到『提示上电』
& & & & & & & && &&&Relay = 0;
& & & & & & & && &&&LED = 0;
& & & & & & & && &&&YS100ms(10);
& & & & & & & && &&&UART_INIT();
& & & & & & & & & & & & ET0 = 1;
& & & & & & & &&&}
& & & && &}
& & & && &if(NEW)
& & & && &{
& & & & & & & &&&NEW = 0;
& & & & & & & &&&TR0 = 0;
& & & & & & & &&&if(++Status & 2)Status=0;
& & & & & & & &&&switch(Status)
& && && &{
& & & & & & & && &&&case 0:TL0=0x00; TH0=0xFA; & & & && &// 2400bps @ 11.0592MHz
& & & & & & & & & & & & & & & &&&//P32=0;P35=1;& & & && && && &&&//状态指示灯(根据需要使用)
& & & & & & & & & & & & & & & && &
& & & & & & & & & & & & case 1:TL0=0x00; TH0=0xFD; & & & && &// 4800bps @ 11.0592MHz
& && && && && && && && && && && && & //P32=0;P35=0;& & & && && && &&&//状态指示灯(根据需要使用)
& & & & & & & & & & & & & & & && &
& & & & & & & & & & & & case 2:TL0=0x00; TH0=0xF4;& & & && &// 1200bps @ 11.0592MHz
& && && && && && && && && && && && & //P32=1;P35=0;& & & && && && &&&//状态指示灯(根据需要使用)
& & & & & & & & & & & & & & & && &
& & & & & & & &&&}
& & & & & & & &&&UART_INIT();
& & & & & & & &&&TR0 = 1;
& & & && &}
void tm0() interrupt 1
& &if(RING)
& && &if(--RCNT == 0)
& && && &RCNT = 3;& && && && & //复位接收波特率计数器
& && && &if(--RBIT == 0)
& && && &{
& && && && &RBUF = RDAT;& && & //保存数据到RBUF
& && && && &RING = 0;& && && & //停止接收
& && && && &REND = 1;& && && & //接收完成标志
& && && &}
& && && &else
& && && &{
& && && && &RDAT &&= 1;
& && && && &if(RXB)RDAT |= 0x80; //RX数据转移到RX缓冲区
& && && &}
& &else if(!RXB)& & & & & & & & & & & && & //是否检测到低电平
& && &RING = 1;& && && && && & //设置开始接收标志
& && &RCNT = 4;& && && && && & //初始接收波特率计数器
& && &RBIT = 9;& && && && && & //初化始接收比特数(8个数据位+1个停止位)
& &if(REND)
& && &REND = 0;
& && &if(RBUF == 0x7F)
& & & && &{
& & & && && &cnt++;
& & & && && &if(cnt & 1)CN=0;& & & && & //“0x7F”连续 & 1,则清切换计数器
& & & & & & & &&&if(cnt & 100)START=1; //“0x7F”连续 & 100,则打开重启标志
& & & && &}
& & & && &else cnt = 0;
& &if(++CN & 600){ CN=0; NEW=1; }//切换计数器 & 600,则打开更新标志
//有一旧时期的STC-ISP_4.88版的引导信号间隔时间有差异( 需要切换计数器 & 800 ),建议用最新时期的
刷次先& &看看
感谢楼主的帮助!
我也借鉴了你的做了一个,
只用了一个STC15F104来监听串口
代价就是目标单片机的主函数里的第一句要加一行代码:
IAP_CONTR |= (0x01&&6); //设置复位后从ISP启动
这样算是比较环保的了, 呵呵
(原文件名:1.jpg)
(原文件名:2.jpg)
(原文件名:3.jpg)
不好意思, 代码就不上传了, 因为牵扯到我最近在做的库代码, 是打算共享的, 可是还在完善中, 就不好意思拿出来献丑了...
方案我在25, 26楼有讲的
25楼------------------
我现在用方法是的是单片机一启动检测RXD引脚, 如果有低电平立刻ISP启动, 也就是要手动按复位键来下载的方案,&&
这个是比较不占用资源的, 不过还是需要手动去按复位键, 只是免了断电
26楼----------------
我可以结合你的方案, 不使用继电器, 不过代价就是mian函数的一开始要检测RXD引脚
只要把继电器改成给目标单片机复位引脚一个复位信号, 这样也可以实现自动下载了, 呵呵
其实核心就是监听串口的内容了~
其实就是楼主的代码稍微改动一下就可以变成这样了
另外我还做了点小优化, 其实无关紧要的, 就是开外部中断4(串口接收脚), 一段时间没收到串口信息后就进入掉电模式, 省点电, 环保环保~
不上程序好像不太厚道, 好吧...
首先要感谢楼主, 因为STC给的软件串口那部分代码要不是因为楼主这里有注释, 我就看不懂了~
因为有一小部分代码是直接从我的STC12C5A60S2的库代码移植过来的, 所以有些地方的注释还有代码不太恰当, 也懒得改了...将就着看吧
先来一段说明:
//& & & & STC单片机免手动下载的串口监视器程序,
//& & & & 只使用了一个单片机STC15F104E制作
//& & & & 为了安全第因素可以在P33(目标机复位控制脚), P31脚串联一个100欧的限流电阻
//& & & & P31(串口发送)脚如果不引出线来的话也不需要串联电阻, 引出来是为了以后更新这个串口监视程序的方便
//& & & & 还可以给串口监视器的单片机STC15F104E加一个复位电路, 因为程序里没有使用看门狗, 有复位电路方便复位
//& & & & 可以自适应波特率,
//& & & & 第一次下载目标机程序的时候还是需要冷启动的,
//& & & & 而且每次下载的目标机程序的代码的主函数第一句要写上一条语句:&&IAP_CONTR |= (0x01&&6);
//& & & & 这条语句是用来设置目标机下次复位的时候从ISP启动的, 如果使用 BXAK 大哥的继电器的方案就不需要这样了
要想提高可靠性的还可以使用内部看门狗, 呵呵, 我就懒得加了~
(原文件名:STC15_AutoDownLoader.zip)
做得太简陋, 然后又改了下, 有个电路板还是实在一点, 然后又加了个复位按键, 手上居然只有贴片的, 麻烦死了... 还在TXD和控制复位的脚串了个100欧的电阻, 因为试的时候不小心接错差点把芯片给烧了, 然后就接个电阻保险一点...
(原文件名:1.jpg)
(原文件名:2.jpg)
(原文件名:3.jpg)
不知道有没有人注意到芯片座好像有点缺口, 因为我手上没有8脚的芯片座, 所以就用手钻从一个18脚的芯片座锯出了一个~
谢谢楼主分享^
STC15的定时器的新的16位自动重装的工作方式不错, 可是没了硬件串口就是个悲剧...
楼主, 程序里还有一点我不太明白
&&else if(!RXB)& & //是否检测到低电平
& && &RING = 1;& && && && && & //设置开始接收标志
& && &RCNT = 4;& && && && && & //初始接收波特率计数器
& && &RBIT = 9;& && && && && & //初化始接收比特数(8个数据位+1个停止位)
这里的RCNT = 4;
为什么不是RCNT = 3?
我有点怀疑是老妖写错了...唉, datasheet上只写是initial receive baudrate counter, 就没再解释了...
测试了RCNT = 3的, 也可以用
我明白了, 看来我错怪老妖了
因为定时器的溢出率是波特率的3倍, 所以第一次检测到起始信号的时间一定是发送端发送一个位的
前三分之一个周期, 所以RCNT初始化为3 + 1, 那么下一次采样的时候就在下一位发送后的半个周期左右了, 这样可以有效的
减小数据传输中因为双方的时钟不是理想同步造成的误差
我终于看明了,谢谢你楼主!
回复【楼主位】BXAK
-----------------------------------------------------------------------
感谢楼主的无私奉献
这个方案挺不错的,有时间回去自己也做个,方便很多了。
回复【49楼】BXAK&&
-----------------------------------------------------------------------
#include &MY_SET.h&
MY_SET.h这个文件我没有啊、、麻烦您能发上来么?谢谢您了!
千山万水 终于找到了这个资料了···
哇~原来还有新内容~顶一下楼主~
弱弱的问一下,楼主的上位机程序咋整的?能提供源码吗?
PS:用MOS管还好,三极管的压降真的会让人不放心的
记得STC-ISP有个&Re-Down重复下载&,板子一插就自动下了。
回复【55楼】Pony279 霍斯
-----------------------------------------------------------------------
物尽其用,单纯自动冷启下载太浪费了,就添加了个简易逻辑分析仪
回复【56楼】Pony279 霍斯
-----------------------------------------------------------------------
上位机程序论坛里面就有,有很多人发过的,
PNP三极管也够用了,几十mA不到0.1V的压降,160mA约0.3V的压降
逻辑分析器115200bps,采样20.0736us,源码网上有:
点击此处下载
(原文件名:逻辑分析器(115200bps,采样20.0736us).zip)
学习了,我是用51做的&&只检测7F。。似乎简单了很多 也浪费了很多
45M晶振&&明白了&&4.88版本才能选择这个频率
49楼的代码 我编译错误呢···
compiling 104E.C...
104E.C(2): warning C318: can't open file 'MY_SET.h'
104E.C(12): error C129: missing ';' before 'Mode'
104E.C - 1 Error(s), 1 Warning(s).
回复【60楼】ppc888
-----------------------------------------------------------------------
少了MY_SET.h,这个只是我的习惯配置罢了,你可以去掉不用,不过要宏定义一下
#define& &uint8& &&&unsigned char
#define& &uint16& & unsigned int
MY_SET.h内容如下:
#ifndef __MY_SET_H__
#define __MY_SET_H__
// data& &固定指片内RAM:0x00~0x7F
// bdata&&固定指片内RAM:0x20~0x2F
// idata&&固定指片内RAM:0x00~0xFF
// xdata&&一般指扩展RAM:0x0000~0xFFFF,也指STC内部扩展RAM:0x0000~0xFFFF
// code& & & && &指程序存储区ROM:0x0000~0xFFFF
//静态局部变量
#define& &s_bit& &&&static bit
#define& &s_uint8& &static unsigned char
//无符号类型
#define& &uint8& &&&unsigned char& & & & & & & & & & & &
#define& &uint8b& & unsigned char bdata& & & & & & & &
#define& &uint8i& & unsigned char idata& & & & & & & &
#define& &uint8x& & unsigned char xdata& & & & & & & &
#define& &uint8c& & unsigned char code
#define& &uint16& & unsigned int
#define& &uint16i& &unsigned int&&idata
#define& &uint16x& &unsigned int&&xdata
#define& &uint16c& &unsigned int&&code
#define& &uint32& & unsigned long
#define& &uint32i& &unsigned long idata
#define& &uint32x& &unsgined long xdata
#define& &uint32c& &unsgined long code
//有符号类型
#define& &int8& && &char
#define& &int8x& &&&char xdata
#define& &int8c& &&&char code
#define& &int16& &&&int
#define& &int16x& & int&&xdata
#define& &int16c& & int&&code
#define& &int32& &&&long
#define& &int32x& & long xdata
#define& &int32c& & long code
#include&&&intrins.h&
#define& &NOP& && & _nop_()& & & &
#define& &NOP3()& & {_nop_();_nop_();_nop_();}
#define& &NOP12()& &{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
/* intrins.h
_crol_ 字符循环左移   
_cror_ 字符循环右移   
_irol_ 整数循环左移   
_iror_ 整数循环右移   
_lrol_ 长整数循环左移   
_lror_ 长整数循环右移   
_nop_ 空操作8051 NOP 指令
_testbit_ 测试并清零位8051 JBC 指令
(_crol_,_irol_,_lrol_)以位形式将val 循环左移n 位,该函数与8051“RLA”指令相关,上面几个函数不同于参数类型。
(_cror_,_iror_,_lror_)以位形式将val 循环右移n 位,该函数与8051“RRA”指令相关,上面几个函数不同于参数类型。
(_nop_)& & 产生一个NOP 指令,该函数可用作C 程序的时间比较。C51 编译器在_nop_函数工作期间不产生函数调用,即在程序中直接执行了NOP 指令。
(_testbit_)产生一个JBC 指令,该函数测试一个位,当置位时返回1,否则返回0。如果该位置为1,则将该位复位为0。
& && && && & 8051 的JBC 指令即用作此目的。_testbit_只能用于可直接寻址的位;在表达式中使用是不允许的。
这个东西很不错啊。好东西
好东西,谢谢楼主了,顺便问一下楼主,那个 WDT_CONR |= 0x10; //清看门狗(预分频数256,约2.2S @ 45MHz) 是不是少了个字母T呀.
回复【65楼】zyyn123
-----------------------------------------------------------------------
你的STC15F104E.H头文件中是WDT_CONRT,就用WDT_CONRT。
我用的STC15F104E.H是对照STC的SFRs自己弄的
MARK&&学习
mark下,以后用
楼主你好,这个东西我也做过,就是用15检测7F,但是在烧写过程中经常会损坏MCU,导致芯片烧写不进去。还有我不是用继电器切换的,使用的是MOS管,体积可以做的非常小。加下我QQ,我想和你一起交流心得。
回复【71楼】soldiers 阿坚
-----------------------------------------------------------------------
我也不用继电器了,那吸合/断开声挺久了——烦啊,改用三极管了,等找到MOS了再换上,
请看“49楼”的最新版本:
// 作品:STC免手动烧写(自适应波特率自动冷启) + 简易逻辑分析仪
// 芯片:STC15F104E
// 晶振:45MHz
// 编译:Keil uVision4 V9.00
// 说明:自适应STC-ISP软件最低波特率(1200bps/2400bps/4800bps)
//&&3种模式:①自动烧写&&(默认)& & 【LED_key不亮:模式① ,LED亮:通电 ,LED不亮:关电】
//& && && &&&②逻辑分析仪(正向波形) 【LED_key亮&&:模式② ,LED亮:预备 ,LED不亮:采样】
//& && && &&&③逻辑分析仪(反向波形) 【LED_key闪烁:模式③ ,LED亮:预备 ,LED不亮:采样】
//& && & ①②③模式下,系统板都可以正常串口通信。
//& && & ②③模式下,也可以烧写程序(手动烧写),不过正在“采样”时请不要烧写程序以及系统板串口通信。
//& &注:建议烧写程序时启动看门狗(预分频数256,约2.2S @ 45MHz)
//&&另:关于STC-ISP V4.88版本,发现用PL2303HX芯片烧写STC15系列很难成功,最低/高波特率都选用4800bps才可以烧写。
//&&关于STC-ISP V6.06版本,用PL2303HX芯片烧写STC15系列非常好(直接用默认的最低/高波特率),
//& && & 但V6.06版本内部R/C振荡器最高只可以选33.1776MHz。
//&&用FT232芯片烧写,则通杀STC-ISP所有版本(直接用默认的最低/高波特率)。
做实验的时候实用,但量产的话,重复烧录时几秒钟就自动等待烧写,目标板同时要接上下载线,这个时候能自动识别并接通电源么?
原来这样,不过我的开发板烧录不用手动的
回复【76楼】GDYJ
-----------------------------------------------------------------------
当然可以,1~9秒重复下载都没问题,其实点击“重复下载”也和编译后目标代码变化自动下载差不多
BXAK 发表于
最终的程序如下:
/***************************************************************
版主能不能把头文件STC15F104E.H上传一下呢。
曹世鹏 发表于
版主能不能把头文件STC15F104E.H上传一下呢。
(549.17 KB, 下载次数: 167)
12:01 上传
点击文件名下载附件
BXAK 发表于
版主,谢谢你。
不错哦。今天我照楼主给的程序做了一个。自动下载程序时可以将继电器吸合的时间延时一下。然后下载间隔时间不能太近。也就是说不能下载完一个程序以后不能紧接着再次下载。如果下载间隔太小,就可能造成15F104E不动作。但是并没有死机。不知为什么。
BXAK 发表于
这个程序构思不完善,主要是自动适应波特率部分有些BUG,
如果是固定程序中的最低波特率(对应STC-ISP的最 ...
楼主真的好用心呀。谢谢楼主。
你好,我用从宏晶申请的STC-ISP下载器,链接按照您的电路和程序做的下载器,成功。但是链接我用CH341T做的USB下载器,就不行了。能帮我分析一下原因吗?谢谢~~
friends369 发表于
你好,我用从宏晶申请的STC-ISP下载器,链接按照您的电路和程序做的下载器,成功。但是链接我用CH341T做的U ...
单独用CH341T做的USB下载器正常可以下载程序吗
BXAK 发表于
单独用CH341T做的USB下载器正常可以下载程序吗
谢谢你的回复!单独用CH341T的USB下载器可以下载程序。
friends369 发表于
谢谢你的回复!单独用CH341T的USB下载器可以下载程序。
如果方便,画个简单的连线图看看(CH341与自动下载转接板、目标单片机之间VCC、GND、TXD、RXD的连接情况)
这个不错,值得学习一下。。。
用继电器?电流有点大了吧。
本帖最后由 friends369 于
21:29 编辑
BXAK 发表于
如果方便,画个简单的连线图看看(CH341与自动下载转接板、目标单片机之间VCC、GND、TXD、RXD的连接情况 ...
谢谢你,下面是我的电路图:
图片4.jpg (98.27 KB, 下载次数: 4)
21:26 上传
(98.27 KB, 下载次数: 2)
21:27 上传
21:27 上传
点击文件名下载附件
814.85 KB, 下载次数: 90
friends369 发表于
谢谢你,下面是我的电路图:
3.3V供电,板上怎么是用STC12C5A60S2(5V单片机)?
BXAK 发表于
3.3V供电,板上怎么是用STC12C5A60S2(5V单片机)?
后来将其换成STC15L104E,效果一样。
friends369 发表于
后来将其换成STC15L104E,效果一样。
只是想问目标板是STC12C5A60S2(5V单片机),还是STC12L5A60S2(3V单片机)?
修改.jpg (724.77 KB, 下载次数: 1)
12:14 上传
阿莫电子论坛, 原"中国电子开发网"
, 原www.ourdev.cn, 原www.ouravr.com

我要回帖

更多关于 avr单片机下载器 的文章

 

随机推荐