基于proteus的51单片机仿真实例七十、串口转并口器件74HC164应用实例(续)

1、本例利用单片机的串口模式0,即移位寄存器输入/输出模式,串行数据通过RXD输出,TXD则用于输出移位时钟脉冲。这种模式有利于用最少硬件实现接口扩展。
本例在单片机串行端口出外接一片74HC164,构成输出电路
2、串行口控制寄存器SCON有四种工作模式,其中在工作模式0下,串行口是作为同步移位寄存器功能,器波特率固定为晶振频率的1/12。
本例将串口设置为工作模式0状态,利用移位寄存器实现串口数据发送,数据发送通过写SBUF寄存器完成,写入SBUF的8位数据通过RXD逐位发送,移位脉冲则通过TTXD发送。
这些工作全部由硬件自动完成,而且发送完毕后,硬件会自动将TI置位,因此,在设置好工作模式后,只需将待发送的字节写入SBUF,然后等待TI复位即可,在发送下一个字节前,TI要用软件请0.
 
3、在keil c51中新建工程ex58,编写如下程序代码,编译并生成ex58.hex文件
//74HC164 串行输入/并行输出器件实例
//利用串口实现,串行数据由RXD端口发送给74HC164芯片,TXD则用于输出移位时钟脉冲。
#include <reg51.h>  //包含头文件
#include <intrins.h> // 包含移位函数的头文件
// 延时函数
void delay(unsigned int x)
{
  unsigned char i;
 while(x--)
 {
   for(i = 0;i < 120;i++);
 }
}
// 主函数
void main(void)
{
  unsigned char c = 0x80;
 SCON = 0x00;    // 串口模式0,即移位寄存器输入/输出方式
 TI = 1;      //开启TI,串口发送中断标志置1
 while(1)
 {
   c = _crol_(c,1);  //移位函数
  SBUF = c;    //数据送串口数据缓冲器
  while(TI == 0);   //等待发送结束
  TI = 0;     //手动复位中断标志
  delay(500);
 }
}
 
4、在proteus中新建仿真文件ex58.dsn,电路原理图如下所示

基于proteus的51单片机仿真实例七十、串口转并口器件74HC164应用实例(续)
5、将ex58.hex文件载入at89c51中,启动仿真,观察运行结果。下图是某一时刻程序运行结果。

基于proteus的51单片机仿真实例七十、串口转并口器件74HC164应用实例(续)