(九)串行口方式0 拓展并行输出端口 02 74LS164芯片

时间:2023-05-12 23:04:28

1、先讲解74LS164 移位芯片:

74HC164、74HCT164 是 8 位边沿触发式移位寄存器,串行输入数据,然后并行输出。

数据通过两个输入端(DSA 或 DSB)之一串行输入;任一输入端可以用作高电平使能端,控制另一输入端的数据输入。两个输入端或者连接在一起,或者把不用的输入端接高电平,一定不要悬空。

时钟 (CP) 每次由低变高时,数据右移一位,输入到 Q0, Q0 是两个数据输入端(DSA和 DSB)的逻辑与,它将上升时钟沿之前保持一个建立时间的长度。

主复位 (MR) 输入端上的一个低电平将使其它所有输入端都无效,非同步地清除寄存器,强制所有的输出为低电平。
2、
(九)串行口方式0 拓展并行输出端口 02    74LS164芯片
3、 仿真电路图(实验效果,由下往上 一个 LED 循环点亮 )
(九)串行口方式0 拓展并行输出端口 02    74LS164芯片

4、分析电路图

这里我们选择了工作方式0,来实现串行口数据的传输

74LS164 对应的8引脚 C1/-> 为 同步脉冲输入端,

9 引脚为控制端口,由 P1^0 控制,

当该引脚为 低电平 0 的时候 ,允许 RXD(P3.0)向 74LS164  的 串行数据输入端口A 和 B 输入,,但是  74LS164芯片  的8位并行输出端关闭。

当该引脚为 低电平 1 的时候 , RXD(P3.0)不准向 74LS164  的 串行数据输入端口A 和 B 输入,但 允许  74LS164芯片  的8位并行输出端。

当串行口将 8 位 串行数据发送完毕后,申请中断, 在中断服务程序中,单片机通过串行口输出下一个 8 位 数据。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

方式0

(1)特点

1.用作串行口扩展,具有固定的波特率,为Fosf/12。

2.同步发送/接收,由TXD提供移位脉冲,RXD用作数据输入/输出通道。

3.发送/接收8位数据,低位在先。

(2)发送操作

当执行一条“MOV SBUF,A”指令时,启动发送操作,由TXD输出移位脉冲,由RXD串行发送SBUF中的数据。发送完8位数据后自动置TI=1,请求中断。要继续发送时,T1必须有指令清零。

(3)接收操作

在RI=0条件下,置REN=1,启动一帧数据的接收,由TXD输出移位脉冲,由RXD接收串行数据到A中。接收完一帧自动置位RI,请求中断。想继续接收时,要用指令清零RI。

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

5、参考代码:

 #include<reg52.h>
#include<stdio.h>
#define uchar8 unsigned char
#define uint16 unsigned int
sbit P1_0=0x90; // 为什么要这样写,P1口的字节地址就是 0x90 ,好像这样写也没有意义啊 // sbit LED=P0^6 uchar8 nSendByte ; void delay(uint16 i) // 延时函数
{
uchar8 j;
for(; i>;i--) for(j=;j<;j++)
; } main()
{
SCON=0x00;
EA=; // 总中断允许
ES=; // 允许串行总中断 nSendByte = ; // 点亮数据初始化为 0000 0001 送入 nSendByte
SBUF=nSendByte; // 向 SBUF 缓冲器 写入点亮数据,启动串行发送
P1_0=;
while()
{ ; } } void Serial_Port( ) interrupt using
{ if(T1) // 如果 T1=1,表示1个字节串行发送完毕,这是标志位,要后来软件清0
{
P1_0=; // 也就是 0x90=1;??? 允许 74LS164芯片并行输出,流水灯点亮发光二极管 SBUF=nSendByte; // 像 SBUF 写入数据,启动串行发送
delay();
P1_0=; // P1_0=0; 允许向 74LS164 芯片 串行写入 nSendByte = nSendByte<<; if(nSendByte==) nSendByte=0x02;
// 判断点亮数据是否左移8次,是重新点亮数据,但自己改了一下
SBUF=nSendByte; // SBUF为 0000 0010 所以仍然接受数据,但从第二个灯开始 } TI=; // 向 74LS164 芯片串行发送点亮数据
RI=; // receive 接受中断请求标志位, 这里也要清0 ,
}

具体还是要自己勤于思考??多看看,多想想??