1、先讲解74LS164 移位芯片:
74HC164、74HCT164 是 8 位边沿触发式移位寄存器,串行输入数据,然后并行输出。
数据通过两个输入端(DSA 或 DSB)之一串行输入;任一输入端可以用作高电平使能端,控制另一输入端的数据输入。两个输入端或者连接在一起,或者把不用的输入端接高电平,一定不要悬空。
时钟 (CP) 每次由低变高时,数据右移一位,输入到 Q0, Q0 是两个数据输入端(DSA和 DSB)的逻辑与,它将上升时钟沿之前保持一个建立时间的长度。
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 ,
}
具体还是要自己勤于思考??多看看,多想想??