基于proteus的51单片机仿真实例七十一、并口转串口器件74HC165应用实例
1、74HC165是一个8位并行输入/串行输出的器件。
根据该器件的真值表,可以了解其读取数据所需的时序
2、在keil c51中新建工程ex59,编写如下程序代码,编译并生成ex59.hex文件
// 8位并行输入/串行输出器件74HC165实例演示
#include <reg51.h> // 包含头文件
#include <reg51.h> // 包含头文件
sbit HC165_DATA = P2^0; // 定义串行数据端口
sbit HC165_SH = P2^1; // 定义数据锁存端口
sbit HC165_CLK = P2^2; // 定义串行时钟端口
sbit HC165_SH = P2^1; // 定义数据锁存端口
sbit HC165_CLK = P2^2; // 定义串行时钟端口
// 延时函数
void delayms(unsigned int x)
{
unsigned char i;
while(x--)
{
for(i = 0;i < 120;i++);
}
}
void delayms(unsigned int x)
{
unsigned char i;
while(x--)
{
for(i = 0;i < 120;i++);
}
}
// 主函数
void main(void)
{
unsigned char dat = 0,i,temp = 0x80;
P3 = 0xff; // 先熄灭所有LED
P2 = 0xff; // P2口输出高,当P2口做输入口时,要先输出1才能正确读取端口状态
HC165_CLK = 0; // 串行时钟端口置0
void main(void)
{
unsigned char dat = 0,i,temp = 0x80;
P3 = 0xff; // 先熄灭所有LED
P2 = 0xff; // P2口输出高,当P2口做输入口时,要先输出1才能正确读取端口状态
HC165_CLK = 0; // 串行时钟端口置0
HC165_SH = 0; // 锁存端口置0,读入8位并行数据
HC165_SH = 1; // 锁存端口置1,保持读入的数据
HC165_SH = 1; // 锁存端口置1,保持读入的数据
for(i = 0;i < 8;i++) // 依次读入8位数据
{
if(HC165_DATA) // 判断读取的是高电平还是低电平
{
dat = dat|temp; // 合并读取的位数据
HC165_CLK = 1; // 产生一个上升沿,串出下一个数据
temp = temp >> 1;
delayms(1);
HC165_CLK = 0;
delayms(1);
}
{
if(HC165_DATA) // 判断读取的是高电平还是低电平
{
dat = dat|temp; // 合并读取的位数据
HC165_CLK = 1; // 产生一个上升沿,串出下一个数据
temp = temp >> 1;
delayms(1);
HC165_CLK = 0;
delayms(1);
}
}
P3 = dat; // 获得的数据送P3口
delayms(500);
P3 = dat; // 获得的数据送P3口
delayms(500);
while(1);
}
}
3、在proteus中新建仿真文件ex59.dsn,电路原理图如下所示
4、将ex59.hex文件载入at89c51中,启动仿真,观察运行结果。下图是程序运行结果