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> // 包含移位函数的头文件
//利用串口实现,串行数据由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 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);
}
}
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,电路原理图如下所示
5、将ex58.hex文件载入at89c51中,启动仿真,观察运行结果。下图是某一时刻程序运行结果。