AT89C51串并轉(zhuǎn)換驅(qū)動(dòng)數(shù)碼管實(shí)驗(yàn)指導(dǎo)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
器件:74hc595.
引腳說明:
SDA:數(shù)據(jù)輸入口。
SH_CP:數(shù)據(jù)輸入控制端,在每個(gè)
SH_CP的上升沿, SDA口上的數(shù)據(jù)移入寄存器, 在 SH_CP的第 9個(gè)上升沿, 數(shù)據(jù)開始從 QS
移出。
ST_CP:數(shù)據(jù)置入鎖存器控制端。
Q0~Q7:數(shù)據(jù)并行輸出端。
數(shù)據(jù)從SDA 口送入 74HC595 , 在每個(gè) SH_CP的上升沿, SDA口上的數(shù)據(jù)移入寄存器, 在 SH_CP的第
9個(gè)上升沿, 數(shù)據(jù)開始從 QS 移出。如果把第一個(gè)74HC595的QS和第二個(gè)74HC595 的 SDA 相接, 數(shù)據(jù)即移入第二個(gè)74HC595中,
照此一個(gè)一個(gè)接下去, 可接任意多個(gè)。數(shù)據(jù)全部送完后, 給 ST_CP一個(gè)上升沿, 寄存器中的數(shù)據(jù)即置入鎖存器。此時(shí)如果 EN 為低電平, 數(shù)據(jù)即從并口Q0~Q7
輸出, 把Q0~Q7 與LED的8 段相接, LED就可以實(shí)現(xiàn)顯示了。要想軟件改變LED的亮度, 只需改變 EN的占空比就行了。
實(shí)驗(yàn)原理及內(nèi)部結(jié)構(gòu):
如圖所示:
74HC595 內(nèi)含8 位串入、串/并出移位寄存器和8位三態(tài)輸出鎖存器。寄存器和鎖存器分別有各自的時(shí)鐘輸入(SH_CP和ST_CP) , 都是上升沿有效。當(dāng)SH_CP從低到高電平跳變時(shí),串行輸入數(shù)據(jù)(SDA) 移入寄存器; 當(dāng)ST_CP從低到高電平跳變時(shí), 寄存器的數(shù)據(jù)置入鎖存器。清除端(CLR) 的低電平只對寄存器復(fù)位(QS 為低電平) ,而對鎖存器無影響。當(dāng)輸出允許控制(EN) 為高電平時(shí), 并行輸出(Q0~Q7) 為高阻態(tài), 而串行輸出(QS) 不受影響。74HC595 最多需要5 根控制線,即SDA、SH_CP、ST_CP、CLR 和EN。其中CLR 可以直接接到高電平, 用軟件來實(shí)現(xiàn)寄存器清零; 如果不需要軟件改變亮度, EN可以直接接到低電平, 而用硬件來改變亮度。把其余三根線和單片機(jī)的I/ O 口相接, 即可實(shí)現(xiàn)對LED 的控制。數(shù)據(jù)從SDA 口送入74HC595 ,在每個(gè)SH_CP的上升沿, SDA 口上的數(shù)據(jù)移入寄存器, 在SH_CP的第9個(gè)上升沿, 數(shù)據(jù)開始從QS 移出。如果把第一個(gè)74HC595 的QS和第二個(gè)74HC595 的SDA 相接, 數(shù)據(jù)即移入第二個(gè)74HC595 中, 照此一個(gè)一個(gè)接下去, 可接任意多個(gè)。數(shù)據(jù)全部送完后, 給ST_CP 一個(gè)上升沿,寄存器中的數(shù)據(jù)即置入鎖存器。此時(shí)如果EN 為低電平, 數(shù)據(jù)即從并口Q0~Q7 輸出, 把Q0~Q7 與LED 的8 段相接, LED就可以實(shí)現(xiàn)顯示了。要想軟件改變LED 的亮度, 只需改變EN 的占空比就行了。。LED 的亮度用PR1~ PR3 的阻值來控制。P1 口的P115 、P116 、P117 用來控制LED 的顯示,分別接到ST_CP、SH_CP和SDA 腳。
實(shí)驗(yàn)內(nèi)容:
按下圖連接器件:
程序如下所示:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA = P1^1;
sbit SHIFT = P1^2;
sbit ST = P1^0;
#define NOP _nop_()
uchar led[] = {0x5b,0x3f,0x3f,0x6f};
uchar select[] = {0x0fe,0xfd,0xfb,0xf7};
uchar i=0;
void Init( )
{
SDA = 0;
SHIFT = 0;
ST = 0;
}
void delay()
{
uchar jj;
for(jj=0;jj<200;jj++);
while(jj--);
}
void display(uchar dat)
{
uchar ii;
uchar sdata=dat;
for(ii=0;ii<8;ii++)
{
if(sdata&0x80)
SDA=1;
else
SDA = 0;
sdata<<=1;
SHIFT =0;
NOP;
NOP;
SHIFT = 1;
NOP;
NOP;
}
ST = 1;
NOP;
NOP;
ST = 0;
}
void main()
{
Init();
while(1)
{
delay();
delay();
P2 = select[i];
display(led[i]);
i=(i+1)%4;
}
}