当前位置:首页 > stc89c52rc
  • stc89c52rc有哪些功能?引脚图与功能详细描述

    STC89C52RC是STC公司生产的一种低功耗、高性能CMOS8位微控制器,STC89C52是一种带8K字节闪烁可编程可檫除只读存储器(FPEROM-Flash Programable and Erasable Read Only Memory )的低电压,高性能COMOS8的微处理器,俗称单片机。该器件采用ATMEL搞密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。 同时,在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 标准功能 引脚图 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外 STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。 主要特性 8K字节程序存储空间; 512字节数据存储空间; 内带4K字节EEPROM存储空间; 可直接使用串口下载; 器件参数 1. 增强型8051单片机,6 时钟/机器周期和12 时钟/机器周期可以任意 选择,指令代码完全兼容传统8051. [1] 2. 工作电压:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V 单片机) 3.工作频率范围:0~40MHz,相当于普通8051 的0~80MHz,实际工作 频率可达48MHz 4. 用户应用程序空间为8K字节 5. 片上集成512 字节RAM 6. 通用I/O 口(32 个),复位后为:P1/P2/P3 是准双向口/弱上拉, P0 口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为 I/O 口用时,需加上拉电阻。 7. ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无 需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程 序,数秒即可完成一片 8. 具有EEPROM 功能 9. 共3 个16 位定时器/计数器。即定时器T0、T1、T2 10.外部中断4 路,下降沿中断或低电平触发电路,Power Down 模式可 由外部中断低电平触发中断方式唤醒 11. 通用异步串行口(UART),还可用定时器软件实现多个UART 12. 工作温度范围:-40~+85℃(工业级)/0~75℃(商业级) 13. PDIP封装 STC89C52RC比普通89C52多了后缀“RC”,虽然它们都是单片机芯片,但是带有“RC”字样的单片机自带RC时钟振荡电路(有的频率可调有的频率不可调),可以在不接外部晶振就能使用,没有带“RC”这个字样的芯片一般必须安装外部晶振电路。 STC89C52RC是宏晶公司的增强型MCS-51单片机,与Atmel公司的AT89C52相比,有以下优点: 支持STC的2线制下载方式,下载程序更方便; 支持6T模式(在6T模式下,6个时钟周期就是一个机器周期); 片内集成了4kB容量的E²PROM; 带有P4口,具有更多的I/O; 程序存储器拥有更多的擦写寿命(STC标称可以擦写10万次,Atmel标称可以擦写1000次。不过对于批量生产的成品来说,这个擦写寿命没什么意义)。 相比于Atmel,STC单片机的缺点:在某些情况下,抗干扰能力不如Atmel的MCS-51单片机。

    时间:2020-04-05 关键词: stc89c52rc 单片机 引脚图

  • 单片机STC89C52RC 内部EEPROM

    单片机运行时的数据都存在于RAM(随机存储器)中,在掉电后RAM 中的数据是无法保留的,那么怎样使数据在掉电后不丢失呢?这就需要使用EEPROM 或FLASHROM 等存储器来实现。 在传统的单片机系统中,一般是在片外扩展存储器,单片机与存储器之间通过IIC 或SPI 等接口来进行数据通信。 这样不光会增加开发成本,同时在程序开发上也要花更多的心思。在STC 单片机中内置了EEPROM(其实是采用 ISP/IAP 技术读写内部FLASH 来实现EEPROM),这样就节省了片外资源,使用起来也更加方便。下面就详细介绍STC 单片机内置EEPROM 及其使用方法     STC 各型号单片机内置的EEPROM 的容量最小有2K,最大有16K,基本上很好地满足项目的需要,更 方便之处就是节省了周边的EEPROM 器件,达到节省成本的目的,而且内部EEPROM 的速度比外部的 EEPROM 的速度快很多。 STC 各型号单片机内置的EEPROM 是以512 字节为一个扇区,EEPROM 的起始地址=FALSH 容量值+1, 那么STC89C52RC 的起始地址为0x2000,第一扇区的起始地址和结束地址0x2000~0x21FF,第二扇区 的起始地址和结束地址0x2200~0x23FF,其他扇区如此类推。 深入重点: 传统的EEPROM 是电可擦可编程只读存储一种掉电后数据不丢失的存储芯片。 STC89C52RC 的EEPROM 是通过ISP/IAP 技术读写内部FLASH 来实现EEPROM。 STC89C52RC 的EEPROM 起始地址为0x2000,以512 字节为一个扇区,EERPOM 的大小为2K 字节。 STC89C52RC 与EEPORM 实现的寄存器有6 个,分别是ISP_DATA、ISP_ADDRH、ISP_ADDRL ISP_TRIG、ISP_CMD、ISP_CONTR。   1. ISP_DATA 寄存器 ISP_DATA 寄存器:ISP/IAP 操作时的数据寄存器。 ISP/IAP 从Flash 的数据在此处,向Flash 写的数据也须放在此处。 示例1:读单个字节 UINT8 EEPROMRead(UINT16 addr) { …… return ISP_DATA; } 示例2:写单个字节 void EEPROMWrite(UINT8 byte) { …… ISP_DATA=byte; } 2.ISP_ADDRH、ISP_ADDRL 寄存器 ISP_ADDRH: ISP/IAP 操作时的地址寄存器高八位 ISP_ADDRL: ISP/IAP 操作时的地址寄存器低八位 示例1:设置地址 void EEPROMSetAddress(UINT16 Addr) { …… ISP_ADDRH=(UINT8)(Addr>>8); ISP_ADDRL=(UINT8) Addr; } 3.ISP_CMD 寄存器 ISP_CMD: ISP/IAP 操作时的命令模式寄存器,需要通过ISP_TRIG 命令触发寄存器才能生效。   4.ISP_TRIG 寄存器 ISP/IAP 命令要生效即ISP_CMD 设置的命令要生效,必须通过ISP_TRIG 命令触发寄存器进行触发。 触发过程很特别,只需要连续二次对ISP_TRIG 寄存器赋值就可以的了,对ISP_TRIG 寄存器先写入 0x46,再写入0xB9 就完成命令触发的过程。 示例1:命令触发 void EEPROMCmdTrig(void) { …… ISP_TRIG=0x46; ISP_TRIG=0xB9; } 5.ISP_CONTR 寄存器 ISP_CONTR:ISP/IAP 控制寄存器   ISPEN:ISP/IAP 功能允许位。0:禁止ISP/IAP 编程改变Flash。 SWBS: 0:软件选择从用户主程序区启动1:ISP 程序区启动 SWRST: 0:不操作1:产生软件系统复位,硬件自动清零 WT2、WT1、WT0:设置等待时间   假如STC89C52RC 的工作频率为12MHz,那么机器周期为1us,参照表12-,EEPROM 的读单个字 节、写单个字节、扇区擦除的所需要的时间大致如下: 读单字节: 11*1us=11us 写单字节: 60*1us=60us 扇区擦除: 10942*1us=10.942ms 无论单片机运行在什么工作频率下,EEPROM 的读、写、擦除操作的所需要的时间分别约为10us、60us、 10ms。 深入重点: STC89C52RC 与EEPORM 实现的寄存器有6 个,分别是ISP_DATA、ISP_ADDRH、 ISP_ADDRL ISP_TRIG、ISP_CMD、ISP_CONTR。 EEPROM 的命令触发必须对ISP_TRIG 寄存器先写入0x46,再写入0xB9。 无论单片机运行在什么工作频率下,EEPROM 的读、写、擦除操作的所需要的时间分别约 为10us、60us、10ms,因而要对ISP_CONTR 设置好等待时间,否则数据容易出现问题。

    时间:2019-07-16 关键词: 内部eeprom stc89c52rc 单片机

  • 基于CH340T 的STC89C52RC编程器设计

    编程器通过USB 接口与PC 上位机通讯,用户只需要通过PC上位机GUI 的简单操作,就可以实现对STC 89C/S51XX/52XX 等系列单片机的擦除、编程、校验和加密。经过STC89C52RC 等单片机反复测试,该编程器功能稳定、速度快、价格低和易用性强等优点。 1 引言 STC(宏晶科技)公司推出的STC 89C/S 51XX/52XX 等系列单片机,具有价格便宜、无法解密、低功耗、高速、高可靠、强抗静电、强抗干扰等优点,其指令代码完全兼容传统8051 单片机,片内资源非常丰富,且均内置可反复擦写的Flash 存储器,并提供了ISP(In-System Programming)编程模式。STC89C52RC 作为STC 89C/S51XX/52XX 系列单品机的一个典型代表,其特征主要有,8K 字节可编程闪烁存储器、1000 次写/ 擦循环寿命、10 年的数据保留时间、三级程序存储器锁定、512 内部RAM、32 可编程I/O 线、两个16 位定时器/ 计数器、5 个中断源、可编程串行通道、低功耗的闲置和掉电模式以及片内振荡器和时钟电路等。因而这款功能强大和超高性价比的单片机,在国内应用极为广泛。 ISP 在线编程是一种彻底颠覆了传统的编程模式的技术,它不会损坏芯片的引脚,同时下载速度很快,从而缩短了设计时间,降低了研发成本、加速了产品的上市,大大提高了工作效率。一般编程器的采用方法都是使用PL2303、CP2102、FT232 等主控芯片,但往往成本较高,而且有的芯片稳定差,极少数芯片固件版本有Bug,鉴于此,本文提出以国产CH340T 芯片为主体的ISP 编程器的设计方案,经过STC89C52RC 等芯片反复测试,功能稳定,性能出色。 2 系统硬件设计 2.1 系统总体结构图 系统总体结构图如图1 所示。其中USB 供电和数据传输模块主要负责为单片机和CH340T 等模块供电,并将来自计算机的USB串行数据经CH340T 转换为串口数据后和单片机通信,为单片机编程提供数据通道。   2.2 核心芯片CH340T 介绍 CH340T 是南京沁恒电子有限公司设计生产的一款接口转换及单片机外围芯片,支持USB2.0.可以实现USB 转串口、扩展计算机异步串口和USB 转IrDA 红外等功能。本设计仅作USB 转串口使用,转换后的串口为全双工串口,内置收和发缓冲区,支持通讯波特率从50bps 到2Mbps,发送允许波特率误差< 0.3%,接收允许波特率误差<2%.其使用方法比较简单,外围元器件只需要晶体、电阻和电容即可。 CH340T 有20 个标准引脚接口。主要有1、UD+ 和UD- 引脚,这些引脚内置了USB 上拉电阻,可以直接接到USB 总线上。2、GND和VCC,即接地和电源引脚,支持5V 或者3.3V 电源电压。3、数据传输引脚TXD 和RXD,分别为串口数据发送和接收引脚。输入空闲时,一般RXD 是高电平,但是如果R232 引脚为高电平,且启用辅助RS232 功能,RXD 引脚内部会自动插入一个反相器,默认变成低电平;输出空闲时,一般TXD 是高电平。4、其他引脚。包括MODEM 联络信号引脚和辅助引脚。 2.3 系统原理图 原理图如图2所示。   图中,USB 接口P1 除用于数据传输外,还经过LM7805 稳压后为CH340T 芯片和单片机和其他部件供电,当使用5V 工作电压时,CH340 芯片的VCC 引脚输入外部 5V 电源,并且V3 引脚应该外接容量为4700pF 或者 0.01uF 的电源退耦电容。CH340T 转接芯片将UD1+ 和UD1- 转换为串口信号串口数据和单片机串口进行通信。需要注意的是,CH340T 芯片的串行接收口CRXD 需要和单片机的P3.1(串行输出口TXD)通过PNP 三极管Q1 接成射极发生器的形式,以到达数据的缓冲和隔离的作用。 单片机子系统,采用40 引脚的试验用插座,为了正常编程,外接必备的单片机复位电路和晶振电路。特别地,为提高编程器的适用性,晶振电路采用跳线开关J1 为单片机提供12MHz 和11.0592M共2 种工作频率。 3 系统测试 ISP 编程涉及的软件主要有USB 驱动程序、单片机固件程序和计算机应用程序三部分构成。单片机固件程序用来实现计算机读取和编程STC 单片机内部的E2PROM(数据Flash),已提前固化在单片机内部。 测试之前,必须首先安装USB 驱动软件USB DriverInstaller.exe,该驱动可以将接入计算机USB 接口的编程映射为虚拟串口,一般是COM3 或COM4.然后安装STC 单片机在线编程烧录软件STC-ISP.STC-ISP 是针对STC 系列单片机而设计的软件,可下载STC89 系列、12C2052 系列和12C5410 等系列的STC 单片机,功能强大,使用简便。本编程器要求版本在V3.0 以上。 测试步骤是,将单片机STC89C52RC 插入编程器插座,整体插入计算机USB 接口(或用USB 线将编程器和计算机连接)。然后打开STC-ISP 软件,依次在主界面中选择MCU 单片机型号(MCUTYPE),导入Hex 文件(Open File/ 打开文件),选择串口(COM : COM3 或COM4 等)和波特率,最后点击下载按钮。下载成功的主界面如图3 所示。 经过多次反复测试本文设计的编程器,功能正常,性能可靠。   4 结束语 本文介绍了一种简单实用、价格低的ISP 编程器。该编程器具有功能稳定、速度快、价格低和易用性强等优点,适合STC 89C/S51XX/52XX 等系列单片机的程序烧录。另外,本系统扩展性较好,原理图稍加改动,借助于SPI 接口,实现对Atmega8515/ Atmega162(AVR 芯片)等更多的单片机的ISP 编程下载。

    时间:2019-06-14 关键词: 编程器 ch340t stc89c52rc

  • 一种基于STC89C52RC单片机的计时系统的设计方案

    摘 要: 阐述一种基于STC89C52RC单片机的计时系统的设计方案, 详细介绍系统的硬件构成、显示系统的设计方案、电路设计及程序设计。关键词: 单片机; 计时系统; 显示系统; 程序设计 随着电子技术的日新月异, 单片机的应用技术已逐步成熟, 市场上也出现了基于单片机技术的仪器设备。本文基于STC89S52RC单片机设计了一种计时系统, 可精确到小数点后2位, 计时系统可实现开始计时、停止计时并保持读数、复位等功能。1 STC89C52RC单片机简介 STC89C52RC单片机是宏晶科技推出的超强抗干扰、高速、低功耗单片机, 指令代码完全兼容传统8051单片机。其最高频率时钟为80 MHz, Flash存储器为8 KB, RAM为512 bit, E2PROM为2 KB, 可反复擦写编程。工作温度为-40℃~+85℃, 内置看门狗电路, 内部电源供电系统、时钟电路和复位电路都经过特殊处理。“6时钟/机器周期”和“12时钟/机器周期”可在ISP编程时反复设置。2 STC89C52RC单片机计时系统硬件 系统硬件包括STC89C52RC单片机、中断键(按下后计时系统停止计时, 显示系统保持读数)、显示系统。3 显示系统 显示系统硬件介绍:4 bit 8段数码管(本论文选用的是共阳极数码管), 54/74LS138译码器(位选控制), 74HC245双向总线发送器/接收器(控制数码管显示)。 显示系统采用单片机驱动数码管显示时间读数, 由54/74LS138译码器控制数字显示的位置, 74HC245双向总线发送器/接收器控制数码管显示数字及何时开始显示(上电开始计时即开始显示)。显示系统原理图如图1所示。 本文中只用到了8位数码管中的4位。 显示系统程序设计如下所示: void display(uint result) { P2=table[result/1000]; //显示十位数值 P1=DIS_BIT[3]; delay50ms(1); P2=table[result%1000/100]; //显示个位数值 P1=DIS_BIT[2]; delay50ms(1); P2=table[result%1000%100/10]; //显示小数点后第一位数值 P1=DIS_BIT[1]; delay50ms(1); P2=table[result%1000%100%10]; //显示小数点后第二位数值 P1=DIS_BIT[0]; delay50ms(1); }4 计时系统原理简述及结构 当启动开关按下时, 仪器设备开始工作, 并将电压信号传送给STC89C52RC单片机的电源输入端即VCC端, STC89C52RC单片机定时器开始工作, 同时显示系统开始工作即开始计时。当中断键按下时, 计时系统停止计时, 显示系统保持停止时的读数。P2口控制数码管显示的数字, P1接口接显示系统54/74LS138译码器做为位选控制。 本设计中STC89C52RC单片机采用单片机中定时器/计时器0作为计时器。系统结构如图2所示。 主程序设计如下:void main(){ EA=1; //允许总中断 EX0=1; //外部中断0的允许 IT0=1; //下降沿触发外部中断 TMOD=0x02; //定时器工作方式2 TH0=0; //高位赋值 TL0=0; //低位赋值 ET0=1; //允许定时器0的中断 TR0=1; //启动定时器0 while(1) { display(second); }} 中断程序设计:void time0(void) interrupt 1 //外部中断函数{ count++; if(count==39) //显示到小数点后两位即最小分辨率 为10 ms, 定时器工作方式2最大计时 为28 μs,即0.256 ms,10/0.256=39.062 5, 所以变量count设置为39 { count=0; second++;  }} 完整程序设计如下所示: #include<REG52.H> #include"intrins.h" #define uint unsigned int #define uchar unsigned char uint second ,sec; code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x00}; uchar code DIS_BIT[10]={0xff,0xfe,0xfd,0xfc,0xfb,0xfa, 0xf9,0xf8}; uint count=0; uint result; sbit pause = P3^2; //定义暂停键 void delay50ms(uint t) { uint j; for(;t>0;t--) for(j=245;j>0;j--); } void display(uint result) { P2=table[result/1000]; P1=DIS_BIT[3]; delay50ms(1); P2=table[result%1000/100]; P1=DIS_BIT[2]; delay50ms(1); P2=table[result%1000%100/10]; P1=DIS_BIT[1]; delay50ms(1); P2=table[result%1000%100%10]; P1=DIS_BIT[0]; delay50ms(1); } void Outside_Init0() interrupt 0 { sec=second; P2=table[sec/1000]; P1=DIS_BIT[3]; delay50ms(20); P2=table[sec%1000/100]; P1=DIS_BIT[2]; delay50ms(20); P2=table[sec%1000%100/10]; P1=DIS_BIT[1]; delay50ms(20); P2=table[sec%1000%100%10]; P1=DIS_BIT[0]; delay50ms(20); EA=0; ET0=0; //允许定时器0的中断 TR0=0; //启动定时器0 } void main(){ EA=1; //允许总中断 EX0=1; //外部中断0的允许 IT0=1; //下降沿触发外部中断 TMOD=0x02; TH0=0; TL0=0; ET0=1; //允许定时器0的中断 TR0=1; //启动定时器0 while(1) { display(second); }}void time0(void) interrupt 1{ count++; if(count==39) { count=0; second++;  }} 以上程序是作者针对所用硬件设计的程序, 部分程序内容需根据具体硬件做适当更改。 显示误差计算: 定时器工作方式2最大计时为28 μs, 即0.256 ms, 10/0.256=39.062 5。此时设置计数器中断运行过程中变量为39, 即1 s误差为0.062 5 ms。参考文献[1] 杨文龙.单片机原理及应用[M].西安:西安电子科技大学出版社,1997.[2] 徐仁贵. 微型计算机接口技术与应用[M].机械工业出版社,北京:2005.[3] 陈良银,游洪跃,李旭伟.C语言程序设计[M].北京:清华大学出版社,2006.

    时间:2019-03-27 关键词: 系统 设计方案 嵌入式处理器 stc89c52rc 单片机

  • 一种简单实用的STC89C52RC编程器设计方案

    1 引言STC(宏晶科技)公司推出的STC 89C/S 51XX/52XX 等系列单片机,具有价格便宜、无法解密、低功耗、高速、高可靠、强抗静电、强抗干扰等优点,其指令代码完全兼容传统8051 单片机,片内资源非常丰富,且均内置可反复擦写的Flash 存储器,并提供了ISP(In-System Programming)编程模式。STC89C52RC 作为STC 89C/S51XX/52XX 系列单品机的一个典型代表,其特征主要有,8K 字节可编程闪烁存储器、1000 次写/ 擦循环寿命、10 年的数据保留时间、三级程序存储器锁定、512 内部RAM、32 可编程I/O 线、两个16 位定时器/ 计数器、5 个中断源、可编程串行通道、低功耗的闲置和掉电模式以及片内振荡器和时钟电路等。因而这款功能强大和超高性价比的单片机,在国内应用极为广泛。ISP 在线编程是一种彻底颠覆了传统的编程模式的技术,它不会损坏芯片的引脚,同时下载速度很快,从而缩短了设计时间,降低了研发成本、加速了产品的上市,大大提高了工作效率。一般编程器的采用方法都是使用PL2303、CP2102、FT232 等主控芯片,但往往成本较高,而且有的芯片稳定差,极少数芯片固件版本有Bug,鉴于此,本文提出以国产CH340T 芯片为主体的ISP 编程器的设计方案,经过STC89C52RC 等芯片反复测试,功能稳定,性能出色。2 系统硬件设计2.1 系统总体结构图系统总体结构图如图1 所示。其中USB 供电和数据传输模块主要负责为单片机和CH340T 等模块供电,并将来自计算机的USB串行数据经CH340T 转换为串口数据后和单片机通信,为单片机编程提供数据通道。2.2 核心芯片CH340T 介绍CH340T 是南京沁恒电子有限公司设计生产的一款接口转换及单片机外围芯片,支持USB2.0.可以实现USB 转串口、扩展计算机异步串口和USB 转IrDA 红外等功能。本设计仅作USB 转串口使用,转换后的串口为全双工串口,内置收和发缓冲区,支持通讯波特率从50bps 到2Mbps,发送允许波特率误差《 0.3%,接收允许波特率误差《2%.其使用方法比较简单,外围元器件只需要晶体、电阻和电容即可。CH340T 有20 个标准引脚接口。主要有1、UD+ 和UD- 引脚,这些引脚内置了USB 上拉电阻,可以直接接到USB 总线上。2、GND和VCC,即接地和电源引脚,支持5V 或者3.3V 电源电压。3、数据传输引脚TXD 和RXD,分别为串口数据发送和接收引脚。输入空闲时,一般RXD 是高电平,但是如果R232 引脚为高电平,且启用辅助RS232 功能,RXD 引脚内部会自动插入一个反相器,默认变成低电平;输出空闲时,一般TXD 是高电平。4、其他引脚。包括MODEM 联络信号引脚和辅助引脚。2.3 系统原理图原理图如图2 所示。图中,USB 接口P1 除用于数据传输外,还经过LM7805 稳压后为CH340T 芯片和单片机和其他部件供电,当使用5V 工作电压时,CH340 芯片的VCC 引脚输入外部 5V 电源,并且V3 引脚应该外接容量为4700pF 或者 0.01uF 的电源退耦电容。CH340T 转接芯片将UD1+ 和UD1- 转换为串口信号串口数据和单片机串口进行通信。需要注意的是,CH340T 芯片的串行接收口CRXD 需要和单片机的P3.1(串行输出口TXD)通过PNP 三极管Q1 接成射极发生器的形式,以到达数据的缓冲和隔离的作用。单片机子系统,采用40 引脚的试验用插座,为了正常编程,外接必备的单片机复位电路和晶振电路。特别地,为提高编程器的适用性,晶振电路采用跳线开关J1 为单片机提供12MHz 和11.0592M共2 种工作频率。3 系统测试ISP 编程涉及的软件主要有USB 驱动程序、单片机固件程序和计算机应用程序三部分构成。单片机固件程序用来实现计算机读取和编程STC 单片机内部的E2PROM(数据Flash),已提前固化在单片机内部。测试之前,必须首先安装USB 驱动软件USB DriverInstaller.exe,该驱动可以将接入计算机USB 接口的编程映射为虚拟串口,一般是COM3 或COM4.然后安装STC 单片机在线编程烧录软件STC-ISP.STC-ISP 是针对STC 系列单片机而设计的软件,可下载STC89 系列、12C2052 系列和12C5410 等系列的STC 单片机,功能强大,使用简便。本编程器要求版本在V3.0 以上。测试步骤是,将单片机STC89C52RC 插入编程器插座,整体插入计算机USB 接口(或用USB 线将编程器和计算机连接)。然后打开STC-ISP 软件,依次在主界面中选择MCU 单片机型号(MCUTYPE),导入Hex 文件(Open File/ 打开文件),选择串口(COM :COM3 或COM4 等)和波特率,最后点击下载按钮。下载成功的主界面如图3 所示。经过多次反复测试本方案所设计的编程器,功能正常,性能可靠。4 结束语本文介绍了一种简单实用、价格低的ISP 编程器设计方案。经过反复测试本方案所设计的编程器具有功能稳定、速度快、价格低和易用性强等优点,适合STC 89C/S51XX/52XX 等系列单片机的程序烧录。另外,本系统扩展性较好,原理图稍加改动,借助于SPI 接口,实现对Atmega8515/ Atmega162(AVR 芯片)等更多的单片机的ISP 编程下载。

    时间:2019-03-26 关键词: 电源技术解析 编程器设计 stc89c52rc

  • STC89C52RC单片机超声波测距程序

    网络上集的STC89C52RC单片机超声波测距程序及电子制作实物,使用单片机最小系统进行试验,超声波部分使用HC-SR04模块,测量范围:4-300cm,实际测量上最长可达到5.70m。下面是实物图,文章后面附源程序。4-300cn,实际测量上最长可达到5.7m#include 'AT89X51.H' //头文件unsigned char code fseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};unsigned char code segbit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};unsigned char disbuf[8]={0,0,0,0,0,0,0,0};//-----------------------------------------------------------------------------// 函数原形定义#define uchar unsigned char#define uint unsigned intvoid main (void); // 主函数void LED4_Display (void); // LED显示void LED_OUT(uchar X); // LED单字节串行移位函数void delayms(uint); //延时子函数 msvoid jisuan(void);unsigned char code LED_0F[]; // LED字模表sbit DIO=P1^0; //串行数据输入sbit RCLK=P1^1; //时钟脉冲信号——上升沿有效sbit SCLK=P1^2; //打入信号————上升沿有效sbit echo=P3^2; //echosbit trig=P3^3; //trig//-----------------------------------------------------------------------------// 全局变量uchar LED[8]; //用于LED的8位显示缓存uint temp; uint temp1;uint a,b; //定义一个变量a,b 后者用于判断是否收到信号//// 主程序//void main(void) //主函数开始{ uint f;echo=0; //先拉低echo,trig引脚trig=0;f=500;while(f>0); //启动延时 消除第一次上电产生的波动{LED[3]=16;LED[2]=15;LED[1]=15;LED[0]=16;f--;}EA=1; //开总中断TMOD=0x11; //设置定时器为方式1ET0=1; //允许定时器中断 这里主要是防止超声波模块未发送信号ET1=1;while(1){echo=0;//a赋值a=0; b=1;TH0=0; //定时器装初值TL0=0;TH1=(65536-25000)/256; //定时器装初值TL1=(65536-25000)%6;trig=1; //trig送高LED4_Display (); // 延时3msLED4_Display ();LED4_Display ();LED4_Display ();LED4_Display ();LED4_Display ();LED4_Display ();trig=0; //trig送低TR1=1;while(echo==0); //等待echo变为高电平if(b==1) 判断是否收到信号{

    时间:2019-01-15 关键词: 超声波测距 stc89c52rc 单片机

  • 51单片机(STC89C52RC)光电耦合控制继电器实验

    单片机控制继电器一般是两种方式:一是单片机-三极管(PNP)-继电器,二是单片机-光电耦合器-三极管(NPN)-继电器,后者由于采用了光电隔离,故起抗干扰能力相对前者要强.前者选用PNP型主要是考虑控制逻辑,采用低电平触发的控制逻辑能够防止单片机复位时候产生的误动作.后者NPN是为了控制的方便,但也是遵循这样的控制逻辑.  本次实验采用材料有:STC89C52RC    51单片机NEC/Ps2002B    晶体管光电耦合器9013         NPN型三极管SRD-06VDC-SL-C 松乐6V继电器  电路图我就不画了,可以google,MCS-51直流继电器接口关键字.在这里主要碰到的问题是驱动电流的选择问题,先查看单片机IO口,根据手册查得5V电源的时候灌入电流为4~6mA,然后查看光电耦合器的发光二极管,查得最大正向电流IF=50mA,正向电压VF最大为1.9V,在IF=5mA条件下,电流传输比CTR最小为100%(有点怀疑数据真实性),再查继电器,6V电源的情况下电流为75mA,电阻为80欧姆左右,在查9013最大集电极电流为0.5A,在看DC电流增益,在集电极电流IC为50mA时,放大倍数为60-300,IC为500mA时,放大倍数最小为40.  由以上数据可以知道,要使得继电器吸合,最小电流为75mA,对应9013的放大倍数最小为40,那么基极至少要提供75/40=1.875mA的电流,由于电流传输比为100%,那么灌入单片机电流最少也为1.875mA*100%=1.875mA,小于单片机灌入电流4~6mA,可以提供.  否则的话就要改进,思路有:   1.可以在单片机加入同相或者反相器,也可以在输出端加入同相或者反向器,以提高电流.   2.可以改用达林顿输出型的光电耦合器.   3.加入小电流驱动的中间继电器

    时间:2019-01-11 关键词: 继电器 51单片机 光电耦合控制 stc89c52rc

  • 51单片机(STC89C52RC)小综合实验

      这个实验包含以下几个内容:51单片机最小系统单片机外接继电器整流桥的使用lm393电压比较器的使用  首先先上实验结果图:前面两个继电器,中间是最小系统,最下脚是整流器和lm393电压比较器.好,下面来说这个板子制作过程当中的经验:  一是整流桥输出的电压输入到电压比较器当中,这里牵扯到电压比较器的零点漂移概念,即输入为零的时候,输出不为零,主要原因是温度对电子元件的影响,电子元件一般都不是纯种的.二是稳压直流电压的输出,这里用电稳压电源的一套系统,要求不高的话一般是线性稳压:交流电压->整流器->RC电路滤波->LR滤波(可选)->稳压(三端稳压器)->稳压管.三是51单片机下载,在接通串口线路后发现单片机电压灯亮起,说明有电流,主要原因是RXD和TXD与GND有电压差所致,电压并不是只有从vcc这个IO口进入,其它的IO口也是可以输入的,他们与VCC并不是绝缘的.这个电流会影响ISP下载,导致失败,具体解决方案暂未验证,换用USB标准输出的5V电压后,下载正常,注意,一定是5V的,波动为0.01.四是要注意布局,通常要留出针口,一边外接电路.五是要尽量给关心的工作主要部件加上一个工作指示灯,一便能够直观的了解部件的工作状况.避免不必要的测量,有时碰到需要同时测量的时候,无法满足条件.六是部件的供电部分,最好是能够分开,使用单独的电源进行供电,同一个部件,条件允许的话,要多留一个电源供电口.

    时间:2018-11-22 关键词: 51单片机 小综合实验 stc89c52rc

  • 51单片机(STC89C52RC)小综合实验(续2)

      在上一次实验后的电路,拿到实际当中去测试,发现还是出现问题的,主要是电压的回落时间变得很慢,仔细检查电路发现,原因主要是由于变更了电容的容量大小,原来的采用了10uf的滤波电容,变更后采用了3300uf的滤波电容,按理来说滤波电容大点也是没有问题的.更有助于平滑波形不是吗?可是在这个电路当中,主要是希望lm393的电压变化作为信号,在上次实验的时候,采用的是初始电压为0,也就是相当于能够关闭供电电压的,实际是持续供给,初始电压不为0,于是采用大电容后,放电时间延迟严重.  得到的教训:滤波电容并不是越大越好的,需要根据电路的需求进行相应的调整.

    时间:2018-11-20 关键词: 51单片机 小综合实验 stc89c52rc

  • TM1637数码管显示STC51单片机驱动程序

    /* Coder : Farman Date  : 2018-01-02 参考了厂家的TM1637数据手册,在此表示感谢。 */ #include //包含52单片机头文件 #include "Delay.h" //////////////////////////////////////////////////////////////////////////// sbit I2C_SCL = P2^1;   //定义模拟IIC总线的时钟线 sbit I2C_SDA = P2^0;   //定义模拟IIC总线的数据线 #define TM1637_BRIGHTNESS 7 // 0 - 7 //////////////////////////////////////////////////////////////////////////// void I2C_delay() {     nop_(); } void I2C_start() {        I2C_SCL = 1;      I2C_SDA = 1;     I2C_delay();     I2C_SDA = 0; // 时钟线设置为常态,低电平。 } /* I2C 总线写1个字节 不包含应答位的检测 */ void I2C_write_byte(char byte_to_write) {     unsigned char i;     for(i=0; i>= 1;     }     return;  } void I2C_check_ack() {     // I2C 检查应答位,实际未检查,只发送了应答位时钟,认为TM1637工作正常     I2C_SCL = 0;     I2C_delay();//在第八个时钟下降沿之后延时5us,开始判断ACK 信号     while(I2C_SDA)     {         ;     }     I2C_SCL = 1;     I2C_delay();     I2C_SCL=0; } void I2C_send_ack() {     I2C_SDA = 0;     I2C_delay();     I2C_SCL = 1;     I2C_delay();     I2C_SCL = 0;     I2C_delay();     I2C_SDA = 1;     I2C_delay(); } void I2C_stop() {     I2C_SCL = 0;     I2C_delay();     I2C_SDA = 0;     I2C_delay();      I2C_SCL = 1;     I2C_delay();     I2C_SDA = 1; } /////////////////////////////////////////////////////////////////////////// // // TM1637模块操作函数 // ////////////////////////////////////////////////////////////////////////// void TM1637_write_command_byte(unsigned char command) {     I2C_start();     I2C_write_byte(command);     I2C_check_ack();     I2C_stop(); } // bright : 0 - 7 void TM1637_display_switch_and_bright(bit enable_display, unsigned char bright) {     TM1637_write_command_byte(0x80 + (enable_display ? 0x08 : 0x00) + bright); } void TM1637_write_display_bytes(unsigned char first_addr,                                  unsigned char bytes_to_write[],                                 unsigned char num_of_bytes) {     unsigned char i;     I2C_start();     I2C_write_byte(0x40);     I2C_check_ack();     I2C_stop();     I2C_start();     I2C_write_byte(0xC0 + first_addr);     I2C_check_ack();     for(i=0; i<num_of_bytes; i++)     {         I2C_write_byte(bytes_to_write[i]);         I2C_check_ack();     }      I2C_stop(); } // addr: 0 - 5 void TM1637_write_display_byte(unsigned char addr, unsigned char segments) {     I2C_start();     I2C_write_byte(0x40 + addr);     I2C_check_ack();     I2C_stop();     I2C_start();     I2C_write_byte(0xC0 + addr);     I2C_check_ack();     I2C_write_byte(segments);     I2C_check_ack();     I2C_stop(); } code unsigned char TM1637_SEG_TAB[] =  {      0x3F // 00111111 0     ,0x06 // 00000110 1     ,0x5B // 01011011 2     ,0x4F // 01001111 3     ,0x66 // 01100110 4     ,0x6d // 01101101 5     ,0x7d // 01111101 6     ,0x07 // 00000111 7     ,0x7F // 01111111 8     ,0x6F // 01101111 9     ,0x77 // 01110111 A     ,0x7C // 01111100 b     ,0x39 // 00111001 C     ,0x5E // 01011110 d     ,0x79 // 01111001 E      ,0x71 // 01110001 F  }; void TM1637_show_digit(unsigned char pos, unsigned char digit, bit with_dot) {     TM1637_write_display_byte(pos, TM1637_SEG_TAB[digit] | (with_dot ? 0x20 : 0x00)); } void TM1637_init() {     unsigned char i;     TM1637_display_switch_and_bright(1, TM1637_BRIGHTNESS);     for(i=0; i<6; i++)     {         TM1637_write_display_byte(i, 0xFF);     }     Delay200ms();     for(i=0; i<6; i++)     {         TM1637_write_display_byte(i, 0x00);     }     Delay200ms();     for(i=0; i<6; i++)     {         TM1637_write_display_byte(i, 0xFF);     }     Delay200ms();     for(i=0; i<6; i++)     {         TM1637_write_display_byte(i, 0x00);     }     Delay200ms();  } void TM1637() {     unsigned char seg;     unsigned char i, j;     TM1637_init();     while(1)     {         for(i=0; i<16; i++)         {             for(j=0; j<6; j++)             {                 TM1637_show_digit(j, i, 0);             }             Delay1s();         }     } } 

    时间:2018-11-20 关键词: stc51单片机 tm1637 stc89c52rc

  • 51单片机(STC89C52RC) keil软件精确定时 浅析

      这里主要是对使用keil环境下,提高51单片机软件精度的问题给出自己的一点小看法,参阅了文章利用 Keil Cx51实现T0的精确定时,使用文章中的方法的确是可以提高软件精度,可是一碰到中断函数中语句较多,且main函数其它任务的时候,总是觉得力不从心,因为要计算中断执行时间就够我受的了。我可是很懒的,研究之下发现了一些东西。51误差主要是来自两个方面:晶振和单片机中断系统的误差晶振:我们的晶振一般误差都是20PPM的,百万分之二十。想提高精度,只能选择误差更小的晶振,但它毕竟不是为精确定时设计的,很难达到时钟芯片晶振的精度。中断系统的误差:定时器产生中断请求以后,并不一定能马上响应这个中断。单片机至少要把当前的指令执行完。51的指令是1到4个周期。如果赶上两周期指令,就会延误一个指令周期。最慢的情况会延误3个周期响应中断。这里是没有办法预测的,因为中断是随机的。如果使用上述文章中的方法,这里就比较难计算了。如果单片机正处理其他的中断(同级或更高级)。要等其执行完其他中断,再执行一条主程序指令,才会响应定时器0中断。因为程序千差万别,所以其他中断占用的时间,就没准儿了。这类影响是随机的,一般会提升相应的优先级别。那么如何解决呢?我们知道定时器只要开着,TH0和 TL0就会不断的增一,增到FFFF,再增一就溢出(不自动重载),这时TF0被硬件置1(也就是中断请求)。我们要注意的就是不管定时器中断是否被响应,TH0和 TL0仍然会不断增一,FFFF增一0000再增一0001再增一0002。定时器在溢出产生中断以后,不论响应还是不响应,TL0并不停止计数。虽然中断响应有可能被延 迟,但是延迟的时间仍然被计算。那么我们就完全有可能将下一次中断“补上”。 1#include"reg51.h"2#include"delay.h"3#include"stdlib.h"4#defineucharunsignedchar5ucharMScond=0;6ucharSeond=0;7ucharMinute=0;8ucharHour=0;9sbitP1_0=P1^0;1011bitis_arrive_time(void)12{1314inta=rand()%10;15if(a>5)16{17return1;18}19return0;20}21voidmain(void){22EA=1;23ET0=1;24TMOD&=0xf0;25TMOD|=0x01;26TH0=0xb1;27TL0=0xdf;28TR0=1;29P1_0=0;30while(1)31{32if(is_arrive_time()==1)33{34P1_0=~P1_0;35}36}37}38voidTime0Isr(void)interrupt139{40TH0=0xb1;//定时器重新赋初值41//TL0=0xeb;42TL0+=0xe1;//测试点43MScond=MScond+1;44if(MScond==50)45{46MScond=0;47Seond=Seond+1;48if(Seond==60)49{Seond=0;50Minute=Minute+1;51if(Minute==60)52{53Minute=0;54Hour=Hour+1;55if(Hour==24)56{Hour=0;57}58}59}60}61}我们可以看到我将TL0的赋值累加了,其结果将等待和初始化的时间也给算上了,解决了上面预测计算的问题,那么为什么负的初值不是0xdf而是0xe1呢?我们查看一下这个语句的汇编就知道了 TL0 += 0xe11C:0x017974E1MOVA,#0xE12C:0x017B258AADDA,TL0(0x8A)3C:0x017DF58AMOVTL0(0x8A),A可以看出,TL0(0x8A)的值在C:0x017B 这里就记录到了A寄存器当中去了。也就是C:0x017B语句本身和C:0x017D两条语句没有记录进去,这两条都是一个周期的指令,故要加上2。这条语句后面的代码执行也就算下一次中断执行的了。从理论上说,真正是一个微秒都不差。中断中代码的执行时间可以扩展到中断周期那么大,比如我这里是50ms,12MHZ的话就是约50000行代码。哟,要计算执行周期不得累死。这个用法的好处显而易见了吧。

    时间:2018-07-26 关键词: 51单片机 keil软件 精确定时 stc89c52rc

  • 51单片机学习笔记:连续读写STC89C52RC内部EEPROM存储器

    STC单片机的内部EEPROM是用DATAFLASH模拟出来的,不是真正的EEPROM存储器,不能用普通的方法来操作下面是一些注意点:1.字节写之前要先将这个字节所在扇区的其它有效数据读取到RAM暂存(这步不是必须的)2.暂存完之后再对整个扇区(512字节)进行擦除操作,擦拭完后,整个扇区每个地址中数据都变成0xFF3.将欲写入的N个字节数据,用字节写函数写入EEPROM4.将暂存到RAM的其它有用的EEPROM值再用字节写函数写回EEPROM5.STC用FLASH模拟出来的EEPROM的字节写功能只能将1变成0,而不能将0变成1, 只有扇区擦除后数据才是全1, 例如:在地址0x21f0处第1次写11010110,第2次写111010,读出结果是这2个值的相与10010 所以如果一个地址处的值不是0xff时写入新的数据是不对的,要先执行扇区擦除,变为0xff, 对于单个字节的写入,我们可以先检查该地址处的数据是否为0xff,是的话就不用擦除扇区了----------------------------------------------------------------------STC89C52单片机内部EEPROM 的读写过程1 配置ISP_CONTR寄存器,使能第7位ISPEN,让ISP_IAP功能生效,并配置低3位的等待时间2 写指令: 读/写/擦除扇区 这3个命令3 赋值: ISP_ADDRH和ISP_ADDRL的地址值4 关闭总中断EA,因为下面要写的2个触发指令必须是连续操作的,不能被中断5 执行公用的 ISP_IAP 触发指令,触发后读写操作才能进行6 打开中断 EA,关闭ISP_IAP功能:清相关寄存器C代码#include"my51.h"/******************定义命令字节******************/#defineread_cmd0x01//字节读数据命令#definewirte_cmd0x02//字节编程数据命令#defineerase_cmd0x03//扇区擦除数据命令/****************特殊功能寄存器声明****************/sfrISP_DATA=0xe2;sfrISP_ADDRH=0xe3;sfrISP_ADDRL=0xe4;sfrISP_CMD=0xe5;sfrISP_TRIG=0xe6;sfrISP_CONTR=0xe7;/*定义Flash操作等待时间及允许IAP/ISP/EEPROM操作的常数******************///#defineenable_waitTime0x80//系统工作时钟

    时间:2018-07-25 关键词: 存储器 51单片机 内部eeprom stc89c52rc

  • 51单片机(STC89C52RC)EEPROM操作实验

    查看了文档,EEPROM是一种非易失的存储器,常用当做数据存储器,在程序运行当中所需要的数据,配置等等.在STC当中,把Flash当做EEPROM,并不是真正的EEPROM. 基本操作包括字写入/只读取/块擦除三种,更具体的使用可以查阅手册,需要说明的是, 这些是STC特有的,一般并不能用仿真来实现,一开始犯下了这个错误,以为能够用protel来仿真,或许可以,但是获取不到,得到一条经验,那就是在硬件允许的情况下,应该首先考虑用硬件来验证程序.

    时间:2018-07-20 关键词: 51单片机 eeprom stc89c52rc

  • 51单片机(STC89C52RC) IO扩展实验

      最近碰到了需要扩展IO口的情况了,正在想办法从lcd1602身上挤出几个IO口,另一种可行的方法是添加专用IC,google之发现可以有更好的方法,网上流传经典IO接按键法,可以用5个IO口实现5X5矩阵键盘.参考这里:   我参照着实验了一番,并用protues仿真看看;用上面的例子,如图:  原理还是采用的是查询的方法进行扫描的,请看其描述:  用3个IO口作行扫描,2个IO作列检测(为方便描述,我们约定:设置某一IO口输出为“0”――称其 为“扫某IO口”)。用行线输出扫键码,列线检测是否有按键的查询方法进行扫键。扫键流程:在行线依次输出011,101,110扫键值,行线每输出一个 扫键值,列线检测一次。当列线检测到有按键时,结合输出的扫键值可以判断相应的按键。  仿真的时候用atmel89c51单片机,选取P1口的0-4,就是不通过,当列作为输入状态(为1时),某IO置0时,接通交叉的按钮,列却没有变化,依旧为高电平.什么原因呢?百思不得其解,用一个小实验,将按钮接行的一端直接接到地,则列状态改变,那么也就是这个上拉电阻的问题咯, 突然想到,P1口内是已经内置了上拉电阻的,能够实际输出高电平,那么再接一个上拉电阻就是白搭了,于是去掉上拉电阻部分,功能正常.为再次验证,将端口接到P0口的0-4,电路依旧按照上图所示,功能正常,验证正确.  经典接按钮一文中并没有提及是在什么单片机中实现的,只是提供了一个原理,实际当中需要注意IO口的上拉电阻问题,不过这个原理确实是蛮经典的,设计不错.

    时间:2018-07-18 关键词: 51单片机 io扩展 stc89c52rc

  • 单片机STC89C52RC 内部EEPROM

    单片机运行时的数据都存在于RAM(随机存储器)中,在掉电后RAM 中的数据是无法保留的,那么怎样使数据在掉电后不丢失呢?这就需要使用EEPROM 或FLASHROM 等存储器来实现。在传统的单片机系统中,一般是在片外扩展存储器,单片机与存储器之间通过IIC 或SPI 等接口来进行数据通信。这样不光会增加开发成本,同时在程序开发上也要花更多的心思。在STC 单片机中内置了EEPROM(其实是采用ISP/IAP 技术读写内部FLASH 来实现EEPROM),这样就节省了片外资源,使用起来也更加方便。下面就详细介绍STC 单片机内置EEPROM 及其使用方法STC 各型号单片机内置的EEPROM 的容量最小有2K,最大有16K,基本上很好地满足项目的需要,更方便之处就是节省了周边的EEPROM 器件,达到节省成本的目的,而且内部EEPROM 的速度比外部的EEPROM 的速度快很多。STC 各型号单片机内置的EEPROM 是以512 字节为一个扇区,EEPROM 的起始地址=FALSH 容量值+1,那么STC89C52RC 的起始地址为0x2000,第一扇区的起始地址和结束地址0x2000~0x21FF,第二扇区的起始地址和结束地址0x2200~0x23FF,其他扇区如此类推。深入重点:传统的EEPROM 是电可擦可编程只读存储一种掉电后数据不丢失的存储芯片。STC89C52RC 的EEPROM 是通过ISP/IAP 技术读写内部FLASH 来实现EEPROM。STC89C52RC 的EEPROM 起始地址为0x2000,以512 字节为一个扇区,EERPOM 的大小为2K 字节。STC89C52RC 与EEPORM 实现的寄存器有6 个,分别是ISP_DATA、ISP_ADDRH、ISP_ADDRLISP_TRIG、ISP_CMD、ISP_CONTR。1. ISP_DATA 寄存器ISP_DATA 寄存器:ISP/IAP 操作时的数据寄存器。ISP/IAP 从Flash 的数据在此处,向Flash 写的数据也须放在此处。示例1:读单个字节UINT8 EEPROMRead(UINT16 addr){…… return ISP_DATA;}示例2:写单个字节void EEPROMWrite(UINT8 byte){…… ISP_DATA=byte;}2.ISP_ADDRH、ISP_ADDRL 寄存器ISP_ADDRH: ISP/IAP 操作时的地址寄存器高八位ISP_ADDRL: ISP/IAP 操作时的地址寄存器低八位示例1:设置地址void EEPROMSetAddress(UINT16 Addr){…… ISP_ADDRH=(UINT8)(Addr>>8); ISP_ADDRL=(UINT8) Addr;}3.ISP_CMD 寄存器ISP_CMD: ISP/IAP 操作时的命令模式寄存器,需要通过ISP_TRIG 命令触发寄存器才能生效。4.ISP_TRIG 寄存器ISP/IAP 命令要生效即ISP_CMD 设置的命令要生效,必须通过ISP_TRIG 命令触发寄存器进行触发。触发过程很特别,只需要连续二次对ISP_TRIG 寄存器赋值就可以的了,对ISP_TRIG 寄存器先写入0x46,再写入0xB9 就完成命令触发的过程。示例1:命令触发void EEPROMCmdTrig(void){…… ISP_TRIG=0x46; ISP_TRIG=0xB9;}5.ISP_CONTR 寄存器ISP_CONTR:ISP/IAP 控制寄存器ISPEN:ISP/IAP 功能允许位。0:禁止ISP/IAP 编程改变Flash。SWBS: 0:软件选择从用户主程序区启动1:ISP 程序区启动SWRST: 0:不操作1:产生软件系统复位,硬件自动清零WT2、WT1、WT0:设置等待时间假如STC89C52RC 的工作频率为12MHz,那么机器周期为1us,参照表12-,EEPROM 的读单个字节、写单个字节、扇区擦除的所需要的时间大致如下:读单字节: 11*1us=11us写单字节: 60*1us=60us扇区擦除: 10942*1us=10.942ms无论单片机运行在什么工作频率下,EEPROM 的读、写、擦除操作的所需要的时间分别约为10us、60us、10ms。深入重点:STC89C52RC 与EEPORM 实现的寄存器有6 个,分别是ISP_DATA、ISP_ADDRH、 ISP_ADDRL ISP_TRIG、ISP_CMD、ISP_CONTR。EEPROM 的命令触发必须对ISP_TRIG 寄存器先写入0x46,再写入0xB9。无论单片机运行在什么工作频率下,EEPROM 的读、写、擦除操作的所需要的时间分别约 为10us、60us、10ms,因而要对ISP_CONTR 设置好等待时间,否则数据容易出现问题。

    时间:2018-07-17 关键词: 内部eeprom stc89c52rc 单片机

  • 51单片机(STC89C52RC) lcd1602实验小结

      lcd1602是自带控制器的液晶显示模块,能够显示两行点阵数据,其引脚参数请google之. 在实际使用的时候碰到的现象:  第1行黑块,第2行空白,是1602本身上电复位成功的标志。意味着单片机根本没有进行初始化,需要检查电路.  如果碰到两行都是现实黑块,那么就是意味着初始化不正常,需要尝试使用更长的延时功能,确保数据不丢失.  仿真的时候是可以写入并显示数据的,并且检查电路连线没有问题,开始的时候碰到上述两种任意一种,但是写入数据后屏幕什么也米有了. 能够碰到上述的现象的任意一种的时候,就需要调节对比度端口,数据有可能已经写入了,只是没有显示出来,经实验证实,带背光的1602 lcd在上电复位的成功的时候,调整正确是看不清一行黑块的.而输出的时候则能正常显示.一般是将对比度端口接入一个可调电阻,比如10k的可调电阻.  ps:据说网上传闻有用比较少的线实现显示的, 两根数据线就可以,正在查证ing.

    时间:2018-07-17 关键词: 51单片机 lcd1602 stc89c52rc

  • 51单片机(STC89C52RC)小综合实验(续)

      上篇文章已经把碰到的问题说了一下,后来去测试的时候发现又碰到问题了,主要的现象就是中断次数不确定,有时候很多次,有时候一次也没有,俗话说就是"中断振荡",首先想到的就是可能类似按钮一样出现的抖动,尝试添加20ms的延时函数失败.进入的次数还不很不确定.google大神告诉我说,尝试在lm393电压比较器输出端加上一个74hc14,这是一个反相器,内置有施密特触发器.对整形很在行. 一想没有这个IC啊,可是我有555定时器,据说也是可以搭建一个电路实现施密特触发器的.但是我没有心急做,仔细分析原因可能有一下几个:电源电压的波动,因为是从变压器整流出来的,波动在所难免.可能是滤波电容不够大.电源共用问题.  换用一个很精准的稳压电源供电,问题依旧,排除电源共用问题.在考虑滤波电容的时候,发现自己没有示波器,观察不了波形唉,使用软件仿真,发现哪怕电容在大,出来的波纹依旧还还是有的,并不能够直接滤波成直线,注意我这里没有加稳压二极管,因为我需要的就是互感器感应出来的电压变化,加了稳压就没有意义了.以施密特触发器做为切入点,无意当中发现lm393的应用里面有描述到存在的问题,因为我的是基本单限比较器,输入信号Uin,即待比较电压,它加到同相输入端,在反相输入端接一个参考电压(门限电平)Ur。当输入电压Uin>Ur时,输出为高电平U,反之就是低电平,但是他的缺点就是如果输入信号Uin在门限值附近有微小的干扰,则输出电压就会产生相应的抖动(起伏)。于是就不断的触发我的中断,这个就是问题的症结所在了,介绍说在电路中引入正反馈可以克服这一缺点。于是就发现了解决办法--迟滞比较器或者是双电压比较器.  网上的电路,有些可能是错误的图~,搞了半天.最后还是发现了motorola的lm393N的Datasheet 有介绍到带迟滞的电压比较器-comparator with hysteresis.详情请看motorola datasheet,里面提供了计算公式,VO(low)指示的是输出的低电压,软件仿真后确认得到了效果,仔细一看逻辑却不对了,我设置的是下降沿触发,于是立刻想到反相器,不行啊,买东西不方便啊.仔细考虑接一级逻辑反了,那要是在接一级反反不就得正(负负得正的经验),尝试后得出可以,而且后一级可以不接入正反馈了,估计反相器也是同理吧.刚好我LM393我还有一个是空着的,利用上了.  测试发现,采用带迟滞比较器后, 效果明显,而且波动范围可以设定.大大提高了可用性.ps:这里有一个在线的计算工具http://www.ec66.com/tools/chizhibijiaoqi.asp注意有误差.

    时间:2018-07-16 关键词: 51单片机 小综合实验 stc89c52rc

  • 基于CH340T 的STC89C52RC编程器设计

    编程器通过USB 接口与PC 上位机通讯,用户只需要通过PC上位机GUI 的简单操作,就可以实现对STC 89C/S51XX/52XX 等系列单片机的擦除、编程、校验和加密。经过STC89C52RC 等单片机反复测试,该编程器功能稳定、速度快、价格低和易用性强等优点。 1 引言 STC(宏晶科技)公司推出的STC 89C/S 51XX/52XX 等系列单片机,具有价格便宜、无法解密、低功耗、高速、高可靠、强抗静电、强抗干扰等优点,其指令代码完全兼容传统8051 单片机,片内资源非常丰富,且均内置可反复擦写的Flash存储器,并提供了ISP(In-System Programming)编程模式。STC89C52RC 作为STC 89C/S51XX/52XX 系列单品机的一个典型代表,其特征主要有,8K 字节可编程闪烁存储器、1000 次写/ 擦循环寿命、10 年的数据保留时间、三级程序存储器锁定、512 内部RAM、32 可编程I/O 线、两个16 位定时器/ 计数器、5 个中断源、可编程串行通道、低功耗的闲置和掉电模式以及片内振荡器和时钟电路等。因而这款功能强大和超高性价比的单片机,在国内应用极为广泛。 ISP 在线编程是一种彻底颠覆了传统的编程模式的技术,它不会损坏芯片的引脚,同时下载速度很快,从而缩短了设计时间,降低了研发成本、加速了产品的上市,大大提高了工作效率。一般编程器的采用方法都是使用PL2303、CP2102、FT232 等主控芯片,但往往成本较高,而且有的芯片稳定差,极少数芯片固件版本有Bug,鉴于此,本文提出以国产CH340T 芯片为主体的ISP 编程器的设计方案,经过STC89C52RC 等芯片反复测试,功能稳定,性能出色。 2 系统硬件设计 2.1 系统总体结构图 系统总体结构图如图1 所示。其中USB 供电和数据传输模块主要负责为单片机和CH340T 等模块供电,并将来自计算机的USB串行数据经CH340T 转换为串口数据后和单片机通信,为单片机编程提供数据通道。 2.2 核心芯片CH340T 介绍 CH340T 是南京沁恒电子有限公司设计生产的一款接口转换及单片机外围芯片,支持USB2.0.可以实现USB 转串口、扩展计算机异步串口和USB 转IrDA 红外等功能。本设计仅作USB 转串口使用,转换后的串口为全双工串口,内置收和发缓冲区,支持通讯波特率从50bps 到2Mbps,发送允许波特率误差< 0.3%,接收允许波特率误差

    时间:2018-05-31 关键词: 编程器 ch340t stc89c52rc

  • 基于STC89C52RC+TEA5767的收音机

    该方案是一个FM收音机,包含完整的原理图和源代码,拿回家马上就可以动手去做。基于(STC89C52RC+TEA5767),使用飞利浦的TDA1308音频功放IC,可以使用耳机收听,也可以接功放收听,音质不错,在实验室可以接受到十几个清晰的电台。 同时,主板也是一个很好的51单片机学习板,单片机的所有IO口已经在电路板上引出,方便实验。       原理图和代码的获取地址:http://www.51hei.com/f/FM52.rar

    时间:2015-01-23 关键词: 收音机 tea5767 stc89c52rc

发布文章

技术子站