使用C51单片机和74HC595芯片驱动数码管动态扫描

学习51单片机有一段时间了,最近想用51单片机做个多功能的时钟来实践一下。因为在制做的过程中总是突发奇想的加一些功能上去,比如加了个温湿度测量显示、加了个24C02·····为了节省io我使用了两片74HC595芯片联级驱动8位动数码。

关于74HC595芯片的资料可以参考 http://t.csdn.cn/cjber
 

以下是例程

使用74HC595的函数部分

#ifndef __74HC595_H
#define __74HC595_H

#include
#include


typedef unsigned char uchar;
typedef unsigned int uint;


sbit DS=P3^0;       //控制串行数据输入
sbit SH_CP=P3^1;    //串行输入时钟
sbit ST_CP=P3^2;    //存储寄存器时钟


void Send_Byte(uchar byte);//发送1byte数据
void Send_Doudle(uchar Place,uchar Data);//参数为原码  发送2byte数据
void Send_CP(uint place,uint Data);//参数为数字  发送2byte数据
void delay(int z);//延时1ms


#endif

#include"74HC595.h"

uchar smgduan[10]={0xc0,0xf9,0xa4,0xb0,0x99,
	               0x92,0x82,0xf8,0x80,0x90}; //共阳数码管0~9段码

void Send(uchar byte)
{
	uchar a;
	SH_CP=0;//拉低时钟线为传送数据准备
	ST_CP=0;
	for(a=0;a<8;a++)
	{
		DS=byte&0x80; //先发送最高位
		byte<<=1;
		SH_CP=1;//拉高时钟线移位寄存器往后移动1位接纳新传送的1位数据
		_nop_();
		_nop_();
		SH_CP=0;//复位	
	}
}


void Send_Byte(uchar byte)
{
	Send(byte);//发送8位数据移位寄存器
	
	ST_CP=1;//将移位寄存器的数据传输到存储寄存器
	_nop_();
	_nop_();
	ST_CP=0;//复位
}


void Send_Doudle(uchar Place,uchar Data)
{
	Send(Place);//先发送数码管位选数据到移位寄存器
	Send(Data);	//再发送数码管段选数据到移位寄存器
	
	ST_CP=1;//将移位寄存器的数据传输到存储寄存器
	_nop_();
	_nop_();
	ST_CP=0;//复位
}


void Send_CP(uint place,uint Data)
{
	Send(0x01<0;x--)
  for(y=110;y>0;y--);
}





主函数部分

#include
#include"74HC595.H"


void main()
{
	int a,b[8]={2,0,2,2,0,8,1,4};
    while(1)  
	 for(a=0;a<8;a++)
	 {
		 Send_CP(a,b[a]);
		 delay(3);
		 Send_Byte(0xff);//消隐
	 }	  
}

proteus仿真

使用C51单片机和74HC595芯片驱动数码管动态扫描_第1张图片

 经过2片74HC595的联级操作只需要3个io就可控制8位的数码管大大的提高了io的利用率,甚至你还可以将更多片的74HC595串起来使用,以上就是本次分享的全部内容,由于水平有限如有错误请谅解!

你可能感兴趣的:(51单片机)