嵌入式 | 51 单片机《手把手教你51单片机-C语言版》
单片机的内部资源 这里讲到的内部资源,是指作为单片机用户,单片机提供给我们可使用的东西。总结起来,主要是三大资源: Flash——程序存储空间,早期单片机是 OTPROM。 RAM——数据存储空间。 SFR——特殊功能寄存器。
KST-51 开发板原理图 单片机最小系统的三要素就是电源、晶振、复位电路,如图 2-1 所示
电源 目前主流单片机的电源分为 5V 和 3.3V 这两个标准,我们所选用的 STC89C52,它需要 5V 的供电系统,我们的开发板是使用 USB 口输出的5V 直流直接供电的。
从图 2-1 可以看到,供电电路在 40 脚和 20 脚的位置上, 40 脚接的是+5V,通常也称为 VCC 或 VDD,代表的是电源正极, 20 脚接的是 GND,代表的是电源的负极。 +5V 和 GND 之间还有个电容。
数字标号代表的才是单片机真正的引脚位置。一般情况下,这种双列直插封装的芯片,左上角是 1 脚,逆时针旋转引脚号依次增加,一直到右上角是最大脚位,我们现在选用的单片机一共是 40 个引脚,因此右上角就是 40(在表示芯片的方框的内部),如图 2-2 所示,大家要分清原理图引脚标号和实际引脚位置的区别。
晶振 晶振,又叫晶体振荡器,通电后不停振荡,作用是为单片机系统提供基准时钟信号,类似于我们部队训练时喊口令的人,单片机内部所有的工作都是以这个时钟信号为步调基准来进行工作的。 STC89C52 单片机的 18 脚和 19 脚是晶振引脚,我们接了一个 11.0592M 的晶振(它每秒钟振荡 11,059,200 次),外加两个 20pF 的电容,电容的作用是帮助晶振起振,并维持振荡信号的稳定。
复位电路 在图 2-1 左侧是一个复位电路,接到了单片机的 9 脚 RST(Reset)复位引脚上。单片机复位一般是 3种情况:上电复位、手动复位、程序自动复位。
假如我们的单片机程序有 100 行,当某一次运行到第 50 行的时候,突然停电了,这个时候单片机内部有的区域数据会丢失掉,有的区域数据可能还没丢失。那么下次打开设备的时候,我们希望单片机能正常运行,所以上电后,单片机要进行一个内部的初始化过程,这个过程就可以理解为上电复位,上电复位保证单片机每次都从一个固定的相同的状态开始工作。这个过程跟我们打开电脑电源开电脑的过程是一致。当我们的程序运行时,如果遭受到意外干扰而导致程序死机,或者程序跑飞的时候,我们就可以按下一个复位按键,让程序重新初始化重新运行,这个过程就叫做手动复位,最典型的就是我们电脑的重启按钮。当程序死机或者跑飞的时候,我们的单片机往往有一套自动复位机制,比如看门狗,具体应用以后再了解。在这种情况下,如果程序长时间失去响应,单片机看门狗模块会自动复位重启单片机。还有一些情况是我们程序故意重启复位单片机电源、晶振、复位构成了单片机最小系统的三要素,也就是说,一个单片机具备了这三个条件,就可以运行我们下载的程序了,其他的比如 LED 小灯、数码管、液晶等设备都是属于单片机的外部设备,即外设。最终完成我们想要的功能就是通过对单片机编程来控制各种各样的外设实现的。
二、点亮LED小灯LED(light-emitting diode),即发光二极管,俗称 LED 小灯。板子上用的是普通的贴片发光二极管。这种二极管通常的正向导通电压是 1.8V 到 2.2V 之间,工作电流一般在 1mA~20mA 之间。其中,当电流在 1mA~5mA 之间变化时,随着通过 LED 的电流越来越大,我们的肉眼会明显感觉到这个小灯越来越亮,而当电流从5mA~20mA 之间变化时,我们看到的发光二极管的亮度变化就不是太明显了。当电流超过 20mA 时, LED 就会有烧坏的危险了,电流越大,烧坏的也就越快。所以我们在使用过程中应该特别注意它在电流参数上的设计要求。 图 2-3 是我们开发板上的 USB 接口电路,通过 USB 线,电脑给我们的开发板供电和下载程序以及实现电脑和开发板之间的通信。
USB 座共有 6 个接口,其中 2 脚和 3 脚是数据通信引脚, 1 脚和 4 脚是电源引脚, 1 脚是 VCC 正电源, 4 脚是 GND 即地线。 5 脚和 6 脚是外壳,直接接到了 GND 上。 我们现在主要来看 1 脚 VCC 和 4 脚 GND。 1 脚通过 F1(自恢复保险丝)接到右侧,在正常工作的情况下,保险丝可以直接看成导线,因此左右两边都是 USB 电源+5V,自恢复保险丝的作用是,当你后级电路哪个地方有发生短路的时候,保险丝会自动切断电路,保护开发板以及电脑的 USB 口,当电路正常后,保险丝会恢复畅通,正常工作。
右侧有 2 条支路,第一条是在+5V 和 GND 接了一个 470uF 的电容, 电容是隔离直流的,所以这条支路是没有电流的。我们把第二条支路摘取出来就是如图 2-4 这个样子 发光二极管是二极管中的一种,因此和普通二极管一样,这个二极管也有阴极和阳极,习惯上也称之为负极和正极。原理图里的 LED 画成这样方便在电路上观察,方向必须接对了才会有电流通过让 LED 小灯发光。刚才提到了我们接入的 VCC 电压是 5V,发光二极管自身压降大概是 2V,那么在右边 R34 这个电阻上承受的电压就是 3V。那么现在我们要求电流范围是 1~20mA 的话,就可以根据欧姆定律 R=U/I,把这个电阻的上限和下限值求出来。
U=3V,当电流是 1mA 的时候,电阻值是 3K;当电流是 20mA 的时候,电阻值是 150欧,也就是 R34 的取值范围是 150~3K 欧姆。这个电阻值大小的变化,直接可以限制整条通路的电流的大小,因此这个电阻我们通常称之为“限流电阻”。在图 2-3 中,我们用的电阻是1K,这条支路电流的大小为 3 mA。 而这个发光二极管在这里的作用,是作为电源指示灯的,使用 USB 线将开发板和电脑连起来,这个灯就会亮了。
同理,我们在板子后级开关控制的地方,又添加了一个 LED10 发光二极管,作用就是当我们打开开关时,这个二极管才会亮起,如图 2-5 所示。 这里的开关虽然只有一个,但是是 2 路的, 2 路开关并联能更好的确保给后级提供更大的电流。电容 C19 和 C10,都是隔离断开直流的。
下面,我们把图 2-4 进行一下变化,把右侧的 GND 去掉,改成一个单片机的 IO口,如图 2-6 所示。 图 2-4 由于电源从正极到负极有电压差,并且电路是导通的,所以就会有电流通过, LED小灯因为有了电流通过,所以就会直接发光。我们把右侧的原 GND 处接到单片机 P0.0 引脚上,那么如果我们单片机输出一个低电平,也就是跟 GND 一样的 0V 电压,就可以让 LED小灯和图 2-4 一样发光了。
因为我们的单片机是可以编程控制的,我们可以让 P0.0 这个引脚输出一个高电平,就是跟 VCC 一样的 5V 电压,那么这个时候,左侧 VCC 电压和右侧的 P0.0 的电压是一致的,那就没有电压差,没有电压差就不会产生电流,没有电流 LED 小灯就不会亮,也就是会处于熄 灭状态。下面,我们就用我们的编程软件来实现控制小灯的亮和灭。
4根地址线控制LED灯。74HC138译码器控制LED区域的总开关。 ADDR0、ADDR1、ADDR2、ADDR3。
当地址线表示 0 时,是点阵灯管第一行。P0=0时,即00000000时,第一行全部亮。 ADDR0=0、ADDR1=0、ADDR2=0、ADDR3=0当地址线表示 1 ~ 7 时,是矩阵灯管第二行至第八行。当地址线表示 8 时,是数码管最右边的数字区域。P0=0时,即00000000时,第一行全部亮。 ADDR0=0、ADDR1=0、ADDR2=0、ADDR3=1当地址线表示 9 ~ 13 时,是液晶管自右边数 1 ~ 5 的数字区域。当地址线表示 14 时,是发光二极管区域。P0=0时,即00000000时,第一行全部亮。 ADDR0=0、ADDR1=1、ADDR2=1、ADDR3=1。其中,每个单元的行可以通过控制p0的值控制小灯的亮灭。主要原理就是小灯的两端产生电势差,从而产生电流。
KST-51单片机 点亮LED小灯代码
#include <reg52.h> //包含特殊功能寄存器定义的头文件 sbit LED = P0^0; //位地址声明,注意: sbit 必须小写、 P 大写! P0.0接口 sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; void main() { ENLED = 0; // 地址线为 1110 即14 。表示单片机上的发光二极管。 ADDR3 = 1; ADDR2 = 1; ADDR1 = 1; ADDR0 = 0; LED = 0; //点亮小灯 while (1); //程序停止在这里 }