基于proteus的51单片机仿真实例七十五、串入并出芯片74HC595应用实例
2017-05-29 09:44
591 查看
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> // 空操作函数,移位函数头文件包含
sbit SH_CP = P2^0; //移位时钟脉冲端口
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};
//数码管段码表
//延时函数
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 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);
}
}
}
3、在keil c51中新建工程ex63,编写如下程序代码,编译并生成ex63.hex文件
4、在proteus中新建仿真文件ex63.dsn,电路原理图如下所示
5、将ex63.hex文件载入at89c51中,启动仿真,按动拨码开关,观察运行结果。下图是某一时刻程序运行结果
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> // 空操作函数,移位函数头文件包含
sbit SH_CP = P2^0; //移位时钟脉冲端口
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};
//数码管段码表
//延时函数
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 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);
}
}
}
3、在keil c51中新建工程ex63,编写如下程序代码,编译并生成ex63.hex文件
4、在proteus中新建仿真文件ex63.dsn,电路原理图如下所示
5、将ex63.hex文件载入at89c51中,启动仿真,按动拨码开关,观察运行结果。下图是某一时刻程序运行结果
相关文章推荐
- 基于proteus的51单片机仿真实例七十六、8-3编码芯片74HC148应用实例
- 基于proteus的51单片机仿真实例七十九、8位数码管驱动芯片max7221应用实例
- 基于proteus的51单片机仿真实例十三、51单片机的C语言宏定义应用实例
- 基于proteus的51单片机仿真实例六十九、串口转并口器件74HC164应用实例
- 基于proteus的51单片机仿真实例七十三、3-8译码器74HC138应用实例
- 基于proteus的51单片机仿真实例七十二、并口转串口器件74HC165应用实例(续)
- 基于proteus的51单片机仿真实例七十四、4-16译码器74HC154应用实例
- 基于proteus的51单片机仿真实例八十、模数转换器ADC0832应用实例
- 基于proteus的51单片机仿真实例七十七、使用555实现定时功能应用实例
- 基于proteus的51单片机仿真实例七十八、使用BCD译码器实现8位数码管显示应用实例
- 基于proteus的51单片机仿真实例七十一、并口转串口器件74HC165应用实例
- 基于proteus的51单片机仿真实例七十、串口转并口器件74HC164应用实例(续)
- 基于proteus的51单片机仿真实例十四、51单片机的C语言文件包含应用实例
- 基于proteus的51单片机仿真实例六十八、8位数据锁存器74HC573应用实例
- 基于proteus的51单片机仿真实例十五、51单片机的C语言条件编译应用实例
- 基于proteus的51单片机仿真实例二十、用单片机端口演示数据的除法运算结果
- 基于proteus的51单片机仿真实例十七、用不同的数据类型控制LED灯的闪烁频率
- 基于proteus的51单片机仿真实例二十六、“万能逻辑电路”实验
- 基于proteus的51单片机仿真实例二十一、C语言的自增和自减运算演示实例
- 基于proteus的51单片机仿真实例八、关于proteus常用操作的补充说明