《51单片机应用开发范例大全(第3版)》——2.1 基本器件实现端口扩展实例

2.1 基本器件实现端口扩展实例

目前,比较常用的串行口转换并行口的专用芯片有74LS165、CD4014等,并行口转换串行口的专用芯片有74LS164、CD4094等。

2.1.1 【实例20】用74LS165实现串口扩展并行输入口

一些低速的并行设备,如果直接和单片机连接,则浪费了宝贵的端口资源;如果先经过并行转换,然后以串行方式送入数据,则可以节省I/O端口。本设计就是通过74LS165,利用单片机串口,实现8位并行数据的输入。

1.74LS165与单片机接口电路设计
74LS165有多种封装,它们在功能上并没有什么差别,可以根据实际需要选择合适的封装。图2-1所示是74LS165的引脚图。

SH/overline{rm{RD}}:移位/装载数据,当为高电平时,在时钟信号下进行移位;当为低电平时,将并行输入口的数据送到寄存器中。
CLK:时钟输入。
A~H:并行输入口。
QH、overline{rm{QH}}:串行输出口。
GND:接地端。
SER:串行输入口,通过它可以将多个74LS165连接起来,也可以和其他串行口连接,在时序配合的情况下,将数据加入送出的串行数据中。
CLKINH:时钟抑制。
VCC:电源。
图2-2所示是8051单片机与74LS165的接口电路。8051单片机的串口工作于模式0,为同步移位寄存器输入/输出方式,收/发的数据为8位,低位在前,无起始位、奇偶校验位和停止位。串行数据从RXD(P3.0)输入,移位时钟由TXD(P3.1)输出。端口线P1.7用于控制74LS165的工作状态。当P1.7输出低电平时,74LS165将并行数据置入寄存器中;当P1.7输出高电平时,74LS165工作在时钟控制下的串行移位状态,数据通过RXD(P3.0)移入8051单片机。

注意

由于单片机的串口资源有限,在串口被占用的情况下,也可以利用I/O口来模拟时序,实现移位寄存,这是一种简单可行的方法。串行数据从P1.5输入,移位时钟脉冲可由P1.6输出,还是用P1.7来控制74LS165的工作状态。
2.用串口驱动74LS165
利用单片机串口实现输入移位寄存器,只需用软件置REN = 1(同时RI =0),即开始接收。数据字节在移位时钟脉冲的配合下,从低位至高位一位一位地接收下来并装入SBUF中,在启动接收过程(即写SCON,清RI位)开始后的第8个机器周期RI被置位。这一数据帧接收完毕,可进行下一帧的接收。

在模式0下,数据传输速率为fosc/12,fosc是时钟频率。时钟频率为12MHz时串行数据传输速率为1Mbit/s,速度较快,故程序中对接收过程采取查询等待方式。如果有必要,应该用中断控制方式以提高程序速率。

需要特别注意,在工作模式0下,必须将 SCON的SM2位清零。

单片机串口驱动74LS165的程序主要包括函数声明管脚定义部分、串口初始化函数以及数据接收函数。

(1)函数声明管脚定义。

函数声明管脚定义部分主要完成程序所涉及的库函数的声明及有关引脚的定义,一般置于程序的开头部分,代码如下:

//------------------库函数声明,管脚定义--------------------------------------
#include<reg52.h>
sbit LOAD=P1^7;
//用P1^7控制SH/ 管脚```
(2)串口初始化函数UART_init()。

串口初始化函数UART_init()实现串口的初始化,包括工作方式选择和中断的开禁等功能,程序代码如下:

//-----------------------------------------------------------------------
// 函数名称:UART_init()
// 功能说明:串口初始化,设定串口工作在方式0
//-----------------------------------------------------------------------
void UART_init(void)
{

SCON=0x10;
//设串行口方式0,允许接收,启动接收过程
ES=0;
//禁止串口中断

}`
(3)数据接收函数PA()。

数据接收函数PA()能够完成8位串行数据的接收,代码如下:

//-----------------------------------------------------------------------
//  函数名称:PA()
//  输入参数:无
//  输出参数:返回由并口输入的数据
//  功能说明:接收8位串行数据
//-----------------------------------------------------------------------
unsigned char PA(void)
{
    unsigned char PA_data;
    LOAD=0;
    //当P1.7输出低电平,74LS165将并行数据装入寄存器当中
    LOAD=1;
    //当P1.7输出高电平,74LS165在时钟信号下进行移位
    UART_init();
    //74LS165工作在时钟控制下的串行移位状态
    while(RI==0);
    //循环等待
    RI=0;
    PA_data=SBUF;
    return PA_data;
    //返回并行输入的数据
}```
3.用I/O端口驱动74LS165
单片机的串口工作在模式0,只是作为同步移位寄存器。如果能够直接用I/O模拟移位寄存器的时序,同样能驱动74LS165,实现并行数据的输入。如图2-2所示,P1.5被用于串行数据输入,P1.6用于移位时钟输出,P1.7用来控制74LS165的工作状态。

单片机I/O端口驱动74LS165主要包括函数声明管脚定义部分、数据输入函数以及数据输出函数。

(1)函数声明管脚定义。

函数声明管脚定义部分主要完成程序所涉及的库函数的声明及有关引脚的定义,一般置于程序的开头部分,代码如下:

//----------------------------库函数声明,管脚定义---------------------------

include

sbit a7=ACC^7;
sbit simuseri_CLK=P1^6;
//用P1^6模拟串口时钟
sbit simuseri_DATA=P1^5;
//用P1^5模拟串口数据
sbit drive74165_LD=P1^7;
//用P1^7控制SH/ 管脚`
(2)数据输入函数in_simuseri()。

数据输入函数in_simuseri()能够实现8位数据的从低位到高位的串行输入,程序代码如下所示:

//-----------------------------------------------------------------------
//  函数名称:in_simuseri()
//  输入参数:无
//  输出参数:data_buf
//  功能说明:8位同位移位寄存器,将simuseri_DATA串行输入的数据按从低位到
//  高位
//  保存到data_buf
//-----------------------------------------------------------------------
unsigned char in_simuseri(void)
{
     unsigned char i;
     unsigned char data_buf;
     i=8;
     do
     {
         ACC=ACC>>1;
         for(;simuseri_CLK==0;);
         a7= simuseri_DATA;
         for(;simuseri_CLK==1;);
     }
     while(--i!=0);
     simuseri_CLK=0;
     data_buf=ACC;
     return(data_buf);
}```
(3)数据输出函数PAs()。

数据输出函数PAs()能够实现数据的并行输出,程序代码如下:

//-----------------------------------------------------------------------
// 函数名称:PAs()
// 输入参数:无
// 输出参数:PAs _buf,返回并行输入74LS165的数据
// 功能说明:直接调用,即可读取并行输入74LS165的数据,不需要考虑74LS165的
// 工作原理
//-----------------------------------------------------------------------
unsigned char PAs(void)
{

unsigned char PAs_buf;
drive74165_LD=0;
drive74165_LD=1;
PAs_buf= in_simuseri();
return(PAs_buf);

}`

2.1.2 【实例21】用74LS164实现串口扩展并行输出口

在单片机应用系统中,并行输入的接口设备很多,如果设备数据传输速率不是很高,可以在单片机输出后端预处理。如果利用串并转换接口,单片机只需要串行输出,就可以满足接口设备并行输入的需要。本设计采用74LS164,通过单片机的串口实现串口转换为并口输出。

1.74LS164与单片机接口电路设计
图2-3所示是74LS164的引脚图。具体各引脚说明如下。

VCC:电源。
GND:接地端。
QA~QH:并行输出口。
B:串行输入口。
CLK:时钟输入。
CLR:清零位,当为低电平时,并行输出口上均为低电平“0”。
74LS164与8051单片机接口电路如图2-4所示。当51系列单片机的串行口工作在方式0的发送状态下,串行数据由P3.0(RXD)送出,移位时钟由P3.1(TXD)送出。在移位时钟的作用下,串行口发送缓冲器的数据一位一位地移入74LS164。

如果串行口被其他设备占用,可以用普通I/O口模拟移位寄存器的时序向74LS164发送数据。实践证明,这是一种方便、经济、可行的方法。P1.5用于输出串行数据,P1.6用于移位时钟输出。

在实际应用中,还应注意,74LS164没有并行输出控制端,在串行输入数据时,并行输出口会不断变化。如果需要,可在74LS164的输出端加接输出三态门控制,以便保证串行输入结束后再输出。

2.用串口驱动74LS164
单片机的串口工作在模式0,只是作为同步移位寄存器。RXD(P3.0)用于串行数据输出,TXD(P3.1)用于移位时钟输出,P1.7用来控制74LS164的工作状态。

单片机串口驱动74LS164的程序主要包括函数声明管脚定义部分、串口初始化函数以及数据发送函数。

(1)函数声明管脚定义。

函数声明管脚定义部分主要完成程序所涉及的库函数的声明及有关引脚的定义,一般置于程序的开头部分,代码如下:

//-------------------------------------库函数声明,管脚定义
#include <reg52.h>
sbit   CLR=P1^7;
//用P1^7控制CLR```
(2)串口初始化函数UART_init()。

串口初始化函数UART_init()能够实现串口的初始化,包括工作方式选择和中断的开禁等功能,程序代码如下:

//-----------------------------------------------------------------------
// 函数名称:UART_init()
// 功能说明:串口初始化,设定串口工作在方式0
//-----------------------------------------------------------------------

void UART_init(void)
{

SCON =0x00;
//没串行口方式0,允许发送,启动发送过程
ES=0;
// 禁止串口中断

}`
(3)数据发送函数PA_out()。

数据发送函数PA_out()能够完成8位数据由串口串行发出,程序代码如下:

//-----------------------------------------------------------------------
//  函数名称:PA_out()
//  输入参数:PA_data,需要从74LS164并行口输出的数据
//  输出参数:无
//  功能说明:发送8位串行数据至并口
//-----------------------------------------------------------------------

void  PA_out(unsigned char PA_data)
{
    CLR=0;
    //并口输出清零
    CLR=1;
    //开始串行移位
    UART_init();
    //74LS165工作在时钟控制下的串行移位状态
    while(TI==0);
    //循环等待
    TI=0;
    SBUF=PA_data;
}```
3.用I/O端口驱动74LS164
74LS164工作时,在移位时钟CLK的作用下,串行口送入的数据一位一位地移入。用单片机的P1.6口输出移位脉冲,用P1.5口输出串行数据,同样可以驱动74LS164工作。如图2-4所示,74LS164的清零端CLR由单片机P1.7控制。

单片机I/O端口驱动74LS164主要包括函数声明管脚定义部分、数据输入函数以及数据输出函数。

(1)函数声明管脚定义。

函数声明管脚定义部分主要完成程序所涉及的库函数的声明及有关引脚的定义,一般置于程序的开头部分,代码如下:

//-------------------------库函数声明,管脚定义-----------------------------

include

sbit simuseri_CLK=P1^6;
//用P1^6模拟串口时钟
sbit simuseri_DATA=P1^5;
//用P1^5模拟串口数据
sbit drive74164_CLR=P1^7;
//用P1^7控制CLR
sbit a0=ACC^0;`
(2)数据输入函数out_simuseri ()。

数据输入函数out_simuseri ()将8位数据的从低位到高位的逐位输入simuseri_DATA当中,程序代码如下所示:

//-----------------------------------------------------------------------
//  函数名称:out_simuseri
//  输入参数:data_buf
//  输出参数:无
//  功能说明:8位同步移位寄存器,将data_buf的数据逐位输出到simuseri_DATA
//-----------------------------------------------------------------------

void out_simuseri(char data_buf)
{
    char i;
    i=8;
    ACC=data_buf;
    do
    {
        simuseri_CLK=0;
        simuseri_DATA=a0;
        simuseri_CLK=1;
        ACC=ACC>>1;
    }
    while(--i!=0);
    simuseri_CLK=0;
}```
(3)数据输出函数PA_out ()。

数据输出函数PA_out ()能够实现数据的并行输出,程序代码如下:

//-----------------------------------------------------------------------
// 函数名称:PA_out
// 输入参数:Pseri_out,需要输出的8位数据
// 输出参数:无
// 功能说明:将Pseri_out中的数据送到74165并行口A-G输出
//-----------------------------------------------------------------------

void PA_out (char Pseri_out )
{

drive74164_CLR =0;
//并口输出清零
drive74164_CLR =1;
//开始串行移位
out_simuseri(Pseri_out);

}`

2.1.3 【实例22】P0 I/O扩展并行输入口

实际应用中经常会遇到开关量、数字量的输入,如开关、键盘等,主机可以随时与这些外设交换信息。在这种情况下,只要按照“输入三态”与总线相连的原则,选择74LS系列或者MOS电路即可组成简单I/O扩展输入口。本例以8位三态缓冲器74LS244组成输入口,P2.0与overline{rm{RD}}信号组成片选信号,如图2-5所示。I/O口对应的地址为:

1111  1110  1111  1111   B=FEFFH```
CPU操作指令为:

define 244_addr xbyte[0XFEFF]

unsigned char I/O_DATA;
I/O_DATA=244_addr;`

2.1.4 【实例23】P0 I/O扩展并行输出口

实际应用中经常遇到多路控制系统数字量的输出,比如数码显示器、继电器控制等,在这种情况下,只要按照“输出锁存”的原则相连,可以采用8D锁存器74LS273、74LS373、74LS377等组成输出口。本例采用74LS273实现端口扩展,P2.1与overline{rm{WR}}信号组成锁存信号,具体电路连接如图2-6所示。

I/O端口对应的地址为:

1111  1101  1111  1111   B=FDFFH```
CPU操作指令为:

define 273_addr xbyte[0XFDFF]

unsigned char I/O_DATA;
244_addr =I/O_DATA;`

时间: 2024-09-20 17:19:06

《51单片机应用开发范例大全(第3版)》——2.1 基本器件实现端口扩展实例的相关文章

《51单片机应用开发范例大全(第3版)》——2.3 CPLD实现端口扩展

2.3 CPLD实现端口扩展 单片机与大规模CPLD有很强的互补性.单片机具有性价比高.功能灵活.易于实现人机对话和良好的数据处理能力等优点:CPLD/FPGA则具有高速度.高可靠性以及开发便捷.灵活等优点.以此两类器件相结合的电路结构在许多高性能仪器仪表和电子产品中已经被广泛应用. 单片机与CPLD/FPGA的接口方式一般有两种,即总线方式与独立方式. 1.总线方式 单片机以总线方式与CPLD/FPGA进行数据与控制信息通信有如下优点. (1)速度快.其通信工作时序是纯硬件行为,对于MCS-5

《51单片机应用开发范例大全(第3版)》——第2章 单片机接口的扩展

第2章 单片机接口的扩展 51单片机应用开发范例大全(第3版) 单片机输入/输出(I/O)接口是单片机和外部设备之间信息交换和控制的桥梁.它可以实现和不同外部设备的速度匹配,可以改变数据传送的方式,也可以改变信号的性质和电平等,可以根据不同的外设需要对输入/输出(I/O)接口进行扩展.本章主要结合具体的实例进行讲解,主要包括以下内容: 基本器件实现端口扩展: 扩展芯片实现端口扩展: cpld实现端口扩展.

《51单片机应用开发范例大全(第3版)》——导读

前 言 本书延续了之前两版的风格,书中内容安排基本一致,只是替换了某些应用实例和综合实例.本书内容仍然注重51单片机的技术实际应用,以提高读者的工程实践和开发能力为宗旨. 本书通过18个单片机C语言基础实例.79个单片机技术应用实例和3个综合实例,总计100个实例来讲解单片机的C语言基础知识和单片机开发应用技术.读者可以通过本书的实例快速掌握单片机的开发技术以及开发技巧. 本书分为14章,每章内容安排如下. 第1章介绍了51单片机的基础知识,主要讲解单片机的基本概念.硬件结构特点及应用,单片机的

《51单片机应用开发范例大全(第3版)》——第1章 单片机C语言开发基础 1.1 MCS-51单片机硬件基础

第1章 单片机C语言开发基础 单片微型计算机(Single Chip Micro Computer)现已正名为微控制器(MCU,Micro Controller Unit),单片机的称谓只是其习惯称呼.它把组成微型计算机的各功能部件(包括中央处理单元CPU.随机存储器RAM.只读存储器ROM.I/O接口电路.定时器/计数器以及串行口等)集成在一块电路芯片上.由于单片机的硬件结构与指令系统的功能都是按工业控制要求而设计的,因此常用在工业检测.控制装置中. 1.1 MCS-51单片机硬件基础 MCS

《51单片机应用开发范例大全(第3版)》——1.2 Keil Vision2

1.2 Keil Vision2 MCS-51单片机的开发除了需要硬件的支持以外,同样离不开软件.CPU真正可执行的是机器码,用汇编语言或C等高级语言编写的源程序必须转换为机器码才能运行,转换的方法有手工汇编和机器汇编两种,前者目前已极少使用.机器汇编是指通过汇编软件将源程序变为机器码的编译方法.这种汇编软件称为编译器.本节将向大家介绍目前十分流行的Keil Vision2. 1.2.1 Keil Vision2集成开发环境介绍 Keil Vision2是一个集成开发环境(Intergrated

《51单片机应用开发范例大全(第3版)》——1.1 MCS-51单片机硬件基础

1.1 MCS-51单片机硬件基础 MCS-51是指美国Intel公司生产的一系列单片机的总称.这一系列单片机包括很多种,如8031.8051.8751.8032.8052.8752等.其中8051是最早.最典型的产品,该系列其他单片机都是以8051为核心发展起来的,都具有8051的基本结构和软件特征.8051单片机内部包含了作为微型计算机所必需的基本功能部件,各部件相互独立地集成在同一块芯片上.其基本功能特性如下: 8位CPU: 32条双向可独立寻址的I/O线: 4KB程序存储器(ROM),外

《51单片机应用开发范例大全(第3版)》——2.2 扩展芯片实现端口扩展

2.2 扩展芯片实现端口扩展 用串口扩展I/O口非常实用,但是串口是按位读取的,输入的数据必须重组后才能使用,速度受到限制,同时还需要严格的时钟配合. 在有些场合,利用串口扩展I/O口不是很理想,比如BCD码的输入及多组速率较高的并行数据的输入.所以,用并行数据端口扩展I/O口也是很有必要的. 2.2.1 [实例24]用8243扩展I/O端口 BCD码由四位二进制数组成,有些设备直接以BCD码的形式收发数据.如果这类接口的设备比较多,就需要扩展4位并行接口.本设计利用单片机4个I/O接口,扩展成

《51单片机应用开发范例大全(第3版)》——1.3 C51基础知识

1.3 C51基础知识 1.3.1 C51控制语句 C51语言中,有相关的控制语句,用以实现选择结构与循环结构. 选择控制语句:if语句和switch-case语句. 循环控制语句:for语句.while语句和do-while语句. 转移控制语句:break语句.continue语句和goto语句. 1.选择控制语句 在C51语言中选择结构主要是利用if语句和switch-case语句来实现的. (1)if语句的3种常用形式. C51语言中分支结构主要是应用if语句来实现的,if语句是对给定条件

《51单片机应用开发范例大全(第3版)》——1.4 【实例19】P1口控制直流电动机实例

1.4 [实例19]P1口控制直流电动机实例 利用P1口,编制程序输出一串脉冲,经放大后驱动小电动机,改变输出脉冲的电平及持续时间,达到使电动机正转.反转.加速.减速.停转之目的. 1.实例概述 可以通过74HC244输入开关量数据来控制小直流电动机的转动,实现正转4种转速,反转4种转速及停转.电路及连线如图1-31所示. 图1-31中P1.0连接74HC244的2A2.两个输出通过两个74HC32连接直流电动机电源.小直流电动机原理是:转动方向是由电压来控制的,电压为正则正转,电压为负则负转.