实验11
74LS165并入串出实验
74L165是并行输入,串行输出移位寄存器。80C51单片机内部的串行口在方式0工作状态下,使用移位寄存器芯片可以扩展一个或多个8位并行I/O口。
A,B,C,D,E,F,G,H 并行输入端。
QH串行输出端。
CLOCK:时钟输入端。
CLOCK INHIBIT:时钟禁止端。当时钟禁止端CLK2为低电平时,充许时钟输入。
SHIFT/LOAD:移位与置位控制端。
SER:扩展多个74LS165的首尾连接端。
本练习TXD(P3.1)作为移位脉冲输出端与74LS165的移位脉冲输入端CLOCK相连;RXD(P3.0)作为串行输入端与74LS165的串行输出端QH相连;P3.2用来控制74165的移位与置入。
本练习利用串行口扩展了1片74LS165,从而实现了8个按键的输入,在单片机的P1口连接了8个LED发光二极管,程序中实现了用按键控制发光二极管的亮与灭。流程为8路开关-74165-3PIN数据线-8路指示灯。
由此可以看出通过165传输,只用了3条数据线, 就实现了8个开关控制8个灯的目的。 从而节约了控制的连线。
74LS165 引脚定义:

74LS165逻辑表:

相关原理:

程序运行照片:

接线方法:
1、用一个4PIN数据排线一端插入CPU部份JP53(P3口)的P3.0,P3.1,P3.2,P3.3。另外一端插入74LS165部份的输入端JP21。
2、用一根8PIN的数据排线, 一端插入74LS165部份的输出端JP28, 另一端插入8路按键开关的的JP48。
3、用一条8PIN的数据排线把CPU部份的P1口(JP44)连接到八路指示灯部份的JP32。运行后分别按k00-k07,可以看到d00-d07八个灯受控制。
程序流程图:

汇编语言参考程序:
org 0080h
loop: mov scon,#00010000b ; 设定MODE=0
clr p3.2 ; P3.2=0 载入数据
call delay1 ;延时
setb p3.2;P3.2=1 ;数据输出
clr ri ;RI=0
loop1:jbc ri,loop2 ;RI=1?是则到LOOP2
jmp loop1 ; 否则继续监测
loop2: mov a,sbuf ;将SUBF载入ACC
mov p1,a ;输出到P1
jmp loop ;重新开始
delay: mov r7,#00h ;延时子程序
tt: mov r6,#00h
djnz r6,$
djnz r7,tt
ret
delay1: ;短延时子程序
mov r7,#02
djnz r7,$
ret
end
c语言参考程序:
#include<reg51.h> //头文件
#define uchar unsigned char //宏定义,为方便编程
#define uint unsigned int
#define LED P1 //宏定义,将P1口定义为LED
sbit LOAD=P3^2; //定义P3.2为数据置入位
void delay_run() //数据载入延迟
{
uchar ii,jj;
for(ii=0;ii<200;ii++)
for(jj=0;jj<200;jj++);
}
void delay_load() //数据载入位延迟
{
uchar ii=200;
while(ii--);
}
void init()
{
SCON=0x10; //串口工作与方式0,启动接收
PCON=0x00;
}
char code SST516[3] _at_ 0x003b; //仿真器入口
main() //主函数
{
uchar value=0;
init(); //串口初始化
while(1)
{
LOAD=0; //74165并口端载入数据
delay_load(); //延迟
LOAD=1; //将置数据位拉高
while(!RI); //若没接收够8位串行数据则等待
RI=0; //接收完毕,标志位清0
value=SBUF; //读取数据
P1=value; //赋给P1,驱动LED
delay_run(); //延迟,完毕后进行下一次并行数据载入
}
}