基于proteus的51单片机仿真实例七十五、串入并出芯片74HC595应用实例

来源:互联网 发布:dd3000软件 编辑:程序博客网 时间:2024/05/20 14:26
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中,启动仿真,按动拨码开关,观察运行结果。下图是某一时刻程序运行结果

阅读全文
0 0
原创粉丝点击