(九)串行口方式0 拓展并行输出端口 02 74LS164芯片
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、参考代码:
1 #include<reg52.h> 2 #include<stdio.h> 3 #define uchar8 unsigned char 4 #define uint16 unsigned int 5 sbit P1_0=0x90; // 为什么要这样写,P1口的字节地址就是 0x90 ,好像这样写也没有意义啊 // sbit LED=P0^6 6 7 uchar8 nSendByte ; 8 9 void delay(uint16 i) // 延时函数 10 { 11 uchar8 j; 12 for(; i>0;i--) 13 14 for(j=0;j<125;j++) 15 ; 16 17 } 18 19 main() 20 { 21 SCON=0x00; 22 EA=1; // 总中断允许 23 ES=1; // 允许串行总中断 24 25 nSendByte = 1; // 点亮数据初始化为 0000 0001 送入 nSendByte 26 SBUF=nSendByte; // 向 SBUF 缓冲器 写入点亮数据,启动串行发送 27 P1_0=0; 28 while(1) 29 { ; } 30 31 } 32 33 void Serial_Port( ) interrupt 4 using 0 34 { 35 36 if(T1) // 如果 T1=1,表示1个字节串行发送完毕,这是标志位,要后来软件清0 37 { 38 P1_0=1; // 也就是 0x90=1;??? 允许 74LS164芯片并行输出,流水灯点亮发光二极管 39 40 SBUF=nSendByte; // 像 SBUF 写入数据,启动串行发送 41 delay(500); 42 P1_0=0; // P1_0=0; 允许向 74LS164 芯片 串行写入 43 44 nSendByte = nSendByte<<1; 45 46 if(nSendByte==0) nSendByte=0x02; 47 // 判断点亮数据是否左移8次,是重新点亮数据,但自己改了一下 48 SBUF=nSendByte; // SBUF为 0000 0010 所以仍然接受数据,但从第二个灯开始 49 50 } 51 52 TI=0; // 向 74LS164 芯片串行发送点亮数据 53 RI=0; // receive 接受中断请求标志位, 这里也要清0 , 54 }
具体还是要自己勤于思考??多看看,多想想??