2.2 MCS-51单片机系统及应用举例

MCS-51单片机在一片芯片上集成了计算机的基本功能部件,功能较强,在实际应用中,可以根据需要加上输入、输出接口电路组成智能仪器,根据智能仪器功能的不同及选用的CPU芯片的不同,会有相应不同的系统构成。

2.2.1 8051/8751/8951的最小系统

所谓最小系统,是指能满足要求的最小配置系统。由于MCS-51系列单片机内部没有集成时钟电路所需的晶体振荡器,也没有复位电路,因此最小系统必须外接这些部件。这几种芯片都有片内4KB程序存储器,区别仅在于8951内部为E2PROM,8051内部为ROM,8751内部为EPROM,如果系统要处理的工作不太复杂,程序加数据不超过4KB,那么这些芯片只要外接晶体振荡器和复位电路就可以构成最小系统,如图2.5所示,其主要特征包括以下几点。

(1)有4KB内部程序存储器(地址是0000H~0FFFH),EA引脚要接高电平。

(2)有128B内部数据存储器(地址是00H~7FH)。

(3)因为没有用到外部程序存储器和数据存储器,所以P0~P3口可以全部作为I/O接口。

图2.5中电源引脚和接地引脚也要接上,一般在电路原理图中因为电源引脚Vcc总是接+5V,接地引脚总要接地,所以不画出来,接线时要注意。最小系统的构成非常简单,可以利用它进行实验和开发小产品。

图2.5 8051/8751/8951的最小系统

2.2.2 单片机系统的并行扩展

当CPU选用8031,或者系统的程序比较长,需要存储的数据比较多,上面的最小系统不能满足要求时,就需要外接程序存储器和数据存储器,通常称为单片机系统的扩展。

MCS-51系列单片机一般用74LS373配合其扩展,以8051为例,只接一片27128(16KB)外部程序存储器和一片62256(32KB)外部数据存储器,扩展后的单片机系统电路接法如图2.6所示。其主要特征如下。

(1)有16KB外部程序存储器(地址是0000H~3FFFH),EA引脚要接地,内部没有程序存储器。

(2)有32KB外部数据存储器(地址是0000H~7FFFH),内部仍有128B的数据存储器可用。

图2.6 扩展后的单片机系统

(3)因为P0和P2口要作为地址线和数据线,所以不能作为I/O接口,只有P1和P3口可以作为I/O接口,且P3.6和P3.7要作为外部数据存储器的读/写控制线,也不能用,可见I/O端口减少了很多,但程序和数据存储量扩大了。

(4)图2.6中RST引脚直接接高电平,通电后就一直工作。没有重启按钮。

2.2.3 单片机系统的串行扩展

在单片机应用系统中,现在常用到带有I2C串行总线接口的芯片,因为采用这种I2C串行总线接口的芯片与单片机连接简单,连接线少,结构紧凑,使用比较方便。

I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线,它由数据线SDA和时钟线SCL构成,可发送和接收数据。各种采用I2C总线标准的器件均并联在总线上,每个器件内部都有I2C接口电路,器件的地址由芯片内部的硬件电路和外部地址引脚共同决定,并建立了简单的主从关系,每个器件既可以作为发送器,又可以作为接收器。

作为例子,图2.7给出了8051单片机与串行存储E2PROM芯片CAT24WC04的接口电路,8051单片机的P1.0,P1.1作为I2C总线与CAT24WC04的SDA和SCL相连,连接时注意I2C总线须通过上拉电阻接电源,P1.2与WP相连,CAT24WC04的地址线A2、A1、A0直接接地,片选地址为000,因此CAT24WC04的器件地址码的高7位为1010000。存储容量为4KB。

从图2.7中可以看到,这种用I2C总线串行扩展的单片机系统既增加了单片机的程序存储器,又保留了很多I/O接口,且接线也简单。图中所用到的CAT24WCXX系列是美国CATALYST公司出品的串行(CMOS)E2PROM芯片,有1~256KB不同容量的芯片,如CAT24WC04就是64KB存储容量的芯片。

图2.7 8051单片机与串行存储E2PROM的接口电路

2.2.4 应用举例

1.MCS-51系列单片机在调速系统中的应用

在单片机控制的小功率直流电机调速系统中,利用单片机的内部定时器产生占空比不同的矩形波,可以改变电机定子电压接通和断开的时间,从而控制电机转速。

例2.1】 若要求单片机输出频率为10kHz的矩形波,占空比为2∶1(高电平时间长),单片机频率为12MHz,写出有关程序。

分析:输出频率为10kHz的矩形波,即周期为100μs。高电平持续时间为66.7μs,低电平持续时间为33.3μs。由于定时时间短,定时器采用模式2即8位定时器/计数器模式(并具有自动重装载功能)。

定时33.3μs,初值=2 8-33.3=DFH

定时66.7μs,初值=2 8-66.7=BDH

方法:利用定时器的模式2自动重装载功能,只要每次计数溢出,就自动重新装入TH0中的值(时间常数),使定时器能交替实现66.7μs和33.3μs定时。

程序清单:

MOV    TMOD,#02H       ;TMOD为8051的内部寄存器,设置T0为模式2
MOV    TL0,#0BDH       ;送初值,高电平持续时间
MOV    TH0,#0DFH       ;低电平持续时间
MOV    A,#0BDH         ;高电平持续时间送到A寄存器
SETB    TR0             ;启动T0
SETB    P1.0             ;P1.0引脚输出高电平
L0:   JNB     TF0,L0           ;循环等待,定时时间是否到?这里也可以用中断
CLR     TF0             ;清定时器0溢出标志
CPL     P1.0             ;P1.0引脚输出取反
XCH    A,TH0           ;交换时间常数,为下次定时做准备
SJMP    L0
END

2.利用单片机的内部定时器测量外部脉冲宽度

例2.2】 用定时器测量INT1引脚上正脉冲的宽度(机器周期数)。

分析:T0、T1定时器/计数器中有一个门控信号GATE,当该信号被设置为“1”时,只有TR1=1,并且INT1为1时才能启动定时器。利用此信号可以检测外部某一个脉冲的宽度。

测量过程为:初始设置T1工作在方式1,定时状态,时间常数初值为0,GATE=1。当外部待测脉冲由INT1(P3.3)输入时,启动T1。当INT1上再次出现高电平时,开始计数,直到INT1出现低电平为止。此时读出的时间常数就是对机器周期的计数次数,此数乘以机器周期即为正电平宽度。其过程如图2.8所示。

图2.8 测量过程示意图

程序清单:

MOV        TMOD,#90H       ;设置T1为模式1,且GATE=1
MOV        TL0,#00H         ;定时初值为0
MOV        TH0,#00H
WAIT1:    JB          P3.3,WAIT1       ;等待INT1变低电平,开始启动TR1
SETB        TR1             ;启动定时器
WAIT2:    JNB         P3.3,WAIT2       ;等待INT1=1,开始计数
WAIT3:    JB          P3.3,WAIT3       ;等待P3.3变低电平
CLR         T               ;结束计数
MOV        A,TL1
MOV        B,TH1           ;存放计数值
END

f=12MHz,则A、B中的数值是以微秒为单位的正电平的宽度。也可以把该数通过显示器显示出来。

3.利用中断实现故障报警

例2.3】 用一个中断源显示故障的发生。如图2.9所示的电路,当系统正常工作时,四个故障源的输出均为高电平,显示灯全不亮。当其中任意一个故障源出现故障时,其相应的输出为低电平,相应的二极管显示灯亮。

图2.9 用中断实现故障报警

分析:当某一故障信号输入线由高电平变为低电平时,与门输出为0,并通过INT0申请中断(边沿触发)。在中断服务程序中,通过查询与故障信号相连接的P1.0、P1.2、P1.4、P1.6的值,确定故障的位置,并使相应的发光二极管亮。

程序清单:

ORG    0000H
AJMP    MAIN        ;跳过中断服务程序
ORG    0003H       ;外部中断0中断矢量
AJMP    zd

主程序:

MAIN:    ANL     P1,#55H      ;P1.0、P1.2、P1.4、P1.6输入,P1.1、P1.3、P1.5、P1.7输出
        SETB    EX0         ;允许外部输入
        SETB    IT0          ;边沿触发
        SETB    EA          ;CPU开中断
        SJMP    $           ;循环等待,需要时这里也可以执行别的程序

中断服务子程序:当INT0引脚出现低电平时,CPU自动执行这段程序。

zd:       JB      P1.0,L1       ;若P1.0=1,转L1
        SETB    P1.1         ;故障1,P1.1脚输出高电平,则相应的二极管亮
L1:       JB      P1.2,L2       ;若P1.2=1,转L2
        SETB    P1.3         ;故障2,P1.3脚输出高电平,则相应的二极管亮
L2:       JB      P1.4,L3       ;若P1.4=1,转L3
        SETB    P1.5         ;故障3,P1.5脚输出高电平,则相应的二极管亮
L3:       JB      P1.6,L4       ;若P1.6=1,转L4
        SETB    P1.7         ;故障4,P1.7脚输出高电平,则相应的二极管亮
L4:       RETI                ;中断返回
        END

4.利用中断进行定时控制外部操作

例2.4】 用中断进行定时控制。即要求每间隔一定时间,对现场数据实施一次采集、传送、取数等操作,而间隔时间未到,CPU可进行数据处理、数据显示等主程序的工作。

要求每隔150ms,从外部P1口读一次数据,并把数据存入到内部RAM 30H(首地址)开始的存储器中,供主程序进行处理,如果数据多的话,也可以存放在外部RAM 1000H单元(首地址)开始的数据存储区,单片机的晶振频率f=6MHz。

分析:实现150ms定时,采用定时器T0定时50ms、软件计数器计数3次的方式实现。定时初值为:X=2 16-50×10-3×3×10 6/6=40536=9E58H

程序清单:

ORG    0000H
AJMP    MAIN            ;跳过中断服务程序
ORG    000BH           ;定时器0中断矢量
AJMP    TCT0

主程序:

ORG    0100H
MAIN:   MOV    TMOD,#01H       ;定时器T0,方式1
MOV    TH0,#9EH
MOV    TL0,#58H
MOV    DPTR,#1000H      ;外部RAM首地址
MOV    R0,#30H          ;内部RAM首地址
MOV    R3,#03H          ;软件计数次数
SETB    ET0             ;允许T0中断
SETB    EA              ;CPU开中断
SETB    TR0
SJMP    $               ;等待中断
                      ;如果需要,可在此放置显示传送次数等程序

中断服务程序:

ORG    0150H
TCT0:   MOV    TH0,#9EH         ;重装初值
MOV    TL0,#58H
DJNZ    R3,NEXT1        ;定时不到150ms,返回
MOV    A,P1
MOVX   @DPTR,A        ;从外部RAM向内部RAM传送数据
MOV    @R0,A
INC     DPTR
INC     R0
NEXT1:  RETI                    ;开中断返回
END