PDA

View Full Version : Phương pháp quét LED


noisePIC
21-07-2005, 08:45 AM
Phương pháp Quét Led
- Giả sử cho bài toán: Dùng PIC 16F84(13 chân I/O) để hiện thị số lên 6 LED 7 đoạn.Bình thường để hiển thị số lên LED 7 đoạn bạn có thể dùng trực tiếp các chân I/O(8 chân/ 1 LED 7 đoạn),Hoặc dùng bộ giải mã BCD(4 chân I/O / 1 LED 7 đoạn).Như vậy để hiển thị số lên 6 LED 7 đoạn bạn cần dùng tối thiểu 24 chân I/O.--> bài toán buộc phải thay đổi ,không dùng PIC 16F84 nữa! dùng con khác có nhiều chân hơn.
- Nhưng bài toán trên vẫn có thể giải quyết được bằng phương pháp quét LED sử dụng tính chất lưu ảnh trên võng mạc(24 ảnh/giây) thì ảnh như liên tục.Do vậy ta phải quét hết 6 LED 24 lần/ 1s. Các LED lần lượt sáng theo thứ tự từ LED thứ 1 cho tới LED thứ 6 trong một khoảng thời gian nào đó(Tùy thuộc vào tần số quét ta chọn).
Linh kiện:

PIC 16F84A
Giải mã BCD 74LS47N
6 Led 7 đoạn Anốt chung
6 Tranzitor C828

Sơ đồ mạch<không upload được ảnh!!!>

Mô tả:
6 Led Anode chung được nối qua Transitor C828 tới nguồn Vcc.Chân RB0-RB5 nối tương ứng qua một điện trở tới chân Bazơ của Transitor C828.
Tất cả các chân của Led 7 đoạn (a,b,c,d,e,f,g) được nối chung với BUS.
- 4 lối ra của PORTA (RA3-RA0) nối với lối vào của 74LS47.Lối vào nhị phân này tương ứng với lối ra là số thập phân được hiển thị.Giả sử ta cần số 5 sáng
thì RB0 phải bằng 1- để mở Transitor.Còn RA3,RA2,RA1,RA0=0101
..tương tự đối với các LED 7 đoạn khác.
Chương trình được viết như sau:

//******************************************
//QUET LED
//author: noisepic@gmail.com
//date:20/07/2005
//status:OK
//Mota:PIC16F84A + Bo giai ma BCD 7447
//4 vao 7447: RA3-RA0
//PORTB(RB0-RB5 ket noi voi Transitor C828)
//*******************************************
#include<16f84A.h>
#include<def_84.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=4000000)
main()
{
//gia su ta can quet so 1,2,3,4,5,6
TRISA=0x00;
TRISB=0x00;
PORTA=0xff;
PORTB=0x00;// ban dau chua Led 7 doan nao sang
while(TRUE)
{
//hien so 1
PORTB=0x01;//transitor 1 mo
PORTA=0x01;
delay_us(3333);
//hien so 2
PORTB=0x02;//transitor 2 mo
PORTA=0x02;
delay_us(3333);
//hien so 3//transitor 3 mo
PORTB=0x04;
PORTA=0x03;
delay_us(3333);
//hien so 4//transitor 4 mo
PORTB=0x08;
PORTA=0x04;
delay_us(3333);
//hien so 5 //transitor 5 mo
PORTB=0x10;
PORTA=0x05;
delay_us(3333);

//hien so 6//transitor 6 mo
PORTB=0x20;
PORTA=0x06;
delay_us(3333);

}
}

Với thời gian trễ là 3333us~3.3 ms tương đương với quét 50 ảnh/ s.
3.3*6*50~999ms=1s.
Chương trình trên hiển thị số 1 2 3 4 5 6
- Trong chương trình có sử dụng hàm delay_us(3333).Tại sao lại là 3333.
Theo nguyên lý làm phim, nếu có 24 hình ảnh của vật xuất hiện trong 1 giây thì dường như vật đó luôn luôn xuất hiện- ứng dụng của hiện tượng lưu ảnh trên võng mạc.Nhưng do trong thiết kế khi dùng 24 ảnh/s đèn led hơi nháy.Do vậy noisepic tăng tần số quét lên 50 ảnh /s..

Viết chương trình mà không giải thích thì….không ai đọc! chính noisepic là người xem nhiều mã ngụồn.Mã nguồn nào mà giải thích cụ thể thi noisepic mới xem!
Một chương trình viết bằng CCS bao gồm

#include<16F84A.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=4000000)
main()
{
// Các lệnh gõ ở đây
}

Cụ thể từng dòng:

#include<16F84A.h> // phần này định nghĩa loại PIC bạn dùng
#fuses NOWDT,PUT,HS,NOPROTECT // nếu bạn mới viết chương trình thì cũng chưa cần quan tâm mấy với các ứng dụng đơn giản như Ngắt,I/O
#use delay(clock=4000000)// định nghĩa thạch anh mà bạn dùng.như tôi dùng thạch anh 4 MHZ.Khai báo này để dùng lệnh trễ thời gian

Tóm tại 3 dòng trên khai báo cho trình biên dịch CCS biết cấu hình phần cứng PIC như thế nào!

TRISA=0x00;
TRISB=0x00;
PORTA=0xff;
PORTB=0x00;//


Với những ai đã học PIC rồi thì khai báo trên dễ hiểu.Nhưng với người mới bắt đàu thì cứ để noisepic giải thích..tiếp nhé

TRISA=0x00;
TRISB=0x00;

Trong PIC có 2 thanh ghi TRISA,TRISB các bit của nó quyết định xem PORTA ,PORTB là input hay out put.1 tương ứng với INPUT,0 tương ứng với OUTPUT
Với khai báo trên PORTA,PORTB là out put cả!
PORTA=0xff; Mức điện áp ra các chân ở cổng A xấp xỉ 5 V.Các LED 7 đoạn OFF
PORTB=0x00; transitor đóng.

PORTB=0x20;
PORTA=0x06;
delay_us(3333);

Dòng lệnh này để xuất số 6 ra cổng A và giữ số 6 đó trong vòng 3,3ms.
PORTB=00100000 RB5=1 transitor 6 mở cấp điện cho LED 6
PORTA=0x06=6.

noisepic định viết phần tutorial về CCS (đơn giản cho người mới bắt đầu!) không biết có nên viết không?

MHz
30-07-2005, 07:31 PM
noisepic định viết phần tutorial về CCS (đơn giản cho người mới bắt đầu!) không biết có nên viết không?

Theo tôi thì nên và rất nên, vì tutorial về MPASM đã có bác Falleaf làm rùi, bác noíepic nếu có thời gian thì cũng nên làm môt cái tutorial CCS về PIC đi, tôi ủng hộ 2 tay luôn, cái này rất cần cho newbie á !

falleaf
31-07-2005, 11:03 AM
Mình đã để sẵn luồng về CCS C và HTPIC ngay bên dưới, các bạn nên vào đó để post bài, và tutorial nên được soạn thảo trong đó. Bây giờ mọi người thích viết bằng CCS C và HT PIC nhiều lắm, nên các bạn sẽ được ủng hộ và hỗ trợ rất nhiều...

Tôi sẽ tặng ngay cho một bạn bất kỳ đứng ra chủ xị vụ viết tutorial CCS C ít nhất 3 con PIC bất kỳ mà bạn thích, ngoại trừ con 18F2550 và 18F4550 vì hai con đó tôi có rất ít, và một số loại khác không có luôn.

Nếu bạn nào đăng ký đứng ra, thì xin mời viết bài nhận công việc của mình, và tôi sẽ cài đặt mod cho bạn đó quản lý phần CCS C và HT PIC ngay.

Chúc vui.

led1312
26-08-2005, 04:10 PM
Nhưng chương trình ở trên khi biên dịch bị báo lỗi mất rùi bác noisepic ơi.Nó báo là không tìm thấy file def_84.h trong include<def_84.h> đó.Khi tôi bỏ dòng này đi thì báo lỗi không hiểu thanh ghi TRISA...
Làm sao đây bác

Help me soon please!

noisePIC
26-08-2005, 06:24 PM
file def_84.h định nghĩa các bit và thanh ghi trong PIC 16F84. Cách lập trình nửa C nửa Assem ...noisepic thấy khá hiệu quả và mình cũng hiểu về phần cứng. Khi viết một lệnh bạn phải hình dung ra thanh ghi rồi phần cứng thay đổi thế nào!
Nếu bạn dùng CCS thì đừng dùng hàm của nó nhiều quá nhé! Hãy xem các hàm của nó..rồi bạn thử tự viết theo cách của bạn. Khi nào bạn cực siêu rồi hãy dùng hàm nhé!!..noisepic dùng hàm sau một thời gian thấy ..hại quá!! Mà tự viết hàm mới thấy sướng!
chúc bạn vui vẻ!

led1312
29-08-2005, 09:37 AM
bác nói thế thì bó tay đàn em rồi. Tui mới học Pic và đang lây các chương trình của bác để biên dịch thử nhưng khi đưa vào CCS dịch thì bị báo lỗi như vậy đó bác ơi. Khi chương trình đó tui viết thủ công bằng PASM thì chạy thoải mái nhưng mà viết băng PASM thì hơi mệt. Bác coi thử xem trong thư mục picc của mình còn thiếu thư mục nào nữa không
PICC:
1 debug
2 device
3 DLL
4 driver
5 EXample
và thêm một số file .
bác coi thủ cần cài thêm món nào nữa không? Chứ sao khi khai báo
#include def_84.h thì bị báo lỗi là không tìm thấy.Hơn nữa khi tui search trong PICC vẫn không ty\hấy.

noisePIC
29-08-2005, 12:15 PM
file def_84.h là do người dùng định nghĩa các thanh ghi và cac bit. Để từ đó gần gũi với ASM hơn. Giúp bạn làm việc "hiểu " hơn. Chứ đừng dùng hàm trong CCS thuần túy.
http://www.picvietnam.com/showthread.php?t=106
file này bạn phải tạo ra và đặt trong thư mục device hay driver khi biên dịch nó mới #include được.
Nội dung file my_16f84a và def_84 là như nhau!

led1312
29-08-2005, 01:12 PM
ái chà vậy sao. OK mình sẽ làm lại. Vậy mà mình cứ tưởng chương trình ccs c của mình bị lỗi chứ. Bác tiếp tục bài giảng của mình cho anh em học tập nha
Thansk.

nguyendt
04-09-2005, 07:06 PM
cám ơn các bác rất nhiều , em đã có thêm kinh nghiệm để giải quyết khó khăn của em rồi.Có gì hay các bác lại post lên cho anh em học tập nhé'

led1312
05-09-2005, 03:38 PM
Tiếp tục phần ngắt đi bác noisepic ới ơi. Lâu lắm rùi không thấy bác post bài mới đó.
Giúp đỡ tụi này nha

led1312
05-09-2005, 04:33 PM
#include<16f84a.h>
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock=4000000)
#include<def_84.h>
main()
{
//unsigned int j;
TRISA=0x00;
TRISB=0xf0;

//output_low(PIN_A2);
enable_interrupts(GLOBAL); //GIE=1
enable_interrupts(INT_RB); //RBIE=1
while(TRUE)
{
output_low(PIN_B3);
output_high(PIN_A2);
delay_ms(100);
output_low(PIN_A2);
delay_ms(100);
}
}

//***************************************
// chuong trình ng?t
#INT_RB
flash()
{
int i;
for(i=0;i<100;i++)
{
output_low(PIN_A2);
output_high(PIN_B3);
delay_ms(100);
output_low(PIN_B3);
delay_ms(100);
}
bác kiểm tra gium sao chương trình trên không chạy
Khi tôi bấm phím cho chân số 4 xuống mass như sơ đồ trên của bác thì không xay ra ngắt,có nghĩa là LED B3 không nhấp nháy. Mục đích của tôi là khi nhấn phím thì LED trên chân B3 sẽ nháy.CÒn không nhấn phím thì LED trên chân A2 sẽ nhấp nháy.Nhưng không hiểu hiểu sai chổ nào.Bác NoisePic kiểm tra giùm cái nha
Cám ơn bác

noisePIC
07-09-2005, 06:16 PM
Xin lỗi bạn led1312 vì đã trả lời bạn hơi chậm! Mình trả lời như sau:
- chương trình trên thử nghiệm ngắt trên cổng B từ RB4:RB7, khi có sự thay đổi nào (PIC so sánh với trạng thái trước) và xảy ra ngắt. Chân 4 là chân MCLR để reset PIC bạn thử lấy cái dây đồng nối một chân RB4:RB7 với nguồn +5V xem?
- Chương trình trên đã chạy, mình đã thử.

TTL
18-06-2006, 06:11 PM
Bạn nên ngắt bằng cạnh thì thú vị hơn, ví dụ muốn ngắt cạnh lên thì nối chân ngắtt qua r =1k xuống mas và ngược lại

th43v3r89
18-03-2010, 06:12 PM
em viết chuơng trình đếm từ 00 đến 99 cho pic hiển thị 2 led 7 thanh = phuơng pháp quet led. sao khi mô phỏng bằng proteus thì mãi (sau 8 giây) thì led mới bắt đắu sáng và đếm từ 8.
ai giải thich hộ em với

th43v3r89
18-03-2010, 06:14 PM
sao ko up được file vậy.
http://www.mediafire.com/?emz0kynteiy

vodich01
16-01-2011, 04:29 PM
cái link def_84 bị dis rồi =((

vodich01
16-01-2011, 06:33 PM
sao ko up được file vậy.
http://www.mediafire.com/?emz0kynteiy

mình thử xóa cái dây nối từ nguồn vào cái transistor thì nó chạy được từ 00 đó bạn, mặc dù mình ko hiểu, vì mới bắt đầu học PIC do thích phần mềm nhúng :)