Professional Documents
Culture Documents
Hình 1.4: Sơ đồ cấu trúc bên trong của vi điều khiển PIC 16F887.
Vi điều khiển PIC 16F887 được thiết kế với các tính năng và chức năng sau:
- Ổ đĩa bởi nguồn 5V DC và có thể hoạt động ở tần số đồng hồ lên đến 20 MHz.
- Bộ chọn mã 14 bit với 35 lệnh cơ bản và 10 lệnh mở rộng.
- Có bộ nhớ EEPROM program 256 x 14-bit cho phép lưu trữ dữ liệu được giữ lại khi hệ thống
không còn cung cấp nguồn.
- Ứng dụng hỗ trợ nhiều nguồn tín hiệu như A/D Converter, USART/SCI, MSSP (SPI/I2C), CCP
(Capture/Compare/PWM) và 2 bộ Timer.
- Có 3 bộ đếm dòng như Timer0, Timer1 và Timer2 được tích hợp kèm với Prescaler cho phép bóp
giãn tần số đồng hồ và làm chậm CPU.
- Được tích hợp sẵn với các chức năng bảo vệ quá dòng và nhiệt độ cho các ứng dụng có tính đáp
ứng cao.
- Hỗ trợ ngắt nội (Internal Interrupt) và ngắt ngoài (External Interrupt), bao gồm các Trigger cơ bản
như INT, TMR0, CCP1, RB/INT external interrupts.
-Được tích hợp 4 cổng I/O Analog để đo dấu hiệu từ các cảm biến.
Cấu trúc vi điều khiển PIC 16F887 bao gồm các thành phần chính như CPU (Central Processing
Unit), Oscillator, Reset Circuit, Memory và các Peripheral Interface. CPU bao gồm bộ xử lý ALU
(Arithmetic Logic Unit), bộ đếm và bộ điều khiển (Controller). Oscillator là thành phần cung cấp
xung dao động nội hoặc bên ngoài cho CPU. Reset Circuit gồm nhiều mạch reset bảo vệ CPU khỏi
các lỗi hoạt động khác nhau. Memory có chức năng chứa dữ liệu đệm và lưu trữ trạng thái của CPU.
Peripheral Interface có chức năng kết nối với thiết bị ngoại vi và truyền dữ liệu giữa CPU và các
thiết bị ngoại vi, bao gồm các target như EEPROM, Timer, UART/USART, MSSP, v.v.
1.8. Thông số vi điều khiển PIC 16F887
Hình 1.5: Hình ảnh mô phỏng của vi điều khiển PIC 16F887.
- Kiến trúc RISC (Reduced Instruction Set Computing) 8-bit.
- Bộ chọn mã 14 bit (14-bit instruction word).
- Tần số dao động đồng hồ tối đa 20 MHz cho phép xử lý nhanh chóng các tác vụ.
- Bộ nhớ chương trình 8K x 14 bit với khả năng xóa và lập trình lại.
- Bộ nhớ dữ liệu RAM 368 x 8 bit cho phép lưu trữ dữ liệu tạm thời.
- Bộ chuyển đổi Analog/Digital (A/D) 10-bit với 8 kênh vào Analog.
- Các kênh Timer/Counter: Timer0, Timer1, Timer2.
- Các chức năng bổ sung: Capture/Compare/PWM (CCP), USART/SCI, MSSP (SPI/I2C).
- Tích hợp bộ đếm sự kiện để đáp ứng cực nhanh các tín hiệu Input.
- Bộ chuyển đổi A/D bên trong vi điều khiển với khả năng tăng thêm module để xử lý nhiều kênh
hơn.
- Số ngõ vào/ra (I/O): 35 dòng ví dụ như nút nhấn bấm (button) hay đèn ( led)...
- Có mạch bảo vệ quá dòng, nhiệt độ và khả năng kháng nhiễu tốt.
- Công nghệ Flash-based, cho phép lập trình và xóa trực tiếp trong hệ thống.
- Điện áp đầu vào từ 2V-5.5V DC.
- Bộ điều khiển Reset và Oscillator được tích hợp có chức năng bảo vệ CPU khỏi các lỗi hoạt động.
* Có 2 kiểu khai báo hằng số: biến toàn cục (global variable) và biến cục bộ (local variable)
- Biến toàn cục:
+ Biến toàn cục được khai báo bên ngoài tất cả các hàm kể cả hàm main.
+ Nó thể được khai báo bất kì nơi nào. Thời gian tồn tại nó tồn tại từ lúc chương trình chạy đến
khi dừng. Các biến toàn cục không được khai báo trùng nhau.
- Biến cục bộ:
+ Biến cục bộ là những biến được khai báo trong hàmvà chỉ có tác dụng trong hàm này, kể cả
các biến trong hàm main chỉ có tác dụng trong hàm main. Điều này tương ứng với các biến có thể
có tên chùng nhau trong các hàm. Các biến này tự động sinh ra khi hàm hoạt động và tự mất khi ra
khỏi hàm.
Ví dụ : Int x; //Biến toàn cục
Void main(){
Int y; //Biến cục bộ
y = 10;
} //ra khỏi main y sẽ bị hủy.
* Khai báo biến
- Khai báo biến thường có 4 dạng:
+ int1 a1; //biến a1 là kiểu dữ liệu 1bit chỉ có hai giá trị là 0 ᴠà 1
+ ѕigned int8 a2; //biến a2 là kiểu ѕố nguуên giá trị 8bit ᴠà có dấu
+ unѕigned int8 a3; // biến a3 là kiểu ѕố nguуên giá trị 8bit không dấu có thể viết thành int8 a3;
+ float a4; //biến a4 là kiểu ѕố thực tức có dấu “,”
Ví dụ: Khai báo các biến
Int1TT; //khai báo biến trạng thái thuộc kiểu dữ liệu bit.
Unsigned char dem; //khai báo biến đếm (dem) thuộc kiểu kí tự không dấu 8 bit.
- Tất cả các kiểu ngoại trừ float, được mặc định là không dấu. Tuy nhiên có thể không dấu hoặc có
dấu bằng cách khai báo Unsigned hoặc Signed .
- SHORT là một kiểu đặc biệt sử dụng rất hiệu quả khi lập trình cho bit thao tác vào ra, mảng của
các bit (INT1) thì RAM được hỗ trợ ngay lập tức.
- Chú ý:
+ Biến phải được khai báo trước khi sử dụng.
+ Để biểu diễn một dãy số hay một bảng dữ liệu, ta có dữ liệu kiểu mảng.
+ Mảng là một tập hợp nhiều phần tử có cùng kiểu giá trị, cùng một tên. Mỗi phần tử được truy
cập bằng chỉ số của phần tử đó. Chỉ số mảng bắt đầu tính từ 0.
+ Khai báo mảng như sau: Loại mảng Vùng chứa Tên mảng [Kích thước]...[Kích thước]
2.2.3. Hàm số học
- Abs (): lấy trị tuyệt đối
- Ceil(): làm tròn theo hướng tăng
- Floor(): làm tròn theo hướng giảm
- Pow(): lũy thừa
- Sqrt(): lấy căn
Nếu muốn tìm hiểu nhiều hơn về chức năng của các hàm số học thì tra chi tiết trong help CCS :
trong tab contents, chọn Built-In-Function
Hình 2.2: Hình ảnh của help trong CCS.
2.2.4. Các toán tử
T Toá Ví
T n tử Chứ dụ
c
năng
1 + Toá
n tử
cộng
2 += Toá x+=y
n tử tươn
cộng g
và đươn
gán g với
x=x+
y
3 &= Toá x&=
n tử y
and tươn
và g
gán đươn
g với
x=x
&y
4 @ Toá
n tử
địa
chỉ
5 & Toá
n tử
và
6 ^= Toá x^=y
n tử tươn
ex- g
or đươn
và g với
gán. x=x^
y
7 ^ Toá
n tử
ex-
or
8 |= Toá x|=y
n tử tươn
or g
và đươn
gán. g với
x=x|
y.
9 | Toá Ví
n tử dụ or
or nhiề
nhiề u bit
u đại trong
lƣợ 1
ng byte
với với
nhau nhau
thàn
h1
1 -- Giả
0 m
1 /= Toá x/=y
1 n tử tươn
chia g
và đươn
gán g với
x=x/
y
1 / Toá
2 n tử
chia
1 == Toá
3 n tử
dùn
g để
so
sánh
1 > Toá
4 n tử
loén
hơn
1 >= Toá
5 n tử
lớn
hơn
hay
bằng
1 ++ Tăn
6 g
1 * Toá
7 n tử
truy
xuất
gián
tiếp,
đi
trướ
c
con
trỏ
1 != Toá
8 n tử
khô
ng
bằng
1 << Toá x <<
9 = n tử =y
dịch tươn
trái g
và đươn
gán g với
x=x<
<y
2 < Toá
0 n tử
nhỏ
hơn
2 << Toá
1 n tử
dịch
trái
2 <= Toá
2 n tử
nhỏ
hơn
hay
bằng
2 && Toá
3 n tử
và
và
2 ! Toá
4 n tử
phủ
định
(not)
2 || Toá
5 n tử
or
2 %= Toá x %=
6 n tử y
chia tươn
lấy g
số đươn
dư g với
và x=x
gán %y
2 % Toá
7 n tử
mod
ule
2 *= Toá x *=
8 n tử y
nhân tươn
và g
gán đươn
g với
x=x*
y
2 * Toá
9 n tử
nhân
3 ~ Toá
0 n tử
bù 1
3 >> Toá x
1 = n tử >>=
dịch y
phải tươn
và g
gán đươn
g với
x=x>
>y
3 >> Toá
2 n tử
dịch
phải
3 -> Toá
3 n từ
con
trỏ
cấu
trúc
3 -= Toá x -=
4 n tử y
trừ tươn
và g
gán đươn
g với
x=x-
y
3 - Toá
5 n tử
trừ
3 Siz Xác
6 eof định
kích
thướ
c
theo
byte
của
toán
tử
Giải:
Int8 x = 0, y = 0, z = 0;
y = sqrt (x) - (y -1) / (pow (z, 2) + 1);
2.2.5. Các lệnh C cơ bản
a. Cấu trúc điều kiện If:
- Cấu trúc: if(biểu thức điều kiện)
{
Lệnh hoặc khối lệnh;
}
- Ý nghĩa: Nếu biểu thức điều kiện cho kết quả đúng thì thực hiện lệnh hoặc khối lệnh.
Ví dụ:
if (x == 100) y=50; // nếu x==100 thì gán y=50
if (swich == 1) // nếu swich tác động
{
led_on(); // bật led
motor_on(); // gọi hàm motor_on.
}
b. Cấu Trúc Điều Kiện If và else:
- Cấu trúc: if (biểu thức điều kiện)
{
< Lệnh hoặc khối lệnh1>;
}
Else
{
< Lệnh hoặc khối lệnh2>;
}
- Ý nghĩa: Nếu biểu thức điều kiện cho kết quả đúng thì thực hiện lệnh hoặc khối lệnh1, ngược lại sẽ
thực hiện lệnh hoặc khối lệnh2.
- Chức năng: kiểm tra điều kiện nếu thỏa thì làm.
Ví dụ:
if (x == 100) y=50;
else y=100; //nếu x==100 thì gán y=50, nếu x!=100 gán y=100;
c. Cấu trúc While:
- Cấu trúc: while (bieu_thuc)
{
<lệnh hoặc khối lệnh>;
}
- Ý nghĩa:
Bước 1: Kiểm tra giá trị bieu_thuc
Bước 2: Nếu bieu_thuc cho giá trị đúng: thực hiện <lện hoặc khối lệnh> và quay về bước 1.
Nếu bieu_thuc cho giá trị sai: thoát khỏi vòng lặp
- Chức năng: lặp lại một thao tác với một số lần nhất định hoặc khi còn thỏa 1 điều kiện nào đó.
Ví dụ: while(x> 0)
{x=x-1;}
d. Cấu Trúc Do...While:
- Cấu trúc: Do
{
<Lệnh hoặc khối lệnh>;
}
while (bieu_thuc)
- Ý nghĩa: Bước 1: thực hiện <Lệnh hoặc khối lệnh>
Bước 2: Kiểm tra giá trị bieu_thuc
Nếu bieu_thuc cho giá trị đúng: quay về bước 1.
Nếu bieu_thuc sai: thoát khỏi vòng lặp
- Chức năng: làm các lệnh trong dấu ngoặc và thoát nếu điều kiện theo sau lệnh while không đúng.
Ví dụ: Do
{x=x+10;}
while(x <100)
Thực hiện lệnh x bằng x cộng với10, làm cho đến khi x nhỏ hơn 100
e. Cấu Trúc Vòng Lặp For:
- Cấu trúc: for (giá_trị_bắt_đầu; điều_kiện_kết_thúc; tăng_giá_trị )
{
Lệnh 1;
Lệnh 2;
...
}
- Chức năng: làm các lệnh trong dấu ngoặc một số lần nhất định.
Ví dụ: For (int n = 0; n <100; n++)
{x=x+10;}
Vòng lặp thực hiện với biến n bằng 0 cho đến khi n bằng 100 thì ngừng.
f. Lệnh Break:
Sử dụng break có thể thoát khỏi vòng lặp ngay cả khi điều kiện để nó kết thúc chưa được thoả
mãn. Lệnh này có thể được dùng để kết thúc một vòng lặp không xác định hay buộc nó phải kết
thúc giữa chừng thay vì kết thúc một cách bình thường.
g. Lệnh Continue:
Làm cho chương trình thực hiện tiếpvòng lặp mới, bỏ qua các câu lệnh khác nằm sau lệnh
continue này.Chỉ được dùng trong các vòng lặp.
i. Lệnh Go:
Lệnh này cho phép nhảy vô điều kiện tới bất kì điểm nào trong chương trình. Nói chung bạn
nên tránh dùng nó trong chương trình C++. Tuy nhiên chúng ta vẫn có một ví dụ dùng lệnh goto để
đếm ngược.
h. Lệnh Swich...Case:
- Cấu trúc: switch (biểu thức)
{
Case constant1: Lệnh a1;
Lệnh a2;
Break;
Case constant2: Lệnh b1;
Lệnh b2;
Break;
Default: Lệnh c1;
Lệnh c2;
Break;
}
- Chức năng: thực hiện 1 công việc tùy thuộc vào hàm.
2.2.6. Một số hình khối trong thuật toán