学习51单片机有一段时间了,最近想用51单片机做个多功能的时钟来实践一下。因为在制做的过程中总是突发奇想的加一些功能上去,比如加了个温湿度测量显示、加了个24C02·····为了节省io我使用了两片74HC595芯片联级驱动8位动数码。
关于74HC595芯片的资料可以参考 http://t.csdn.cn/cjber
以下是例程
使用74HC595的函数部分
#ifndef __74HC595_H
#define __74HC595_H
#include<reg52.h>
#include<intrins.h>
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<<place);//先发送数码管位选数据到移位寄存器
Send(smgduan[Data]);//再发送数码管段选数据到移位寄存器
ST_CP=1;//将移位寄存器的数据传输到存储寄存器
_nop_();
_nop_();
ST_CP=0;//复位
}
void delay(int z)//1ms延时
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
主函数部分
#include<reg52.h>
#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仿真
经过2片74HC595的联级操作只需要3个io就可控制8位的数码管大大的提高了io的利用率,甚至你还可以将更多片的74HC595串起来使用,以上就是本次分享的全部内容,由于水平有限如有错误请谅解!