Lập trình là 1 kỹ năng rất quan trọng đối với 1 kỹ sư điện tử. Tuy nhiên, trong quá trình xây dựng phần cứng, tôi thấy rằng chỉ lập trình thôi chưa đủ.
Làm việc với họ vi điều khiển 89C5x, chúng ta sẽ thấy họ này hỗ trợ rất nhiều cho các IC ngoại vi. Chúng ta quá chú trọng đến các tài nguyên có sẵn của 89C5x (ví dụ như số lượng chân, timer, counter, bộ nhớ RAM, ROM...)mà quên mất 1 điều rằng họ này hỗ trợ mở rộng tất cả các tài nguyên của nó.
Vậy chúng ta thiếu kỹ năng gì, nhất là với những người đã có kiến thức cơ bản về vi điều khiển: đó là sử dụng thành thạo các IC ngoại vi và các IC phụ trợ cho việc mở rộng tài nguyên của vi điều khiển.
Vì các lý do trên, tôi xin mạnh dạn đưa ra 1 tutorial về học cách sử dụng các IC ngoại vi, các IC phụ trợ. Mong mọi người có kinh nghiệm vê các họ này đóng góp chút kiến thức cho các em sinh viên muốn tìm hiểu về lĩnh vực này.
Kinh nghiệm của tôi cho thấy, các bạn sinh viên chỉ cần nắm được cách sử dụng thành thạo khoảng hơn 10 loại IC họ 74xx là các bạn có thể làm việc khá thoải mái. Các vấn đề về thiết kế mạch cũng trở nên rất sáng sủa.
Tôi tạm thời đưa ra IC họ 74xx để chúng ta có thể bắt đầu
74LS08/74HC08 : AND
74LS32/74HC08 : OR
74LS04/74HC04 : NOT
74LS03/74HC03 : NAND
74LS138 : giải mã địa chỉ 3 đầu vào 8 đầu ra
74LS573 : Đệm và chốt theo mức của xung điều khiển
74LS574 : Đệm và chốt theo sườn của xung điều khiển
74LS244 : Đệm 1 chiều
74LS245 : Đệm 2 chiều
74595 : Ghi dịch, vào nối tiếp, ra song song
Sau khi đã tìm hiểu về các loại IC trên, chúng ta sẽ tiếp tục tìm hiểu về các IC mở rộng ngoại vi như:
8255 : mở rộng chân cẳng
8253 : mở rộng timer và counter
62xx : RAM ngoài (6264 có 8KB)
27xxx: ROM ngoài (27256 có 32KB)
Làm việc với họ vi điều khiển 89C5x, chúng ta sẽ thấy họ này hỗ trợ rất nhiều cho các IC ngoại vi. Chúng ta quá chú trọng đến các tài nguyên có sẵn của 89C5x (ví dụ như số lượng chân, timer, counter, bộ nhớ RAM, ROM...)mà quên mất 1 điều rằng họ này hỗ trợ mở rộng tất cả các tài nguyên của nó.
Vậy chúng ta thiếu kỹ năng gì, nhất là với những người đã có kiến thức cơ bản về vi điều khiển: đó là sử dụng thành thạo các IC ngoại vi và các IC phụ trợ cho việc mở rộng tài nguyên của vi điều khiển.
Vì các lý do trên, tôi xin mạnh dạn đưa ra 1 tutorial về học cách sử dụng các IC ngoại vi, các IC phụ trợ. Mong mọi người có kinh nghiệm vê các họ này đóng góp chút kiến thức cho các em sinh viên muốn tìm hiểu về lĩnh vực này.
Kinh nghiệm của tôi cho thấy, các bạn sinh viên chỉ cần nắm được cách sử dụng thành thạo khoảng hơn 10 loại IC họ 74xx là các bạn có thể làm việc khá thoải mái. Các vấn đề về thiết kế mạch cũng trở nên rất sáng sủa.
Tôi tạm thời đưa ra IC họ 74xx để chúng ta có thể bắt đầu
74LS08/74HC08 : AND
74LS32/74HC08 : OR
74LS04/74HC04 : NOT
74LS03/74HC03 : NAND
74LS138 : giải mã địa chỉ 3 đầu vào 8 đầu ra
74LS573 : Đệm và chốt theo mức của xung điều khiển
74LS574 : Đệm và chốt theo sườn của xung điều khiển
74LS244 : Đệm 1 chiều
74LS245 : Đệm 2 chiều
74595 : Ghi dịch, vào nối tiếp, ra song song
Sau khi đã tìm hiểu về các loại IC trên, chúng ta sẽ tiếp tục tìm hiểu về các IC mở rộng ngoại vi như:
8255 : mở rộng chân cẳng
8253 : mở rộng timer và counter
62xx : RAM ngoài (6264 có 8KB)
27xxx: ROM ngoài (27256 có 32KB)
Cho thêm sự đa dạng của TTL - 74xx :
74ls00 Cổng NAND với 2 đầu vào
74ls04 Cổng NOT
74ls06 Cổng NOT với cực thu hở
74ls08 Cổng AND với 2 ngõ vào
74ls10 Cổng NAND với 3 ngõ vào
74ls13 Cổng NOT với 3 ngõ vào
74ls11 Cổng AND với 3 ngõ vào
74ls14 Cổng NOT với 6 ngõ vào
74ls12 Cổng NAND với 3 ngõ vào cực thu hở
74ls21 Cổng AND với 4 ngõ vào
74ls22 Cổng NAND với 4 ngõ vào cực thu hở
74ls25 Cổng NOR với 4 ngõ vào
74ls27 Cổng NOR với 3 ngõ vào
74ls30 Cổng NAND với 8 ngõ vào
74ls32 Cổng OR với 2 ngõ vào
74ls33 Cổng NOR với 2 ngõ v ào . Cực thu hở
74ls42 Giải mã từ 1 đến 10
74ls45 Giải mã BCD sang thập phân
74ls47 Giải mã BCD sang LED 7 thanh
74ls90 Đếm nhị phân đồng bộ thuận với Kd = 10
74ls92 Đếm nhị phân đồng bộ thuận với Kd = 12
74ls93 Đếm nhị phân đồng bộ thuận với Kd = 16
74ls121 Bộ đa hài 1 xung
74ls154 Giải mã 4 vào --> 16 ra
74ls138 Giải mã 3 vào --> 8 ra
74ls192 Đếm mã BCD lên xuống với Kd = 10
74ls193 Đếm nhị phân đồng bộ 8 bít
74ls237 Bộ phân kênh : 3 -->8
74ls374 Trigio - D . Với 8 chốt điều chỉnh
74ls390 Bộ đếm 10. Chia 2 và chia 5.
74ls107 FipFlop - JK
74ls175 FipFlop - D
74ls289 Định vị 8 bít
74ls279 Chốt RS
74ls164 Thanh ghi 8 bit vào nối tiếp ra song song
74ls166 Thanh ghi 8 bít vào song song ra nối tiếp
74ls273 Thanh ghi 8 bit
74ls150 Dồn kênh : 16 -->1
74ls151 Dồn kênh : 16 -->1
74ls153 Dồn kênh : 2 -->1
74ls157 Dồn kênh : 4 -->2
74ls158 Dồn kênh : 2 -->1
74ls160 Đếm mã BCD
74ls162 Đếm mã BCD
74ls161 Đếm mã nhị phân - 4 bit
74ls163 Đếm mã nhị phân - 4 bit
74ls155 Giải mã từ 2 --> 4
74ls156 Giải mã từ 2 --> 4
74ls167 Giải mã từ 2 --> 4
74ls139 Giải mã từ 2 --> 4
74ls145 Giải mã BCD sang thập phân
74ls185
74ls147 Mã hóa ưu tiên từ 10 --> 4
74ls148 Mã hóa ưu tiên từ 10 --> 4
74ls125 Bộ đệm 3 trạng thái
74ls126 Bộ đệm 3 trạng thái
74ls85 So sánh 2 số nhị phân 8 bít
74ls181 Phép tính số học
74ls74 Trigio - D
74ls76 Tri \gio - JK
74ls01 Cổng NAND với 4 đầu ra
74ls02 Cổng NOR với 4 đầu ra
74ls595 Thanh ghi 8 bit với chốt đầu ra
74ls00 Cổng NAND với 2 đầu vào
74ls04 Cổng NOT
74ls06 Cổng NOT với cực thu hở
74ls08 Cổng AND với 2 ngõ vào
74ls10 Cổng NAND với 3 ngõ vào
74ls13 Cổng NOT với 3 ngõ vào
74ls11 Cổng AND với 3 ngõ vào
74ls14 Cổng NOT với 6 ngõ vào
74ls12 Cổng NAND với 3 ngõ vào cực thu hở
74ls21 Cổng AND với 4 ngõ vào
74ls22 Cổng NAND với 4 ngõ vào cực thu hở
74ls25 Cổng NOR với 4 ngõ vào
74ls27 Cổng NOR với 3 ngõ vào
74ls30 Cổng NAND với 8 ngõ vào
74ls32 Cổng OR với 2 ngõ vào
74ls33 Cổng NOR với 2 ngõ v ào . Cực thu hở
74ls42 Giải mã từ 1 đến 10
74ls45 Giải mã BCD sang thập phân
74ls47 Giải mã BCD sang LED 7 thanh
74ls90 Đếm nhị phân đồng bộ thuận với Kd = 10
74ls92 Đếm nhị phân đồng bộ thuận với Kd = 12
74ls93 Đếm nhị phân đồng bộ thuận với Kd = 16
74ls121 Bộ đa hài 1 xung
74ls154 Giải mã 4 vào --> 16 ra
74ls138 Giải mã 3 vào --> 8 ra
74ls192 Đếm mã BCD lên xuống với Kd = 10
74ls193 Đếm nhị phân đồng bộ 8 bít
74ls237 Bộ phân kênh : 3 -->8
74ls374 Trigio - D . Với 8 chốt điều chỉnh
74ls390 Bộ đếm 10. Chia 2 và chia 5.
74ls107 FipFlop - JK
74ls175 FipFlop - D
74ls289 Định vị 8 bít
74ls279 Chốt RS
74ls164 Thanh ghi 8 bit vào nối tiếp ra song song
74ls166 Thanh ghi 8 bít vào song song ra nối tiếp
74ls273 Thanh ghi 8 bit
74ls150 Dồn kênh : 16 -->1
74ls151 Dồn kênh : 16 -->1
74ls153 Dồn kênh : 2 -->1
74ls157 Dồn kênh : 4 -->2
74ls158 Dồn kênh : 2 -->1
74ls160 Đếm mã BCD
74ls162 Đếm mã BCD
74ls161 Đếm mã nhị phân - 4 bit
74ls163 Đếm mã nhị phân - 4 bit
74ls155 Giải mã từ 2 --> 4
74ls156 Giải mã từ 2 --> 4
74ls167 Giải mã từ 2 --> 4
74ls139 Giải mã từ 2 --> 4
74ls145 Giải mã BCD sang thập phân
74ls185
74ls147 Mã hóa ưu tiên từ 10 --> 4
74ls148 Mã hóa ưu tiên từ 10 --> 4
74ls125 Bộ đệm 3 trạng thái
74ls126 Bộ đệm 3 trạng thái
74ls85 So sánh 2 số nhị phân 8 bít
74ls181 Phép tính số học
74ls74 Trigio - D
74ls76 Tri \gio - JK
74ls01 Cổng NAND với 4 đầu ra
74ls02 Cổng NOR với 4 đầu ra
74ls595 Thanh ghi 8 bit với chốt đầu ra
Phương pháp học:
- Đọc datasheet để nắm được cấu tạo và thứ tự chân cẳng của IC. Các trang web để lấy datasheet gồm
http://www.alldatasheet.com/
http://www.datasheetcatalog.com/
- Phải hiểu về 8 khái niệm sau:
+) Xung là gì? (Xung sườn lên và Xung sườn xuống)
+) Mức (Mức cao và mức thấp)
+) Trạng thái trở kháng cao (High Z)
+) Chọn chip (CS - Chip Select)
+) Tích cực thấp (Low active)
+) Tích cực cao (High active)
+) Chốt dữ liệu (Strobe, Latch)
+) Cho phép xuất dữ liệu (OE - Output Enable)
- Tiến hành ráp mạch và lập trình để sử dụng các IC
Tôi lấy ví dụ về cách sử dụng IC 74HC138
+) IC74LS138 có 3 đầu vào, 3 đầu vào này giải mã ra 8 đầu ra. (2 mũ 3 bằng 8)
+) Đầu tiên chúng ta nối 3 chân đầu vào của 74138 với 3 chân P1_1, P1_2, P1_3 của 89C5x. Các chân chọn chip của 74138 chúng ta mắc sao cho nó luôn được kich hoạt (chân 4,5 mắc lên GND. chân 6 mắc VCC)
+) Mắc 8 đèn LED vào 8 đầu ra, mắc sao cho khi đầu ra của 74138 ở mức 0V thì LED sáng.
+) Lập trình với 89C5x, xuất ra 3 chân lần lượt là 000, trễ 1s. 001 trễ 1s, 010, trễ 1s... cứ thế cho đến 111.
+) Quan sát LED đầu ra chúng ta sẽ thấy các LED sẽ sáng thứ tự từng cái một. Như vậy là mạch đã hoạt động, giải mã đã thành công.
- Đọc datasheet để nắm được cấu tạo và thứ tự chân cẳng của IC. Các trang web để lấy datasheet gồm
http://www.alldatasheet.com/
http://www.datasheetcatalog.com/
- Phải hiểu về 8 khái niệm sau:
+) Xung là gì? (Xung sườn lên và Xung sườn xuống)
+) Mức (Mức cao và mức thấp)
+) Trạng thái trở kháng cao (High Z)
+) Chọn chip (CS - Chip Select)
+) Tích cực thấp (Low active)
+) Tích cực cao (High active)
+) Chốt dữ liệu (Strobe, Latch)
+) Cho phép xuất dữ liệu (OE - Output Enable)
- Tiến hành ráp mạch và lập trình để sử dụng các IC
Tôi lấy ví dụ về cách sử dụng IC 74HC138
+) IC74LS138 có 3 đầu vào, 3 đầu vào này giải mã ra 8 đầu ra. (2 mũ 3 bằng 8)
+) Đầu tiên chúng ta nối 3 chân đầu vào của 74138 với 3 chân P1_1, P1_2, P1_3 của 89C5x. Các chân chọn chip của 74138 chúng ta mắc sao cho nó luôn được kich hoạt (chân 4,5 mắc lên GND. chân 6 mắc VCC)
+) Mắc 8 đèn LED vào 8 đầu ra, mắc sao cho khi đầu ra của 74138 ở mức 0V thì LED sáng.
+) Lập trình với 89C5x, xuất ra 3 chân lần lượt là 000, trễ 1s. 001 trễ 1s, 010, trễ 1s... cứ thế cho đến 111.
+) Quan sát LED đầu ra chúng ta sẽ thấy các LED sẽ sáng thứ tự từng cái một. Như vậy là mạch đã hoạt động, giải mã đã thành công.
Với các bước thực hiện như trên, các bạn có thể làm tiếp với IC 74LS573, 74LS574. 2 IC này là 2 IC đệm có chốt. (khác với 74LS244 và 74LS254 là đệm không chốt).
Ví dụ 74LS573. Đây là IC đệm có chốt với tín hiệu điều khiển theo mức (khác với tín hiệu điều khiển theo sườn)
+) Nối 8 chân của cổng P1 của 89C5x với các chân từ D0->D7 của 74LS573
+) Nối 8 chân ra Q0->Q7 với 8 đèn LED (giống như với 74LS138)
+) Các chân LE và OE là 2 chân điều khiển luồng data. LE là chốt dữ liệu. OE là cho phép xuất dữ liệu ra.
Chúng ta hãy tưởng tượng con 74LS573 như 1 căn phòng hình chữ nhật có 2 cánh cửa. một cánh cửa vào (cho phép người vào trong phòng) và 1 cánh cửa ra (cho phép người đi ra). Căn phòng chính là bộ đệm
Tín hiệu điều khiển đóng/mở cửa vào là LE (LE = 0 là đóng cửa, LE = 1 là mở cửa) tín hiệu điều khiển đóng/mở cửa ra là OE (OE = 0 là mở cửa, OE = 1 là đóng cửa). Khi ta đóng cửa vào (LE = 0) tức là người ở ngoài không vào được phòng (dữ liệu không vào được bộ đệm), nhưng người ở trong phòng vẫn có thể ra ngoài được nhờ tín hiệu OE
Nếu cửa vào luôn mở (LE luôn bằng 0 - nối đất) thì chỉ còn phụ thuộc vào OE. Ngược lại nếu cửa ra luôn mở (OE luôn bằng 1 - nối lên dương nguồn) thì đầu ra chỉ còn phụ thuộc vào LE.
................-----------------
...............|.......................|
...............|..(Vùng đệm)......|
................\.......................\
.................\ LE....................\ OE
-->data vào..\........-->data ra..\ ---->LED
...............|.......................|
...............|.......................|
................-----------------
Như vậy muốn đưa dữ liệu từ 89C5x ra các LED thì phải qua 2 tín hiệu (2 cánh cửa). 1 tín hiệu LE là đưa dữ liệu từ 89C5x vào vùng đệm (căn phòng), 1 tín hiệu OE đưa dữ liệu từ vùng đệm ra LED
............LE...................OE..........
89C5x ------> Vùng đệm -----> LED
IC 74LS573 có nhiều ứng dụng như: Mở rộng bộ nhớ RAM ROM, mở rộng cổng vào ra (kết hợp với 74138).....
Ví dụ 74LS573. Đây là IC đệm có chốt với tín hiệu điều khiển theo mức (khác với tín hiệu điều khiển theo sườn)
+) Nối 8 chân của cổng P1 của 89C5x với các chân từ D0->D7 của 74LS573
+) Nối 8 chân ra Q0->Q7 với 8 đèn LED (giống như với 74LS138)
+) Các chân LE và OE là 2 chân điều khiển luồng data. LE là chốt dữ liệu. OE là cho phép xuất dữ liệu ra.
Chúng ta hãy tưởng tượng con 74LS573 như 1 căn phòng hình chữ nhật có 2 cánh cửa. một cánh cửa vào (cho phép người vào trong phòng) và 1 cánh cửa ra (cho phép người đi ra). Căn phòng chính là bộ đệm
Tín hiệu điều khiển đóng/mở cửa vào là LE (LE = 0 là đóng cửa, LE = 1 là mở cửa) tín hiệu điều khiển đóng/mở cửa ra là OE (OE = 0 là mở cửa, OE = 1 là đóng cửa). Khi ta đóng cửa vào (LE = 0) tức là người ở ngoài không vào được phòng (dữ liệu không vào được bộ đệm), nhưng người ở trong phòng vẫn có thể ra ngoài được nhờ tín hiệu OE
Nếu cửa vào luôn mở (LE luôn bằng 0 - nối đất) thì chỉ còn phụ thuộc vào OE. Ngược lại nếu cửa ra luôn mở (OE luôn bằng 1 - nối lên dương nguồn) thì đầu ra chỉ còn phụ thuộc vào LE.
................-----------------
...............|.......................|
...............|..(Vùng đệm)......|
................\.......................\
.................\ LE....................\ OE
-->data vào..\........-->data ra..\ ---->LED
...............|.......................|
...............|.......................|
................-----------------
Như vậy muốn đưa dữ liệu từ 89C5x ra các LED thì phải qua 2 tín hiệu (2 cánh cửa). 1 tín hiệu LE là đưa dữ liệu từ 89C5x vào vùng đệm (căn phòng), 1 tín hiệu OE đưa dữ liệu từ vùng đệm ra LED
............LE...................OE..........
89C5x ------> Vùng đệm -----> LED
IC 74LS573 có nhiều ứng dụng như: Mở rộng bộ nhớ RAM ROM, mở rộng cổng vào ra (kết hợp với 74138).....
74LS595(chốt và dịch) = 74LS164(dịch) + 74LS573(chốt)
Một code đơn giản để sử dụng con 74LS595.
Như bài trước đã nói, 74LS595 có 5 tín hiệu cần điều khiển.
+) DATA - Dữ liệu vào nối tiếp
+) SHIFT - Dịch dữ liệu
+) LATCH - Chốt dữ liệu
+) OUTPUT ENABLE - Cho phép xuất dữ liệu
+) RESET - Xóa dữ liệu
Mọi người xem 2 đoạn code này làm gì nhé.
(chú ý: 8 đầu ra của 74LS595 mắc với 8 đèn LED)
CODE 1
Một code đơn giản để sử dụng con 74LS595.
Như bài trước đã nói, 74LS595 có 5 tín hiệu cần điều khiển.
+) DATA - Dữ liệu vào nối tiếp
+) SHIFT - Dịch dữ liệu
+) LATCH - Chốt dữ liệu
+) OUTPUT ENABLE - Cho phép xuất dữ liệu
+) RESET - Xóa dữ liệu
Mọi người xem 2 đoạn code này làm gì nhé.
(chú ý: 8 đầu ra của 74LS595 mắc với 8 đèn LED)
CODE 1
#include <AT89X52.H>
#define data P2_0
#define reset P2_1
#define shift P2_2
#define latch P2_3
#define output P2_4
//-------------- Ham tre mini giay ----------------
void tre(unsigned int ms)
{
unsigned int m,n;
for(m=0;m<ms;m++)
for (n=0;n<120;n++)
{}
}
//-------------------------------------------------
//------------- Ham xuat 1 byte data ---------------------
void xuat_data(unsigned char out_data)
{
unsigned char i;
for (i=1;i<=8;i++)
{
data = 0x01 & out_data; //xuat bit dau tien cua byte out_data ra chan data
shift=1;
shift=0; //shift chuyen tu muc cao xuong thap, bit data duoc day vao trong 74LS595
out_data = out_data >> 1; //dich cac bit cua out_data sang phai 1 bit
}
latch=1;
latch=0; //latch chuyen tu muc cao xuong thap, xuat 8 bit (byte out_data) ra 8 chan cua 74LS595
}
//--------------------------------------------------------
void main()
{
reset=1; //no clear data
output = 0; // luon xuat data trong bo dem
while(1)
{
xuat_data(0xFF);
tre(1000); //tre 1 giay
xuat_data(0x00);
tre(1000);
}
}
CODE 2
#include <AT89X52.H>
#define data P2_0
#define reset P2_1
#define shift P2_2
#define latch P2_3
#define output P2_4
//-------------- Ham tre mini giay ----------------
void tre(unsigned int ms)
{
unsigned int m,n;
for(m=0;m<ms;m++)
for (n=0;n<120;n++)
{}
}
//-------------------------------------------------
//------------- Ham xuat 1 byte data ---------------------
void xuat_data(unsigned char out_data)
{
unsigned char i;
for (i=1;i<=8;i++)
{
data = 0x01 & out_data; //xuat bit dau tien cua byte out_data ra chan data
shift=1;
shift=0; //shift chuyen tu muc cao xuong thap, bit data duoc day vao trong 74LS595
out_data = out_data >> 1; //dich cac bit cua out_data sang phai 1 bit
}
latch=1;
latch=0; //latch chuyen tu muc cao xuong thap, xuat 8 bit (byte out_data) ra 8 chan cua 74LS595
}
//--------------------------------------------------------
void main()
{
reset=1; //no clear data
output = 0; // luon xuat data trong bo dem
while(1)
{
xuat_data(0xFF);
tre(1000); //tre 1 giay
reset = 0;
reset = 1;
tre(1000);
}
}
Code ma tran dung 595:
DULIEU BIT P2.2
CLK BIT P2.0
STOBE BIT P2.1
CHAR EQU P3
org 0000h
start: mov a,#00h
mov p2,#00h
mov p3,#00h
mov dptr,#DL
mov r6,1
BD: mov r3,#64 ; Số cột dữ liệu cần truyền, tương ứng độ dài của bảng mã
loop:mov r1,#0
loop1:
setb DULIEU ;Cho một cột ở trạng thái Active
mov r2,#0 ; Biến dữ liệu
lap: setb CLK ; Cho xung clock để dịch cột
cpl DULIEU
cpl CLK
setb STOBE ; Đưa cột ở trạng thái Active ra ( bỏ qua lệnh này nếu dùng IC 741HC64 hoặc 74HC4094, 4094)
cpl STOBE
mov a,r2
movc a,@a+dptr
mov CHAR,a
mov 7fh,#100 ; Chờ thời gian ngắn để mắt nhìn thấy
djnz 7fh,$
mov CHAR,#0 ; Tắt toàn bộ Led
inc r2
cjne r2,#64,lap ; Số cột led, dùng bao nhiêu cột thì số tương ứng
inc r1
cjne r1,#6,loop1 ;tốc độ chạy chữ, giá trị càng cao thì càng chậm
inc dptr
djnz r3,loop
djnz r6,BD
jmp start
;================================================= ====
DL:
DB 0H,0H,0H,0H,0H,0H
DB 0H,0H,0H,0H,0H,0H
DB 0H,0H,0H,0H,0H,0H
DB 0H,0H,0H,0H,0H,0H
DB 4EH,0DFH,0DBH,0DBH,0FBH,72H,0H ;S
DB 7EH,0FFH,0C3H,0C3H,0FFH,7EH,0H ;O
DB 0FFH,0FFH,1CH,38H,0FFH,0FFH,0H ;N
DB 0FFH,0FFH,18H,18H,0FFH,0FFH,0H ;H
DB 0FFH,0FFH,1BH,1BH,1FH,0EH,0H ;P
DB 0H,0H,0H
DB 0H,0H,0H
END
con 74ALS573 và 74LS573 có khác gì nhau
Đối với những ứng dụng thông thường thì 2 con này hoàn toàn thay thế cho nhau được.
Tuy nhiên, để so sánh cụ thể hơn thì bạn nên đọc tài liệu sau đây
http://www.fairchildsemi.com/an/AN/AN-319.pdf
Với họ 74LS và 74HC: 74LS có tốc độ nhanh hơn nhưng cũng "ăn dòng" nhiều hơn (tổn hao công suất lớn hơn), ngược lại họ 74HC thì ăn dòng ít hơn nhưng tốc độ lại chậm hơn.
#define data P2_0
#define reset P2_1
#define shift P2_2
#define latch P2_3
#define output P2_4
//-------------- Ham tre mini giay ----------------
void tre(unsigned int ms)
{
unsigned int m,n;
for(m=0;m<ms;m++)
for (n=0;n<120;n++)
{}
}
//-------------------------------------------------
//------------- Ham xuat 1 byte data ---------------------
void xuat_data(unsigned char out_data)
{
unsigned char i;
for (i=1;i<=8;i++)
{
data = 0x01 & out_data; //xuat bit dau tien cua byte out_data ra chan data
shift=1;
shift=0; //shift chuyen tu muc cao xuong thap, bit data duoc day vao trong 74LS595
out_data = out_data >> 1; //dich cac bit cua out_data sang phai 1 bit
}
latch=1;
latch=0; //latch chuyen tu muc cao xuong thap, xuat 8 bit (byte out_data) ra 8 chan cua 74LS595
}
//--------------------------------------------------------
void main()
{
reset=1; //no clear data
output = 0; // luon xuat data trong bo dem
while(1)
{
xuat_data(0xFF);
tre(1000); //tre 1 giay
xuat_data(0x00);
tre(1000);
}
}
CODE 2
#include <AT89X52.H>
#define data P2_0
#define reset P2_1
#define shift P2_2
#define latch P2_3
#define output P2_4
//-------------- Ham tre mini giay ----------------
void tre(unsigned int ms)
{
unsigned int m,n;
for(m=0;m<ms;m++)
for (n=0;n<120;n++)
{}
}
//-------------------------------------------------
//------------- Ham xuat 1 byte data ---------------------
void xuat_data(unsigned char out_data)
{
unsigned char i;
for (i=1;i<=8;i++)
{
data = 0x01 & out_data; //xuat bit dau tien cua byte out_data ra chan data
shift=1;
shift=0; //shift chuyen tu muc cao xuong thap, bit data duoc day vao trong 74LS595
out_data = out_data >> 1; //dich cac bit cua out_data sang phai 1 bit
}
latch=1;
latch=0; //latch chuyen tu muc cao xuong thap, xuat 8 bit (byte out_data) ra 8 chan cua 74LS595
}
//--------------------------------------------------------
void main()
{
reset=1; //no clear data
output = 0; // luon xuat data trong bo dem
while(1)
{
xuat_data(0xFF);
tre(1000); //tre 1 giay
reset = 0;
reset = 1;
tre(1000);
}
}
Code ma tran dung 595:
DULIEU BIT P2.2
CLK BIT P2.0
STOBE BIT P2.1
CHAR EQU P3
org 0000h
start: mov a,#00h
mov p2,#00h
mov p3,#00h
mov dptr,#DL
mov r6,1
BD: mov r3,#64 ; Số cột dữ liệu cần truyền, tương ứng độ dài của bảng mã
loop:mov r1,#0
loop1:
setb DULIEU ;Cho một cột ở trạng thái Active
mov r2,#0 ; Biến dữ liệu
lap: setb CLK ; Cho xung clock để dịch cột
cpl DULIEU
cpl CLK
setb STOBE ; Đưa cột ở trạng thái Active ra ( bỏ qua lệnh này nếu dùng IC 741HC64 hoặc 74HC4094, 4094)
cpl STOBE
mov a,r2
movc a,@a+dptr
mov CHAR,a
mov 7fh,#100 ; Chờ thời gian ngắn để mắt nhìn thấy
djnz 7fh,$
mov CHAR,#0 ; Tắt toàn bộ Led
inc r2
cjne r2,#64,lap ; Số cột led, dùng bao nhiêu cột thì số tương ứng
inc r1
cjne r1,#6,loop1 ;tốc độ chạy chữ, giá trị càng cao thì càng chậm
inc dptr
djnz r3,loop
djnz r6,BD
jmp start
;================================================= ====
DL:
DB 0H,0H,0H,0H,0H,0H
DB 0H,0H,0H,0H,0H,0H
DB 0H,0H,0H,0H,0H,0H
DB 0H,0H,0H,0H,0H,0H
DB 4EH,0DFH,0DBH,0DBH,0FBH,72H,0H ;S
DB 7EH,0FFH,0C3H,0C3H,0FFH,7EH,0H ;O
DB 0FFH,0FFH,1CH,38H,0FFH,0FFH,0H ;N
DB 0FFH,0FFH,18H,18H,0FFH,0FFH,0H ;H
DB 0FFH,0FFH,1BH,1BH,1FH,0EH,0H ;P
DB 0H,0H,0H
DB 0H,0H,0H
END
con 74ALS573 và 74LS573 có khác gì nhau
Đối với những ứng dụng thông thường thì 2 con này hoàn toàn thay thế cho nhau được.
Tuy nhiên, để so sánh cụ thể hơn thì bạn nên đọc tài liệu sau đây
http://www.fairchildsemi.com/an/AN/AN-319.pdf
Với họ 74LS và 74HC: 74LS có tốc độ nhanh hơn nhưng cũng "ăn dòng" nhiều hơn (tổn hao công suất lớn hơn), ngược lại họ 74HC thì ăn dòng ít hơn nhưng tốc độ lại chậm hơn.
Đăng nhận xét