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