PDA

View Full Version : TÀI LIỆU VỀ PIC 16F887 VÀ HƯỚNG DẪN LẬP TRÌNH BẰNG mikroC PR


hosontu_xhoa
16-04-2013, 10:30 AM
CÁC MEM PRO xin chỉ giáo về pic 16f887

truongvinh01
16-04-2013, 10:30 AM
Bài 1 : truy xuất PORT ,làm sáng tắt đèn led.
Đây là bài kinh điển mà bất cứ ai mới học vi điều khiển đều phải trải qua, bâygiờ cũng không ngoại lệ. các bạn chú ý tôi sử dụng trình biên dịch MikroC nhé.( tôi khuyên các bạn sử dụng vì nó cực kỳ tiện lợi và nhiều thư viện hỗ trợ)


void main()
{
while(1)
{
1. ANSEL = 0; // CAU HINH NGO RA DIGITAL
2.ANSELH = 0; // vì 2 thanh ghi ansel đều = 0 nên tất cả 14 có 2 chức năng số/tưong tự đều là số
3.TRISB = 0; //CAU HINH PORT B LA NGO RA
4. PORTB = 0xFF; hoặc PORTB = 0b11111111// sáng hết port B
5.delay_ms(10);
6.PORTD = 0; hoặc viết PORTB = 0b00000000 hoặc PORTB = Ox00; // tắt hết PORTB (cả 8 chân)
7.delay_ms(1000);
}
}


bài này rất rất cơ bản, tôi có thể giải thích như sau:
dòng lệnh 1:
- đây là dòng lệnh thiết lập, trong bài này đơn giản chỉ là sáng tắt port D (tức là cho 8 chân sáng hết - mức 1 rồi sau đó 1s cho tắt hết). Như tôi đã nóimột port có nhiều chức năng khác nhau. cụ thể ở đây PORT D có thể là ngõ số hay ngõ tưong tự . bạn cho led sáng tắt tức xuất 0 hoặc 5 V ra PORT D, . Nó là ngõ số, vì vậy ra phải làmgì>??? dĩ nhiên là khai báo nó là ngõ kiểu số ( chỉ có 2 mức 0 - tức 0V, 1tức 5 V). thiết lập là ngõ số liên quan đến thanh ghi ANSEL. thực chất có 2thanh ghi cấu hình số và tương tự cho một chân nào đó: là thanh ghi ANSEL vàANSELH. thanh ghi ANSEL có đủ 8 bit trong khi thanh ghi ANSEL H chỉ có 6 bit (lý do là trên 16f887 có 14 chân vừa là ngõ số vừa là ngõ tương tự => mỗichân ứng với 1 bit để cấu hình cho nó.
bit = 0 là ngõ số, = 1 là tưong tự). vì thế các bạn muốn 1 chân nào đó là sốhay tương tự các bạn chỉ cần thiết lập cho bit liên quan tuơng ứng.

ví dụ: tôi muốn chân số 4 ( chân RA2/ AN2) là ngõ ra số, vậy tôi phải thiết lậpbit tưong ứng của nó trong thanh ghi ANSEL, vậy trong 2 thanh ghi ANSEL, bitnày nằm trong thanh ghi nào??? bit này nằm trong thanh ghi ANSEL và nó nằm ở vịtrí bit thứ 3( tức bit ANS2) ,
vậy đơn giản chỉ cần khai báo
ANS2 = 0;
okie? hoặc có thể viết ANSEL.2 = 0;
2 cách viết này là tương đương.
cách thiết lập từng bit này có thể cho phép trong 1 port có thể vừa có ngõ số,vừa có ngõ tưong tự. đã xong
Lệnh 2( tưong tự lệnh 1)
lệnh 3: sau khi đã cấu hình nó là ngõ số, vậy các bạn phải xem nó là ngõ vàohay ra. vì trong 16f887 thì 1 chân hoặc là vào, hoặc là ra. thiết lập nó liênquan đến thanh ghi TRIS. Thanh ghi TRIS thì port nào cũng có, có thanh ghiTRISA cho port A, TRISB cho port B...vân vân.
ví dụ port B có 8 chân, mỗi chân sẽ đựoc 1 bit trong thanh ghi TRISB cấu hìnhlà ngõ vào hay ra. ( do thanh ghi TRISB sẽ có đầy đủ 8 bit). tôi muốn ngõ RB0 (các bạn nhớ chân nào có chữ RB hay RA, RA..thì là pin cho xuất nhập nhé) là ngõra. vậy tất nhiên bit đầu tiên trong thanh ghi TRISB dùng để thiết lập cho chânRB0 rồi, đó là bit TRISB0. vì là ngõ ra nên ta cho TRISB0 = 0; ngược lại muốnlà ngõ vào ( giả sử ứng dụng cho nút nhấn chẳng hạn) thì TRISB = 1;. vậy muốncả PORTB là ngõ ra thì sao? đơn giản chỉ là TRISB = 0b0000000 ( viết theo kiểunhị phân, 0b tức trình biên dịch hiểu là viết theo nhị phân, sau đó 8 số 0 tứclà 8 bit trong thanh ghi trisb đều = 0, tức 8 chân đều là ngõ ra, nếu viếtTRISB = 0b01010101 thì tức chân 4 chân là ngõ ra, 4 chân là ngõ vào)..okie?
hoặc có thể viết theo kiểu số HEXA, bạn có thể viết TRISB = 0x00( 0x tức là sửdụng số HEXA, mỗi số HEXA ứng với 4 bit. 0x00 = 0b00000000

okie, vậy là khi làm việc với 1 port hay 1 pin bạn nhớ chú ý 2 việc cần thiếtlập: nó là ngõ số hay tương tự ( liên quan thanh ghi ANSEL và ANSELH), = 0 làngõ số, = 1 là ngõ tưong tự ( làm việc với tín hiệu tưong tự)
kế tiếp nó là ngõ ra hay vào( liên quan thanh ghi TRIS. PORT A thì liên quanthanh ghi TRISA, PORTB liên quan thanh ghi TRISB..vân vân
TRISB= 0 hoặc TRISB = 0b00000000 hoặc TRISB = 0x00 ( 3 cách viết); // tất cảcác chân của portB là ngõ vào.

TRISB = 0b10101010 hoặc viết TRISB = 0xAA ;// 4 chân là ngõ vào, 4 chân là ngõra
rất đơn giản phải không?

lênh số 4:
PORTB = 0xFF hoặc có thể viết PORTB = 0b11111111 tức tất cả các 8 ngõ ra đều =1 ( led sáng)
nếu tôi viết PORTB = 0b11110000 ( theo nhị phân) hoặc PORTB = 0xF0 ( theo sốHEXA ) tức 4 chân đầu = 1( led sáng), 4 chân sau = 0( led tắt)
Lệnh số 5: các bạn gặp phải 1 ứng dụng ngon lành trong trình biên dịch MikroC,nó chính là hàm delay, không như các trình biên dịch khác phải viết chuơngtrình delay , bạn chỉ việc viết theo cấu trúc:
delay_ms( số ms muốn delay);
ở ví dụ trên tôi truyền vào 1000 tức 100ms( nhớ là đơn vị ms) tức 1s
lệnh số 6: các bạn cho PORDB tắt hết

ngoài ra vòng lặp while(1) tức vòng lặp vô tận, nó sẽ không bao giờ dừng lại.tức led cứ sáng, sáng 10s, led tắt, tắt 10s rồi lặp lại...vân vân ( giống kiểumấy bảng quảng cáo led ở các shop ngoài đường vậy)

Bài viết có gì thiếu sót thì mong anh em chỉnh sửa giùm vì mình cũng mới học ak còn rất gà>>>>

nè thỳ chữ ký ((( V.V.V )))
V V V

petrosetco
16-04-2013, 10:30 AM
cho mình hỏi lập trình trong mickroC với nhiều port cùng lú thì làm như nào.Bạn có thể cho mình một ví dụ như là dịch led từ porta->porte->portc->portd->portb được ko? Mình làm hoài mà nó ko chạy.