74LS165简介
主要引脚介绍:
SO:串行数据输出端
QH:反相串行数据输出端
D0~D7:并行数据输入端
CLK:时钟输入端(需要接时钟源,51单片机串口工作在方式0时接TXD(P3.1口))
INH:时钟禁止端(高电平有效,使用时设为低电平)
SH/LD :移位与置位控制端
SI:串行输入端(用于拓展多个74LS165)
使用方式
74LS165芯片上电后,首先设置SH/LD端为低电平,此时芯片将D0~D7脚上的高低电平数据存入芯片内寄存器Q0~Q7,然后设置SH/LD端为高电平,此时芯片将寄存器内数据通过SO串行发送(QH也会发送反相数据)。
实验电路
C语言代码
轮询写法:
#include<AT89X52.h>
#define LED P0
#define DATEGET P2_5 //对应74LS165数据载入位 SH/LD
void DelayMS(unsigned int Time) //延时函数
{
unsigned char Temp;
while(Time--)
{
for(Temp = 0;Temp <= 160;Temp++);
}
}
void Init() //初始化函数
{
SCON = 0x10;
}
void main()
{
Init(); //初始化
while(1)
{
DATEGET = 0; //数据载入位设为低电平开始读取按键输入
DelayMS(20); //延时一段时间确保读取完成
DATEGET = 1; //数据载入位设为高电平将数据写入串口寄存器
while(!RI); //等待直到寄存器接收完成
LED = SBUF; //使用寄存器数据驱动LED灯
RI = 0; //允许串口接收下一组数据
DelayMS(20); //延时一段时间等待按键输入
}
}
中断写法:
#include<AT89X52.h>
#define LED P0
#define DATEGET P2_5 //对应74LS165数据载入位 SH/LD
void DelayMS(unsigned int Time) //延时函数
{
unsigned char Temp;
while(Time--)
{
for(Temp = 0;Temp <= 160;Temp++);
}
}
void Init() //初始化函数
{
SCON = 0x10;
EA = 1;
ES = 1;
}
void DateGet() interrupt 4 //串口数据接收完成中断
{
DATEGET = 0; //数据载入位设为低电平,将按键数据存入74LS165寄存器
DelayMS(50); //延时一会等待存入完成
LED = SBUF; //变更LED端口
DATEGET = 1; //数据载入位设为高电平,将74LS165寄存器数据写入串口寄存器
/*一定要在串口复位前将数据载入位设为高电平,使得在串口开始接收前发送74LS165寄存器内数据
如果先进行串口复位,串口寄存器因为通讯线路上无信号导致串口寄存器全部被写0,
寄存器误以为数据接收完成使得RI位置1,无法接收数据载入位设为高电平时发送的数据*/
RI = 0; //复位串口开始接收74LS165寄存器数据
/*跳出中断,执行主函数中while(!RI)等待数据接收完成*/
}
void main() //主函数
{
/*开始进行第一次初始化接收*/
Init(); //执行初始化
DATEGET = 1; //数据载入位设为高电平,将74LS165寄存器初始数据写入串口寄存器
/*等待结束进行第一次初始化接收后转入中断*/
while(1)
{
while(!RI); //等待串口寄存器接收完成
/*接收完成后进入中断*/
}
}