① 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上已移入數據寄存器中的數據送入到輸出鎖存......餘下全文>>