基于proteus的51单片机仿真实例七十五、串入并出芯片74HC595应用实例
1、本例中利用一片595控制一个数码管显示。实现了利用3个IO口控制8位数据的输出
2、74HC595的控制端口:
1)SH_CP(11脚):移位时钟脉冲输入端。在上升沿时移位寄存器将数据移位
2)DS(14脚):串行数据输入端。本例通过移位运算将每次移位的数据送到PWD寄存器的进位标志位CY,CY再将值传递给DS引脚,8次移位后完成一个字符的串行传送。
3)ST_CP(12脚):锁存脉冲控制端,在上升沿时移位寄存器的数据被传入存储寄存器,这时如果OE端为低电平,传入存储器的数据会直接输出到输出端Q0-Q7。本例在一个字节的移位操作完成后,通过在ST_CP端产生一个上升沿将数据送出。
4)/MR(10脚):低电平时将移位寄存器数据请0.一般情况下接VCC
5)/OE(13脚):高电平时输出端禁止输出(高阻态)。低电平时允许数据输出
使用74HC595的优点是能锁存数据,这样在移位过程中可以保持输出端的数据不变。而74HC164则没有这种功能。
//利用74HC595实现端口扩展
#include <reg51.h> // 寄存器头文件包含
#include <intrins.h> // 空操作函数,移位函数头文件包含
#include <reg51.h> // 寄存器头文件包含
#include <intrins.h> // 空操作函数,移位函数头文件包含
sbit SH_CP = P2^0; //移位时钟脉冲端口
sbit DS = P2^1; // 串行数据输入端口
sbit ST_CP = P2^2; //锁存端口
sbit DS = P2^1; // 串行数据输入端口
sbit ST_CP = P2^2; //锁存端口
unsigned char temp;
unsigned char code disp_buff[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//数码管段码表
unsigned char code disp_buff[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//数码管段码表
//延时函数
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 input_595(void)
{
unsigned char i;
for(i = 0;i < 8;i++)
{
temp <<= 1; // 数据移位
DS = CY; //产生一个时钟上升沿,使数据移位
SH_CP = 1; //
_nop_();
_nop_();
SH_CP = 0;
}
}
void input_595(void)
{
unsigned char i;
for(i = 0;i < 8;i++)
{
temp <<= 1; // 数据移位
DS = CY; //产生一个时钟上升沿,使数据移位
SH_CP = 1; //
_nop_();
_nop_();
SH_CP = 0;
}
}
//数据并行输出函数
void output_595(void)
{
ST_CP = 0; // 锁存器端口产生一个上升沿,将数据输出
_nop_();
ST_CP = 1;
_nop_();
ST_CP = 0; //锁存数据
}
void output_595(void)
{
ST_CP = 0; // 锁存器端口产生一个上升沿,将数据输出
_nop_();
ST_CP = 1;
_nop_();
ST_CP = 0; //锁存数据
}
//
void main(void)
{
unsigned char i;
while(1)
{
for(i = 0;i < 10;i++)
{
temp = disp_buff[i]; //数码管显示
input_595(); //将一个字节的数据串行输入595
output_595(); //595移位寄存器数据传输到存储寄存器,并输出到数据端口
delayms(500);
}
}
}
void main(void)
{
unsigned char i;
while(1)
{
for(i = 0;i < 10;i++)
{
temp = disp_buff[i]; //数码管显示
input_595(); //将一个字节的数据串行输入595
output_595(); //595移位寄存器数据传输到存储寄存器,并输出到数据端口
delayms(500);
}
}
}
3、在keil c51中新建工程ex63,编写如下程序代码,编译并生成ex63.hex文件
4、在proteus中新建仿真文件ex63.dsn,电路原理图如下所示
5、将ex63.hex文件载入at89c51中,启动仿真,按动拨码开关,观察运行结果。下图是某一时刻程序运行结果