1、74LS165各个端口功能
SH/RD':移位/装载数据,当为高电平时,在时钟信号下进行移位,当为低电平时,将并行输入口的数据送到寄存器中
CLK:时钟输入
A~H:并行输入口
QH、QH':串行输出口
GND:接地端
SER:串行输入口,通过它可以将多个74LS165连接起来,也可以和其他串行口连接,在时序配合的情况下,将数据加入送出的串行数据中
CLKINH:时钟抑制
VCC:电源
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单片机。
用串口驱动74LS165
74LS165实现串口扩展并行输入口
示例代码
利用单片机串口实现输入移位寄存器,只需用软件置REN=1(同时RI=0),即开始接
收。数据字节在移位时钟脉冲的配合下,从低位至高位一位一位地接收下来并装入SBUF中,
在启动接收过程(即写SCON,清RI位)开始后的第8个机器周期RI被置位。这一数据帧
接收完毕,可进行下一帧的接收。
#include <STC89C5xRC.H>
sbit LOAD=P1^7; //控制引脚SH/RD’
void UART_init();
unsigned char PA(void);
void mian()
{
UART_init();
while(1)
{
}
}
//串口初始化
void UART_init()
{
SCON=0x10;
//设置串行口为方式0,允许接收和
ES=1;//打开串口中断
RI=0;
}
//数据接收函数PA()
unsigned char PA(void)
{
unsigned char PA_deta;
LOAD=0;//低电平 74LS165将并行数据装入寄存器
LOAD=1;//高电平 74LS165在时钟信号下进行移位
UART_init();
//74LS165工作在时钟控制下的串行移位状态
while(RI==0);
RI=0;
PA_deta=SBUF;
return PA_deta;
}
2、用I/O口驱动74LS165
单片机的串口工作在模式0,只是作为同步移位寄存器。如果能够直接用I/O模拟移位
寄存器的时序,同样能驱动74LS165,实现并行数据的输入。如图2-2所示,P1.5被用于串
行数据输入,P1.6用于移位时钟输出,P1.7用来控制74LS165的工作状态。
示例代码
#include <STC89C5xRC.H>
sbit a7=ACC^7;
sbit CLK=P1^6;//模拟时钟串口
sbit DETA=P1^5;//模拟串口数据
sbit LD=P1^7;//控制引脚
unsigned char PAs(void);
unsigned char in_simuseri(void);
void main()
{
while(1)
{
}
}
//数据输入函数
//输出参数deta_buf
//8位同位移位寄存器 将DETA串行输入的数据按从低位到高位保存到 deta_buf
unsigned char in_simuseri(void)
{
unsigned char i;
unsigned char deta_buf;
i=8;
do
{
ACC=ACC>>1;
if(CLK==0)
a7=DETA;
if(CLK==1);
}
while(--i!=0);
CLK=0;
deta_buf=ACC;
return(deta_buf);
}
//数据输出函数
//输出参数PAs_buf,返回并行输入74LS165的数据
//直接调用即可读取并行输入74LS165的数据
unsigned char PAs(void)
{
unsigned char PAs_buf;
LD=0;
LD=1;
PAs_buf=in_simuseri();
return(PAs_buf);
}