51单片机驱动两片74HC595级联动态驱动8位数码管

合集下载

移位寄存器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驱动数码管程序

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动态扫描

数码管显示-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驱动芯片对数码管的控制设计

单片机和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单片机控制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位数码管显示

使用SPI接口的74HC595控制 8位数码管显示
$hwstack = 32 '设置堆栈大小
$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级联控制数码管

单片机74HC595级联控制数码管
程序:单片机和2个74HC595L级联控制4位数码管显示
功能:在数码管上显示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位数码管电路图+程序

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); }}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;
}
}
}
}
}
}
}
}
}
}。

相关文档
最新文档