51单片机驱动两片74HC595级联动态驱动8位数码管
移位寄存器74hc595控制8位数码管
一不用单片机串口电路原理图:C程序:#include<reg51.h>#define uint unsigned int#define uchar unsigned charsbit QS=P2^0; // 串行数据输入端sbit shuchu=P2^1; // 存储寄存器脉冲输入sbit yiwei=P2^2; // 移位寄存器脉冲输入sbit Q1=P2^3; //38译码器输入选择sbit Q2=P2^4;sbit Q3=P2^5;uchar shuma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=120;y>0;y--);}void wei(uchar z) //数码管位选择{Q1=z&0x01;Q2=(z>>1)&0x01;Q3=(z>>2)&0x01;}void display(){uchar i,j,temp;for(i=0;i<8;i++){wei(i);temp=shuma[i];for(j=0;j<8;j++){QS=temp&0x80;yiwei=0;yiwei=1;temp=temp<<1;}shuchu=0;shuchu=1;delay(2);for(j=0;j<8;j++) //消影{QS=1;yiwei=0;yiwei=1;}}}void main(){while(1){display();}}二用单片机串口(P3^0和P3^1)电路原理图:C程序:#include<REG51.H>#define uint unsigned int#define uchar unsigned char//sbit QS=P3^0; // 串行数据输入端sbit shuchu=P3^2; // 存储寄存器脉冲输入//sbit yiwei=P3^1; // 移位寄存器脉冲输入sbit Q1=P3^3; //38译码器输入选择sbit Q2=P3^4;sbit Q3=P3^5;uchar shuma[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};/*由于串口发送是由低向高发送,所以得把数码从高低位调换如‘0’码为0xco 11000000换为00000011 0x03*/void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=120;y>0;y--);}void wei(uchar z) //数码管位选择{Q1=z&0x01;Q2=(z>>1)&0x01;Q3=(z>>2)&0x01;}void display(){uchar i;for(i=0;i<8;i++){wei(i); //选择数码管位SBUF=shuma[i]; //向串口缓冲寄存器中存入数据while(!TI); //等待发送完成TI=0; //清楚发送完成标志shuchu=0; //输出shuchu=1;delay(2);SBUF=0xff; //消影while(!TI);TI=0;}}void main(){/*单片机上电后默认为串口方式0,所以不需要设置串口模式*/ // EA=1; //开总中断// ES=1; //开串口中断// IE=0x90;/*SM0=0; //选择串行工作模式0SM1=0;*/// TCON=0x00;// TI=0;while(1){display();}}。
51单片机+74HC595驱动数码管程序
51单片机+74HC595驱动数码管程序这里是电路图:完整的源码和图纸下载地址:51hei/bbs/dpj-20392-1.html下面是51 单片机驱动74hc595 芯片的程序:#include //包含51 单片机的头文件#include #define uint unsigned int#define uchar unsigned char//sbit sin_595 =P1;//sbit rclk_595 =P1;//sb it sclk_595 =P1 ;//sbit s_clr =P1;sb it a_cp_595 =P2; //串行移位时钟脉冲sh_cp_595sbit b_cp_595 =P2;//输出锁存器控制脉冲st_cp_595//sbit _oe_595 =P1 ; //8 位并行输出使能/禁止(高阻态)sbit ds_595=P2 ; //串行数据输入extern uchar datas[6]; //存放6 个数码管的显示数字uchar ledcode[]={0xC0,// 00xF9,// 10xA4,// 20xB0,// 30x99,// 40x92,// 50x82,// 60xF8,// 70x80,// 80x90,// 90x88,// A0x83,// B0xC6,// C0xA1,// D0x86,// E0x8E// F};void delay(uint z){uint t1,y;for(t1=z;t1>0;t1--)for(y=110;y>0;y--);}voidled_display(void){ uchar i,j; bit testb; uchar bdata movebit[6]; uchar bdata test; //_oe_595=0; //选中数码管for(i=0;i<6;i++) movebit[i]=ledcode[datas[i]]; // P1=0; delay(1); for(i=0;i<6;i++) //数据移位{ test=movebit[i]; for(j=0;j<8;j++) { testb=test&0x80; test=test<<1; if(testb) { ds_595=1; } else {ds_595=0; }a_cp_595=1; a_cp_595=0; } //数据移位} b_cp_595=0; b_cp_595=1; b_cp_595=0;} tips:感谢大家的阅读,本文由我司收集整编。
数码管显示-74HC595动态扫描
输出第8位的位码,紧接着输出该位要显示的段码,然后使LATCH由0跳变到1使74HC595锁存并输出数据,此时第8位将显示,其它位全部都不显示。
延时一段时间。
如此循环往复,实现8位数码管显示的效果。
四、操作步骤:(1)按照IAR MSP430 项目建立与JTAG仿真设置所讲方法建立名称为M13x LED 595的项目。
(2)将如下程序拷贝粘贴到main.c文件中。
//*******************************************************************************//// 描述; 在TY-DIS1(8位数码管显示模块)上动态扫描显示 4321// ACLK= n/a, MCLK= SMCLK= default DCO ~ 800k//// 硬件连接:如下图// MSP430F13x// -----------------// /|\| XIN|-// | | |// --|RST XOUT|-// | |// | P5.0|-->LED_DOUT// | P5.2|-->LED_CLK// | P5.4|-->LED_LATCH//// 时间:2007年10月// //// 硬件电路:MSP430F135核心实验板-I型+ TY-DIS1(8位数码管显示模块)// 硬件连接://// 调试器:MSP430FET全系列JTAG仿真器// 调试软件: IAR Embedded Workbench Version: 3.41A 编译//******************************************************************************#include <msp430x13x.h>//4位LED数码管显示子程序void LED_595(char SMG1,char SMG2,char SMG3,char SMG4);//74HC595串行输出子程序void Led_out(unsigned char X);//LED数码管段码转换表const unsigned char LED_0_F[];void main(void){WDTCTL = WDTPW + WDTHOLD; // Stop watchdogP5DIR =0; //P5口全部设为输入口P5SEL =0; //将P5口所有的管脚设置为一般I/O口//将P5.0 P5.2 P5.4设置为输出方向P5DIR |= BIT0;P5DIR |= BIT2;P5DIR |= BIT4;for (;;){LED_595(4,3,2,1);//调用显示子程序(改变参数表,改变显示内容)}}//------------------------------------------------------// 4位LED数码管显示子程序//// 人口参数:SMG1,SMG2,SMG3,SMG4——待显示的数据//void LED_595(char SMG1,char SMG2,char SMG3,char SMG4){char z;//最高位(最左侧)LED数码管显示---------------------z = LED_0_F[SMG1];Led_out(z); //段码输出z = 0xFE; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;//--------------------------------------------------_NOP(); // 断点设置(观察watch)//次高位(左数第2个)LED数码管显示---------------------z = LED_0_F[SMG2];Led_out(z); //段码输出z = 0xFD; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;//--------------------------------------------------_NOP(); // 断点设置(观察watch)//次低位(左数第3位)LED数码管显示---------------------z = LED_0_F[SMG3];Led_out(z); //段码输出z = 0xFB; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;//--------------------------------------------------_NOP(); // 断点设置(观察watch)//最低位(左数第4位)LED数码管显示---------------------z = LED_0_F[SMG4];Led_out(z); //段码输出z = 0xF7; //位码Led_out(z); //位码输出P5OUT &=~(BIT4); //显示输出P5OUT |=BIT4;//--------------------------------------------------_NOP(); // 断点设置(观察watch)}//------------------------------------------------------// 用于74HC595的LED串行移位子程序//// 人口参数:X——待输出的数据//void Led_out(unsigned char X){unsigned char i;。
单片机和74HC595驱动芯片对数码管的控制设计
单片机和74HC595驱动芯片对数码管的控制设计
1. 数码管显示设计
本设计使用了一个4位的数码管,为共阳型,为了节省单片机的IO口,使用了两片74HC595作为数码管的驱动芯片,共占用3个IO口。
74HC595部分电路图如下:
与单片机相连接的三个脚分别为:HC_DAT,HC_RCK,HC_CLK。
两片595采用级联方式,即U2的第9脚接到U3的第14引脚。
2. 74HC595简介
74HC595是8位的移位寄存器,串入并出,并具有锁存功能,被广泛的用于数码管、点阵的驱动电路中。
其管脚介绍如下:
15:数据输出A-接数码管数据A段;
1:数据输出B-接数码管数据B段;
2:数据输出C-接数码管数据C段;
3:数据输出D-接数码管数据D段;
4:数据输出E-接数码管数据E段;
5:数据输出F-接数码管数据F段;
6:数据输出G-接数码管数据G段;
7:数据输出H-接数码管数据H段;
16:电源正脚-接电源正;
8:电源负脚-接电源负;
14:数据输入脚-接单片机管脚;
12:数据锁存时钟-接单片机管脚;
11:数据输入时钟-接单片机管脚;
13:使能输出脚-低电平有效,接低电平;
10:数据清零-不清零,接高电平;。
51单片机控制74HC595驱动的编程要点
51单片机控制74HC595驱动的编程要点51单片机编程要点51单片机控制74HC595驱动的编程要点:74595外形图______QB--|1 16|--VccQC--|2 15|--QAQD--|3 14|--SIQE--|4 13|--/GQF--|5 12|--RCKQG--|6 11|--SCKQH--|7 10|--/SCLRGND-|8 9|--QH'|_____|74595的数据端:QA--QH: 八位并行输出端,可以直接控制数码管的8个段。
QH': 级联输出端。
我将它接下一个595的SI端。
SI: 串行数据输入端。
74595的控制端说明:/SCLR(10脚): 低点平时将移位寄存器的数据清零。
通常我将它接Vcc。
SCK(11脚):上升沿时数据寄存器的数据移位。
QA-->QB-->QC-->...-->QH;下降沿移位寄存器数据不变。
(脉冲宽度:5V时,大于几十纳秒就行了。
我通常都选微秒级)RCK(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。
通常我将RCK置为低点平,当移位结束后,在RCK端产生一个正脉冲(5V时,大于几十纳秒就行了。
我通常都选微秒级),更新显示数据。
/G(13脚): 高电平时禁止输出(高阻态)。
如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。
比通过数据端移位控制要省时省力。
注1)74164和74595功能相仿,都是8位串行输入转并行输出移位寄存器。
74164的驱动电流(25mA)比74595(35mA)的要小,14脚封装,体积也小一些。
2)74595的主要优点是具有数据存储寄存器,在移位的过程中,输出端的数据可以保持不变。
这在串行速度慢的场合很有用处,数码管没有闪烁感。
3)595是串入并出带有锁存功能移位寄存器,它的使用方法很简单,在正常使用时SCLR为高电平,G为低电平。
使用SPI接口的74HC595控制 8位数码管显示
$swstack = 10
$framesize = 40
Const On = 1
Const Off = 0
Dim I As Byte
Dim A(3) As Byte
Latch Alias Portb.1
Config Spi = Soft , Dout = Portb.3 , Ss = None , Clock = Portb.5
// 74HC595/165驱动程序
//(16ቤተ መጻሕፍቲ ባይዱ,595均为两片)
//*******************************************
unsigned int LED;
unsigned int KEY_DATA;
void Driver_595(unsigned char Bit,unsigned char State)
Latch = Off '使能显示
Waitus 10
Latch = On
Do
Loop
End
'********************************************************************
'--------------------------专用字形表------------------------------------------
{
DDRB=0xff;
PORTB=0x00;
}
//****************************************************************
void Driver_165(void) //Bite所取位0~15,State为改位的状态0,1
单片机74HC595级联控制数码管
功能:在数码管上显示1234
作者:陈韬
时间:20111118
备注:595不管是多少个级联,先只管写,比如两个级联,那么先写后一个的数据函数,
然后写前一个级联595的函数,最后一次性的一起释放并出的引脚
*******************************************************************/
0x80,0x90,0x83,0xc6,0xa1,0x86,0x8e };//共阳数码管低电平点亮
unsigned char code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//高电平位选
/*************
void Delay(void);//延时函数
void Disp(unsigned char m,unsigned char n)//显示的数字+显示的数码管位
{
W595_in(wei[n]);
W595_in(duan[m]);
W595_out();
Delay();
}
/**************************/
main()
{
unsigned char i;
void W595_in(unsigned char Data);//完成一个字节8位的输入
void W595_out (void);//完成并出数据功能
void Disp(unsigned char m,unsigned char n);//显示的数字+显示的数码管位
****************/
/*************************************/
51单片机驱动8位数码管电路图+程序
51单片机驱动8位数码管电路图+程序电路图:JP10排线连接J12 J21跳线跳12处测试程序#includetypedef unsigned char BYTE;typedef unsigned int WORD;sbit LS138A = P2^2; //定义138译码器的输入A脚由P2.2控制sbit LS138B = P2^3; //定义138译码器的输入脚B由P2.3控制sbit LS138C = P2^4; //定义138译码器的输入脚C由P2.4控制//此表为LED 的字模, 共阴数码管 0-9 -BYTE code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};WORD LedOut[10];//数码管数组/************************************************************** **************** 延时程序 **************************************************************** *************/void Delay(WORD n){WORD x;while (n--){x = 250;while (x--);}}/************************************************************** **************** 显示函数 *****************************************************************************/void display(WORD num){WORD i,LedNumVal ;LedNumVal=num;LedOut[0]=Disp_T ab[LedNumVal%100000/10000]; //万位LedOut[1]=Disp_T ab[LedNumVal%10000/1000]; //千位LedOut[2]=Disp_T ab[LedNumVal%1000/100]; //百位LedOut[3]=Disp_T ab[LedNumVal%100/10]; //十位LedOut[4]=Disp_T ab[LedNumVal%10]; //个位LedOut[5]=Disp_T ab[LedNumVal%1000/100]|0x80; //百位带小数点LedOut[6]=Disp_T ab[LedNumVal%100/10]; //十位LedOut[7]=Disp_T ab[LedNumVal%10]; //个位for( i=0; i<8; i++) //实现8位动态扫描循环{P0 = LedOut[i]; //将字模送到P0口显示switch(i) //使用switch 语句控制位选也可以是用查表的方式{case 0:LS138A=0; LS138B=0; LS138C=0; break;case 1:LS138A=1; LS138B=0; LS138C=0; break;case 2:LS138A=0; LS138B=1; LS138C=0; break;case 3:LS138A=1; LS138B=1; LS138C=0; break;case 4:LS138A=0; LS138B=0; LS138C=1; break;case 5:LS138A=1; LS138B=0; LS138C=1; break;case 6:LS138A=0; LS138B=1; LS138C=1; break;case 7:LS138A=1; LS138B=1; LS138C=1; break;}Delay(1);}}main(){while(1){display(12345); }}。
AVR单片机595驱动8位数码管的显示的电路实现
A VR单片机595驱动数码管显示一、电路实现8位数码管的电路如下图所示数码管是一种半导体发光器件,其基本单元是发光二极管。
数码管按段数分为七段数码管和八段数码管(还有一种“米”字型的数码管,其段数更多),八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示),其基本原理是:将所有LED的一端(正极、负极均可)连在一起作为一个公共端,然后通过分别控制这组LED的另一个端口来使部分LED点亮,从而达到显示一定字形的目的。
数码管的分类:按能显示多少个“8”可分为1位、2位、4位等等数码管;按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。
共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。
共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。
当某一字段的阴极为高电平时,相应字段就不亮。
共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。
共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。
当某一字段的阳极为低电平时,相应字段就不亮。
我们在实际使用中一定要搞清楚数码管是共阴极的还是共阳极的。
数码管段、位引脚的确定(以4位8段数码管为例),我们在实际应用中购买的数码管不像电阻、电容、集成等元件那样有数据手册或者直接在元件上标明管脚序号和用途,并且市场上数码管的管脚排列顺序并不是一致的,所以我们购买回来的数码管一般都要亲自测量一下各个引脚的用途,怎么测量呢?数码管引脚测量分三步:极性判断(共阳极还是共阴极)、公共端判断(位选端口)、段码端判断(段选端口)。
首先要确定数码管是共阴极还是共阳极的:找一个3到5V的直流电源,准备几个1K或者几百欧姆的电阻。
将电源的正极串接一个电阻后连在数码管的任意一个脚上,然后将电源的负极逐个接到数码管的其余引脚上,观察数码管的某一段是否会点亮,如果全部引脚试过都没有亮的,那么将电源正极(串电阻)换一个引脚再试,直到有一个LED发光,这时固定电源负极不动,电源正极(串电阻)逐个接到数码管的其余引脚上,如果有8段LED都亮,说明该数码管是共阴极的。
利用2片74HC595驱动8个数码管显示
/*---------------------------------------------*/ unsigned char code duan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0 1 2 3 4 5 6 7 8 9
} 注:74164和74595功能相仿,都是8位串行输入转并行输出移位寄存器。74164的驱动电流(25m A)比74595(35mA)的要小,14脚封装,体积也小一些。 74595的主要优点是具有数据存储寄存器,在移位的过程中,输出端的数据可以保持不变。这在 串行速度慢的场合很有用处,数码管没有闪烁感。 与164只有数据清零端相比,595还多有输出端时能/禁止控制端,可以使输出为高阻态。
unsigned char code wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
void delay2ms(void) { unsigned char i,j; for(i=133;i>0;i--) for(j=6;j>0;j--);
} /*---------------串行数据输入-----------------------------*/ void 595_in(unsigned char Data) { unsigned char i; for(i = 0; i < 8; i++) { SCL1 = 0; //先将移位寄存器控制引脚置为低 //取数据的最高位 //将数据的次高位移到最高位 //再置为高,产生移位时钟上升沿,上升沿时数据寄存器 //循环8次,刚好移完8位
用两片74HC595驱动两个四连体数码管(共阳极,动态扫描) 首先介绍一下74HC595芯片:
单片机驱动74HC595的c51程序
单片机驱动74HC595的c51程序//该子程序为74HC595 发送字符的程序,该程序是先发送的是最低位!//芯片74HC595 的时钟引脚为第11 脚//芯片74HC595 的数据引脚为第14 脚//芯片74HC595 的锁存引脚为第12 脚//当有多片74HC595 串联时,只有当所有数据都发送完成后,再锁存信号!//同样74hc164 与51 单片机连接也可以由这个程序来驱动#include#define uchar unsigned char#define uint unsigned int sbit clk=P3 ;sbit dat=P3;sb it shuo_cun=P3;uchar volatile e,f;uchar code tab[]={0x03,/*0*/0x9F,/*1*/0x25,/*2*/0x0D,/*3*/0x99,/*4*/0x49,/*5*/0x41,/*6*/0x1F,/*7*/0x01,/*8*/0x09,/*9*/};void fa_shon(uchar k) //{uchar i; //定义循环变量for(i=0;i8;i++) //因为是1 字节是8 位,所以循环8 次{dat=k0x01; //将要发送的数据与上0X01 送到数据引脚clk=0; //时钟引脚加低电平clk=1; //时钟引脚加高电平k=1; //将发送的数据右移1 位} }void main() {TMOD=0x01;TH0=15535/256;TL0=15535%256;EA=1;ET0=1;TR0=1;while(1){ uchara;for(a=0;a3;a++){fa_shon(tab[e%10]);fa_shon(tab[e%100/10]);fa_shon(tab[e/100]);}s huo_cun=0; //锁存为低电平shuo_cun=1; //锁存为高电平}}void tt()interrupt1{TH0=15535/256;TL0=15535%256;f++;if(f10){f=0;e++;if(e250)e=0;}}tips:感谢大家的阅读,本文由我司收集整编。
74hc595详解(符程序原理图)驱动8个 LED
74HC595芯片中文资料8位串行输入/输出或者并行输出移位寄存器,具有高阻关断状态。
三态。
特点8位串行输入8位串行或并行输出存储状态寄存器,三种状态输出寄存器可以直接清除100MHz的移位频率输出能力并行输出,总线驱动串行输出;标准中等规模集成电路应用串行到并行的数据转换Remote control holding register.描述595是告诉的硅结构的CMOS器件,兼容低电压TTL电路,遵守JEDEC标准。
595是具有8位移位寄存器和一个存储器,三态输出功能。
移位寄存器和存储器是分别的时钟。
数据在SCHcp的上升沿输入,在STcp的上升沿进入的存储寄存器中去。
如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。
移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。
参考数据符号参数条件TYP单位HC HCtt PHL/t PLH传输延时SHcp到Q7’STcp到Qn MR到Q7’C L=15pFVcc=5V161714212019NsNsNsf max STcp到SHcp最大时钟速度10057MHzC L输入电容Notes 1 3.53.5pF C PD Power dissipation Notes2 115 pFC PD 决定动态的能耗,P D =C PD ×V CC ×f 1+∑(C L ×V CC 2×f 0)F 1=输入频率,C L =输出电容 f 0=输出频率(MHz ) Vcc=电源电压 引脚说明 符号 引脚 描述 Q0…Q7 15, 1, 7 并行数据输出 GND 8 地Q7’ 9 串行数据输出 MR 10 主复位(低电平) SH CP11移位寄存器时钟输入ST CP12存储寄存器时钟输入OE13 输出有效(低电平) D S14串行数据输入capacitance per package.130V CC16 电源功能表输入输出功能SH CP ST CP OE MR D S Q7’Q n××L ↓×L NC MR为低电平时紧紧影响移位寄存器×↑L L ×L L 空移位寄存器到输出寄存器××H L ×L Z 清空移位寄存器,并行输出为高阻状态↑×L H H Q6’NC 逻辑高电平移入移位寄存器状态0,包含所有的移位寄存器状态移入,例如,以前的状态6(内部Q6”)出现在串行输出位。
74595的使用
单片机与74LS595(8位输出锁存移位寄存器)的使用方法2009-04-12 13:5574595的数据端:QA-—QH:八位并行输出端,可以直接控制数码管的8个段。
QH’: 级联输出端.我将它接下一个595的SI端.SI: 串行数据输入端.74595的控制端说明:/SCLR(10脚):低点平时将移位寄存器的数据清零.通常我将它接Vcc。
SCK(11脚):上升沿时数据寄存器的数据移位。
QA--〉QB--〉QC——〉...——>QH;下降沿移位寄存器数据不变。
(脉冲宽度:5V时,大于几十纳秒就行了.我通常都选微秒级)RCK(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。
通常我将RCK置为低点平,当移位结束后,在RCK端产生一个正脉冲(5V时,大于几十纳秒就行了。
我通常都选微秒级),更新显示数据。
/G(13脚):高电平时禁止输出(高阻态)。
如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。
比通过数据端移位控制要省时省力。
注:1)74164和74595功能相仿,都是8位串行输入转并行输出移位寄存器。
74164的驱动电流(25mA)比74595(35mA)的要小,14脚封装,体积也小一些。
2)74595的主要优点是具有数据存储寄存器,在移位的过程中,输出端的数据可以保持不变。
这在串行速度慢的场合很有用处,数码管没有闪烁感。
3)595是串入并出带有锁存功能移位寄存器,它的使用方法很简单,在正常使用时SCLR为高电平,G为低电平。
从SER每输入一位数据,串行输595是串入并出带有锁存功能移位寄存器,它的使用方法很简单,如下面的真值表,在正常使用时SCLR为高电平, G为低电平.从SER每输入一位数据,串行输入时钟SCK 上升沿有效一次,直到八位数据输入完毕,输出时钟上升沿有效一次,此时,输入的数据就被送到了输出端.入时钟SCK上升沿有效一次,直到八位数据输入完毕,输出时钟上升沿有效一次,此时,输入的数据就被送到了输出端。
74hc595驱动数码管
74HC595的工作原理74HC595是具有8位移位寄存器和一个存储器,三态输出功能。
移位寄存器和存储器是分别的时钟。
数据在SHcp的上升沿输入,在STcp的上升沿进入的存储寄存器中去。
如果两个时钟连在一起,则移位寄存器总是比存储寄存器早一个脉冲。
移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),和一个异步的低电平复位,存储寄存器有一个并行8位的,具备三态的总线输出,当使能OE时(为低电平),存储寄存器的数据输出到总线。
74HC595各个引脚的功能:Q1~7 是并行数据输出口,即储寄存器的数据输出口Q7' 串行输出口,其应该接SPI总线的MISO接口STcp 存储寄存器的时钟脉冲输入口SHcp 移位寄存器的时钟脉冲输入口OE的非输出使能端MR的非芯片复位端Ds 串行数据输入端程序说明:每当SHcp上升沿到来时,DS引脚当前电平值在移位寄存器中左移一位,在下一个上升沿到来时移位寄存器中的所有位都会向左移一位,同时Q7'也会串行输出移位寄存器中高位的值,这样连续进行8次,就可以把数组中每一个数(8位的数)送到移位寄存器;然后当STcp上升沿到来时,移位寄存器的值将会被锁存到锁存器里,并从Q1~7引脚输出。
//74HC595串行输出数据void outdisp(unsigned char num){unsigned char i;for (i=0;i<8;i++ ){DS=num;SHCP=1;SHCP=0;num<<=1;}}74595的数据端:1)、QA--QH: 八位并行输出端,可以直接控制数码管的8个段。
2)、QH': 级联输出端。
我将它接下一个595的SER端。
3)、SER: 串行数据输入端。
74595的控制端说明:1) 、/SCLR(10脚): 低点平时将移位寄存器的数据清零。
通常我将它接Vcc。
2)、SCK(11脚):上升沿时数据寄存器的数据移位。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51单片机驱动两片74HC595级联动态驱动8位数码管
功能: 用2片74HC595驱动8位数码管, 级联的最低1片595控制位选,那么第一片控制段选
平台: STC89C52
现象: 8位数码管从第一位开始从0计数,满10进位
版本说明: 第0版本没有使用定时器中断,同时定义了一个unsigned long int 变量计数,再把这个数的每位分离出来显示,所以导致有点闪屏,此版本使用定时器中断,而且没有用unsigned long int 之类的变量,而是用数组Val[8] 来计数,
主函数只负责显示,其它的在中断函数里面处理,这样显示一点都不闪屏,
备注: 可以用ULN2003A 接在数码管的com 口来提高驱动能力,ULN2003A里面有7个NPN三极管, 可以大大提高驱动能力
#include <>
sbit SCK = P1^1; // 数据输入时钟线,脉冲
sbit SI = P1^0; // 数据线
sbit RCK = P1^2; // 锁存
unsigned char code SMG[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; // 段码
unsigned char code Wei[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; // 位选unsigned char Val[8] = {0}; // 要显示的数据
************************ 函数声明************************
void interrupt_init(void);
void timer_init(void);
控制74HC595输出数据
void Output(void)
{
RCK = 0;
RCK = 1;
}
向74HC595中写入一字节数据
void Write_Byte(unsigned char dat)
{
unsigned char i = 0;
for(i=0; i<8; i++)
{
SCK = 0;
SI = dat & 0x80;
SCK = 1;
dat <<= 1;
}
}
显示函数
void Display(unsigned char * p) {
unsigned char * pt = Wei;
Write_Byte(*(pt+0));
Write_Byte(SMG[*(p+7)]);
Output();
Write_Byte(*(pt+1));
Write_Byte(SMG[*(p+6)]);
Output();
Write_Byte(*(pt+2));
Write_Byte(SMG[*(p+5)]);
Output();
Write_Byte(*(pt+3));
Write_Byte(SMG[*(p+4)]);
Output();
Write_Byte(*(pt+4));
Write_Byte(SMG[*(p+3)]);
Output();
Write_Byte(*(pt+5));
Write_Byte(SMG[*(p+2)]);
Output();
Write_Byte(*(pt+6));
Write_Byte(SMG[*(p+1)]);
Output();
Write_Byte(*(pt+7));
Write_Byte(SMG[*(p+0)]);
Output();
}
int main(void)
{
timer_init();
interrupt_init();
while(1)
{
Display(Val);
}
return 0;
}
void interrupt_init(void)
{
EA = 1; //开总中断
ET0 = 1; //开定时器0中断
ET1 = 1; //开定时器1中断
}
void timer_init(void)
{
TMOD = TMOD | 0x01; //定时器0工作方式1
TMOD = TMOD & 0xFD;
TH0 = 0x4B; //装初值,50ms计数
TL0 = 0xFF;
TR0 = 1; //开启定时器0
}
void timer0() interrupt 1
{
static unsigned char counter0 = 0;
counter0++;
TH0 = 0x4B; //重新装入初值,定时器0从头开始计数,计数50ms TL0 = 0xFF;
if(2 == counter0) //2*50 ms = 100ms =
{
counter0 = 0; //counter0置零,定时器0从头开始计数
Val[0]++;
if(10==Val[0])
{
Val[0] = 0;
Val[1]++;
if(10==Val[1])
{
Val[1] = 0;
Val[2]++;
if(10==Val[2])
{
Val[2] = 0;
Val[3]++;
if(10==Val[3])
{
Val[3] = 0;
Val[4]++;
if(10==Val[4])
{
Val[4] = 0;
Val[5]++;
if(10==Val[5])
{
Val[5] = 0;
Val[6]++;
if(10==Val[6])
{
Val[6] = 0;
Val[7]++;
if(10==Val[7])
{
Val[7] = 0;
}
}
}
}
}
}
}
}
}
}。