单片机原理及技术(三)—— AT89S51单片机(二)(C51编程)

目录

一、AT89S51单片机的并行I/O端口

1.1 P0口

1.2 P1口

1.3 P2口

1.4 P3口

二、时钟电路与时序

2.1 时钟电路设计

2.1.1 内部时钟方式

2.1.2 外部时钟方式

2.1.3 时钟信号的输出

2.2 机器周期、指令周期与指令时序

三、复位操作和复位电路

3.1 复位操作

3.2 复位电路设计

四、AT89S51单片机的最小应用系统

五、看门狗定时器(WDT)的使用

六、低功耗节电模式

6.1 特殊功能寄存器PCON

七、AT89S51单片机与AT89S52单片机的差异

7.1 AT89S52单片机的程序存储器空间

7.2 AT89S52单片机的数据存储器空间


一、AT89S51单片机的并行I/O端口

1.1 P0口

AT89S51的P0口是一个通用的I/O口,可以用于输入和输出。每个引脚都可以通过软件控制为输入或输出模式。

P0口的工作原理是通过对P0寄存器的读写操作来控制P0口的引脚。

  1. 输出模式:当P0口配置为输出模式时,可以通过对P0寄存器进行写操作来控制引脚的电平状态。写入“0”将相应引脚置为低电平(0V),写入“1”将相应引脚置为高电平(Vcc,即供电电压),实现对外部设备的控制。

  2. 输入模式:当P0口配置为输入模式时,可以通过对P0寄存器进行读操作来获取外部设备输入的电平状态。读取P0寄存器的值,可以得知相应引脚的电平,如果读取值为“0”,表示引脚为低电平,如果读取值为“1”,表示引脚为高电平。

1.2 P1口

AT89S51的P1口是一个具有8个引脚的I/O口,可以用于输入和输出操作,可以配置为输入或输出模式,可以使用上拉电阻推挽电路配置。

P1口也是一种数字输入/输出(I/O)端口,其工作原理与P0口类似,但具有一些特定的功能和特性。

P1口通常可用于各种用途,如外部中断,定时器/计数器的输入/输出。以下是P1口的一般工作原理:

  1. 输入模式:在输入模式下,P1口可以接收外部电路传输的电平信号。当外部电路输出低电平(0V)时,P1口会读取到一个逻辑低电平(0);当外部电路输出高电平(3.3V或5V)时,P1口会读取到一个逻辑高电平(1)。这样,通过读取P1口的电平状态,可以判断外部设备的状态或传送外部设备的数据。

  2. 输出模式:在输出模式下,P1口可以向外部电路发送电平信号。通过将P1口设置为输出模式,并向其写入逻辑低电平(0)或逻辑高电平(1),可以控制外部电路的工作状态或发送数据。

1.3 P2口

AT89S51的P2口是一个8位的双向I/O口,可以用于输入和输出。P2口的特殊功能是通过该端口的位定义来选择。默认情况下,P2口的所有引脚都是作为GPIO引脚使用。

P2口的默认状态是输入模式。要将P2某一位设置为输出模式,只需将相应的P2寄存器位设置为1即可。

  1. 当P2口设置为输出模式时,可以通过对P2寄存器位的设置来控制相应的引脚输出高电平(1)或低电平(0)。
  2. 当P2口设置为输入模式时,可以通过对P2寄存器位的读取来获取相应引脚的输入状态。例如,读取P2寄存器的P2.0位,可以获取P2.0引脚的输入状态(高电平或低电平)。

注意:

  • 在将P2口的某一位设置为输出模式时,要确保相应引脚上的外部设备可以接受输出信号,并且要注意电流和电压等规格的限制。

1.4 P3口

P3口的引脚分别为P3.0~P3.7,可以通过程序配置为输入或输出。对于输出模式,可以通过设置对应的P3寄存器来输出高电平或低电平电压。对于输入模式,可以通过读取P3寄存器的状态来获取引脚的电平状态。

注意:

  • P3口同时也作为一些特殊功能的引脚,如外部中断、定时器/计数器输入等。

P3口是AT89S51单片机的一个8位双向口。它可以通过配置为输入或输出模式来进行相应的操作。

  1. 在输出模式下,可以通过设置P3口的相应位来输出高电平或低电平电压。对于P3.0至P3.7,可以使用软件指令来设置或清除相应的位。设置位将引脚拉高为高电平,而清除位将引脚拉低为低电平。
  2. 在输入模式下,P3口可以用来读取外部设备或传感器的状态。通过读取P3口的相应位,程序可以获取到对应引脚的电平状态(高电平或低电平)。
  3. 除了一般的输入/输出功能,P3口还有一些特殊功能。其中,P3.2和P3.3可以用作外部中断引脚,用于接收外部中断信号。P3.4和P3.5可以作为定时器/计数器的输入引脚。这些功能需要在使用之前进行相应的配置,以使P3口能够正确地工作。

二、时钟电路与时序

下面是AT89S51的时钟电路和时序相关的特点:

时钟电路: AT89S51的时钟电路由晶体振荡器和相关外部元件组成。它支持使用外部晶体振荡器或外部时钟源作为时钟信号。晶体振荡器接口可以接入一个8MHz陶瓷晶体,或外部时钟信号

时序特点: AT89S51的时序特点包括以下几个方面:

  1. 时钟频率:AT89S51的工作时钟频率为最高为33MHz。时钟频率由供电电压和晶体振荡器的频率决定。
  2. 存取时间:AT89S51的存取时间(即指令执行时间)为1个机器周期。机器周期是时钟周期与机器指令执行时间之和。以8MHz的晶振为例,机器周期时间为1/8MHz=125ns。
  3. 中断响应时间:AT89S51的中断响应时间为2机器周期。即在发生中断请求后,芯片最多需要2个机器周期才能进入中断服务程序。
  4. 复位时间:AT89S51的复位时间为2机器周期。即在复位引脚(RST)变为高电平后,芯片最多需要2个机器周期才能执行正常的程序。

2.1 时钟电路设计

2.1.1 内部时钟方式

AT89S51单片机的内部时钟方式包括两种:晶振模式RC振荡模式

  1. 晶振模式:在晶振模式下,单片机使用外部晶体振荡器作为主时钟源。晶体振荡器通过外部晶体与XTAL1XTAL2引脚连接,提供稳定的时钟信号。晶振模式具有更高的精度和稳定性,适用于对时钟要求较高的应用。

  2. RC振荡模式:在RC振荡模式下,单片机使用内部RC振荡电路作为主时钟源。RC振荡电路包括一个电容和一个电阻,通过内部电阻和电容的组合来产生时钟信号。RC振荡模式成本低廉,但时钟信号精度和稳定性较差,适用于对时钟要求不那么严格的应用。

2.1.2 外部时钟方式

AT89S51单片机支持两种外部时钟方式:晶体振荡器模式外部时钟源模式

  1. 晶体振荡器模式: 在晶体振荡器模式下,需要使用一个晶体振荡器将外部时钟信号输入到单片机的XTAL1和XTAL2引脚。晶体的频率可以根据实际需求选择,常见的频率为11.0592MHz或12MHz。单片机通过内部的时钟电路将晶体振荡器输出的时钟信号分频,生成系统时钟,供CPU和其他模块使用。

  2. 外部时钟源模式: 在外部时钟源模式下,可以直接将外部时钟源信号输入到单片机的XTAL1引脚,而XTAL2引脚保持悬空或接地。外部时钟源的频率可以根据实际需求选择,一般情况下,输入频率应小于单片机支持的最大外部时钟频率。

以下是一个使用晶体振荡器模式的示例程序:

#include <REG51.h>

void main()
{
    // 设置晶体振荡器的频率为11.0592MHz
    OSCXCN = 0x67;    // 配置晶体振荡器模式和频率
    while (!(OSCXCN & 0x80));    // 等待晶体振荡器稳定

    // 设置系统时钟为晶体振荡器模式
    AUXR &= 0xF7;    // 清除定时器2的时钟源选项位

    // 其他代码...

    while (1)
    {
        // 主循环
    }
}

2.1.3 时钟信号的输出

AT89S51单片机的时钟信号输出主要有两个方式:XTAL2引脚输出P3.4引脚输出

  1. XTAL2引脚输出: 在晶体振荡器模式下,XTAL2引脚可以用作时钟信号的输出。单片机内部的时钟电路通过分频晶体振荡器的时钟信号生成系统时钟,系统时钟经过处理后就会驱动XTAL2引脚输出相应的时钟信号。XTAL2引脚的输出频率通常是输入时钟频率的一半

  2. P3.4引脚输出: P3.4是AT89S51单片机的一个通用I/O口,可以通过编程将其配置为时钟信号的输出。需要设置P3.4为输出模式,并将相应的寄存器设置为输出高电平或低电平,来控制P3.4引脚输出时钟信号。需要注意的是,P3.4引脚是具有上拉电阻的,因此在将其配置为输出低电平时,需要将其外接到地,以确保输出为低电平。

以下是使用P3.4引脚作为时钟信号输出的示例程序:

#include <REG51.h>

void main()
{
    // 将P3.4引脚配置为输出模式
    P3 &= 0xEF;    // 将P3.4引脚置为0,即输出低电平
    P3 |= 0x10;    // 将P3.4引脚置为1,即输出高电平

    // 其他代码...

    while (1)
    {
        // 主循环
    }
}

2.2 机器周期、指令周期与指令时序

AT89S51单片机的机器周期、指令周期和指令时序如下:

  1. 机器周期: AT89S51单片机使用外部时钟源进行时钟信号的驱动。机器周期取决于所选择的外部时钟源频率(晶振频率)。一般情况下,AT89S51的机器周期为12个时钟周期。例如,如果使用12MHz的晶振,那么每个机器周期的时钟周期就是1微秒(1/12MHz)

  2. 指令周期: AT89S51的指令周期通常为12个机器周期。因此,在使用12MHz晶振的情况下,每个指令周期的时钟周期为12微秒。每条指令按照这个指令周期来执行。

  3. 指令时序: AT89S51的指令时序是由内部控制单元生成的。它定义了每个指令在执行时的各个阶段,并且需要按照时钟信号进行同步。在每个指令周期内,有不同的阶段,如取指令、译码、执行、存储结果等。

三、复位操作和复位电路

3.1 复位操作

在AT89S51单片机中,复位操作可以通过以下方法进行:

  1. 外部电源复位:将单片机的Vcc电压降至低电平(通常为0V)并持续一段时间,然后恢复到正常电压(通常为5V),即可触发复位操作。

  2. 内部复位:通过设置单片机内部的复位标志位来触发复位操作。可以通过编写程序来实现内部复位,具体代码如下:

#include <8051.h>

void main()
{
   EA = 0;      // 关闭总中断
   RSTFR = RSTFR | 0x01;   // 设置复位标志位
   EA = 1;      // 打开总中断

   while(1)
   {
       // 程序运行主体
   }
}

在以上代码中,通过设置RSTFR(复位标志寄存器)的最低位为1,即可触发复位操作。设置复位标志位之前需要先关闭总中断(EA=0),设置完成后再打开总中断(EA=1)。

下面是在AT89S51单片机复位时,部分片内寄存器的状态表格:

寄存器名称复位后状态
P00xFF
P10xFF
P20xFF
P30xFF
PSW0x00
ACC0x00
B0x00
SP0x07
DPL0x00
DPH0x00
IP0x00
IE0x00
TMOD0x00
TCON0x00
TH00x00
TL00x00
TH10x00
TL10x00
SCON0x00
SBUF0x00
IE0x00
IP0x00
EA0x00
RSTFR0x00
T2CON0x00
RCAP2L0x00
RCAP2H0x00
TL20x00
TH20x00

上表列出了复位后的部分寄存器状态,其中:

  • 端口寄存器(P0, P1, P2, P3)的状态为0xFF,表示所有引脚为高电平输入状态;
  • 程序状态字寄存器(PSW)的状态为0x00,表示所有标志位都被清零;
  • 累加器(ACC)和B寄存器的状态为0x00,表示内容被清零;
  • 堆栈指针(SP)的状态为0x07,指向上一次使用的栈顶位置;
  • 定时器、串口等相关寄存器的状态为0x00,表示所有配置被清零。

3.2 复位电路设计

AT89S51单片机的复位电路一般由三部分组成:复位电路晶振电路电源电路

  1. 复位电路:复位电路主要是用来实现单片机的复位功能,确保在单片机上电或外部复位信号发生时,单片机能正常地进行初始化操作。它通常由一个复位电路芯片(如MAX809)和相关的电阻和电容组成。复位电路芯片有两个功能引脚,一个是复位输入引脚(RST),用于接收复位信号;另一个是复位输出引脚(RESET),用于输出复位信号给单片机。

  2. 晶振电路:晶振电路主要是用于提供稳定的时钟信号给单片机。AT89S51单片机通常需要外接一个晶振(如12MHz),晶振电路由晶振、两个电容和两个相关电阻组成。其中,晶振接在单片机的两个时钟输入引脚(XTAL1和XTAL2),两个电容和两个电阻分别连接在晶振和地之间,用于稳定晶振的工作。

  3. 电源电路:电源电路主要是用于为单片机提供稳定的电源。一般来说,AT89S51单片机可以工作在5V的电源电压下。电源电路通常由一个稳压芯片(如7805)和相关的电容和二极管组成。稳压芯片负责将输入的电源电压(如9V)稳压为5V输出给单片机,相关的电容和二极管则用于滤波和保护。

四、AT89S51单片机的最小应用系统

AT89S51单片机的最小应用系统是只包含单片机、晶振和复位电路的系统。以下是一个基本的最小应用系统的组成部分:

  1. 单片机:AT89S51单片机是一款8位微控制器,具有4KBFlash程序存储器128字节RAM4个I/O口

  2. 晶振:单片机需要一个外部晶振提供时钟信号。AT89S51单片机通常使用12MHz的晶振作为系统时钟,可以通过晶振来控制单片机的运行速度。

  3. 复位电路:单片机需要一个复位电路来确保在系统上电或异常情况下单片机能够正常复位并重新启动。复位电路通常包括一个复位按钮和一个电容,以及一个电阻用于提供复位信号。

AT89S51单片机的最小应用系统,如图所示:

五、看门狗定时器(WDT)的使用

AT89S51单片机具有可编程的看门狗定时器(WDT),用于监控和恢复系统错误。WDT通过一个计时器来定期检查系统是否正常运行,并在检测到故障时自动复位系统。

WDT的工作原理如下:

  • 当WDT启用后,一个内部计数器开始计时。
  • 系统中的程序需要定期喂狗,即在计数器溢出之前重置WDT。
  • 如果WDT计数器在指定的时间内没有被重置(喂狗),则它会溢出。
  • 溢出后,WDT会发送一个复位信号,导致系统重新启动。

以下是使用AT89S51单片机的WDT的详细步骤

  1. 设置WDT时钟源和分频系数:

    • WDT的时钟源可以选择为内部RC振荡器(大约为1.1 MHz)或外部晶体振荡器。在AT89S51中,默认使用内部RC振荡器作为WDT的时钟源。
    • 分频系数可以通过寄存器WDTPSx(WDT Prescaler Select)来设置。该寄存器有4个位(WDTPS3-0),用于选择分频系数。例如,WDTPS3=0,WDTPS2=1,WDTPS1=0,WDTPS0=1,表示使用1:16的分频系数。
  2. 启动WDT定时器:

    • 设置寄存器WDTCR(Watchdog Timer Control Register)的WDEN位为1,以启动WDT定时器。
  3. 定时器复位操作:

    • 在WDT定时器开始计时后,在喂狗周期内必须定期重置WDT计数器,以防止溢出。
    • 在AT89S51单片机中,重置WDT的方法是依次写入0x5A和0xA5两个特定字节到WDTCR寄存器中。
  4. 喂狗操作:

    • 系统中的程序需要定期喂狗,即在WDT计数器溢出之前重置WDT。
    • 喂狗操作可以通过定期重置WDTCR寄存器来完成,即写入0x5A和0xA5两个字节。
  5. 关闭WDT:

    • 如果不再需要WDT,可以将寄存器WDTCR的WDEN位设置为0,以关闭WDT定时器。

注意:

  • WDT的定时器周期取决于时钟源和分频系数的选择。根据AT89S51单片机的规格说明,WDT的最小定时周期为0.05秒(使用内部RC振荡器和分频系数1:2)。

下面是AT89S51单片机启动和清零WDT的代码示例

#include <reg51.h>

// 启动WDT
void startWDT() {
    // 设置WDT的时钟源和分频系数
    // 使用内部RC振荡器和1:16的分频系数
    WDTPS3 = 0;
    WDTPS2 = 1;
    WDTPS1 = 0;
    WDTPS0 = 1;

    // 启动WDT定时器
    WDEN = 1;
}

// 清零WDT
void resetWDT() {
    // 定期喂狗,重置WDT计数器
    WDTCR = 0x5A;
    WDTCR = 0xA5;
}

void main() {
    startWDT(); // 启动WDT

    while(1) {
        // 主循环代码

        resetWDT(); // 定期清零WDT计数器
    }
}

在上述代码中,startWDT()函数用于配置和启动WDT定时器,resetWDT()函数用于定期清零WDT计数器。在主循环中,可以执行其他任务,并在适当的位置调用resetWDT()函数,以确保WDT计数器被重新设置。

六、低功耗节电模式

AT89S51单片机有两种低功耗节电模式,分别是空闲模式掉电保持模式

  1. 空闲模式(Idle Mode):在空闲模式下,CPU停止执行指令,但系统时钟和外设时钟仍然运行。其他外围设备和中断能够正常工作。通过设置PSM0和PSM1位来选择空闲模式。在空闲模式下,CPU通过中断来唤醒。

  2. 掉电保持模式(Power-Down Mode):在掉电保持模式下,整个系统的时钟都被关闭,并且外设也停止工作。通过设置PD位来选择掉电保持模式。在该模式下,只有外部中断能够唤醒单片机。

6.1 特殊功能寄存器PCON

特殊功能寄存器PCON(Power Control)是用于控制微控制器的低功耗模式的寄存器。PCON寄存器可以实现空闲模式和掉电保持模式。

  • 通过设置PCON寄存器中的IDL位(Idle)为1,可以进入空闲模式。在空闲模式下,CPU会暂停执行,直到接收到中断信号或其他事件唤醒系统。
  • 通过设置PCON寄存器中的PD位(Power Down)为1,可以进入掉电保持模式。在掉电保持模式下,系统会保持低功耗状态,直到外部触发事件唤醒系统。

PCON寄存器还包含其他控制位,如控制系统复位的软件复位位(软件复位)和控制复位原因常亮(复位原因)。通过设置这些位,可以实现更多的控制和监测功能。

七、AT89S51单片机与AT89S52单片机的差异

AT89S51和AT89S52是两种常见的8位单片机,它们都是基于8051内核的。下面是它们之间的一些主要差异:

  1. 存储器容量:AT89S51具有4KB内部闪存存储器,而AT89S52具有8KB内部闪存存储器。这意味着AT89S52具有更大的存储容量,可以存储更多的程序代码和数据。

  2. I/O引脚数量:AT89S51具有32个I/O引脚,而AT89S52具有40个I/O引脚。这意味着AT89S52具有更多的可编程I/O引脚,可以连接更多的外部设备和传感器。

  3. 定时器/计数器:AT89S51具有2个定时器/计数器,而AT89S52具有3个定时器/计数器。这意味着AT89S52具有额外的定时器/计数器功能,可以支持更多的计时和计数操作。

  4. 外部中断:AT89S51具有2个外部中断引脚(INT0和INT1),而AT89S52具有3个外部中断引脚(INT0、INT1和INT2)。这意味着AT89S52具有更多的外部中断功能,可以支持更复杂的中断处理。

  5. 存储器扩展:AT89S51支持8位存储器扩展,而AT89S52支持16位存储器扩展。这意味着AT89S52可以连接更大容量的外部存储器,如RAM和ROM。

7.1 AT89S52单片机的程序存储器空间

AT89S52单片机的程序存储器空间是64KB(65536字节)。其中包含了8KB的Flash程序存储器和56KB的扩展存储器。Flash程序存储器用于存储程序代码,扩展存储器用于存储数据和其他信息。程序存储器的地址范围从0x0000到0x1FFF。

以下是AT89S52单片机的6个中断源及其对应的中断入口地址:

中断源入口地址
外部中断0 (INT0)

0x0003H

外部中断1 (INT1)0x000BH
定时器/计数器0中断 (T0)0x0013H
定时器/计数器1中断 (T1)0x001BH
串口中断 (UART)0x0023H

ADC中断 (ADC)

或 定时器/计数器2中断 (T2)

0x002BH

7.2 AT89S52单片机的数据存储器空间

AT89S52单片机的数据存储器空间包括两部分:片内RAM片外扩展RAM

片内RAM是用于程序运行时存储临时数据的内存,它的容量为256字节(0x00 ~ 0xFF)。其中,可直接寻址的RAM区域从0x00到0x7F(共128字节),另外128字节的RAM区域可以通过间接寻址方式访问。

片外扩展RAM是通过外部存储器芯片来扩展的,可以提供更大的存储容量。AT89S52单片机支持最大64KB(65536字节)的外部扩展RAM。扩展RAM的寻址是通过控制端口P2来实现的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕卿扬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值