实现STC单片机的自动下载
STC单片机软复位

因学习需要,本人从网上整理了一些STC单片机不断电程序下载的方法,拿出来分享一下。
stc单片机isp实现原理如下:stc单片机每次上电复位后首先执行isp引导程序,如果串口检测到合法的数据流,则进行isp程序下载;串口没有检测的合法的数据流,则跳出isp程序,执行用户程序。
正常情况下,stc单片机只有在上电复位时才执行isp引导程序,其它复位(看门狗复位、rst引脚复位)则直接执行用户程序。
通过阅读stc单片机手册发现,在用户程序运行时,利用软件复位方式,可以让stc单片机复位后从isp引导程序处运行,利用该特性,可以模拟stc单片机上电复位状态,实现不断电程序下载。
STC单片机有热启动和冷启动两种复位形式。
两种复位方式区别如下:用户应用程序在运行过程中,有时会有特殊需求,需要实现单片机系统复位(热启动之一),传统的8051单片机由于硬件上未支持此功能,用户必须用软件模拟实现,实现起来较麻烦。
STC单片机增加了相应的硬件功能,内部的ISP/IAP控制寄存器ISP_CONTR便可以实现此功能。
用户只需简单的控制ISP_CONTR特殊功能寄存器的其中两位SWBS和SWRST就可以实现系统复位。
ISP/IAP控制寄存器(ISP_CONTR)STC单片机ISP/IAP控制寄存器在特殊功能寄存器中的字节地址为E7H,不能位寻址,该寄存器用来管理和ISP/IAP相关的功能设定及是否软件复位等。
单片机复位时该寄存器全部被清0。
其各位的定义如表4.3.1所示。
表1 ISP/IAP控制寄存器(ISP_CONTR)ISPEN:ISP/IAP 功能允许位。
0:禁止ISP/IAP编程改变Flash。
1:允许编程改变Flash。
SWBS:软件选择从用户应用程序区启动(0),还是从ISP程序区启动(1)。
要与SWRST直接配合才可以实现。
SWRST:0:不操作;1:产生软件系统复位,硬件自动清零。
WT2、WT1、WT0:ISP/IAP编程时设定CPU等待的最长时间。
STC单片机内部EEPROM的应用

ISPEN:ISP/IAP功能允许位。
0:禁止ISP/IAP编程改变Flash,1:允许编程改变FlashSWBS:软件选择从用户主程序区启动(0),还是从ISP程序区启动(1)。
SWRST:0:不操作,1:产生软件系统复位,硬件自动清零。
ISP_CONTR中的SWBS与SWRST这两个功能位,可以实现单片机的软件启动,并启动到ISP区或用户程序区,这在“STC单片机自动下载”一节,亦有所应用。
如:ISP_CONTR=0x60; 则可以实现从用户应用程序区软件复位到ISP程序区开始运行程序。
ISP_CONTR=0x20; 则可以实现从ISP程序区软件复位到用户应用程序区开始运行程序。
(以上的建议时钟是(WT2、WT1、WT0)取不同的值时的标称时钟,用户系统中的时钟不要过高,否则可能使操作不稳定。
)以下是具体的实现代码:EEPROM操作函数:#define RdCommand 0x01#define PrgCommand 0x02#define EraseCommand 0x03#define Error 1#define Ok 0#define WaitTime 0x01#define PerSector 512unsigned char xdata Ttotal[512];/*---------------------------------------------------------------------打开 ISP,IAP 功能---------------------------------------------------------------------*/void ISP_IAP_enable(void){EA=0;/* 关中断*/ISP_CONTR|=0x18;/*0001,1000*/ISP_CONTR|=WaitTime;/*写入硬件延时*/ISP_CONTR|=0x80;/*ISPEN=1*/}/*---------------------------------------------------------------------关闭 ISP,IAP 功能---------------------------------------------------------------------*/void ISP_IAP_disable(void){ISP_CONTR&=0x7f;/* ISPEN = 0 */ISP_TRIG=0x00;EA=1;/* 开中断 */}/*----------------------------------------------------------------------公用的触发代码----------------------------------------------------------------------*/void ISPgoon(void){ISP_IAP_enable();/* 打开 ISP,IAP 功能 */ISP_TRIG=0x46;/* 触发ISP_IAP命令字节1 */ISP_TRIG=0xb9;/* 触发ISP_IAP命令字节2 */_nop_();}/*-----------------------------------------------------------------------字节读-----------------------------------------------------------------------*/unsigned char byte_read(unsigned int byte_addr){ISP_ADDRH=(unsigned char)(byte_addr>>8); /* 地址赋值*/ ISP_ADDRL=(unsigned char)(byte_addr&0x00ff);ISP_CMD&=0xf8; /* 清除低3位 */ISP_CMD|=RdCommand;/* 写入读命令*/ISPgoon();/* 触发执行*/ISP_IAP_disable();/* 关闭ISP,IAP功能*/return ISP_DATA;/* 返回读到的数据*/}/*------------------------------------------------------------------------扇区擦除------------------------------------------------------------------------*/void sectorerase(unsigned int sector_addr){unsigned int iSectorAddr;iSectorAddr=(sector_addr&0xfe00);/* 取扇区地址*/ISP_ADDRH=(unsigned char)(iSectorAddr>>8);ISP_ADDRL=0x00;ISP_CMD&=0xf8;/* 清空低3位*/ISP_CMD|=EraseCommand;/* 擦除命令3*/ISPgoon();/* 触发执行 */ISP_IAP_disable();/* 关闭ISP,IAP功能*/}/*-------------------------------------------------------------------------------------字节写-------------------------------------------------------------------------------------*/void byte_write(unsigned int byte_addr, unsigned char original_data){ISP_ADDRH=(unsigned char)(byte_addr>>8); /* 取地址*/ISP_ADDRL=(unsigned char)(byte_addr & 0x00ff);ISP_CMD&=0xf8;/* 清低3位*/ISP_CMD|=PrgCommand;/* 写命令2*/ISP_DATA=original_data;/* 写入数据准备*/ISPgoon();/* 触发执行*/ISP_IAP_disable();/* 关闭IAP功能*/}/*-----------------------------------------------------------------字节写并校验-----------------------------------------------------------------*/unsigned char byte_write_verify(unsigned int byte_addr, unsigned char original_data){ISP_ADDRH=(unsigned char)(byte_addr>>8); /* 取地址*/ISP_ADDRL=(unsigned char)(byte_addr&0xff);ISP_CMD&=0xf8;/* 清低3位*/ISP_CMD|=PrgCommand;/* 写命令2*/ISP_DATA=original_data;ISPgoon();/* 触发执行*//* 开始读,没有在此重复给地址,地址不会被自动改变*/ISP_DATA=0x00;/* 清数据传递寄存器*/ISP_CMD&=0xf8;/* 清低3位*/ISP_CMD|=RdCommand;/* 读命令1*/ISP_TRIG=0x46;/* 触发ISP_IAP命令字节1 */ISP_TRIG=0xb9;/* 触发ISP_IAP命令字节2 */_nop_();/* 延时*/ISP_IAP_disable();/* 关闭IAP功能*/if(ISP_DATA==original_data)/* 读写数据校验*/return Ok;/* 返回校验结果*/elsereturn Error;}/*--------------------------------------------------------------------------数组写入--------------------------------------------------------------------------*/unsigned char arraywrite(unsigned int begin_addr, unsigned int len, unsigned char *array){unsigned int i;unsigned int in_addr;/* 判是否是有效范围,此函数不允许跨扇区操作 */if(len > PerSector)return Error;in_addr = begin_addr & 0x01ff;/* 扇区内偏移量 */if((in_addr+len)>PerSector)return Error;in_addr = begin_addr;/* 逐个写入并校对 */ISP_IAP_enable();/* 打开IAP功能 */for(i=0;i<len;i++){/* 写一个字节 */ISP_ADDRH=(unsigned char)(in_addr >> 8);ISP_ADDRL=(unsigned char)(in_addr & 0x00ff);ISP_DATA=array; /* 取数据 */ISP_CMD&=0xf8;/* 清低3位 */ISP_CMD|=PrgCommand;/* 写命令2 */ISP_TRIG=0x46;/* 触发ISP_IAP命令字节1 */ISP_TRIG=0xb9;/* 触发ISP_IAP命令字节2 */_nop_();/* 读回来 */ISP_DATA=0x00;ISP_CMD&=0xf8;/* 清低3位*/ISP_CMD|=RdCommand;/* 读命令1*/ISP_TRIG=0x46;/* 触发ISP_IAP命令字节1 */ISP_TRIG=0xb9;/* 触发ISP_IAP命令字节2 */_nop_();/* 比较对错 */if(ISP_DATA!=array){ISP_IAP_disable();return Error;}in_addr++;/* 指向下一个字节*/}ISP_IAP_disable();return Ok;}/*----------------------------------------------------------------------------- 扇区读出----------------------------------------------------------------------------- *//* 程序对地址没有作有效性判断,请调用前事先保证他在规定范围内 */ void arrayread(unsigned int begin_addr, unsigned char len){unsigned int iSectorAddr;unsigned int i;iSectorAddr = begin_addr; // & 0xfe00; /* 取扇区地址*/ISP_IAP_enable();for(i=0;i<len;i++){ISP_ADDRH=(unsigned char)(iSectorAddr>>8);ISP_ADDRL=(unsigned char)(iSectorAddr & 0x00ff);ISP_CMD&=0xf8;/* 清低3位*/ISP_CMD|=RdCommand;/* 读命令1*/ISP_DATA=0;ISP_TRIG=0x46;/* 触发ISP_IAP命令字节1 */ISP_TRIG=0xb9;/* 触发ISP_IAP命令字节2 */_nop_();Ttotal=ISP_DATA;iSectorAddr++;}ISP_IAP_disable();/* 关闭IAP功能*/}主函数对EEPROM操作函数进行调用:#include <stc51rd.h>#include <intrins.h>#include <stc_eeprom.h>#include <ados.h>int i;void delay(unsigned int time){while(time--);}void main(){_ADOS(22.1184);//ADOS自动下载//for(i=0;i<100;i++)//{//Ttotal=i;//}//arraywrite(0x8000,100,Ttotal);/*第一次运行时向EEPROM中写入数据然后再将写入函数注释掉,将先前写入的数据读出,输出在P2口上。
STC8G 系列单片机技术参考手册说明书

STC micro TM宏晶科技STC8G 系列单片机技术参考手册资料更新日期:2019/10/22目录1概述 (1)2特性及价格 (2)2.1 STC8G1K08系列特性及价格 (2)3管脚及说明 (4)3.1 管脚图 (4)3.1.1 STC8G1K08系列管脚图 (4)3.2 管脚说明 (6)3.2.1 STC8G1K08系列管脚说明 (6)3.3 功能脚切换 (9)3.3.1 功能脚切换相关寄存器 (9)3.4 范例程序 (10)3.4.1 串口1切换 (10)3.4.2 串口2切换 (11)3.4.3 SPI切换 (12)3.4.4 PCA/CCP/PWM切换 (13)3.4.5 I2C切换 (15)3.4.6 比较器输出切换 (16)3.4.7 主时钟输出切换 (17)4封装尺寸图 (19)4.1 TSSOP20封装尺寸图 (19)4.2 QFN20封装尺寸图(3mm*3mm) (20)4.3 SOP16封装尺寸图 (21)4.4 SOP8封装尺寸图 (22)4.5 STC8系列单片机命名规则 (23)5ISP下载及典型应用线路图 (24)5.1 STC8G系列ISP下载应用线路图 (24)5.1.1 使用RS-232转换器下载 (24)5.1.2 使用PL2303-SA下载 (25)5.1.3 使用PL2303-GL下载 (26)5.1.4 使用U8-Mini工具下载 (27)5.1.5 使用U8W工具下载 (28)5.1.6 USB直接ISP下载 (29)6时钟、复位与电源管理 (30)6.1 系统时钟控制 (30)6.2 STC8G系列内部IRC频率调整 (33)6.3 系统复位 (35)6.4 系统电源管理 (37)6.5 范例程序 (38)6.5.1 选择系统时钟源 (38)6.5.2 主时钟分频输出 (40)6.5.3 看门狗定时器应用 (41)6.5.4 软复位实现自定义下载 (42)6.5.5 低压检测 (44)6.5.6 省电模式 (45)6.5.7 使用INT0/INT1/INT2/INT3/INT4中断唤醒MCU (47)6.5.8 使用T0/T1/T2/T3/T4中断唤醒MCU (50)6.5.9 使用RxD/RxD2中断唤醒MCU (54)6.5.10 使用LVD中断唤醒MCU (56)6.5.11 使用CCP0/CCP1/CCP2中断唤醒MCU (58)6.5.12 CMP中断唤醒MCU (60)6.5.13 使用LVD功能检测工作电压(电池电压) (62)7存储器 (67)7.1 程序存储器 (67)7.2 数据存储器 (68)7.2.1 内部RAM (68)7.2.2 内部扩展RAM (69)7.3 存储器中的特殊参数 (70)7.3.1 读取Bandgap电压值(从ROM中读取) (71)7.3.2 读取Bandgap电压值(从RAM中读取) (74)7.3.3 读取全球唯一ID号(从ROM中读取) (76)7.3.4 读取全球唯一ID号(从RAM中读取) (79)7.3.5 读取32K掉电唤醒定时器的频率(从ROM中读取) (82)7.3.6 读取32K掉电唤醒定时器的频率(从RAM中读取) (84)7.3.7 用户自定义内部IRC频率(从ROM中读取) (87)7.3.8 用户自定义内部IRC频率(从RAM中读取) (89)8特殊功能寄存器 (91)8.1 STC8G1K08系列 (91)8.2 特殊功能寄存器列表 (92)9I/O口 (95)9.1 I/O口相关寄存器 (95)9.2 配置I/O口 (98)9.3 I/O的结构图 (99)9.3.1 准双向口(弱上拉) (99)9.3.2 推挽输出 (99)9.3.3 高阻输入 (99)9.3.4 开漏输出 (100)9.4 范例程序 (101)9.4.1 端口模式设置 (101)9.4.2 双向口读写操作 (102)9.4.3 用STC系列MCU的I/O口直接驱动段码LCD (103)10指令系统 (123)11中断系统 (127)11.1 STC8G系列中断源 (127)11.2 STC8中断结构图 (129)11.3 STC8系列中断列表 (130)11.4 中断相关寄存器 (132)11.4.1 中断使能寄存器(中断允许位) (132)11.4.2 中断请求寄存器(中断标志位) (135)11.4.3 中断优先级寄存器 (136)11.5 范例程序 (139)11.5.1 INT0中断(上升沿和下降沿) (139)11.5.2 INT0中断(下降沿) (140)11.5.3 INT1中断(上升沿和下降沿) (141)11.5.4 INT1中断(下降沿) (143)11.5.5 INT2中断(下降沿) (144)11.5.6 INT3中断(下降沿) (146)11.5.7 INT4中断(下降沿) (147)11.5.8 定时器0中断 (148)11.5.9 定时器1中断 (150)11.5.10 定时器2中断 (151)11.5.11 UART1中断 (153)11.5.12 UART2中断 (155)11.5.13 ADC中断 (157)11.5.14 LVD中断 (159)11.5.15 PCA中断 (160)11.5.16 SPI中断 (163)11.5.17 CMP中断 (164)11.5.18 I2C中断 (166)12定时器/计数器 (169)12.1 定时器的相关寄存器 (169)12.2 定时器0/1 (170)12.3 定时器2 (173)12.4 掉电唤醒定时器 (174)12.5 范例程序 (175)12.5.1 定时器0(模式0-16位自动重载) (175)12.5.2 定时器0(模式1-16位不自动重载) (176)12.5.3 定时器0(模式2-8位自动重载) (178)12.5.4 定时器0(模式3-16位自动重载不可屏蔽中断) (179)12.5.5 定时器0(外部计数-扩展T0为外部下降沿中断) (180)12.5.6 定时器0(测量脉宽-INT0高电平宽度) (182)12.5.7 定时器0(时钟分频输出) (183)12.5.8 定时器1(模式0-16位自动重载) (185)12.5.9 定时器1(模式1-16位不自动重载) (186)12.5.10 定时器1(模式2-8位自动重载) (187)12.5.11 定时器1(外部计数-扩展T1为外部下降沿中断) (189)12.5.12 定时器1(测量脉宽-INT1高电平宽度) (190)12.5.13 定时器1(时钟分频输出) (192)12.5.14 定时器1(模式0)做串口1波特率发生器 (193)12.5.15 定时器1(模式2)做串口1波特率发生器 (197)12.5.16 定时器2(16位自动重载) (200)12.5.17 定时器2(外部计数-扩展T2为外部下降沿中断) (202)12.5.18 定时器2(时钟分频输出) (203)12.5.19 定时器2做串口1波特率发生器 (205)12.5.20 定时器2做串口2波特率发生器 (208)13串口通信 (213)13.1 串口相关寄存器 (213)13.2 串口1 (214)13.2.1 串口1模式0 (215)13.2.2 串口1模式1 (216)13.2.3 串口1模式2 (219)13.2.4 串口1模式3 (219)13.2.5 自动地址识别 (220)13.3 串口2 (222)13.3.1 串口2模式0 (222)13.3.2 串口2模式1 (223)13.4 串口注意事项 (225)13.5 范例程序 (226)13.5.1 串口1使用定时器2做波特率发生器 (226)13.5.2 串口1使用定时器1(模式0)做波特率发生器 (229)13.5.3 串口1使用定时器1(模式2)做波特率发生器 (232)13.5.4 串口2使用定时器2做波特率发生器 (236)14比较器,掉电检测,内部固定比较电压 (240)14.1 比较器内部结构图 (240)14.2 比较器相关的寄存器 (241)14.3 范例程序 (243)14.3.1 比较器的使用(中断方式) (243)14.3.2 比较器的使用(查询方式) (245)14.3.3 比较器作外部掉电检测 (247)14.3.4 比较器检测工作电压(电池电压) (249)15IAP/EEPROM (253)15.1 EEPROM相关的寄存器 (253)15.2 EEPROM大小及地址 (255)15.3 范例程序 (257)15.3.1 EEPROM基本操作 (257)15.3.2 使用MOVC读取EEPROM (260)15.3.3 使用串口送出EEPROM数据 (263)16ADC模数转换 (268)16.1 ADC相关的寄存器 (268)16.2 范例程序 (271)16.2.1 ADC基本操作(查询方式) (271)16.2.2 ADC基本操作(中断方式) (272)16.2.3 格式化ADC转换结果 (274)16.2.4 利用ADC第16通道测量外部电压或电池电压 (276)17PCA/CCP/PWM应用 (279)17.1 PCA相关的寄存器 (279)17.2 PCA工作模式 (282)17.2.1 捕获模式 (282)17.2.2 软件定时器模式 (282)17.2.3 高速脉冲输出模式 (283)17.2.4 PWM脉宽调制模式 (283)17.3 范例程序 (287)17.3.1 PCA输出PWM(6/7/8/10位) (287)17.3.2 PCA捕获测量脉冲宽度 (289)17.3.3 PCA实现16位软件定时 (292)17.3.4 PCA输出高速脉冲 (295)17.3.5 PCA扩展外部中断 (298)18同步串行外设接口SPI (301)18.1 SPI相关的寄存器 (301)18.2 SPI通信方式 (303)18.2.1 单主单从 (303)18.2.2 互为主从 (303)18.2.3 单主多从 (304)18.3 配置SPI (305)18.4 数据模式 (307)18.5 范例程序 (308)18.5.1 SPI单主单从系统主机程序(中断方式) (308)18.5.2 SPI单主单从系统从机程序(中断方式) (310)18.5.3 SPI单主单从系统主机程序(查询方式) (311)18.5.4 SPI单主单从系统从机程序(查询方式) (313)18.5.5 SPI互为主从系统程序(中断方式) (315)18.5.6 SPI互为主从系统程序(查询方式) (317)19I2C总线 (320)19.1 I2C相关的寄存器 (320)19.2 I2C主机模式 (321)19.3 I2C从机模式 (324)19.4 范例程序 (327)19.4.1 I2C主机模式访问AT24C256(中断方式) (327)19.4.2 I2C主机模式访问AT24C256(查询方式) (332)19.4.3 I2C主机模式访问PCF8563 (338)19.4.4 I2C从机模式(中断方式) (343)19.4.5 I2C从机模式(查询方式) (347)19.4.6 测试I2C从机模式代码的主机代码 (351)20增强型双数据指针 (357)20.1 范例程序 (359)20.1.1 示例代码1 (359)20.1.2 示例代码2 (359)附录A无 (361)附录B无 (366)附录C使用第三方MCU对STC8G系列单片机进行ISP下载范例程序 (429)附录D电气特性 (437)附录E应用注意事项 (439)附录F STC8G系列头文件 (440)附录G更新记录 (444)1概述STC8G系列单片机是不需要外部晶振和外部复位的单片机,是以超强抗干扰/超低价/高速/低功耗为目标的8051单片机,在相同的工作频率下,STC8G系列单片机比传统的8051约快12倍(速度快11.2~13.2倍),依次按顺序执行完全部的111条指令,STC8G系列单片机仅需147个时钟,而传统8051则需要1944个时钟。
STC单片机PWM的实现

STC单片机PWM的实现实现PWM功能的步骤如下:1.设置计时器/计数器模式:选择一个适当的计时器/计数器模式,通常选择16位定时器模式,然后配置相关寄存器。
2.设置计时器的初值:将计时器的计数初值设置为0。
3.设置计时器的重载值:根据所需的PWM周期确定计时器的重载值,设置到重载寄存器中。
4.设置计时器的工作模式:选择适当的计时器工作模式,通常选择自动重载模式或单次计数模式。
5.设置PWM占空比:根据所需的PWM占空比计算出所需要的计数值,并将其设置到计时器寄存器中。
6.启动计时器:将计时器使能位设置为1,启动计时器。
7.等待PWM周期结束:等待计时器溢出,表示一个PWM周期结束。
8.关闭计时器:将计时器使能位清零,关闭计时器。
通过以上步骤,就可以在STC单片机上实现PWM功能。
下面是一个具体的实例,以STC89C52为例,实现一个简单的PWM控制LED亮度的功能:```c#include <reg51.h>sbit PWM_PIN = P1^0; // 控制端口void mainTMOD=0x00;//设置定时器0为模式0,工作方式1 TH0=0xEC;//计时器初值TL0=0xEC;ET0=1;//允许定时器0中断TR0=1;//启动定时器0while(1)//控制PWM占空比,0-255之间,控制LED亮度for(int i = 0; i < 256; i++)PWM_PIN=1;//设置PWM引脚高电平for(int j = 0; j < i; j++); // 控制占空比PWM_PIN=0;//设置PWM引脚低电平for(int k = 0; k < 255-i; k++); // 控制占空比}}void Timer0_ISR( interrupt 1static unsigned char count = 0;count++;//设置重载值,控制PWM频率TH0=0xEC;TL0=0xEC;if(count > 100) // 设置占空比PWM_PIN=0;elsePWM_PIN=1;```以上代码通过控制定时器0的计数值和PWM引脚的电平状态实现了一个简单的PWM控制LED亮度的功能。
STC单片机软复位

//*******************stc 单片机不断电下载程序******************
#include <REG52.H> sfr ISP_CONTR=0xe7;
软复位寄存器声明
void main(void)
{ //////////////将这段代码嵌入到程序中//////////////// if((PCON&0x10)==0) //如果 POF 位=0
ISP/IAP 控制寄存器(ISP_CONTR)
STC 单片机 ISP/IAP 控制寄存器在特殊功能寄存器中的字节地址为 E7H,
不能位寻址,该寄存器用来管理和 ISP/IAP 相关的功能设定及是否软件复位
等。单片机复位时该寄存器全部被清 0。其各位的定义如表 4.3.1 所示。
表 1 ISP/IAP 控制寄存器(ISP_CONTR)
在以前的教程中,曾利用单片机串口收到某个有效数据后,执行从 isp 引导区软启动的 命令(ISP_CONTR=0x60;),实现程序不断电下载。但该方法为实现程序不断电下载,占用 了一些单片机资源——串口、中断等,实际应用中有一些不便。下面介绍另一种程序不断电
利用单片机的 reset 复位键下载程序:
单片机上电复位时,POF=1;单片机手动复位时,POF=0 单片机上电运行时对 POF 位进行判断,如果 POF 位=0,将 POF 位置 1,让单片机从 isp 引 导区软复位。如果 POF 位=1,将 POF 位清 0。 将实现以上功能的代码加入到你的程序中,当需要下载程序时,按下复位按钮,此时 POF 位=0,单片机再次从 isp 引导区软复位,从而实现程序下载。 该方法只需在用户程序中嵌入一段判断 POF 标志位的代码就能实现程序不断电下载,无需 占用任何单片机内部资源。
STC 脱机下载制作说明书

STC-ISP Ver6.38下载软件超强悍高级功能说明书目录●发布项目程序使用说明 (3)●自定义加密下载使用说明 (7)●发布项目程序 + 自定义加密下载结合使用说明 (11)●用户自定义下载说明 (17)● RS485控制使用说明 (18)● STC仿真器使用指南 (20)●用户自制脱机下载板/U7 全自动烧录工具注意事项 (24)发布项目程序使用说明发布项目程序功能主要是将用户的程序代码与相关的选项设置打包成为一个可以直接对目标芯片进行下载编程的超级简单的用户自己界面的可执行文件。
关于界面,用户可以自己进行定制(用户可以自行修改发布项目程序的标题、按钮名称以及帮助信息),同时用户还可以指定目标电脑的硬盘号和目标芯片的ID号,指定目标电脑的硬盘号后,便可以控制发布应用程序只能在指定的电脑上运行(防止烧录人员将程序轻易从电脑盗走,如通过网络发走,如通过U盘烤走,防不胜防,当然盗走你的电脑那就没办法那,所以STC的脱机下载工具比电脑烧录安全,能限制可烧录芯片数量,让前台文员小姐烧,让老板娘烧都可以),拷贝到其它电脑,应用程序不能运行。
同样的,当指定了目标芯片的ID号后,那么用户代码只能下载到具有相应ID号的目标芯片中(对于一台设备要卖几千万的产品特别有用---坦克,可以发给客户自己升级,不需冒着生命危险跑到战火纷飞的伊拉克升级软件啦),对于ID号不一致的其它芯片,不能进行下载编程。
发布项目程序详细的操作步骤如下:1、首先选择目标芯片的型号2、打开程序代码文件3、设置好相应的硬件选项4、试烧一下芯片,并记下目标芯片的ID号,如下图所示,该芯片的ID号即为“000D001100641D”(如不需要对目标芯片的ID号进行校验,可跳过此步)5、设置自动增量(如不需要自动增量,可跳过此步)6、设置RS485控制信息(如不需要RS485控制,可跳过此步)7、设置用户自定义下载命令(如不需要此功能,可跳过此步)8、点击界面上的“读取本机硬盘号”按钮,并记下目标电脑的硬盘号(如不需要对目标电脑的硬盘号进行校验,可跳过此步)9、点击“发布项目程序”按钮,进入发布应用程序的设置界面。
STC 单片机下载器使用说明

STC单片机下载器使用说明介绍:这是一个USB转TTL电平的串口转换器。
它利用USB协议里规定的总线转换功能,把USB转换成串行通信口。
因为现在的台式机、笔记本电脑普遍已经不再配备串口,因此在需要串口的时候,可以使用这种转换器。
由于STC单片机可以使用串口下载程序,所以可以使用这种USB转串口模块来给STC的单片机下载程序。
写到此处,我想多说几句题外话,8051内核单片机诞生于1980年左右,由Intel公司设计,(这家公司各位一定不陌生吧)。
当时英特尔公司刚刚起步,走的是开放的、兼容型的路线。
所以,intel公司把8051单片机的设计授权给了给了其他半导体厂商,于是众多厂商生产了各种各样的51系列单片机,这些厂商包括:ATMEL公司、WinBond(华邦)公司、Philips(飞利浦)公司、 LG公司、NEC(日电)公司、SIEMENS(西门子)公司等。
如今,8051单片机内核的知识产权保护期已过,因此许多国产半导体厂商兴起,如:深圳宏晶(STC)、上海海尔、台湾笙泉、湖南华芯、台湾华邦(芯唐)、台湾中颖、台湾新茂、台湾太欣等等。
我们之所以选用国产STC单片机作为教学用单片机,主要还是考虑到其成本因素。
相对来说,STC单片机价格比较便宜,而且芯片功能强大,片内集成了很多功能。
此外还要说明的是,给单片机下载程序必须要有下载器(编程器、烧录器),而多数单片机的下载器价格都会在100到200元以上,这对于初学者来说是难以承受的,而STC 单片机烧录程序,仅仅需要串口即可,而即使电脑没有配备串口,购买一个USB转串口也不过15块钱以内,这就大大降低了单片机的学习门槛。
下面就来介绍我们这款STC的单片机下载器——USB转TTL串口模块。
USB转串口小板功能:1、简单的串口通信。
2 、路由器或者ADSL固件升级。
3 、STC单片机、STM32单片机等,烧写程序。
4 、硬盘固件升级。
5、超级终端里使用。
常用串口调试工具。
STC单片机的协议

STC单片机的下载协议关于STC的下载在Linux平台下面一直是一个老大难的问题。
我最近一段时间去ourdev网站,和数码之家,包括有一些热心人的协助。
以及一些前人开发的开源软件,类似gSTC-ISP之类的软件。
才让我完全的搞懂了STC的ISP协议。
本文以GPL v3条款发布。
但是切勿胡乱传播。
影响宏晶的利益。
这个逆向工程做的并不妥当。
望宏晶包涵,毕竟你并未公开协议。
导致我们使用Linux的人痛苦不堪。
现在先放出用Gambas写的两个ISP软件。
分别对应89系列和12系列。
15系列正在分析。
别的系列因为不常用暂无协议。
SerialPort kSTC89-ISP那么呢,我就先从STC89系列的讲起。
大同小异的。
STC89系列的单片机在上电的时候会执行在ISP FLASH 的ISP程序。
只要在串口上收到连续的0x7f,便会进入ISP模式。
老姚选择 0x7f的理由是里面没有连续的低电平。
这样的话就可以让单片机来调整自身UART的时钟到计算机的时钟,让波特率同步。
但是若频率太高,则测不准。
所以启动波特率要控制在9600以下为宜。
而且均有时间限制。
如果不在超时时间内连接MCU。
MCU会自动断开,跑用户程序。
这就是为什么某些芯片,类似PL2303打开关闭速度慢的芯片下载容易出问题的原因。
切入正题:STC的数据包格式为:包头 2BYTE+标识 2BYTE +长度 1BYTE +包类型1 BYTE+数据 nnBYTE+校验码 1BYTE+包尾1BYTE。
包头固定0×46,0xb9.(但是在信息帧中不包含包头标识来自单片机的是68 00而来自计算机的是6A 00包尾固定0×16.至于我这里捕获的标识,在89系列里大概有0×00 ——信息(注意,这里没有包头)0×00 ——数据(这个是切换波特率以后的0x8F ——新波特率实验0x8E ——波特率正式更改0×84 ——擦除芯片0×80 ——校验返回0x8D ——设置选项并且结束编程0×80 ——(结束时,上位机)结束编程,通知MCU复位。
STC15F104E的STC单片机自动下载系统设计

图 1 主 控 电 路
7 6
M co o t l r & E b d e y tms irc nr l s oe m e d dS se
wWw
.
m e h . om . 7 s ot c ci
曩
经 验 交 流
■ 瑟瑟 ___
大 可 通 过 电 流 不 要 小 于 单 片 机 电路 的 所 需 电 流 。如 果 三
流 , 而 进 入 冷启 动 程 序 。 从
V CC
T
n1
1 Q k
∞一AD6P0 一 一 一 如 一 ”一 弱一 一 一 一 f
.
r AD1e . )o1 ( D2P . A )02 ( AD3P ) 03 ( D4P 4 A )0 ( D5P 5 A )0
S 1 F1 4 是 宏 晶 公 司研 发 的一 款 单 片 机 , 有 省 去 一 TC 5 0 E 具
器P V. C C 3 2
2 1 - 1 0 g 7# 1期
RS T ( AD7P . )07 ( RXD P . E v P ) 30 P (XD)31 T P. AL _ G E P . n o 3 (wr ) 2 丽 P , m WD f 5P . 33 ( A1 )27 P .(0 34T ) f )26 A1 P . 4 P .( ) 35T1 ( 3P . A1 )25 P .( R ( 2P . 36W ) Al )24 P .R 3 ( D) 7 ( P . A1)23 1 XT L2 A ( 0P . A1 )22 XT 1 AL ( )21 A9P . G ND ( )20 A8P .
定 时 器 中断 。 S TC单 片 机 接 收 到 下 载 命 令 后 , 须 作 出 回应 才 能 必
STC单片机通过RS485通信和下载ISP

STC单片机通过RS485通信和下载ISP
STC单片机的ISP本身是半双工的,所以使用TX作为自动换向控制信号可以下载。
发送数据”0”, TXD为低电平Q1截止,DE和/RE为高电平, D_in接地,故RS485芯片发送”0”出去。
发送数据时的二进制位“1”状态,TXD为高电平Q1导通,DE和/RE为低电平,故本侧的RS485芯片实际表现为接收状态了,其发送的高电平实际是依靠2个上拉下拉R5和R6电阻维持。
(发送的“1”是假的)
PC下载端用USB转RS232 TTL后复制同样的上述电路构成。
以上电路在STC12C5204AD上通过RS485实验下载代码成功,同时通过增加R9/R10/R7/R8等辅助隔离上拉电阻,也可不通过RS485而在MCU端RXD/TXD同时直接ISP下载。
实验过程中也实际发现ISP下载的成功率与USB转RS232芯片以及下载波特率有一定的关系:
1.PL2303的芯片下载成率非常高,几乎为100%;
2.CH340等的芯片下载成功率相对低一些;
3.下载波特固定为9600的成功率较其他要高。
以上电路和实验供需用STC单片机产品远程抗干扰通信以及远程代码更新作参考。
Keil μVision4 建立 STC 单片机工程及程序下载教程

CUIT学生机器人爱好者协会Keil μVision4建立STC单片机工程及程序下载教程示例使用STC 12C5A60S2单片机注意:KEIL4与KEIL5新建工程类似。
细微差别自行体会一.准备工作(已经安装过可跳过此步骤)1.安装破解Keil μVision4软件2.下载stc-isp-15xx-v6.75.exe烧录工具3.添加STC仿真驱动到KEIL中,添加STC型号和头文件到KEIL中stc-isp-15xx-v6.75.exe烧录工具1.养成良好的编程习惯,每一个工程单独放在一个文件夹中2.打开软件4.选择目录4.选择MCU DataBase此处如果进行了准备工作中的第三步骤,就会弹出一个弹框。
让你选择Generic MCU DataBase,还是选择STC MCU DataBase。
如果没有进行准备工作的第三步骤则只有Generic MCU DataBase(会默认选择,直接跳过此步骤)。
这里面有按照各个公司分类的各种型号让你选择。
由于我们使用STC12C5A60S2单片机,所以选择STC MCU DataBase。
STC(宏晶)公司。
5.选择芯片型号这里选择STC12C5A60S2单片机启动文件,如果汇编编程则不用,这里点是。
6.给工程添加一个C文件。
保存并重命名文件3.将新建的main.c文件添加到工程中4. 输出HEX文件三.开始编程1.此处编写一个点亮一个LED的程序,编写代码养成习惯为代码编写注释1.点击第二个或者第三个(差别自己体会),生成HEX文件注意:一定要养成良好的编程习惯,每一个工程一定要放在此工程单独的一个文件夹。
每建立一个工程,先建立一个文件夹,工程的所有文件都包含在内。
三.下载程序到单片机1.准备工作1)stc-isp-15xx-v6.75.exe烧录软件2)单片机最小系统(单片机能进行工作的基本条件要满足)3)一个下载器以及安装对应的驱动下载器可以选用CH340模块或者PL2303模块,对应的驱动一定要装好。
STC-ISP(V6.75)烧录程序操作步骤

STC-ISP下载软件的使用方法
这里以STC单片机PC端ISP下载控制软件Ver6.75版介绍使用的方法。
1、先按把母板和计算机连接好(接好串口线和电源)
2、打开STC-ISP v6.75,如下图界面,在MCU Type栏目下选中单片机,如
STC12C5A60S2;
3、根据您的4针数据线连接情况选中COM端口,最好把波特率:9600;按
图示选中各项:
4、先确认硬件连接正确,按下图点击“打开程序文件”并在对话框内找到您
要下载的“main_CTRL7.HEX”文件:再点“打开”;
5、按下图选中两个条件项,这样可以使您在每次编译KEIL时HEX代码能
自动加载到STC-ISP,点击“下载/编程”:
六、手动按下电源开关便即可把可执行文件HEX写入到单片机内,下图是正在写入程序,操作成功的截图:。
stc单片机下载软件使用说明以及注意事项

下载软件使用说明:
1.用串口线连接开发板和电脑,打开STC_ISP_V3.1可以看到如图一界面
图1 STC_ISP下载界面
在左上角选择器件名称STC89C51RC,然后点击,选中要下载的hex文件。
2.点击,然后按下串口上面的S_DLD按键,让系统断电,既可开始下载。
STC_ISP左下方会有下图提示,说明下载成功。
图2 下载提示
编程说明:
ZLG7290芯片负责LED显示及键盘扫描,它与单片机采用IIC总线方式进行通信,所以在此开发板上进行开发时需要添加iic.h此头文件(所给例程里面都包含此头文件,使用时自己添加即可),在它里面提供了一些IIC总线的函数,可以直接调用。
关于ZLG7290的用法,可参考其芯片的PDF,上面有详细的说明。
有能力的同学可以自己根据IIC的时序自己编写函数,或者在此基础上进行修改。
另:注意数码管显示函数 void dispp(unsigned char num,char leddata)(在iic.h头文件中)中第一个参数num是选择那一个数码管,8个数码管从左至右顺序依次为7,6…1,0。
例:若使第3个数码管显示为8,调用显示函数应该为dispp(2,8).
注意事项:
开发板led标示为p0.0到p0.7,此处标示错误,应该为p1.0到p1.7,在编程时请注意。
焊接时,6脚的按键不要焊接错误,按键侧面有一竖条的那面应该朝右,请一定注意,否则硬件会有问题!!。
STC工具使用说明书

STC工具使用说明书V1.22020-8-21目录1 概述 (3)2 系统可编程(ISP)流程说明 (3)3 STC通用USB转串口工具 (4)3.1 STC通用USB转串口工具外观图 (4)3.2 STC通用USB转串口工具布局图 (5)3.3 STC通用USB转串口工具驱动安装 (6)3.4 使用STC通用USB转串口工具下载程序到MCU (8)3.5 使用STC通用USB转串口工具仿真用户代码 (11)4 USB型联机/脱机下载工具U8W/U8W-Mini (20)4.1安装U8W/U8W-Mini驱动程序 (22)4.2 U8W的功能介绍 (26)4.3 U8W的在线联机下载使用说明 (27)4.4 U8W的脱机下载使用说明 (30)4.5 U8W-Mini的功能介绍 (39)4.6 U8W-Mini的在线联机下载使用说明 (40)4.7 U8W-Mini的脱机下载使用说明 (42)4.8 制作/更新U8W/U8W-Mini (47)4.9 U8W/U8W-Mini设置直通模式(可用于仿真) (49)4.10 U8W/U8W-Mini的参考电路 (50)5应用线路图 (52)5.1 U8W工具应用参考线路图 (52)5.2 STC通用USB转串口工具应用参考线路图 (52)1 概述U8W/U8W-Mini 是一款集在线联机下载和脱机下载于一体的编程工具系列。
STC 通用USB 转串口工具则是支持在线下载与在线仿真的编程工具。
工具类型 在线下载 脱机下载 烧录座下载 在线仿真 价格(人民币) U8W 支持 支持 支持 需设置直通模式 100元 U8W-Mini 支持 支持 不支持 需设置直通模式 50元 通用USB 转串口支持不支持不支持支持30元2 系统可编程(ISP )流程说明注意:因 [P3.0, P3.1] 作下载/仿真用(下载/仿真接口仅可用 [P3.0, P3.1] ),故建议用户将串口1放在 P3.6/P3.7 或 P1.6/P1.7 ,若用户不想切换,坚持使用 P3.0/P3.1 工作或作为串口1进行通信,则务必在下载程序时,在软件上勾选“下次冷启动时,P3.2/P3.3为0/0时才可以下载程序”。
STC单片机脱机下载器H7301使用说明

目录安装H7301下载器串口驱动 (1)在线下载操作方法 (2)存储程序代码到H7301以供脱机下载 (3)脱机下载操作方法-下载器向目标板供电 (4)脱机下载操作方法-目标板向下载器供电 (5)脱机固件更新方法 (6)安装H7301下载器串口驱动1、运行 H7301/H7301驱动 文件夹下的 ch341ser.exe。
点击安装按钮。
2、安装完成后会显示驱动预安装成功,点击确定退出安装程序。
在线下载操作方法1、运行H7301文件夹下的stc-isp程序(本说明以V6.85为例,官方会不定期更新版本,可到STC官网下载)。
2、建立目标单片机最小系统,与H7301建立硬件连接,然后H7301接入电脑USB口,如下图所示:3、按下图设置及操作stc-isp下载软件。
H73015V/3.3VP30P31SGNDVCCP3.0P3.1GNDXTAL1P1.0/P3.2P1.1/P3.3STCMCU特别说明:是否需要提供时钟分几种情况:仅支持外部晶振的型号必需提供时钟,可在单片机XTAL1和XTAL2脚接上晶振,或直接在XTAL1脚输入外部时钟;STC15系列可不提供外部时钟;同时支持内部RC时钟和外部晶振的型号(STC15系列除外),是否需要提供时钟取决于上次成功下载时设置的情况,如果本次出现不能烧录的情况,必需提供外部时钟以排除时钟问题。
P1.0和P1.1(STC15系列为P3.2和P3.3)是否需要接GND取决于上次成功下载时软件的硬件选项设置,如果本次出现不能烧录的情况,必需接至GND,以排除影响。
1 2 3 45 6选择单片机型号选择串口号(带CH340字样)波特率一般用默认打开需要下载的程序文件(.hex或.bin)根据需要设置点击"下载/编程"按钮存储程序代码到H7301以供脱机下载1、运行H7301文件夹下的stc-isp 程序(本说明以V6.85为例,官方会不定期更新版本,可到STC官网下载)。
stc单片机教程

STC单片机支持SPI接口,可通过编程实现与SPI从设备之间的同步串行 通信。用户需根据从设备的要求设置SPI通信参数,如时钟极性、时钟 相位、数据传输速率等。
I2C总线协议在STC单片机中的应用
I2C基本概念
I2C(Inter-Integrated Circuit)总线是一种由Philips公司开发的双向同步串行总线,用 于连接微控制器及其外围设备。
提供调试接口,如 JTAG或SWD接口,方 便进行程序下载和调试 。
03 编程语言与开发工具
C语言在STC单片机中的应用
C语言的特点
C语言是一种高效、灵活、可移植的编程语 言,适用于STC单片机的开发。
C语言在STC单片机中的优势
C语言具有丰富的库函数和强大的数据处理能力, 可以简化开发过程,提高开发效率。
02 STC单片机硬件基础
STC单片机内部结构
CPU内核
STC单片机采用高性能的8051内核, 具有高速、低功耗、稳定可靠的特点 。
存储器
包括程序存储器(ROM/Flash)和 数据存储器(RAM),用于存储程 序代码和变量数据。
特殊功能寄存器
STC单片机提供丰富的特殊功能寄存 器,用于实现各种控制和配置功能。
I2C通信原理
I2C总线采用多主从结构,支持多个主设备和多个从设备。通信过程中,主设备发送起始 信号并发送设备地址及读写命令,从设备根据地址和命令进行响应。数据传输以字节为单 位进行,每个字节传输后主设备发送应答信号。
I2C在STC单片机中的应用
STC单片机内置I2C接口,可通过编程实现与I2C从设备之间的通信。用户需根据从设备的 要求设置I2C通信参数,如设备地址、数据传输速率等,并通过编程实现I2C总线的读写操 作。
STC单片机的免冷启动自动下载器

STC系列单片机的免冷启动自动下载器
作者:单小丹
宏晶STC单片机以其高性价比颇受欢迎,特别是其独特的下载程序方式,使得烧写程序变得很简单,只需通过数据口串口经电平转换就可以将程序写入单片机中,如果电脑上没有串口可以用USB转串口芯片将USB口转换为串口,例如PL2303HX,CH340,等这些芯片都可以将电脑的USB口仿真为标准的串口,让电脑多出一个串口,另外还要说明如果使用PL2303HX芯片,该芯片自带TTL电平转换电路,所以直接将芯片的RXT,TXD和单片机的TXD,RXD相连即可下载程序,如果使用CH340等这些内部不带TTL电平转换的芯片,那么我们就要外加电平转换电路了,例如外加MAX232芯片,也可以用两个三极管将电平进行转换,
接下来该说说如何实现无需冷启动只要鼠标轻轻点击下载就可以实现下载了,无需频繁的切断电源,这给调试带来了极大的方便,我们利用串口在发送数据时串口的第7脚(RTS 请求发送数据脚),串口的7(RTS)脚在发送数据时会输出一个低电平脉冲再输出数据,我们可以利用这个低电平脉冲实现单片机的冷启动,这样单片机在上电之后运行ISP监控程序就可以下载了,
当点击下载时RTS输出一个低电平脉冲,Q1导通,K1吸合,单片机断电,再上电,实现冷启动,从而实现自动下载。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//初始 UART 模块变量
//timer0 在 16 位自动重新加载模式 //timer0 1 t 模式工作
//最初的 timer0 和将重新加载值 //tiemr0 开始运行 //使 //改善 //开放的
UART_INIT(); LED = 0; while (1) {
if (REND) 能
{ REND = 0; buf[r++ & 0x0f] = RBUF; if(RBUF==0x7f) { if(RBUF==0x7f) { if(RBUF==0x7f) { if(RBUF==0x7f) { RBUF = 0; RELAY = 1; LED = 1; RELAY = 1; delay (7000);
看一下画好了的图纸,在这里再发布一下原理图以及 PCB、3D.
3D:
原理图
PCB
最终打样出板的 PCB
这是制作出来的实物,,以下部分是这个小单片机的程序:
/**************************
程序名:串口软模拟检测
作 者:王淑玉
时 间:2012/8/6
**************************/
//接通电源 //清零数据 //延时后重
void tm0() interrupt 1 using 1 //定时器中断程序对
于 UART
{
if (RING)
{
if (--RCNT == 0)
{
RCNT = 3;
//重置发送波特率
计数器
if (--RBIT == 0)
{
RBUF = RDAT;
//数据保存到 RBUF
#include <reg51.h>
#define BAUD 02MHz
//sfr AUXR = 0x8E; sbit RXB = P3^0; 端口 sbit TXB = P3^1; sbit RELAY = P3^3; sbit LED = P3^4 ; typedef unsigned int WORD; unsigned char TBUF,RBUF; unsigned char TDAT,RDAT; unsigned char TCNT,RCNT; unsigned char TBIT,RBIT; unsigned char t, r; unsigned char buf[16]; bit TING,RING; bit TEND,REND; void delay (unsigned int ms) {
RBIT = 9; //初始接收比特数(8 个数据位+ 1 停止位)
}
}
程序暂时还不是很稳定,需要用以后的经验加以 修改,暂且就做到这吧~
//用户的功
//关断电源 //延时后重
启 LED = 0; RELAY = 0; RBUF = 0; delay (6000);
启 }}
} } if (TEND) { if (t != r) { TEND = 0; TBUF = buf[t++ & 0x0f]; TING = 1; } } } } }
unsigned int i,j; for(i = ms;i > 0;i --)
for(j=110;j > 0;j --); }
//定义 UART TX / RX
void UART_INIT() {
TING = 0; RING = 0; TEND = 1; REND = 0; TCNT = 0; RCNT = 0; } void main() { TMOD = 0x00; AUXR = 0x80; TL0 = BAUD; TH0 = BAUD>>8; TR0 = 1; ET0 = 1; timer0 中断 PT0 = 1; timer0 中断优先 EA = 1; 全球中断开关
RING = 0;
//停止接收
REND = 1;
//设置接收完成标志位
}
else
{
RDAT >>= 1;
if (RXB) RDAT |= 0x80; //转变 RX 数据 RX 缓冲区
}
}
}
else if (!RXB)
{
RING = 1;
//开始启动标志位
RCNT = 4;
//初始接收波特率计数器
实现 STC 单片机的自动下载
网上有很多的这个的教程我就顺便抄袭一下做了一 个,这里边的单片机不一样笔者用的是 STC15F104E。
STC15F104E 这个 8 脚的小单片机来作为检测装置,检测 串口中的数据,可没想到的是,这个小家伙里边不带串口, 一时间乱了阵脚,好在最后可以用软件模拟的方法解决了通 信问题。