![]() |
![]() |
#1 |
Đệ tử 2 túi
Tham gia ngày: May 2005
Bài gửi: 39
: |
Phương pháp quét LED
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: Code:
//****************************************** //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); } } 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 Code:
#include<16F84A.h> #fuses NOWDT,PUT,HS,NOPROTECT #use delay(clock=4000000) main() { // Các lệnh gõ ở đây } #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! Code:
TRISA=0x00; TRISB=0x00; PORTA=0xff; PORTB=0x00;// Code:
TRISA=0x00; TRISB=0x00; 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. Code:
PORTB=0x20; PORTA=0x06; delay_us(3333); 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? thay đổi nội dung bởi: noisePIC, 21-07-2005 lúc 08:47 AM. |
![]() |
![]() |
![]() |
#2 | |
Đệ tử 2 túi
Tham gia ngày: Jun 2005
Bài gửi: 34
: |
Trích:
|
|
![]() |
![]() |
![]() |
#3 |
PIC Bang chủ
|
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.
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
![]() |
![]() |
![]() |
#4 |
Nhập môn đệ tử
Tham gia ngày: Jul 2005
Bài gửi: 8
: |
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! |
![]() |
![]() |
![]() |
#5 |
Đệ tử 2 túi
Tham gia ngày: May 2005
Bài gửi: 39
: |
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ẻ! |
![]() |
![]() |
![]() |
#6 |
Nhập môn đệ tử
Tham gia ngày: Jul 2005
Bài gửi: 8
: |
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. |
![]() |
![]() |
![]() |
#7 |
Đệ tử 2 túi
Tham gia ngày: May 2005
Bài gửi: 39
: |
![]() 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! |
![]() |
![]() |
![]() |
#8 |
Nhập môn đệ tử
Tham gia ngày: Jul 2005
Bài gửi: 8
: |
á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. |
![]() |
![]() |
![]() |
#9 |
Nhập môn đệ tử
Tham gia ngày: Sep 2005
Bài gửi: 2
: |
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é'
|
![]() |
![]() |
![]() |
#10 |
Nhập môn đệ tử
Tham gia ngày: Jul 2005
Bài gửi: 8
: |
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 |
![]() |
![]() |
![]() |
#11 |
Nhập môn đệ tử
Tham gia ngày: Jul 2005
Bài gửi: 8
: |
#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 |
![]() |
![]() |
![]() |
#12 |
Đệ tử 2 túi
Tham gia ngày: May 2005
Bài gửi: 39
: |
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ử. |
![]() |
![]() |
![]() |
#13 |
Đệ tử 3 túi
Tham gia ngày: Jun 2006
Bài gửi: 50
: |
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
|
![]() |
![]() |
![]() |
#14 |
Nhập môn đệ tử
Tham gia ngày: Mar 2010
Bài gửi: 3
: |
![]() 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 |
![]() |
![]() |
![]() |
#15 |
Nhập môn đệ tử
Tham gia ngày: Mar 2010
Bài gửi: 3
: |
sao ko up được file vậy.
http://www.mediafire.com/?emz0kynteiy |
![]() |
![]() |
![]() |
Ðiều Chỉnh | |
Xếp Bài | |
|
|