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

 

 

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

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

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

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

主复位 (MR) 输入端上的一个低电平将使其它所有输入端都无效,非同步地清除寄存器,强制所有的输出为低电平。
 
2、
 
 
 
3、 仿真电路图(实验效果,由下往上 一个 LED 循环点亮 )
 

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 }

 

 

 

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

 

posted on 2015-12-27 11:48  无悔这一生。  阅读(5487)  评论(0编辑  收藏  举报

导航