(九)串行口方式0 拓展并行输入端口 74LS165 芯片
74LS165芯片讲解:
外接一个同步移位寄存器 74LS165芯片,拓展一个 8 位 并行输入端口的电路, 可将接在74LS165芯片的8个开关 S0——S7 的状态 通过 串行口方式 0 读到 单片机内。
SH/LD : (一) 控制端
低电平: 74LS165芯片可以并行输入数据,且串行输入口关闭
高电平: 并行输入关闭,串行输入口打开,可以向 单片机串行传送数据。
当 P1.0引脚连接的开关S合上的时候,可以进行 S0-S7的状态数字量的并行输入。
单片机采用中断的方式来对状态进行读取,并从 P2 端口通过 LED 显示输出。 (也就是对应LED 灯点亮)
仿真电路图:
参考代码:
1 #include<reg52.h> 2 #include"intrins.h" 3 #include<stdio.h> 4 #define uint16 unsigned int 5 #define uchar8 unsigned char 6 7 uchar8 nRxByte ; 8 9 sbit P1_0=P1^0; 10 sbit P1_1=0x91; 11 12 void delay ( uint16 i) 13 { 14 uchar8 j; 15 for( ; i>0;i--) 16 for(j=0;j<125;j++) ; 17 18 } 19 20 main() 21 { 22 SCON = 0x10; // 这里设置了 对应 REN =1, 允许了串行口接受数据 23 ES=1; // 允许串行口中断 24 EA=1; // 允许全局中断 25 26 for( ; ; ) ; 27 28 } 29 30 void Serial_Port( ) interrupt 4 // 串行口中断服务子程序 31 { 32 33 if(P1_0 == 0) // 解释: P1^0 =0 表示开关S 按下, 可读开关 S0~S7 的状态,如果不按下,就没法输入低电平 34 { 35 36 P1_1=0; // 165芯片允许并行读入开关的状态,串行口关闭 37 delay(10); 38 39 P1_1=1; // 将 开关的状态 串行 读入到 串口中 40 41 RI=0 ; // 接收中断标志 RI 清 0 42 43 nRxByte = SBUF ; // 开关状态从 SBUF 读入到 nRxByte 单元 44 45 P2= nRxByte; // 开关状态数据送到 P2 端口, 驱动 发光二极管 发光 46 47 } 48 49 }
总结: 可以先 按下 S ,然后选 按下 s1 S4 S6 S7 ,按下总运行开关,数据会像 8位 一样传输到 SBUF
当然你也可以按下 总开关,然后随便怎么按, LED 也会对应 点亮,只是分了几次串行通讯而已。 也就是执行了 好几次 串行口中断程序。