LED接口是第一件事,在开始使用任何微控制器时,人们都会尝试这样做。因此,在本教程中,我们将使LED与8051微控制器接口,并将编写一个C程序来使LED闪烁。我们使用了ATMEL生产的非常流行的8051系列微控制器AT89S52。
在详细介绍之前,我们应该对微控制器AT89S52有所了解。它是40针微控制器,具有4个端口(P0,P1,P2,P3),每个端口有8个针脚。从软件的角度来看,我们可以将每个端口视为8位寄存器。每个引脚具有一条输入/输出线,这意味着每个引脚都可以用于输入和输出,即从某些设备(如传感器)读取数据或将其输出提供给某些输出设备。某些引脚具有双重功能,下面的引脚图中的括号中已提及。双重功能,例如中断,计数器,计时器等。
AT89S52具有两种类型的存储器,第一类是具有256字节存储器的RAM,第二种是具有8k字节存储器的EEPROM(电可擦可编程只读存储器)。RAM用于在程序执行期间存储数据,而EEPROM用于存储程序本身。EEPROM是我们用来将程序刻录到其中的闪存。
电路图和说明
我们正在使用端口1的引脚一连接LED。在嵌入式C编程中,我们可以使用P1_0访问端口1的PIN 1。我们已经将频率为11.0592MHz的晶体振荡器连接到PIN 19和18,即XTAL1和XTAL2。晶体振荡器用于生成时钟脉冲,而时钟脉冲用于提供时序计算的平均值,这对于同步所有事件是必不可少的。这些类型的晶体几乎用在计算机,手表等各种现代数字设备中。最常用的晶体是石英。这是一个谐振振荡器电路,电容器用于振荡晶体,因此我们在这里连接了22pf电容器。您可以阅读有关“谐振电路”的更多信息。
上图显示了LED与8051微控制器89S52接口的电路图。 引脚31(EA)连接到Vcc,这是一个低电平有效引脚。当我们不使用任何外部存储器时,应将其连接到Vcc。引脚30(ALE)和引脚29(PSEN)用于将微控制器连接到外部存储器,而引脚31告诉微控制器在接地时要使用外部存储器。我们没有使用任何外部存储器,因此我们将Pin31连接到Vcc。
引脚9(RST)是复位PIN,用于复位微控制器,并从头开始重新编程。连接到高电平时,它将使微控制器复位。我们使用了标准的复位电路,10k欧姆电阻和1uF电容器来连接RST引脚。
现在,这里有趣的部分是我们将LED反向连接,这意味着负脚与微控制器PIN相连,因为微控制器没有提供足够的功率来使LED发光,因此这里的LED以负逻辑运行,例如引脚P1_0为1时。然后将LED调为OFF,并且当引脚输出为0时,LED将点亮。当PIN输出为0时,其行为类似于接地并且LED发光。
代码说明
标头REGX52.h已包括在内,以包括基本的寄存器定义。嵌入式C中有很多类型的变量和常量,例如int,char,unsigned int,float等,您可以轻松地学习它们。在这里,我们使用的范围是0到65535的无符号int。我们使用“ for循环”来创建延迟,以便LED点亮一段时间(P1_0 = 0,负LED逻辑),然后熄灭(P1_0 = 1) ,负LED逻辑)以延迟时间。通常,当“ for循环”运行1275次时,会延迟1毫秒,因此我们创建了用于创建DELAY的“ delay”函数,并从主程序(main())中对其进行了调用。从主函数调用“延迟”函数时,我们可以传递延迟时间(以毫秒为单位)。在程序中,“ While(1)”表示程序将无限执行。
我简要地解释一下,“ for”循环的1275次运行如何产生1ms的延迟:
在8051中,一个机器周期需要执行12个晶体脉冲,因此我们使用了11.0592Mhz晶体。
因此,一个机器周期所需的时间:12 / 11.0592 = 1.085us
因此1275 * 1.085 = 1.3ms,“ for”循环的1275倍会产生近1ms的延迟。
由“ C”程序产生的确切时间延迟很难计算,当从示波器(CRO)测量时,(j = 0; j <1275; j ++)给出的延迟将近1ms。
因此,我们可以通过简单地将LED与8051微控制器接口来理解,通过简单的编码,我们就可以使用微控制器通过软件(编程)进行交互和控制硬件。我们也可以通过编程来操纵微控制器的每个端口和引脚。