单片机最小系统,或者称为单片机最小应用系统,是指用最少的元件组成的单片机可以工作的系统.对51系列单片机来说,最小系统一般应该包括:单片机、晶振电路、复位电路.
一.先说一下51单片机的引脚:
- 总线型 DIP40 引脚封装
- 电源及时钟引脚, 4 个
VCC:电源接入引脚
VSS:接地引脚
XTAL1:晶体振荡器接入的一个引脚
XTAL2:晶体振荡器接入的另外一个引脚
- 控制线引脚, 4 个
RST/VPD:复位信号输入引脚/备用电源输入引脚;ALE/PROG:地址锁存允许信号输出引脚/编程脉冲输入引脚
EA/VPP:内外存储器选择引脚,当接高电平时,单片机在复位后从内部ROM的0000H开始执行;当接低电平时,复位后直接从外部ROM的0000H开始执行
PSEN:外部程序存储器选择通信号输出引脚
- 并行 I/O 引脚, 32 个,分 4 个 8 位口
P0.0 ~ P0.7:一般 I/O 口引脚或数据/低位地址总线复用引脚
P1.0 ~ P1.7:一般 I/O 口引脚
P2.0 ~ P2.7:一般 I/O 口引脚或高位地址总线引脚
P3.0 ~ P3.7:一般 I/O 口引脚或第二功能引脚
二.下面是在protues环境下搭建的一个51单片机的最小系统电路图. Proteus软件是英国Labcenter electronics公司出版的EDA工具软件。主要是可以进行单片机及外围器件的仿真,在编译方面,它也支持IAR、Keil和MATLAB等多种编译.
- 晶振电路:
单片机系统里都有晶振,在单片机系统里晶振作用非常大,全程叫晶体振荡器,他结合单片机内部电路产生单片机所需的时钟频率,单片机晶振提供的时钟频率越高,那么单片机运行速度就越快典型的晶振取11.0592MHz(方便串口波特率设置)或者12MHz(产生精确的uS级时歇,方便定时操作),电容这里选择22pf(15~33pF都行,经验值),并且电容离晶振越近越好,晶振离单片机越近越好,的瓷片电容或者无极性的贴片电容,具体根据制作的电路板类型选择
- 复位电路:
在单片机系统在运行中,当受到环境干扰出现程序跑飞的时候,按下复位按钮内部的程序自动从头开始执行。51单片机要复位只需要在RST引脚接个高电平持续2US就可以实现。
复位电路的工作原理如下:
在电路图中,电容的的大小是10uF,电阻的大小是10k。根据公式,可以算出电容充电到电源电压的0.7倍(单片机的电源是5V,所以充电到0.7倍即为3.5V),需要的时间是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左右)。按键按下的时候也会会复位,在单片机启动0.1S后,电容C两端的电压持续充电为5V,这是时候10K电阻两端的电压接近于0V,RST处于低电平所以系统正常工作。当按键按下的时候,开关导通,这个时候电容两端形成了一个回路,电容被短路,所以在按键按下的这个过程中,电容开始释放之前充的电量。随着时间的推移,电容的电压在0.1S内,从5V释放到变为了1.5V,甚至更小。根据串联电路电压为各处之和,这个时候10K电阻两端的电压为3.5V,甚至更大,所以RST引脚又接收到高电平。单片机系统自动复位。
- 下载电路:
我们可以把P3.0(RXD) ,P3.1(TXD)和电源地接在一个3p的header上,方便程序的下载和串口通行。
三.最后简单说一下单片机输出驱动能力的问题:
单片机的引脚,可以用程序来控制输出高、低电平, 单片机输出低电平时,将允许外部器件,向单片机引脚内灌入电流,这个电流,称为“灌电流”,外部电路称为“灌电流负载”,单片机输出高电平时,则允许外部器件,从单片机的引脚拉出电流,这个电流,称为“拉电流”,外部电路称为“拉电流负载”,每个单个的引脚,输出低电平的时候,允许外部电路,向引脚灌入的最大电流为 10 mA;每个 8 位的接口(P1、P2 以及 P3),允许向引脚灌入的总电流最大为 15 mA,而 P0 的能力强一些,允许向引脚灌入的最大总电流为 26 mA;全部的四个接口所允许的灌电流之和,最大为 71 mA。而当这些引脚“输出高电平”的时候,单片机的“拉电流”能力可以说是太差了,竟然不到 1 mA。结论就是:单片机输出低电平的时候,驱动能力尚可,而输出高电平的时候,就没有输出电流的能力。设计单片机的负载电路,应该采用“灌电流负载”的电路形式,以避免无谓的电流消耗。所以这里我们采用“灌电流”的方式接一个LED灯。此时,一个51单片机的最小系统就搭建好了,开始单片机的学习之旅~~~
附一段小程序,通过P1.0控制一个LED的闪烁
#include
sbit led=P1^0;
void delay(unsigned int i)
{
unsigned int j;
unsigned char k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void main(void)
{
while(1)
{
led=~led;
delay(2000);
}
}