购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第3章
逐步认识单片机基本结构

单片机编程实际上就是通过程序来控制单片机各部分硬件按预定目标去工作。例如,要点亮 P1.0引脚的 LED,就是要让寄存器 P1的对应位输出低电平。因此,了解单片机的基本结构对掌握单片机编程和单片机应用技术具有极其重要的作用。要熟悉单片机的基本结构并能熟练控制各部分硬件的工作,较好的方法是边学边用,即先学懂一部分硬件的结构,再通过练习达到对这部分结构的熟练控制,然后学另一部分的硬件结构。本章基于这一思路,逐步介绍单片机各部分的硬件结构并在练习中使读者掌握其使用方法。

3.1 实例4:用单片机控制一个灯闪烁

本节通过用单片机控制一个灯(发光二极管)闪烁的实例来介绍单片机的工作频率。本例采用图2-23中的电路原理图。

3.1.1 实现方法

当 P1.0输出低电平时,使发光二极管(LED)D1正向偏置而点亮;当 P1.0输出高电平时,LED熄灭。如果P1.0输出电平在高低电平之间不停转换,则LED会产生闪烁。也就是说,先点亮 LED 一段时间之后,再熄灭 LED,延迟一段时间后再点亮 LED,如此反复(可用循环语句实现)。

3.1.2 程序设计

先建立文件夹“ex4”,然后建立“ex4”工程项目,最后建立源程序文件“ex4.c”。输入以下源程序:

3.1.3 用Proteus软件仿真

为了验证程序的运行效果,将程序经 Keil 软件编译通过后,可利用 Proteus 软件进行仿真。这里我们仍使用第2章实例3的仿真原理图来进行仿真。为了验证LED的闪烁频率,在 Proteus 工作界面的小工具箱中单击虚拟仪表按钮,在弹出的对象选择器中选择“OSCILLOSCOPE”(示波器),如图3-1所示。将示波器放置到仿真原理图中,并将其输入端A连接在P1.0引脚上以观察其输出电平的变化,结果如图3-2所示。

图3-1 选择示波器

用鼠标右键单击单片机 AT89C51,从弹出的快捷菜单中选择“Edit Properties”命令,弹出“Edit Component”对话框,在“Program File”文本框中载入编译好的“ex4.hex”文件,并在“Clock Frequency”文本框中输入“24MHz”,单击“OK”按钮。单击仿真运行按钮启动仿真,可以看到 LED 以较快的频率闪烁,同时示波器输出一系列矩形波。为便于观察,在图3-3所示的示波器控制面板上进行以下参数设置:

➢ 电压幅值:2V/格;

➢ 分辨率:0.1s/格。

图3-2 在仿真原理图中添加示波器

图3-3 对示波器参数进行设置

结果如图3-4(a)所示。为了研究单片机工作频率对灯闪烁速度的影响,在仿真原理图中用鼠标右键单击单片机 AT89C51,从弹出的快捷菜单中选择“Edit Properties”命令,弹出“Edit Component”对话框,在“Clock Frequency”文本框中将已输入的“24MHz”改为“2MHz”,单击“OK”按钮。单击仿真运行按钮再次启动仿真,可以看到LED的闪烁频率明显变慢,同时还可以看到 P1.0引脚的输出电平脉宽明显增大,结果如图3-4(b)所示。

图3-4 P1.0引脚的输出电平信号波形

3.1.4 延时程序分析

为什么单片机时钟频率(工作频率)的改变会引起灯闪烁速度的明显变化?弄清楚这个问题非常重要。

单片机需要一个时钟信号送给内部各电路,才能使各部分有节拍地工作。时钟信号的频率由外部振荡电路的晶振频率决定。如果外接晶振的频率是12MHz,则外部振荡电路送给单片机时钟信号的频率也是12MHz。此时,我们说单片机的工作频率就是12MHz。以下是与工作频率相关的几个重要概念。

(1)振荡周期:为单片机提供时钟脉冲信号的振荡源的周期。例如,若单片机外接晶振频率是12MHz,则振荡周期就是1/(12MHz)=(1/12)μs。

(2)机器周期:51系列单片机的一个机器周期由12个振荡周期组成。如果一个单片机的工作频率是12MHz,那么它的工作周期就是(1/12)μs,其机器周期就是12×(1/12)μs=1μs;如果单片机的外接晶振频率为11.0592MHz,其机器周期就是12×(1/11.0592)μs=1.085μs。

(3)指令周期:单片机执行一条指令所用的时间。一般来说,单片机执行一个简单指令需要1个机器周期,执行一个复杂指令需要2个机器周期。因为一个机器周期非常短,一般只有1~2μs,所以单片机工作速度非常快。

在本例中,灯的闪烁时间是通过延时程序来实现的,即让单片机等待(空操作)若干个机器周期。通过以下比较可以看出时钟频率对灯的闪烁速度的影响:

➢ 当时钟频率为24MHz时,一个机器周期为12×(1/24)μs=0.5μs;

➢ 当时钟频率为2MHz时,一个机器周期为12×(1/2)μs=6μs。

显然,时钟频率越低,延迟的时间就越长,灯的闪烁速度就越慢。

3.2 实例5:将 P1口状态送入P0、P2和P3口

本节通过一个将 P1口状态送入P0、P2和 P3口的实例,来介绍单片机的输入/输出口(I/O口)的基本结构和使用方法。本例采用的电路原理图如图3-5所示,要求当按下按键S时,发光二极管D0~D3均被点亮;当松开按键S时,D0~D3均熄灭。本例的实质是将P1口状态送到P0、P2和P3口。

图3-5 单片机I/O口状态输送的电路原理图

3.2.1 实现方法

可以利用单片机工作速度快这个特点,通过编程设置一个无限循环,让单片机不停地把P1口的电平状态送到P0、P2和P3口。在按下按键S时,P1.7引脚的灯被点亮的瞬间,P0.7引脚、P2.7引脚和P3.7引脚的3个灯也接着被点亮。

3.2.2 程序设计

先建立文件夹“ex5”,然后建立“ex5”工程项目,最后建立源程序文件“ex5.c”。输入以下源程序:

3.2.3 用Proteus软件仿真

经Keil软件编译通过后,可利用Proteus软件进行仿真。在Proteus ISIS工作环境中绘制好图3-5所示仿真原理图,或者打开随书附件“仿真实例\第3章\ex5”文件夹内的“ex5.pdsprj”仿真原理图文件。用实例4的方法将编译好的“ex5.hex”文件载入 AT89C51中,并将单片机的时钟频率设置为“11.0592MHz”。启动仿真,按下按键 S,可以看到D0~D3均被点亮,仿真原理图如图3-6所示。结果表明P1口的状态被送到了其他3个口。

注: 下文如不特别说明,时钟频率均设置为“11.0592MHz”。

图3-6 将P1口状态送到P0口、P2口和P3口的仿真原理图

3.2.4 用实验板进行实验

程序仿真无误后,将“ex5”文件夹中的“ex5.hex”文件烧录到 AT89S51芯片中。再将烧录好的单片机插入实验板。为实验板通电,可以看到,在按下 P1.7引脚对应的按键时,P0.7引脚、P2.7引脚和P3.7引脚的3个LED被同时点亮。

3.2.5 I/O口功能介绍

以上仿真实验表明,单片机的P0、P1、P2和 P3口具有输入/输出(I/O)功能。虽然P1.7引脚电平在编程时被置为高电平(P1=0xff),但是当按下按键S时,该引脚被接地,其电平也被强制下拉为低电平。此时,低电平“0”通过 P1.7引脚被输入单片机,可见 P1口具有输入功能。在按下按键 S 时,不仅 P1.7引脚 LED 点亮,而且P0.7引脚 LED 也被点亮,这表明 P1口的状态被送到了P0口,所以 P1口还具有输出功能。同样地,P0、P2和P3口也有类似的输入/输出功能。

3.2.6 I/O口的结构分析

要更好地使用单片机的I/O口,必须了解其内部结构。

1.P0口的内部电路结构(外接32~39脚)

P0口有P0.0~P0.7共8个引脚。图3-7所示为P0口某一引脚的内部电路结构,其他引脚的内部结构都与此相同。图中有1个输出锁存器、2个三态缓冲器、1个输出驱动电路和1个输出控制端。输出驱动电路由一对场效应管组成,其工作状态受输出端的控制,输出控制端由1个与门、1个反相器和1个转换开关MUX组成。应用时,P0口需外接上拉电阻。

图3-7 P0口的内部电路结构

1)P0口用作输入端口

如果P0口用作输入端口,则P0口的输入信号既送到下面的三态缓冲器,又送到V2的漏极。如果锁存器之前锁存为“0”,即 Q =0, =1,则 V2导通,通过P0口的外接上拉电阻,P0口被钳位在“0”电平上,“1”无法送入P0口。所以,在数据输入P0口前,必须先通过内部总线向锁存器写“1”,即让 =0,V2截止,P0口输入的“1”就可以送到三态门的输入端。此时,再给三态门的读引脚送一个读控制信号(高电平),“1”就可以通过三态门送到内部总线。

2)P0口用作输出端口

如果P0口用作输出端口,则单片机内部的 CPU 会发出一个“0”到与门的控制端。控制端的“0”一方面关闭与门,使地址/数据总线送来的信号无法通过与门;另一方面控制电子开关,让电子开关与锁存器的 端接通。此时,若给写锁存器端 CP 送入写脉冲信号,内部总线送来的数据就可以通过D端进入锁存器,并从Q和 端输出,如果D端输入“1”,则 端输出“0”,该“0”使场效应管V2截止,通过P0口的外接上拉电阻,可使P0口输出高电平“1”。

2.P1口的内部电路结构(外接1~8脚)

P1口的内部电路结构如图3-8所示。由于其内部与电源之间接了一只上拉电阻,所以P1口外部不用再接上拉电阻。

图3-8 P1口的内部电路结构

1)P1口用作输入端口

如果 P1口用作输入端口,即 Q =0, =1,则图3-8中的场效应管导通,通过 P1端口的内部上拉电阻,P1口被钳位在“0”电平上,“1”无法送入P1口。所以与P0口一样,在将数据输入P1口前,先要通过内部总线向锁存器写“1”,让 =0,使场效应管截止,P1口输入的“1”就可以送到输入三态缓冲器(又称三态门)的输入端。此时,再给三态门的读引脚送一个读控制信号,“1”就可以通过三态门送到内部总线。

2)P1口用作输出端口

如果 P1口用作输出端口,应给锁存器的写锁存器 CP 端送写脉冲信号,内部总线送来的数据就可以通过D端进入锁存器并从Q和 端输出,如果D端输入“1”,则 =0,“0”送到场效应管的栅极,使场效应管截止,从P1口输出高电平“1”。

3.P2口的内部电路结构(外接21~28脚)

P2口有P2.0~P2.7共8个引脚,其内部电路结构如图3-9所示。

图3-9 P2口的内部电路结构

1)P2口用作输入端口

当 P2口作为通用 I/O 端口使用时,同样需要先通过内部总线向锁存器写“1”,让 Q =1,使场效应管截止,P2口输入的“1”才能送到输入三态门的输入端。此时,再给读引脚送一个读控制信号,“1”就可以通过三态门送到内部总线。

2)P2口用作输出端口

当 P2口用作输出端口时,给锁存器的 CP 端送写脉冲信号,内部总线上的数据就被锁存进锁存器并从Q端输出,再通过电子开关、非门和场效应管从P2口输出。

4.P3口的内部电路结构(外接10~17脚)

P3口有P3.0~P3.7共8个引脚,其内部电路结构如图3-10所示。

图3-10 P3口的内部电路结构

1)P3口用作I/O接口

当P3口用作I/O接口时,其使用方法与P1和P2类似。

2)P3口用作第二功能

P3口的内部电路结构的特殊性决定了其还可用作第二功能。P3口各引脚的第二功能见表3-1。例如,当P3.2引脚用作第二功能时,该端口可输入外部设备送来的中断请求信号。

表 3-1 P3口各引脚的第二功能

总之,P0、P1、P2和 P3口都可用作输入/输出端口;P3口具有第二功能。各端口的用法:P0口使用时需要外接上拉电阻;P1~P3口使用时不需要外接上拉电阻;在用作输入端口时,都需要先通过内部总线置“1”。

3.3 实例6:使用P3口流水点亮8位LED

本节通过使用P3口流水点亮其外接的8位LED,介绍单片机I/O接口的使用方法。本节采用的电路原理图如图3-11所示。

图3-11 使用P3口流水点亮8位LED的电路原理图

3.3.1 实现方法

可通过循环执行以下操作来实现。

(1)点亮P3.0引脚LED,利用延时程序延迟一段时间,其实现程序如下:

(2)点亮P3.1引脚LED,利用延迟程序延迟一段时间,其实现程序如下:

(3)点亮P3.7引脚LED,利用延时程序延迟一段时间,其实现程序如下:

3.3.2 程序设计

先建立文件夹“ex6”,然后建立“ex6”工程项目,最后建立源程序文件“ex6.c”。输入以下源程序:

3.3.3 用Proteus软件仿真

经 Keil 软件编译通过后,可使用 Proteus 软件进行仿真。在 Proteus ISIS 工作环境中绘制好仿真原理图(如图3-11所示),或者打开随书附件中“仿真实例\第3章\ex6”文件夹内的“ex6.pdsprj”仿真原理图文件。用鼠标右键单击 AT89C51,将编译好的“ex6.hex”文件载入 AT89C51中。启动仿真,可以看到 P3口的8位 LED被流水点亮,仿真原理图如图3-12所示。

图3-12 流水点亮8位LED的仿真原理图

3.3.4 用实验板进行实验

程序仿真无误后,将“ex6”文件夹中的“ex6.hex”文件烧录到 AT89S51芯片中。再将烧录好的单片机插入实验板上,为实验板通电,可看到P3口所接的8位LED被流水点亮。

通过本实例可知,单片机与外界信息的传递可以通过P0~P3口来实现,P0口和P3口实际上是单片机众多特殊功能寄存器中的两个。要使单片机实现各种控制功能,还必须了解单片机的特殊功能寄存器,这需要先明确单片机的地址和存储器的概念。

3.4 实例7:通过对P3口地址的操作流水点亮8位LED

本节通过对P3口地址的操作流水点亮8位 LED 来认识单片机的存储器。本节仍采用图3-11中的电路原理图。

3.4.1 实现方法

单片机中存储器(包括特殊功能寄存器)都有固定的地址,正是通过这些固定的地址,单片机才能准确地实现对各个存储器的操作。例如,P3口的固定地址是 B0H(这在单片机制造时已经分配好,我们只能根据这种分配来使用它,而不可能改变它),P3只不过是地址“B0H”的名字,我们对地址“B0H”的操作实际上就是对 P3的操作。例如,张三同学在教室的第2排第5列(相当于地址),老师可以说“请张三回答问题”,也可以说“请第2排第5列的同学回答问题”,两者是一回事。显然,当不知道名字时,用地址就很方便。

要对特殊功能寄存器P3的地址“B0H”操作,可进行如下定义:

定义后,程序中对x的操作也就相当于对地址“0xb0”即P3的操作。

3.4.2 程序设计

先建立文件夹“ex7”,然后建立“ex7”工程项目,最后建立源程序文件“ex7.c”。输入以下源程序:

3.4.3 用Proteus软件仿真

经Keil软件编译通过后,可使用Proteus软件进行仿真。在Proteus ISIS工作环境中绘制好仿真原理图(如图3-11所示),或者打开随书附件中“仿真实例\第3章\ex7”文件夹内的“ex7DSN”仿真原理图文件。将编译好的“ex7.hex”文件载入 AT89C51中。启动仿真,可看到P3口8位LED被流水点亮,表明对地址操作同样可达到预期效果。

3.4.4 用实验板进行实验

程序仿真无误后,将“ex7”文件夹中的“ex7.hex”文件烧录到 AT89S51芯片中。再将烧录好的单片机插入实验板上,为实验板通电,可看到 P3口所接的8位 LED 被流水点亮。

3.5 MCS-51单片机存储器的基本结构

MCS-51单片机有两种存储器:程序存储器和数据存储器。程序存储器用来储存编入的程序;而数据存储器用来存放单片机工作时用到的一些临时数据。

从物理地址空间看,MCS-51有4个存储器地址空间,即片内程序存储器、片外程序存储器、片内数据存储器和片外数据存储器。

3.5.1 程序存储器

单片机编程时,一般先在计算机中用软件编写程序,再通过烧录器(编程器)将编好的程序写入程序存储器中,单片机通过执行程序存储器中的程序来实现控制目的。

MCS-51单片机在一般情况下使用内部程序存储器。当内部存储空间不够时,需要使用外部程序存储器,其使用受 端外接电平的控制。

➢当 =0(接地)时,单片机只能使用外部程序存储器;

➢当 =1(接+5V 电源)时,单片机先使用内部程序存储器,容量不够时自动使用外部程序存储器。

AT89C51系列单片机内部有4KB 的程序存储器,存储单元的地址编号是0000~0FFFH,当扩展外接60KB程序存储器时,外部程序存储器的地址编号是1000H~FFFFH。

MCS-51单片机上电复位后程序计数器 PC 的内容为0000H,因此系统从0000H 单元开始取指令并执行程序。

3.5.2 数据存储器

MCS-51单片机的数据存储器分为两个地址空间:一个为内部数据存储器,另一个为外部数据存储器,需采用不同的方法进行访问。

内部数据存储器有256B 存储空间,地址编号为00H~FFH;外部数据存储器的地址编号为0000H~FFFFH,有64KB 存储空间。最常用的是内部数据存储器,其结构如图3-13所示。从图中可以看出,内部数据存储器分为四个区:工作寄存器区、位寻址区、数据缓冲区和特殊功能寄存器区。

图3-13 MCS-51单片机内部数据存储器的结构

如果采用汇编语言来设计单片机应用程序,就必须熟练掌握内部数据存储器的结构和地址;但如果采用 C 语言来开发单片机,几乎用不到工作寄存器区、位寻址区和数据缓存区的结构和地址,因而本书不对此进行详细介绍,但需要了解以下内容。

工作寄存器区分为4(0~3)组,每组有8个存储单元。应用时默认第0组寄存器工作。

表3-2所列各特殊功能寄存器的名字和功能在应用时非常重要,其使用方法将在后文逐步介绍。

表3-2 特殊功能寄存器

3.6 单片机的复位电路

单片机通电时,从初始态开始执行程序,称为上电复位。单片机死机时,通过手动按“重启”键使其从初始态开始执行程序,称为手工复位。复位电路是单片机应用电路中的重要组成部分。

单片机复位的条件:使单片机的RST端(引脚9的RESET端)加上持续两个机器周期的高电平。例如,若时钟频率为12MHz,机器周期为1μs,则只需在RST引脚出现2μs以上时间的高电平,就可以使单片机复位。

单片机常见的复位电路如图3-14所示。图3-14(a)为上电复位电路,它是利用电容充电来实现的。在通电瞬间,RESET 端的电位与 VCC 相同,随着充电电流的减小,RESET的电位逐渐下降。只要保证 RESET 为高电平的时间大于两个机器周期,就能正常复位。图3-14(b)为手工复位电路,需复位时,按下 RESET 键,此时电源 VCC 经电阻 R1、R2分压,在RESET端产生一个复位高电平使单片机复位。

图3-14 单片机常见的复位电路

习题与实验

1.什么是时钟周期?什么是机器周期?当单片机外接晶振的频率为11.0592MHz 时,一个机器周期为多少微秒?

2.MCS-51单片机的4个 I/O 接口(P0~P3)在结构上有何异同?各自的主要功能是什么?

3.参照图3-11中的电路,设计一个程序使P3口的高四位LED和低四位LED轮流点亮,并分别进行Proteus仿真和实验板验证。

4.MCS-51存储器结构的主要特点是什么?程序存储器和数据存储器有何区别?画出内部数据存储器的基本结构。

5.参照图3-5中的电路,设计一个对地址操作的程序,实现把 P1口的状态送到P0、P2和P3口。结果用Proteus仿真和实验板进行验证。 sBoS7+nfKWNxfWtYMBNlVRUjCrq8H1gWNwF5zXnQhmDI9F5h4kVi7ubVrmDKTCqZ

点击中间区域
呼出菜单
上一章
目录
下一章
×