导航:首页 > 操作系统 > 51单片机74hc595程序

51单片机74hc595程序

发布时间:2022-08-09 06:12:54

① 51单片机74hc595

74hc595是串行输入并行输出,所以你需要将八位数据分八次传入然后一次性传出 具体程序如下 注意特殊管脚的宏定义命名

unsigned char i,j;
j = 0xfe;

for(i=0;i<8;i++) // 循环8次,依次移入八位
{
if(j&0x80) P_HC595_SER = 1; // 若dat&0x80 == 1说明dat的最高位为1 相当于将j串行发送给SER
else P_HC595_SER = 0; // 否则说明dat的最高位为0
P_HC595_SRCLK = 1; // 此处SRCLK由0变为1产生上升沿,将SER上的一位数据移入寄存器
//_nop_(); _nop_(); _nop_(); _nop_();
P_HC595_SRCLK = 0; // 将SRCLK变为低电平 等待下一次上升沿
j = j<<1; // 数据右移,从最高位移入寄存器
}
P_HC595_RCLK = 1; // RCLK此处由0变为1产生一个上升沿,将八位数据置入锁存器,锁存器数据通过Q0~Q7输出数据在led显示
//_nop_(); _nop_(); _nop_(); _nop_();
P_HC595_RCLK = 0; //将RCLK的数据变为低电平 等待下一次上升沿
顺便帮你实现了一下 运行正常 望采纳

② 51单片机控制74hc595输出进而控制发光二极管点亮

51单片机控制74hc595输出进而控制发光二极管点亮:74hc595是一个反极性驱动,也就是说如果用的是共阴数码管,段选端本应高电平点亮,如果在单片机的p口送个高电平,但是经过74hc595后你的高电平就变成低电平了,所以要在单片机那面往595送低电平,共阳相反,然后在将位选选通,如果想固定显示某个数或者循环显示某几个数的话,就直接只一个表这个表就是八字码,然后通过查表就可以了,如果不是的话就能麻烦点,需要将待显示的数据转成十进制然后经过处理后再查表送显示。

二极管,(英语:Diode),电子元件当中,一种具有两个电极的装置,只允许电流由单一方向流过,许多的使用是应用其整流的功能。而变容二极管(Varicap Diode)则用来当作电子式的可调电容器。大部分二极管所具备的电流方向性我们通常称之为“整流(Rectifying)”功能。二极管最普遍的功能就是只允许电流由单一方向通过(称为顺向偏压),反向时阻断 (称为逆向偏压)。因此,二极管可以想成电子版的逆止阀。
早期的真空电子二极管;它是一种能够单向传导电流的电子器件。在半导体二极管内部有一个PN结两个引线端子,这种电子器件按照外加电压的方向,具备单向电流的传导性。一般来讲,晶体二极管是一个由p型半导体和n型半导体烧结形成的p-n结界面。在其界面的两侧形成空间电荷层,构成自建电场。当外加电压等于零时,由于p-n 结两边载流子的浓度差引起扩散电流和由自建电场引起的漂移电流相等而处于电平衡状态,这也是常态下的二极管特性。
早期的二极管包含“猫须晶体("Cat's Whisker" Crystals)”以及真空管(英国称为“热游离阀(Thermionic Valves)”)。现今最普遍的二极管大多是使用半导体材料如硅或锗。

③ 用51单片机+74HC595控制LED,程序怎样实现整体渐变(595不接OE脚)

如果你是静态显示,那么灰度是没戏了。如果是动态显示,那就先点亮一个LED,再将595的数据刷新,令所有的LED灭掉,然后亮第二个LED,再将595的数据刷新,令所有的LED灭掉,如此循环,来控制LED点亮的占空比就可以控制灰度了。但这个办法的关键是你刷新的频率一定要足够高,不然就会产生闪烁。
其实,你电路中最大的问题就是OE脚被你锁死了,通常的产品都是靠这个引脚来控制灰度的。另外,595到LED之间最好再加一级驱动芯片,例如,2003,2803,否则595驱动电流不足,很容易烧坏。

④ 51单片机+10片 74hc595 控制16*64点阵屏显示

#include<reg52.h>
sbit HC595_DS = P2^0;
sbit HC595_STCP = P2^1;
sbit HC595_SHCP = P2^2;
sbit HC595_OE = P2^3;
void HC595_WriteByte(unsigned char value)
{
unsigned char i;

for(i=0;i<8;i++)

{
HC595_SHCP = 0;

HC595_DC = value&(0x80>>i);

HC595_SHCP = 1;

}
}
void Lattice_WriteData(unsigned char *buffer,unsigned char value,value1)
{
while(*buffer)//列扫描

{
HC595_WriteByte(*buffer++);

}
HC595_WriteByte(value);//行数据低八位
HC595_WriteByte(value1);//行数据高八位
HC595_STCP = 0;
HC595_STCP = 1;
}
unsigned char buffer[8]={0x01,0,0,0,0,0,0,0};//64列
void main()
{
HC595_OE = 0;
HC595_OE = 1;
//假设行低电平有效,列高电平有效,显示效果为第一行,第一列坐标为(0,0)的像素点亮,其他均不亮
Lattice_WriteData(buffer,0xfe,0xff);
while(1)
{

}
}

//如有问题,可再咨询

⑤ 求51单片机驱动16X64点阵,行列用74HC595芯片驱动的程序

这是16X16的,自己一改就好了

//74HC595练习程序
//串入并出实现16流水灯效果
//2009.12.28
#include"reg52.h"
sbit shcp=P2^0; //数据在上升沿进入移位寄存器
sbit date1=P2^1; //串行数据输入端
sbit clock=P2^2; //上升沿时将数据输出到并行端口

unsigned char tab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
unsigned char tab1[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

void delay(unsigned int delay)
{
unsigned char i;
for(;delay>0;delay--)
for(i=0;i<125;i++);
}

void send_data(unsigned char date) //发送数据
{
unsigned char i;
for(i=0;i<8;i++) //把每一位数据移入寄存器
{
shcp=0;
date=date<<1;
date1=CY;
shcp=1;
delay(20);
}
}

void main()
{
unsigned char k;
for(k=0;k<16;k++)
{
send_data(tab[k]);
send_data(tab1[k]);
{clock=0;clock=1;};
}
}

⑥ 74HC595的程序样例

DS接MOSI,OE/GND接GND,SH_CP接SCLK,ST_CP接使能信号BIT0@P1,MR/VCC接POWER,如果不需要16位,改US16B,不使用H寄存器即可,还有SPI工作期间可以进入低功耗,也可以执行指令. #include<msp430.h>voidmain(void){WDTCTL=WDTPW+WDTHOLD;P1DIR|=BIT0+BIT1;P1OUT&=~BIT0;USICTL0|=USIPE6+USIPE5+USIMST+USIOE;USICTL1|=USIIE;USICKCTL=USIDIV_7+USISSEL_2;USICTL0&=~USISWRST;while(1){P1OUT|=BIT0;USISRH=0xAA;USISRL=0xAA;USICNT=0x10+USI16B;//16位数,级联可用.while((USICTL1&USIIFG)!=0x01){//此处可以干别的//这里写入与SPI无关的代码,共8*16=128条单周期指令.}USICTL1&=~USIIFG;P1OUT&=~BIT0;}}单片机74HC595模块驱动程序 //74HC595LED控制#include<reg51.h>#include<intrins.h>#defineNOP()_nop_()sbitMOSIO=P3^4;sbitR_CLK=P3^5;sbitS_CLK=P3^6;voiddelay(unsignedinti);voidHC595SendData(unsignedcharSendVal);main(){unsignedcharLed=0xfe;HC595SendData(0xff);while(1){HC595SendData(Led);Led<<=1;Led=Led|0x01;if(Led==0xff)Led=0xfe;delay(200);}}voiddelay(unsignedinti){unsignedintj;for(i;i>0;i--)for(j=300;j>0;j--);}voidHC595SendData(unsignedcharSendVal){unsignedchari;for(i=0;i<8;i++){if((SendVal<<i)&0x80)MOSIO=1;elseMOSIO=0;S_CLK=0;NOP();NOP();S_CLK=1;}R_CLK=0;NOP();NOP();R_CLK=1;}74HC595驱动静态数码管程序 #include<reg51.h>#include<intrins.h>#defineNOP()_nop_()sbitMOSIO=P3^4;sbitR_CLK=P3^5;sbitS_CLK=P3^6;voiddelay(unsignedinti);voidHC595SendData(unsignedcharSendVal);unsignedcharcodeLED7Code[]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F,~0x77,~0x7C,~0x39,~0x5E,~0x79,~0x71};main(){unsignedcharHC595SendVal;unsignedintLedNumVal;while(1){LedNumVal++;HC595SendVal=LED7Code[LedNumVal%16];HC595SendData(HC595SendVal);delay(200);}}voiddelay(unsignedinti){unsignedintj;for(i;i>0;i--)for(j=300;j>0;j--);}voidHC595SendData(unsignedcharSendVal){unsignedchari;for(i=0;i<8;i++){if((SendVal<<i)&0x80)MOSIO=1;elseMOSIO=0;S_CLK=0;NOP();NOP();S_CLK=1;}R_CLK=0;NOP();NOP();R_CLK=1;}双595驱动点阵程序 #include<reg51.h>#include<intrins.h>#defineNOP()_nop_()sbitMOSIO=P3^7;sbitR_CLK=P3^5;sbitS_CLK=P3^6;sbiten573=P1^3;sbitends=P1^2;voidHC595SendData(unsignedintSendVal);unsignedintVal;unsignedcharcodetab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsignedcharcodedigittab[18][8]={{0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00},//0{0x00,0x00,0x00,0x00,0x21,0x7f,0x01,0x00},//1{0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00},//2{0x00,0x00,0x22,0x49,0x49,0x49,0x36,0x00},//3{0x00,0x00,0x0c,0x14,0x24,0x7f,0x04,0x00},//4{0x00,0x00,0x72,0x51,0x51,0x51,0x4e,0x00},//5{0x00,0x00,0x3e,0x49,0x49,0x49,0x26,0x00},//6{0x00,0x00,0x40,0x40,0x40,0x4f,0x70,0x00},//7{0x00,0x00,0x36,0x49,0x49,0x49,0x36,0x00},//8{0x00,0x00,0x32,0x49,0x49,0x49,0x3e,0x00},//9{0x00,0x00,0x7F,0x48,0x48,0x30,0x00,0x00},//P{0x00,0x00,0x7F,0x48,0x4C,0x73,0x00,0x00},//R{0x00,0x00,0x7F,0x49,0x49,0x49,0x00,0x00},//E{0x00,0x00,0x3E,0x41,0x41,0x62,0x00,0x00},//C{0x00,0x00,0x7F,0x08,0x08,0x7F,0x00,0x00},//H{0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00},//I{0x00,0x7F,0x10,0x08,0x04,0x7F,0x00,0x00},//N{0x7C,0x48,0x48,0xFF,0x48,0x48,0x7C,0x00}};unsignedinttimecount;unsignedcharcnta;unsignedcharcntb;voidmain(void){TMOD=0x01;TH0=(65536-3000)/256;TL0=(65536-3000)%256;TR0=1;ET0=1;EA=1;cntb=0;ends=0;en573=0;while(1){}}voidt0(void)interrupt1using0{TH0=(65536-3000)/256;TL0=(65536-3000)%256;if(cntb<18)/{//P1=0xFF;//P2=tab[cnta];P0=~digittab[cntb][cnta];Val=tab[cnta]&0x00ff;Val<<=8;Val=Val+0x00ff;HC595SendData(Val);}else{//P2=0xFF;//P1=tab[cnta];P0=~digittab[cntb-18][cnta];Val=tab[cnta];Val=Val+0xFF00;HC595SendData(Val);}if(++cnta>=8)cnta=0;if(++timecount>=333){timecount=0;if(++cntb>=36)cntb=0;}}voidHC595SendData(unsignedintSendVal){unsignedchari;for(i=0;i<16;i++){if((SendVal<<i)&0x8000)MOSIO=1;//=0;//MOSIO=1S_CLK=0;NOP();NOP();S_CLK=1;}R_CLK=0;//setdatalinelowNOP();NOP();R_CLK=1;}

⑦ 51单片机+74hc595程序求错

程序需要更改位选与段选的次序,两个时钟脉冲的引脚,弄混了。

其它基本正常:

#include<reg52.h>

#defineuintunsignedint

#defineucharunsignedchar

//-----------------------------------------------------

ucharcodea[16]={

0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};

ucharcoded[4]={0x01,0x02,0x04,0x08};

//-----------------------------------------------------

sbitLCK=P3^7;

sbitSCK=P3^6;

sbitSDI=P3^5;

//-----------------------------------------------------

voiddelay()

{

;

}

//-----------------------------------------------------

voiddelay_ms(uintms)

{

uinta,b;

for(a=ms;a>0;a--)for(b=249;b>0;b--);

}

//-----------------------------------------------------

voidsend(ucharx)

{

uchari;

for(i=0;i<8;i++){

x=x<<1;

SCK=0;delay();

SDI=CY;

SCK=1;delay();

}

}

//-----------------------------------------------------

voiddisplay(uchard0,uchard1,uchard2,uchard3)

{

LCK=0;send(d[0]);send(a[d0]);LCK=1;delay_ms(1);

LCK=0;send(d[1]);send(a[d1]);LCK=1;delay_ms(1);

LCK=0;send(d[2]);send(a[d2]);LCK=1;delay_ms(1);

LCK=0;send(d[3]);send(a[d3]);LCK=1;delay_ms(1);

}

//-----------------------------------------------------

voidmain()

{

while(1){

display(1,2,3,4);

}

}

//-----------------------------------------------------

参看:

http://hi..com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/36bd7634baa8ba0691ef390a.html

显示截图如下:

⑧ 51单片机加74hc595驱动多个数码管静态显示的程序设计

1、首先数码管分为1位,4位,8位,4位和8位的又分为共阴和共阳数码管。

⑨ 基于51单片机通过74HC595控制四相步进电机的C程序

我有一个74hc595串入并出控制led程序,你自己改一改就行了。
前提是你还需要一个电机驱动芯片(如l293d,uln2003等)。
/************************************************************************************
* 标题: 试验74HC595驱动8位LED灯(C语言) *
* *
* 连接方法:JP12用条线冒短接 JP1(LED灯接口)和JP2(595接口) 用8PIN排线连接 * *
******************************************************************************** *
*通过本例程了解 74HC595(串入并出)基本原理和使用 *
*3个I/O扩展8个输出,通过片选可以串接更多74HC595芯片,得到更多的输出数 *
* 请学员认真消化本例程,懂74C595在C语言中的操作 *
*此汇编程序留给大家做为课后作业自己完成。关于HC595汇编驱动参考“静态显示(74HC595驱动)”。
*************************************************************************************/

#include <reg51.h>
#include <intrins.h>
#define NOP() _nop_() /* 定义空指令 */

//SPI IO
sbit MOSIO =P3^4;
sbit R_CLK =P3^5;
sbit S_CLK =P3^6;

void delay(unsigned int i); //函数声名
void HC595SendData(unsigned char SendVal);

main()
{ unsigned char Led=0xfe; //1111 1110
HC595SendData(0xff); //初始化595使他为高电平 让LED处于熄灭状态

while(1)
{

HC595SendData(Led); //调用595驱动程序 把LED的数据送到595
Led<<=1;
Led = Led| 0x01; //移位后,后面的位为高电平;
if (Led == 0xff ) Led=0xfe; //1111 1110

delay(200);

}
}
/*****************************************************************************
* 延时子程序 *
* *
******************************************************************************/
void delay(unsigned int i)
{
unsigned int j;
for(i; i > 0; i--)
for(j = 300; j > 0; j--);
}

/*********************************************************************************************************
** 函数名称: HC595SendData
** 功能描述: 向SPI总线发送数据
*********************************************************************************************************/
void HC595SendData(unsigned char SendVal)
{
unsigned char i;

for(i=0;i<8;i++)
{
if((SendVal<<i)&0x80) MOSIO=1; //set dataline high 0X80 最高位与SendVal左移的最高位 进行逻辑运算
else MOSIO=0; // 如果为真 MOSIO = 1

S_CLK=0;
NOP(); //产生方形波
NOP();
S_CLK=1;
}

R_CLK=0; //set dataline low
NOP(); //产生方形波
NOP();
R_CLK=1; //片选

}

⑩ 用74HC595做串转并的程序

PDF不一样,是另一份,大家可以下载来看看!内部结构结合引脚说明就能很快理解595的工作情况74LS595,74HC595引脚图,管脚图________QB--|116|--VccQC--|215|--QAQD--|314|--SIQE--|413|--&#47;GQF--|512|--RCKQG--|611|--SRCKQH--|710|--&#47;SRCLRGND-|89|--QH`|________|74595的数据端:QA--QH:八位并行输出端,可以直接控制数码管的8个段QH`:级联输出端。我将它接下一个595的SI端。SI:串行数据输入端。74595的控制端说明:&#47;SRCLR(10脚):低点平时将移位寄存器的数据清零。通常我将它接Vcc。SRCK(11脚):上升沿时数据寄存器的数据移位。QA--&gt;QB--&gt;QC--&gt;...--&gt;QH;下降沿移位寄存器数据不变。(脉冲宽度:5V时,大于几十纳秒就行了。我通常都选微秒级)RCK(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。(通常我将RCK置为低电平,)当移位结束后,在RCK端产生一个正脉冲(5V时,大于几十纳秒就行了。我通常都选微秒级),更新显示数据。&#47;G(13脚):高电平时禁止输出(高阻态)。如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。比通过数据端移位控制要省时省力。注:74164和74595功能相仿,都是8位串行输入转并行输出移位寄存器。74164的驱动电流(25mA)比74595(35mA)的要斜4脚封装,体积也小一些。74595的主要优点是具有数据存储寄存器,在移位的过程中,输出端的数据可以保持不变。这在串行速度慢的场合很有用处,数码管没有闪烁感。与164只有数据清零端相比,595还多有输出端时能&#47;禁止控制端j可以使输出为高阻态。注:1)74164和74595功能相仿395都是8位串行输入转并行输出移位寄存器。74164的驱动电流(25mA)比74595(35mA)的要小14脚封装,体积也小一些。2)74595的主要优点是具有数据存储寄存器,在移位的过程中,输出端的数据可以保持不变。这在串行速度慢的场合很有用处,数码管没有闪烁感。3)595是串入并出带有锁存功能移位寄存器,它的使用方法很简单,在正常使用时SCLR为高电平,G为低电平。从SER每输入一位数据,串行输595是串入并出带有锁存功能移位寄存器,它的使用方法很简单,如下面的真值表,在正常使用时SCLR为高电平,G为低电平。从SER每输入一位数据,串行输入时钟SCK上升沿有效一次,直到八位数据输入完毕,输出时钟上升沿有效一次,此时,输入的数据就被送到了输出端。入时钟SCK上升沿有效一次,直到八位数据输入完毕,输出时钟上升沿有效一次,此时,输入的数据就被送到了输出端。其实看了这么多595的资料觉得没什么难的关键是看懂其时序图说到底就是下面三步(引用):第一步:目的:将要准备输入的位数据移入74HC595数据输入端上。方法:送位数据到P1.0。第二步:目的:将位数据逐位移入74HC595,即数据串入方法:P1.2产生一上升沿,将P1.0上的数据移入74HC595中.从低到高。第三步:目的:并行输出数据。即数据并出方法:P1.1产生一上升沿将由P1.0上已移入数据寄存器中的数据送入到输出锁存......余下全文>>

阅读全文

与51单片机74hc595程序相关的资料

热点内容
程序员代码合适吗 浏览:280
复利计算法律保护 浏览:737
代号f2服务器连接失败怎么搞 浏览:956
旋律云我的世界服务器靠谱吗 浏览:63
pdf降低大小 浏览:231
魔兽世界中文如何外服服务器 浏览:924
kindle转pdf格式 浏览:61
单片机自动控制 浏览:673
需要很多文件夹怎么快速的新建啊 浏览:68
算法申请着作权 浏览:214
以前手机号换了要怎么登录农行app 浏览:194
线切割编程系统怎么绘画 浏览:255
如何搭建云服务器异地容灾 浏览:925
黄金拐点指标源码 浏览:97
算法导论第九章 浏览:282
鸽子为什么生成服务器没反应 浏览:495
freebsdnginxphp 浏览:223
噪声消除算法 浏览:611
vue类似电脑文件夹展示 浏览:118
后备服务器有什么功效 浏览:273