第3章51单片机主要功能应用基础 51单片机主要功能部件包括并行口、中断、定时器/计数器、串行口。本章主要接好51 单片机主要功能部件应用基础。 3.151系列单片机P0~P3口应用编程举例 在认识51单片机的P0~P3口之前,先看两个概念。 双向口:单片机的I/O口是CPU与片外设备进行信息交换的通道,为了提高接口的驱动 能力,具有由场效应管组成的输出驱动器。当驱动器场效应管的漏极具有开路状态时,该 口就具有高电平、低电平和高阻抗3种状态,称为双向口。 准双向口:单片机I/0口的输出场效应管的漏极接有上拉电阻,该口具有高电平、低 电平两种状态,称为准双向口。 在51单片机内部包含有4个并行的I/0接口,分别称为P0口、P1口、P2口和P3口,每一 个口都是8位的,每个口的位都有一个输出锁存器和一个输入缓冲器。PO口是双向口,P1、 P2、P3是准双向口。 3.1.1P0~P3口结构 1.结构 图3-1所示为P0~P3口的位结构原理图。 地址/数据 控制 Vco 读锁存器 Vco & VT 读锁存器 1 PO.X 内部上拉电阻 内部总线 D Q 内部总线 锁存器 D Q 写锁存器 VT 写锁存器 锁存器 P1X CP MUJX CP Q HVT 读引脚 读引脚 地址/数据 控制 地址控制 读锁存器 & VT, 读锁存器 Vcc 1 PO.X 内部总线 D Q 内部总线 D Q 9.0 P2.X 锁存器 锁存器 。 写锁存器 CP VT1 写锁存器 CP MUJX 1 读引脚 读引脚 图3-1P0~P3口口的位结构示意图 2.操作一以P1口为例。 P1口作为通用的I/0接口使用,具有输出、读引脚、读锁存器三种工作方式。 69
69 第 章 单片机 3 51 主要功能应用基础 51单片机主要功能部件包括并行口、中断、定时器/计数器、串行口。本章主要接好51 单片机主要功能部件应用基础。 3.1 51系列单片机P0~P3口应用编程举例 在认识51单片机的P0~P3口之前,先看两个概念。 双向口:单片机的I/O口是CPU与片外设备进行信息交换的通道,为了提高接口的驱动 能力,具有由场效应管组成的输出驱动器。当驱动器场效应管的漏极具有开路状态时,该 口就具有高电平、低电平和高阻抗3种状态,称为双向口。 准双向口:单片机I/O口的输出场效应管的漏极接有上拉电阻,该口具有高电平、低 电平两种状态,称为准双向口。 在51单片机内部包含有4个并行的I/O接口,分别称为P0口、P1口、P2口和P3口,每一 个口都是8位的,每个口的位都有一个输出锁存器和一个输入缓冲器。P0口是双向口,P1、 P2、P3是准双向口。 3.1.1 P0 P3 ~ 口结构 1.结构 图3-1所示为P0~P3口的位结构原理图。 图3-1 P0~P3口口的位结构示意图 2.操作-以P1口为例。 P1口作为通用的I/O接口使用,具有输出、读引脚、读锁存器三种工作方式
(1)输出方式P1口工作于输出方式,此时数据经内部总线送入锁存器存储。如果某位的数据为1,则该位锁存器输出端Q=1,Q=0使V1截止,从而在引脚P1.X上出现高电平;反之,如果数据为0,则Q=0,Q=1使V1导通,在引脚P1.X上出现低电平。(2)读引脚方式读引脚时,控制器打开三态门1,引脚P1.X上的数据经三态门1进入芯片的内部总线,并送到累加器A。输入时无锁存功能。单在读引脚之前,一定要保证V1是截止的。(3)读锁存器方式51系列单片机有很多指令可以直接进行端口操作,这些指令的执行过程分成“读一修改一写”三步,即先将端口的数据读入CPU,在ALU中进行运算,运算结果再送回端口。执行“读一修改一写”类指令时,CPU实际是通过三态门2读回锁存器Q端的数据的。是读引脚还是读锁存器,其过程CPU内部会自动处理,读者不必在意。但应注意,当作为读引脚方式使用时,应先对该口写“1”,使场效应管截止,再进行读操作,以防止场效应管处于导通状态,使引脚为“0”,从而引起误读。3.特点总结:(1)若要执行输入操作,POP3口都必须先输出高电平,才能读取该端口所连接的外部设备的数据。(2)PO口8位皆为漏极开路输出,每个引脚可以驱动8个LS型TTL负载;P1~P3口的8位类似于漏极开路输出,但已接上拉电阻,每个引脚可驱动4个LS型TTL负载。(3)PO口内部无上拉电阻,执行输出功能时,外部必须接上拉电阻(一般1OkQ即可);P1P3口内部具有约30kQ的上拉电阻,执行输出操作时,无须连接外部上拉电阻。(4)若系统连接外部存储器或I/O口芯片,PO口作为地址总线(A7~A0)及数据总线(D7~DO)的复用引脚,此时内部具有上拉电阻,不用外接;若系统连接外部存储器或I/0口芯片,而外部存储器或I/0口芯片的地址线超过8条时,则P2可作为地址总线(A15A8)引脚;P3口的8个引脚各具有第二功能。(5)灌电流比拉电流大。3.1.2输出操作举例51单片机内部并行I/0输出操作包括字节操作和位操作。下面通过例子来说明具体的操作。【例3-1】字节操作。电路如图3-2所示,P1口接8个发光二极管作为输出指示,编程实现使8个发光二极管按一定的频率亮、灭闪烁。70
70 (1)输出方式 P1口工作于输出方式,此时数据经内部总线送入锁存器存储。如果某位的数据为1,则 该位锁存器输出端Q=1,Q =0使V1截止,从而在引脚P1.X上出现高电平;反之,如果数据为 0,则Q=0,Q =1使V1导通,在引脚P1.X上出现低电平。 (2)读引脚方式 读引脚时,控制器打开三态门1,引脚P1.X上的数据经三态门1进入芯片的内部总线, 并送到累加器A。输入时无锁存功能。 单在读引脚之前,一定要保证V1是截止的。 (3)读锁存器方式 51系列单片机有很多指令可以直接进行端口操作,这些指令的执行过程分成“读—修 改—写”三步,即先将端口的数据读入CPU,在ALU中进行运算,运算结果再送回端口。执 行“读—修改—写”类指令时,CPU实际是通过三态门2读回锁存器Q端的数据的。 是读引脚还是读锁存器,其过程CPU内部会自动处理,读者不必在意。但应注意,当作 为读引脚方式使用时,应先对该口写“1”,使场效应管截止,再进行读操作,以防止场效 应管处于导通状态,使引脚为“0”,从而引起误读。 3.特点总结: (1)若要执行输入操作,P0~P3口都必须先输出高电平,才能读取该端口所连接的外 部设备的数据。 (2)P0口8位皆为漏极开路输出,每个引脚可以驱动8个LS型TTL负载;P1~P3口的8位 类似于漏极开路输出,但已接上拉电阻,每个引脚可驱动4个LS型TTL负载。 (3)P0口内部无上拉电阻,执行输出功能时,外部必须接上拉电阻(一般10kΩ即可); P1~P3口内部具有约30kΩ的上拉电阻,执行输出操作时,无须连接外部上拉电阻。 (4)若系统连接外部存储器或I/O口芯片,P0口作为地址总线(A7~A0)及数据总线 (D7~D0)的复用引脚,此时内部具有上拉电阻,不用外接;若系统连接外部存储器或I/O 口芯片,而外部存储器或I/O口芯片的地址线超过8条时,则P2可作为地址总线(A15~A8) 引脚;P3口的8个引脚各具有第二功能。 (5)灌电流比拉电流大。 3.1.2 输出操作举例 51单片机内部并行I/O输出操作包括字节操作和位操作。下面通过例子来说明具体的操 作。 【例3-1】字节操作。电路如图3-2所示,P1口接8个发光二极管作为输出指示,编程实 现使8个发光二极管按一定的频率亮、灭闪烁
U1AT89C51VCC19XTAL1PO.D/ADCLED-GERRN4ADR1470RD1AD89388XTAL2nR2D2IADSnYAD7IAD7RSTnR3D3DIE2.1110YR422.2/A10福D4PSEN3/A127R5AID528A19930999R6O/RXDD6884886893.TXDYINTUP3.3/NTR7D7B3R8ORD87.7/RO图3-2P1口输出操作实例图分析:P1口输出“高电平”时灯“灭”,输出“低电平”时灯“亮”:亮、灭闪烁可以通过一软件延时程序实现。#include<reg51.h)//特殊功能寄存器声明intd)//延时函数voiddelay(unsigned( while(--d>0):)//主函数void main()(while(1)//亮(P1=0x00;delay(50000);//灭P1=0xff;delay(50000) ;11【例3-2】位操作。电路如图3-2所示,编程实现P1.3所接的发光二极管亮、灭闪烁。#include<reg51.h>//位定义sbit LED3=P1'3;intd)voiddelayunsigned( while(--d>0);)void main( )1while(1){LED3=0;delay(50000);LED3=1;delay(50000);11修改:(1)P1.0对应的灯亮时,P1.7对应的灯灭;P1.0对应的灯灭时,P1.7对应的灯亮。(2)循环操作:编程实现8个灯从低到高流水灯的显示闪烁。(3)从左到右,一个一个亮保持到全亮,然后再重复。(4)思考:灯的亮、灭没有什么规律(花样流水灯),应该怎样编程?71
71 图3-2 P1口输出操作实例图 分析:P1口输出“高电平”时灯“灭”,输出“低电平”时灯“亮”;亮、灭闪烁可 以通过一软件延时程序实现。 #include<reg51.h> //特殊功能寄存器声明 void delay( unsigned int d ) //延时函数 { while(-d>0); } void main( ) //主函数 { while(1) { P1=0x00; delay(50000); //亮 P1=0xff; delay(50000); //灭 } } 【例3-2】 位操作。电路如图3-2所示,编程实现P1.3所接的发光二极管亮、灭闪烁。 #include<reg51.h> sbit LED3=P1^3; //位定义 void delay( unsigned int d) { while(-d>0); } void main( ) { while(1) { LED3=0; delay(50000); LED3=1; delay(50000); } } 修改: (1)P1.0对应的灯亮时,P1.7对应的灯灭; P1.0对应的灯灭时,P1.7对应的灯亮。 (2)循环操作:编程实现8个灯从低到高流水灯的显示闪烁。 (3)从左到右,一个一个亮保持到全亮,然后再重复。 (4)思考:灯的亮、灭没有什么规律(花样流水灯),应该怎样编程?
(5)思考:如何编程使P1.0和P1.1输出不同周期的信号。(6)将P1口改为P3口。3.1.3输入操作举例51单片机的POP3口可以作为基本的输入口使用,其输入信号是由外部电路决定的,可以分为两大类:电平信号、脉冲信号。这两类信号可以通过闸刀开关、按钮开关两类开关来模拟。如图3-3所示。图3-3(a)是闸刀型开关示意图:图3-3(b)是按钮型开关示意图:图3-3(c)是闸刀型开关输入电路示意图:图3-3(d)是按钮型开关输入电路示意图oACCKC(a)KKNC(b)(e)(d)图3-3闸刀型与按钮型开关示意图1.闸刀型开关【例3-3】闸刀型开关输入信号例子。电路如图3-4所示,编程实现相应的开关闭合时,相应的灯亮。1ATaSS1K3E卫P3.7/RT服K228E3S2IRTEK1.1TXtSDRXD04KORNRNNNa1vCCoG/A1N4LED3R4空费招CTUR42.MAS中LED2R3ARMARRMARST+70RLED18R2AB1SALLTURPB.ABALEDOR1PODIADOXTAL1470R图3-4例4-7电路原理图分析:P1口高4位接开关,低4位接指示灯,因此P1口高4位为输入口,低4位为输出口;对于输入部分,键按下时输入口为低电平,抬起时输入口为高电平:对于输出部分,输出高电平灯灭,输出低电平灯亮;所以只要将相应的键的状态送到相应的输出位置就可以了。#include<reg51.h>sbit LEDO=PO;//输出灯位定义sbit LED1=P1'1;sbit LED2=P1'2;72
72 (5)思考:如何编程使P1.0和P1.1输出不同周期的信号。 (6)将P1口改为P3口。 3.1.3 输入操作举例 51单片机的P0~P3口可以作为基本的输入口使用,其输入信号是由外部电路决定的, 可以分为两大类:电平信号、脉冲信号。这两类信号可以通过闸刀开关、按钮开关两类开 关来模拟。如图3-3所示。图3-3(a)是闸刀型开关示意图;图3-3(b)是按钮型开关示意 图;图3-3(c)是闸刀型开关输入电路示意图;图3-3(d)是按钮型开关输入电路示意图 。 图3-3 闸刀型与按钮型开关示意图 1.闸刀型开关 【例3-3】闸刀型开关输入信号例子。电路如图3-4所示,编程实现相应的开关闭合时 ,相应的灯亮。 图3-4 例4-7电路原理图 分析:P1口高4位接开关,低4位接指示灯,因此P1口高4位为输入口,低4位为输出 口;对于输入部分,键按下时输入口为低电平,抬起时输入口为高电平;对于输出部分, 输出高电平灯灭,输出低电平灯亮;所以只要将相应的键的状态送到相应的输出位置就可 以了。 #include<reg51.h> sbit LED0=P1^0; //输出灯位定义 sbit LED1=P1^1; sbit LED2=P1^2;
sbit LED3=P1°3:sbit KO=P1~4;//输入按键位定义sbit K1=P1'5;sbit K2=P1'6;sbitK3=P1"7:voidmain()( while(1)K0=1; K1=l; K2=1; K3=1;//读之前先置1{LEDO=KO;LED1=K1:LED2=K2;LED3=K3;11思考:为什么在读键状态之前要先置1?修改:(1)开关闭合时灯灭。(2)KO控制LED3,K1控制LED2,K2控制LED1,K3控制LEDO。2.按钮型开关按钮型开关输入信号具有自动恢复(弹回)功能,当按下按钮,其中的接点接通,放开按钮后,接点恢复为断开。开关在动作时并不是理想的状态,将可发生许多非预想状态,如图3-5所示。这种非预想状态称为抖动。开关抖动的处理可以分为硬件去抖动和软件去抖动。硬件去抖动增加硬件投入,在单片机应用电路中,一般采用软件去抖动。软件去抖动就是执行一段软件延时程序(10ms左右)。这样,开关的处理参看图4-13所示的程序框图。在图3-6中关注两个问题:去抖动、判断按键是否抬起。开始输入键状态1《有键按下吗?》+Y延时消抖动输入键状态Y《有键按下吗?Y键处理Y输入键状态键按下《键拾起了吗?键稳定Y延时消抖动T-结束后沿抖动前沿抖动图3-5开关的抖动图3-6开关处理程序框图73
73 sbit LED3=P1^3; sbit K0=P1^4; //输入按键位定义 sbit K1=P1^5; sbit K2=P1^6; sbit K3=P1^7; void main( ) { while(1) K0=1; K1=1; K2=1; K3=1; //读之前先置1 { LED0=K0; LED1=K1; LED2=K2; LED3=K3; } } 思考:为什么在读键状态之前要先置1? 修改: (1)开关闭合时灯灭。 (2)K0控制LED3,K1控制LED2,K2控制LED1,K3控制LED0。 2.按钮型开关 按钮型开关输入信号具有自动恢复(弹回)功能,当按下按钮,其中的接点接通,放开 按钮后,接点恢复为断开。 开关在动作时并不是理想的状态,将可发生许多非预想状态,如图3-5所示。这种非预 想状态称为抖动。 开关抖动的处理可以分为硬件去抖动和软件去抖动。硬件去抖动增加硬件投入,在单 片机应用电路中,一般采用软件去抖动。 软件去抖动就是执行一段软件延时程序(10ms左右)。这样,开关的处理参看图4-13所 示的程序框图。在图3-6中关注两个问题:去抖动、判断按键是否抬起。 图3-5 开关的抖动 图3-6 开关处理程序框图