【STC51】51最小系统和驱动注意事项

0. 基础:STC89C52 的引脚简介

STC89C52共有40个引脚,被分为三种类型:

  • 电源引脚:VCC+GND
  • 普通I/O
  • 功能引脚

其中VCC和GND分别代表芯片的正负电源,普通I/O口可用于输入和输出,而功能引脚则具有特定的功能。

1. 普通I/O口

STC89C52共有32个普通I/O口,这些引脚的主要功能是用于数据输入和输出。需要注意的是,为了避免短路和损坏,需要注意不要同时将多个引脚设置为输出模式并输出高电平。

  1. P0口(8个引脚):可作为输入或输出端口。
  2. P1口(8个引脚):可作为输入或输出端口,并具有外部中断功能。
  3. P2口(8个引脚):可作为输入或输出端口,并具有外部中断功能。
  4. P3口(8个引脚):可作为输入或输出端口,也可以用作特殊功能端口。

2. 功能引脚

STC89C52的功能引脚包括Reset、XTAL1、XTAL2、EA、ALE、PSEN、RD、WR、T0、T1、INT0和INT1。这些引脚具有不同的功能,例如Reset引脚用于复位,XTAL1和XTAL2引脚用于外部晶振,T0和T1引脚用于定时器等等。需要注意的是,这些引脚的特定功能需要通过程序进行设置才能生效。

  1. (最小系统:时钟电路)XTAL1、XTAL2:晶振接口,接入外部晶振振荡器。
  2. (最小系统:复位电路)RST:复位引脚,当该引脚接收到低电平信号时,系统将重启。
  3. (最小系统:BOOT电路)EA:程序存储器(ROM)控制引脚。当EA连接VCC时,芯片从内部ROM启动;当EA连接地时,芯片从外部ROM启动。
  4. ALE:地址锁定使能引脚。
  5. PSEN:程序存储器读使能引脚。
  6. INT0、INT1:外部中断输入引脚。
  7. (最小系统:下载电路)TXD、RXD:串行口传输引脚。
  8. T0、T1:定时器/计数器输入引脚。
  9. AUXR、P3.4、P3.5、P3.6、P3.7:特殊功能引脚,具体用途与芯片内部的其他电路有关。

其中,EA,ALE,PSEN与外部存储器有关:

  • EA(31脚):外部程序存储器地址允许输入端。
    ○ 当EA接高电平时,CPU执行片内ROM指令,但当PC值超过OFFFH时,将自动转去执行片外ROM指令;
    ○ 当EA接低电平时,CPU只执行片外ROM指令。对于80C31,由于其无片内ROM,故其EA必须接低电平。

  • ALE(30脚):地址锁存允许信号输出。
    ○ 当CPU访问片外存储器时,ALE输出信号控制锁存PO口输出的低8位地址,从而实现PO口数据与低位地址的分时复用。
    ○ 当80C51上电正常工作后,自动在ALE端输出频率为fosc/6的脉冲序列(fosc代表振荡器的频率)。
  • PSEN(29脚):片外ROM读选通信号端。

 

1. 51单片机为什么P0口要接上拉电阻?

简短不看版:因为P0口的GPIO在内部都是开漏输出的。

一、概述

51单片机(通常指AT89C51,AT89C52,STC89C51,STC89C52)P0口作为I/O口输出的时候时,输出低电平为0 输出高电平为高组态,所谓的高阻态就相当于浮空状态,不能真正的输出高电平。

P0端口8位中的一位结构图见下图:

由上图可见,P0端口由锁存器、输入缓冲器、切换开关、一个与非门、一个与门及场效应管驱动电路构成。再看图的右边,标号为P0.X引脚的图标,也就是说P0.X引脚可以是P0.0到P0.7的任何一位,即在P0口有8个与上图相同的电路组成半导体

当作为输出给所接的负载提供电流时,必须接上拉电阻(一电阻连接到VCC),由电源通过这个上拉电阻给负载提供电流。P0作输入时不需要上拉电阻,但要先置1。因为P0口作一般I/O口时上拉场效应管一直截止,所以如果不置1,下拉场效应管会导通,永远只能读到0。因此在输入前置1,使下拉场效应管截止,端口会处于高阻浮空状态,才可以正确读入数据。 

二、上拉情况分类

由于P0口内部没有上拉电阻,是开漏的,不管它的驱动能力多大,相当于它是没有电源的,需要外部的电路提供,绝大多数情况下P0口是必需加上拉电阻的。

1、一般51单片机的P0口在作为地址/数据复用时不接上拉电阻。

2、作为一般的I/O口时用时,由于内部没有上拉电阻,故要接上上拉电阻。

3、当p0口用来驱动PNP管子的时候,就不需要上拉电阻,因为此时的低电平有效;

4、当P0口用来驱动NPN管子的时候,就需要上拉电阻的,因为此时只有当P0为1时候,才能够使后级端导通。 简单一点说就是它要驱动LDE亮就必须要有电源驱动,否则亮不了,而恰好P0口没有电源,所以就要外接电源,接上电阻是起到限流的作用;如果接P1、P2、P3端口就不用外接电源和电阻了。

P0口是开漏的,不管它的驱动能力多大,相当于它是没有电源的,需要外部的电路提供,绝大多数情况下P0口是必需加上拉电阻的;

5、51单片机的P0口用作数据和地址总线时不必加上拉电阻。

有些IC的驱动能力并不强,如果P0口作为输入而加了不必要的上拉,有可能驱动IC无法将其拉回到低电平,从而使输入失败!

三、常用驱动实例

1、如果是驱动led,那么用1K左右的就行了。如果希望亮度大一些,电阻可减小,最小不要小于200欧姆,否则电流太大;如果希望亮度小一些,电阻可增大,增加到多少呢,主要看亮度情况,以亮度合适为准,一般来说超过3K以上时,亮度就很弱了,但是对于超高亮度的LED,有时候电阻为10K时觉得亮度还能够用。通常就用1k的。

2、对于驱动光耦合器,如果是高电位有效,即耦合器输入端接端口和地之间,那么和LED的情况是一样的;如果是低电位有效,即耦合器输入端接端口和VCC之间,那么除了要串接一个1~4.7k之间的电阻以外,同时上拉电阻的阻值就可以用的特别大,用100k~500K之间的都行,当然用10K的也可以,但是考虑到省电问题,没有必要用那么小的半导体

3、对于驱动晶体管,又分为PNP和NPN管两种情况:对于NPN,毫无疑问NPN管是高电平有效的,因此上拉电阻的阻值用2K~20K之间的,具体的大小还要看晶体管的集电极接的是什么负载,对于LED类负载,由于发管电流很小,因此上拉电阻的阻值可以用20k的,但是对于管子的集电极为继电器负载时,由于集电极电流大,因此上拉电阻的阻值最好不要大于4.7K,有时候甚至用2K的。对于PNP管,毫无疑问PNP管是低电平有效的,因此上拉电阻的阻值用100K以上的就行了,且管子的基极必须串接一个1~10K的电阻,阻值的大小要看管子集电极的负载是什么,对于LED类负载,由于发光电流很小,因此基极串接的电阻的阻值可以用20k的,但是对于管子的集电极为继电器负载时,由于集电极电流大,因此基极电阻的阻值最好不要大于4.7K。

4、对于驱动TTL集成电路,上拉电阻的阻值要用1~10K之间的,有时候电阻太大的话是拉不起来的,因此用的阻值较小。但是对于CMOS集成电路,上拉电阻的阻值就可以用的很大,一般不小于20K,我通常用100K的,实际上对于CMOS电路,上拉电阻的阻值用1M的也是可以的,但是要注意上拉电阻的阻值太大的时候,容易产生干扰,尤其是线路板的IC线条很长的时候,这种干扰更严重,这种情况下上拉电阻不宜过大,一般要小于100K,有时候甚至小于10K。

根据以上分析,上拉电阻的阻值的选取是有很多讲究的,不能乱用。

 

 

2. 51单片机的时钟(外部晶振)必须是12M吗?

STC89C52RC是没有内部时钟的,因此必须在外部配置晶振电路才能启动使用。

从数据手册中可以看到,STC89C52RC是可以支持0-80Mhz的晶振使用,但我们在实际项目中,是不会用到那么大的晶振。

首先需要明确:51单片机不是一定要用12M的晶振,11.05925M也行,18M也行,即一般来说35M以内的无源晶振(两脚的)都可以的。为什么常见的51单片机要用12M的晶振,是因为我们常说的51单片机是12分频的,如果选用12M晶振,如果是单指令周期的语句,刚好是1us,其他语句好似1us的整数倍,这样计算指令时间很方便。对于利用51单片机进行串口通讯的,一般会选用11.0592M晶振,因为对于9600,4800的波特率,11.0592M晶振计算时正好可以得到整数。

因此,在使用51单片机时,我们会一般选择这两种晶振:11.0592MHz和12M 。

  • 使用12Mhz晶振时,刚好是一个机器周期,也就是1US。在设计程序时,比较好计算。
  • 使用11.0592MHz时,串口通信波特率等运算中能够得到一个整数,计算的结构更加的精确和方便。

一个照顾时间,一个照顾波特率。具体情况看项目选择或个人需要选择。

相关扩展:51单片机时钟电路原理图

STC89C52单片机的内部有一个高增益反相振荡器,其输入端引脚为19引脚XTAL1,其输出端引脚为18引脚XTAL2,只要在这两个引脚之间跨接一颗无源晶振,再外加两个起振电容(一般可取15~33PF左右,该值主要取决于晶振负载CL),就可以构成一个稳定的自激振荡器。

 

 

3. 复位电路的接线

单片机复位通常可分为以下三种:

  • 上电复位
  • 手动复位(人为按下复位按键)、
  • 程序自动复位(如看门狗复位)

51单片机复位电路的工作原理

在时钟振荡器稳定工作的情况下,该引脚若由低电平上升到高电平并且持续2个机器周期(若晶振频率为12MHz,则两个机器周期为2us),则系统将实现一次复位操作。

现在咱们在说复位电路时,先默认为是在时钟振荡器稳定工作的前提下,要将RST引脚由低电平值为高电平然后高电平持续2us以上。单片机在RST高电平有效的第二个机器周期开始执行内部复位操作,并在RST变为低电平前的每个机器周期重复执行内部复位操作。直到RST变为稳定的低电平,程序便从0000H地址开始运行。

总之,复位电路要想正常工作,需要先满足以下条件:

■CPU正常工作
为什么CPU需要正常工作?因为复位操作需要设计PC寄存器, 这涉及到软件层面, 故所以需要CPU能正常功能才能进行复位

■晶振正常工作
为什么晶振需要正常工作?由3.2可知CPU需要正常功能, 那么CPU是靠什么正常工作的呢?显而易见CPU是靠晶振提供时钟频率的,所以晶振需要正常工作

■电源正常工作
试想一下,如果电源不稳定,电压波动范围很大, 是不是会影响CPU的运行?的确是这样子的,电源一定要稳定。

■复位电路并不是仅仅2个机器周期就一定能正常工作!!!

如果此时是有复位信号了, 但是电源还没到VCC,晶振还没起振?

这一定存在的,因为上电时,Vcc 的上升时间约为 10ms,而振荡器的起振时间取决于振荡频率,如晶振频率为 10MHz,起振时间为 1ms;晶振频率为 1MHz,起振时间则为 10ms。

因此,复位电路的设计时间一定要比设计手册上面的要长。

怎么设计复位电路?

目前市面上的复位电路大部分采用RC复位,这种方式成本低廉,稳定性好,被用于大部分的设计中。

 

RC电路如上所式,公式(充电)和图(包括充电和放电)如下所示:

式中:

  • vc用小写斜体来表示,因为它是随时间变化的,不是常数;
  • 指数写为时间(t)除以常数涛,涛称作时间常数,定义为:
    涛=RC (S)
  • t=0S 时, vc=0;
  • t=涛S 时, vc=0.632E;
  • t=2涛S 时, vc=0.865E;
  • t=3涛S 时, vc=0.993E;

原理图设计

按照我们上面说的理论,其实有两种方式,如下图所示,那么哪种才是我们想要的呢?下图两者的区别在于电容的电阻的位置不同, 由于电容两端的电压不能突变,当刚上电时,A电路为低电平,此时单片机复位,直到保持到1个时间常数后,NRST为高电平,而B电路,一上电为高电平,1个时间常数后NRST管脚为低电平, 并且一直保持低电平。

51单片机高电平复位,正常工作时RST引脚为低电平,因此为B图所示。

STM32单片机低电平复位,正常工作时RST引脚为高电平,因此为A图所示。

开机的时候为什么会复位?

在电路图中电容的大小是10uF电阻的大小是10k。所以根据公式可以算出电容充电到电源电压的0.7倍(5V*0.7=3.5V)需要的时间是T=RC=10K*10UF=0.1S。

也就是说在单片机启动的0.1S内电容两端的电压时在0~3.5V增加。这个时候10K电阻两端的电压为从5~1.5V减少串联电路各处电压之和为总电压。所以在0.1S内RST引脚所接收到的电压是5V~1.5V。在5V正常工作的51单片机中小于1.5V的电压信号为低电平信号而大于1.5V的电压信号为高电平信号。所以在开机0.1S内单片机系统自动复位RST引脚接收到的高电平信号时间为0.1S左右。

 

上图为上电自动复位电路, 如果需要加手动复位的话也和简单,只需要在AB电路的电容两端并联一个按键,当按键按下时,A图中的NRST为低电平,MCU复位,B电路为高电平。

扩展:STM32的RST的硬件复位条件

硬件复位,由STM32的数据手册可知,复位管脚低电平电压需要小于0.8V,输入脉冲时间为100ns。所以只需要在NRST管脚给小于0.8V的电压,持续时间为100ns就可以实现复位了。

在实际测试中,10K+0.1uF 电容,能维持0.8V以下的时间为275μs。满足要求。

 

 

4. 51单片机的BOOT电路

前面提到——EA引脚是程序存储器(ROM)控制引脚。

  • 当EA连接VCC时,芯片从内部ROM启动;
  • 当EA连接地时,芯片从外部ROM启动。

因此让EA上拉就行:

 

扩展:对比STM32的BOOT电路

STM32三种启动模式对应的存储介质均是芯片内置的,它们是:

1)主FLASH(Main Flash memory) = 芯片内置的FLASH

一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面。

2)SRAM(Embedded SRAM ) = 芯片内置的RAM区,就是内存啦。

既然是SRAM,自然也就没有程序存储的能力了,SRAM模式一般用于程序调试

假如我只修改了代码中一个小小的地方,然后就需要重新擦除整个Flash,比较的费时,可以考虑从这个模式启动代码(也就是STM32的内存中),用于快速的程序调试,等程序调试完成后,在将程序下载到SRAM中。

3)系统存储器(System memory) = 从系统存储器启动,

这种模式启动的程序功能是由厂家设置的。系统存储器是芯片内部一块特定的区域,STM32在出厂时,由ST在这个区域内部预置了一段BootLoader,也就是我们常说的ISP程序,这是一块ROM,出厂后无法修改。

一般来说,我们选用系统存储器启动模式时,是为了从串口下载程序,因为在厂家提供的BootLoader中,提供了串口下载程序的固件,可以通过这个BootLoader将程序下载到系统的Flash中。但是这个下载方式需要以下步骤:

  • Step1:将BOOT0设置为1,BOOT1设置为0,然后按下复位键,这样才能从系统存储器启动BootLoader
  • Step2:最后在BootLoader的帮助下,通过串口下载程序到Flash中
  • Step3:程序下载完成后,又有需要将BOOT0设置为GND,手动复位,这样,STM32才可以从Flash中启动

可以看到,利用串口下载程序还是比较的麻烦,需要跳帽跳来跳去的,非常的不注重用户体验。

 

 

STM32的BOOT电路原理图

一般BOOT0和BOOT1跳线都跳到0(地),只是在ISP下载的情况下,BOOT0=1,BOOT1=0,下载完成后,把BOOT0的跳线接回0,也就是BOOT0 = 0,BOOT1 = 0;

问题:STM32F103配置BOOT0和BOOT1直接接地还是经过电阻接地?

STM32的硬件设计指导也是建议BOOT0、1接电阻再接地的防止流入或者流出ICpin脚的电流不至于很大烧坏器件,而且可以起到抗干扰的作用,以下这个链接是某位博主由于BOOT没有接电阻造成的干扰影响STM32 BOOT0连接不当造成死机:

STM32的三种启动方式依靠BOOT0和BOOT1两个引脚的电平来决定,ST官方推荐的是串联10k电阻然后在接高电平或接地。
理论上这两个引脚只是在启动的时候用来选择启动方式,启动结束后对程序运行没有影响。
在一个项目中采用了STM32和GSM通信模块,调试中发现STM32工作及不稳定,非常容易受到GSM的射频干扰死机。几经周折终于找到问题的原因,PCB上STM32的BOOT0引脚是
直接接地的,没有串联10k电阻,造成STM32的死机。

 

转载自:

1. P0上拉电阻部分:文章来源:单片机仿真  原文: 一般的51单片机P0口为什么要加上拉电阻?

2. 时钟部分:https://zhuanlan.zhihu.com/p/616014638?utm_id=0

3. 百度知道

4. https://www.iotword.com/9731.html

5. 引脚相关:https://www.cnblogs.com/feng9exe/p/17613717.html

6. 复位电路:https://blog.csdn.net/FourLeafCloverLLLS/article/details/124437453

7. STM32的BOOT电路:https://blog.csdn.net/weixin_46061266/article/details/125459499

posted @ 2024-01-07 21:19  FBshark  阅读(211)  评论(0编辑  收藏  举报