74hc595 Sự Thông Dụng Và Cách Dùng

BuiBachTuanAnh

Quản trị viên
Thành viên BQT
#1
  • Nói đến 74xx595 (xx ở đây có thể là những ký hiệu khác nhau nhưng bản chất giống nhau) nhiều bạn đã quá quen thuộc, tuy nhiên nhiều bạn vẫn chưa biết công dụng của nó. 74hc595 là IC ghi dịch 8bit kết hợp chốt dữ liệu , đầu vào nối tiếp đầu ra song song .
  • Chức năng: Thường dùng trong các mạch quét led 7 , led matrix …để tiết kiệm số chân VDK tối đa (3 chân) . Có thể mở rộng số chân vi điều khiển bao nhiêu tùy thích mà k ic nào có thể làm dc bằng việc mắc nối tiếp đầu vào dữ liệu các ic với nhau .
595.jpg
  • Sơ đồ chân của nó như sau:
chan595.jpeg
  • Giải thích ý nghĩa hoạt động của một số chân quan trọng:
(input)
Chân 14 : đầu vào dữ liệu nối tiếp . Tại 1 thời điểm xung clock chỉ đưa vào được 1 bit
(output)
QA=>QH : trên các chân (15,1,2,3,4,5,6,7)
Xuất dữ liệu khi chân chân 13 tích cực ở mức thấp và có một xung tích cực ở sườn âm tại chân chốt 12
(output-enable)
Chân 13 : Chân cho phép tích cực ở mức thấp (0) .Khi ở mức cao, tất cả các đầu ra của 74595 trở về trạng thái cao trở, không có đầu ra nào được cho phép.
(SQH)
Chân 9: Chân dữ liệu nối tiếp . Nếu dùng nhiều 74595 mắc nối tiếp nhau thì chân này đưa vào đầu vào của con tiếp theo khi đã dịch đủ 8bit.
(Shift clock)
Chân 11: Chân vào xung clock . Khi có 1 xung clock tích cực ở sườn dương(từ 0 lên 1) thì 1bit được dịch vào ic.
(Latch clock)
Chân 12 : xung clock chốt dữ liệu . Khi có 1 xung clock tích cực ở sườn dương thì cho phép xuất dữ liệu trên các chân output . lưu ý có thể xuất dữ liệu bất kỳ lúc nào bạn muốn ,ví dụ đầu vào chân 14 dc 2 bit khi có xung clock ở chân 12 thì dữ liệu sẽ ra ở chân Qa và Qb (chú ý chiều dịch dữ liệu từ Qa=>Qh)
(Reset)
Chân 10: khi chân này ở mức thấp(mức 0) thì dữ liệu sẽ bị xóa trên chip)
  • Sơ đồ chức năng của chân
chuc nang chan.PNG
74xx595 đầu ra hoạt động ở 2 mức 0 &1 dòng ra tầm 35mA . điện áp hoạt động <=7V . Công suất trung bình 500mW
-------------------
  • Ví dụ đơn giản sử dụng 74HC595
vidu.PNG
Đoạn mã code như sau:
Mã:
//http://codientu.org project//
#include"regx52.h"
sbit    DATA = P2^1;
sbit    SCK = P2^0;
sbit    SCL = P2^2;
 
void quet(unsigned char x)
{
int i,temp;
for(i=0;i<8;i++)
{
temp=x;//gan bien
temp=temp&0x80;//lay ra bit dau tien (bit 7)
if(temp==0x80)//so sanh bit
DATA=1;      //bang 1 thi xuat vao chip =1
else
DATA=0;      //nguoc lai bang 0
x*=2;  //dich bit lay bit trong so thap
 
SCK=0;    //tao xung tren chan 11
SCK=1;    //1 xung dua vào 1 bít
}
SCL=0;    //xuat du lieu ra output
SCL=1;
}
void delay()
{
unsigned int i;
for(i=0;i<33000;i++);
}
 
void main()
{
unsigned int i, k=0;
unsigned char ma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//ma led 7
while(1)
{
for(i=0;i<10;i++)
{
quet(ma[i]);
delay();
}
}}
Các bạn có thể download cả project theo file đính kèm
 

Đính kèm

mta_cdt

Super Moderator
Thành viên BQT
#2
nếu cần sử dụng nhiều ic loại này thì nối chân số 9 của ic trước với chân số 14 của ic sau cứ như vậy cho đến hết.
 
#3
xin chào tất cả mọi người, mình là thành viên mới, trước kia mình có tham gia diễn đàn labb3i.com, mình thật sự rất vui khi tham gia diễn đàn này, rất nhiều kiến thức bổ ích và còn gặp lại mấy anh làm admin bên labb3i nữa. anh demon52, segsvn....
thực sự con 595 này rất dễ, mình xin chia sẽ kinh nghiệm khi sử dụng con ic này :
khi kết hợp con 74595 với các họ vđk như AVR,PIC,MSP430 thì nên chú ý đến dộ rộng xung kích vào chân clock,STR.
thực tế con 595 chỉ hoạt động ổn định khi xung kích lớn hơn 0,5uS. có nghĩa là áp dk logic từ 0>1 ko được nhỏ hơn 0,5us. với con 89 thì ko vấn đề gì cả vì 1 lệnh điều khiển của nó mất tới 8us. nhưng với PIC,AVR thì sẽ bị ảnh hưởng. vì vậy cần trế 1 khoảng thời gian để dảm bảo 595 hoạt động bình thường.
nếu sử dụng 595 mà có hiên tượng bị sai code khi xuất ra thì sẽ có 2 nguyên nhân : 1, dòng cung cấp ko đủ, 595 có vấn đề. nhưng thường thì dòng cung cáp chính là nguyên nhân gây sai mã khi xuất tín hiện từ 595.
mình sẽ bổ xung thêm vào code.
Mã:
--------
void delay(unsigned int time)
{while(time--);}
-------
void quet(unsigned char x)
{
int i,temp;
for(i=0;i<8;i++)
{
temp=x;//gan bien
temp=temp&0x80;//lay ra bit dau tien (bit 7)
if(temp==0x80)//so sanh bit
DATA=1;      //bang 1 thi xuat vao chip =1
else
DATA=0;      //nguoc lai bang 0
x*=2;  //dich bit lay bit trong so thap
 
SCK=0;    //tao xung tren chan 11
[COLOR=#ff0000]delay(5);[/COLOR] [COLOR=#339966]// trễ 1 khoảng thời gian để phù hợp với tần số hoạt động của 595[/COLOR]
SCK=1;    //1 xung dua vào 1 bít
}
SCL=0;    //xuat du lieu ra output
[COLOR=#ff0000]delay(5);[/COLOR]
SCL=1;
}
đây là những gì mình rút ra khi sử dụng 595, nếu sai xin mọi người góp ý.
 

xuanmanh88

Học sinh phổ thông
#4
Bạn nào có thể share code 74hc595 dịch 60 bit (8 con 74hc595) không?
Mình đang làm cái viền đồng hồ Digital Clock mà không biết làm thế nào. Các bạn giúp mình với.
 
V

VNS_SPK__Knight

Guest
#5
Ai có share cho bạn nào... post lên 4 rum share cho anh em nào cần luôn...
 
#6
code dịch 60 con đây
đây là 1 hàm ghi các mã vào 8 con 595 :
Mã:
....
#define CLK2 P3_2
#define SDI2 P3_1
#define STR2 P3_0
...
code unsigned char led[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
....
void hu(unsigned char ms1,unsigned char ms2,unsigned char ms3,unsigned char ms4,
unsigned char ms5,unsigned char ms6,unsigned char ms7,unsigned char ms8)
    {
        unsigned char i,Q;
        Q=ms8; for(i=0;i<8;i++){SDI2=(Q&0x80)?1:0;CLK2=1;CLK2=0;Q<<=1;}
        Q=ms7; for(i=0;i<8;i++){SDI2=(Q&0x80)?1:0;CLK2=1;CLK2=0;Q<<=1;}
        Q=ms6; for(i=0;i<8;i++){SDI2=(Q&0x80)?1:0;CLK2=1;CLK2=0;Q<<=1;}
        Q=ms5; for(i=0;i<8;i++){SDI2=(Q&0x80)?1:0;CLK2=1;CLK2=0;Q<<=1;}
        Q=ms4; for(i=0;i<8;i++){SDI2=(Q&0x80)?1:0;CLK2=1;CLK2=0;Q<<=1;}
        Q=ms3; for(i=0;i<8;i++){SDI2=(Q&0x80)?1:0;CLK2=1;CLK2=0;Q<<=1;}
        Q=ms2; for(i=0;i<8;i++){SDI2=(Q&0x80)?1:0;CLK2=1;CLK2=0;Q<<=1;}
        Q=ms1; for(i=0;i<8;i++){SDI2=(Q&0x80)?1:0;CLK2=1;CLK2=0;Q<<=1;}
        STR2=0; STR2=1;
    }
/./đây là 1 hiệu ứng mình lập trình, cho led sáng dần từ 1>60, theo số giây.
void vongtron()
    {
        if(sec<8) hu(~led[sec],ma2,ma2,ma2,ma2,ma2,ma2,ma2);
        else if((sec>= 8)&&(sec<16)) hu(ma1,~led[sec-8],ma2,ma2,ma2,ma2,ma2,ma2);
        else if((sec>=16)&&(sec<24)) hu(ma1,ma1,~led[sec-16],ma2,ma2,ma2,ma2,ma2);
        else if((sec>=24)&&(sec<32)) hu(ma1,ma1,ma1,~led[sec-24],ma2,ma2,ma2,ma2);
        else if((sec>=32)&&(sec<40)) hu(ma1,ma1,ma1,ma1,~led[sec-32],ma2,ma2,ma2);
        else if((sec>=40)&&(sec<48)) hu(ma1,ma1,ma1,ma1,ma1,~led[sec-40],ma2,ma2);
        else if((sec>=48)&&(sec<52)) hu(ma1,ma1,ma1,ma1,ma1,ma1,~led[sec-48],ma2);
        else if((sec>=52)&&(sec<60)) hu(ma1,ma1,ma1,ma1,ma1,ma1,ma1,~led[sec-52]);
    }
ddaya là toàn bộ mạch của mình : dong ho tron led don.rar
 

NgoHungCuong

http://ngohungcuong.com
#7
kid làm với 2 ic74hc595
bạn làm hoàn toàn tương tự để mở rộng thêm
hi vọng nhìn vào video và code bạn sẽ hiểu hoạt động của ic 74hc595 như thế nào
Mã:
#include <htc.h>
#include <pic.h>
__CONFIG(FOSC_XT&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_OFF&CPD_OFF&BOREN_OFF&IESO_OFF&FCMEN_OFF&LVP_OFF&DEBUG_OFF);
__CONFIG(BOR4V_BOR40V&WRT_OFF);
#ifndef _XTAL_FREQ
    #define _XTAL_FREQ 4000000
#endif
#define    sda        RD1
#define        scl        RD0
#define        chot    RD2
unsigned char i;
 
void xuat595(unsigned char u);
void main() {
   
    TRISD=0;
    ANSEL=ANSELH=0;
    sda=scl=chot=0;
    sda=1;//xuat 1 bit chay lan luot xem ket qua the nao
    while(1) {
        //lap lan luot qua cac so
        sda=1;
        scl=1;
        scl=0;
        //dua du lieu vao con thu nhat
        //xuat du lieu ra
        chot=1;
        chot=0;
        sda=0;
        __delay_ms(200);
        //cu het 8 clock thi chuyen sang con thu 2
        for(i=1;i<16;++i) {
            scl=1;
            scl=0;//tao 1 xung de dua du lieu vao
            chot=1;
            chot=0;
            __delay_ms(200);
        }
    }
}
 

chipamd

Học sinh phổ thông
#8
mấy anh cho ví vụ tương tự nhưng dùng assembly thì tốt quá
một số không ít mem như em chỉ dùng được assembly thôi ak :(
thank mấy anh :)
 

sgesvn

Moderator
Thành viên BQT
#9
mấy anh cho ví vụ tương tự nhưng dùng assembly thì tốt quá
một số không ít mem như em chỉ dùng được assembly thôi ak :(
thank mấy anh :)
ASM thì bạn tham khảo code sau:
Mã:
MOSI    BIT    P0.0
SCK    BIT    P0.1
LATCH1    BIT    P0.2
LATCH2    BIT    P0.3
NUM1    EQU    30H
NUM2    EQU    31H
NUM3    EQU    32H
NUM4    EQU    33H
;--------------------------------------------               
    ORG 0000H
MAIN:    SETB    MOSI
    SETB    SCK
    SETB    LATCH1
    SETB    LATCH2
    MOV    NUM1, #0FFH
    MOV    NUM2, #0
    MOV    NUM3, #0   
    MOV    NUM4, #0
 
START:    MOV    R0, #NUM1
    INC    @R0      ;increase NUM1
    CJNE    @R0,#10,DISPLAY
    MOV    @R0, #0
    MOV    R0, #NUM2
    INC    @R0      ;increase NUM2
    CJNE    @R0,#10,DISPLAY
    MOV    @R0, #0
    MOV    R0, #NUM3
    INC    @R0      ;increase NUM3
    CJNE    @R0,#10,DISPLAY
    MOV    @R0, #0
    MOV    R0, #NUM4
    INC    @R0      ;increase NUM4
    CJNE    @R0,#10,DISPLAY
    MOV    @R0, #0
DISPLAY:
    MOV    R0,#NUM2  ;transmiting 16 bit first
    LCALL    DOT_OFF
    MOV    R0,#NUM1
    LCALL    DOT_OFF
    CLR    LATCH1    ;export to Led 1 & 2
    SETB    LATCH1
 
    MOV    R0,#NUM4  ;transmiting 16 bit second
    LCALL    DOT_ON
    MOV    R0,#NUM3
    LCALL    DOT_OFF
    CLR    LATCH2    ;export to Led 3 & 4
    SETB    LATCH2
 
    LCALL    DELAY
    LJMP    START
;---------------------------------------------
DOT_ON:
    MOV    R2, #8
    MOV    A, @R0
    LCALL    L_DECODE1  ;decode data
LOOP1:    RLC    A        ;transfer data
    MOV    MOSI, C
    SETB    SCK
    CLR    SCK
    DJNZ    R2, LOOP1
    RET
;---------------------------------------------
DOT_OFF:   
    MOV    R2, #8
    MOV    A, @R0
    LCALL    L_DECODE  ;decode data
LOOP:    RLC    A        ;transfer data
    MOV    MOSI, C
    SETB    SCK
    CLR    SCK
    DJNZ    R2, LOOP
    RET
;---------------------------------------------
L_DECODE:
    MOV      DPTR, #TABLE
        MOVC    A,@A+DPTR
        RET
 
TABLE:    DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
;---------------------------------------------
L_DECODE1:
    MOV      DPTR, #TABLE1
        MOVC    A,@A+DPTR
        RET
 
TABLE1:    DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH
;---------------------------------------------
DELAY:   
    MOV    11H, #150
DL2:    MOV    10H, #0FFH
DL1:    DJNZ    10H, DL1
    DJNZ    11H, DL2
    RET
END
Mạch đếm hiển thị led 7 seg, có sử dụng 74hc595, 74hc245, 2803.
1.PNG
Bạn down project ở file đính kèm nhé.
 

Đính kèm

#10
các bác cho em hỏi là : em làm mạch thì ok rồi,chạy ngon. mỗi tội là mức 0 của 595 em lại đo đc là ~2V ko biết là lỗi do đâu
các bác giúp em với
 

Quảng cáo Google