Tải bản đầy đủ (.docx) (70 trang)

TÀI LIỆU học VI điều KHIỂN PIC

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.65 MB, 70 trang )

TÀI LIỆU
HỌC VI ĐIỀU KHIỂN PIC

-Ngôn ngữ lập trình C++
-Mô phỏng mạch điện trên Proteus
7.8
-Lập trình PIC cơ bản trên CCS
-Các Ứng dụng PIC
-Thiết kế mạch in trên Altium
Designer
-Làm mạch in thủ công
<Đam mê-Làm chủ công nghệ>

1


Chương I:
ÔN TẬP LẠI NGÔN NGỮ LẬP TRÌNH
C++
I:Tón tắt về ngôn ngữ c.
Ngôn ngữ lập trình C là một ngôn ngữ mệnh lệnh được phát triển từ
đầu thập niên 1970 bởi Ken Thompson và Dennis Ritchie để dùng trong hệ
điều hành UNIX. Từ dó, ngôn ngữ này đã lan rộng ra nhiều hệ điều hành
khác và trở thành một những ngôn ngữ phổ dụng nhất. C là ngôn ngữ rất
có hiệu quả và được ưa chuộng nhất để viết các phần mềm hệ thống, mặc
dù nó cũng được dùng cho việc viết các ứng dụng. Ngoài ra, C cũng
thường được dùng làm phương tiện giảng dạy trong khoa học máy
tính mặc dù ngôn ngữ này không được thiết kế dành cho người nhập môn.

II:Cá cấu trúc lệnh biến,hằng, hàm, mảng, chương trình con
trong c++(cụ thể là phần mềm CCS).


*Các hệ số thường dùng trong CCS
-Hệ cơ số 10 0,1,2,3,4......9.
VD: 14,25,153.
-Hệ nhị phân 0,1
VD: 0101.
-Hệ cơ số 16
VD: 0x25,0xFA.
Cách đổi qua lại các hệ cơ số trình bày trên lớp.
1:Biến sử dụng trong CCS
ĐN: Biến là đại lượng số học hay ký tự chữ viết mà có thể thay đổi được
giá trị.
2:Các kiểu biến sử dụng trong CCS
-Int1 kiểu logic 1 or 0
- Int8,Int,short,byte số nguyên 8 bit (-127 đến 127)
-Int16 số nguyên 16bit
-Int32 số nguyên 32 bit
-char ký tự 8 bit
-float số thực 32 bit
2


-long số nguyên 16 bit
-double số thực có độ chính xác cao
3:Định nghĩa biến và sử dụng
-Ví dụ sau sẽ giúp bạn hiểu về biến
Int8 a;
Int b=5;
Int c;
a=10;
a=a+2;

c=a+b;

//khai báo biến a 8 bit
//Khai báo biến b 8 bit và gán giá trị bằng 5
//khai báo biến a 8 bit
//Gán giá trị cho a=10
// a=10+2=12 biến a mang giá trị mới bằng 12
// c=12+5=17 biến c mang giá trị mới =17

Tóm lại là biến sau khi đưa vào tính toán thì nó bị thay đổi giá trị đi.
-Ví dụ khai báo mảng-Mảng là một tập hợp các biến cùng tên cùng kiểu
dữ liệu nhưng khác chỉ số
Int8 abc[10];

//mảng abc có 10 phần tử từ abc[0] đến abc[9]

abc[0]=5;

//Gán giá trị cho phần tử thứ 1 trong mảng abc =5

abc[1]=7;

//Gán giá trị cho phần tử thứ 2 trong mảng abc =7

c=abc[0]+abc[1]; //Biến c có giá trị =5+7=12.
4:Hằng ,và khai báo hằng số.
Hằng số giống như biến nhưng không thay đổi được giá trị mà chỉ mang
một giá trị ngay từ lúc đầu khi khai báo nó.
Ví dụ sau sẽ rõ.
Const int8 a=2;


//Khai báo hằng số a có giá trị =2

Ta có một biến
Int8 b=2;
Int8 c ;
c=a+b;

// Biến c có giá trị là 2+2=4.

Nếu dùng như sau là không được vì hằng số không thể thay đổi giá trị.
a=b+3;

3


5:Các hàm hay dùng trong CCS(tôi sẽ trình bày theo mức độ quan
trọng giảm dần)
-Hàm if-else (Nếu thì)
if(điều kiện){ chương trình A }
else {chương trình B}
Giải thích nếu điều kiện đúng thì thực hiện chương trình A còn nếu sai thì
thực hiện chương trình B
VD:
If (a>=5) { b=10;}
else{ b=0}
Nếu a có giá trị =1 thì chương trình trên b=0;
Nếu a có giá trị =7 thì chương trình trên b=10;
-Hàm for(vòng lặp)
for(biến chạy;điều kiện;thay đổi biến){chương trình A }

Giải thích, hàm này sẽ tạo ra một vòng lặp với một số lần quy ước của
người sử dụng.
VD:
Int i,b=0;
for(i=0;i<=9;i++){
b=b+2;}
Sau đoạn chương trình này b=20.
-Hàm While(điều kiện)
Giải thích: hàm này cũng tạo ra một vòng lặp , điều kiện còn đúng thì còn
thực hiện,thường thì chương trình của chúng ta đặt trong một vòng lặp
While vô tận.
VD:
4


Int i,b=5;
While(i>=5){
i++;
b--;
}
Sau chương trình này biến b sẽ mang giá trị bằng 0.
6:Các hàm xử lý toán số , toán học trong CCS.
Toán tử gán =
Toán tử gán dùng để gán một giá trị nào đó cho một biến
a = 5;
gán giá trị nguyên 5 cho biến a. Vế trái bắt buộc phải là một biến còn vế
phải có thể là bất kỳ hằng, biến hay kết quả của một biểu thức.
Cần phải nhấn mạnh rằng toán tử gán luôn được thực hiện từ trái sang
phải và không bao giờ đảo ngược
a = b;

gán giá trị của biến a bằng giá trị đang chứa trong biến b. Chú ý rằng
chúng ta chỉ gán giá trị của b cho a và sự thay đổi của b sau đó sẽ không
ảnh hưởng đến giá trị của a.
Một thuộc tính của toán tử gán trong C++ góp phần giúp nó vượt lên các
ngôn ngữ lập trình khác là việc cho phép vế phải có thể chứa các phép gán
khác. Ví dụ:
a = 2 + (b = 5);
tương đương với
b = 5;a = 2 + b;
Vì vậy biểu thức sau cũng hợp lệ trong C++
a = b = c = 5;
gán giá trị 5 cho cả ba biến a, b và c
Các toán tử số học (+, -, *, /, %)
Năm toán tử số học được hỗ trợ bởi ngôn ngữ là:
+ cộng
- trừ
* nhân
/ chia
% lấy phần dư (trong phép chia)

5


Thứ tự thực hiện các toán tử này cũng giống như chúng được thực hiện
trong toán học. Điều duy nhất có vẻ hơi lạ đối với bạn là phép lấy phần dư,
ký hiệu bằng dấu phần trăm (%). Đây chính là phép toán lấy phần dư trong
phép chia hai số nguyên với nhau. Ví dụ, nếu a = 11 % 3, biến a sẽ mang
giá trị 2 vì 11 = 3*3 +2.
Các toán tử gán phức hợp (+=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |=)
Một đặc tính của ngôn ngữ C++ làm cho nó nổi tiếng là một ngôn ngữ súc

tích chính là các toán tử gán phức hợp cho phép chỉnh sửa giá trị của một
biến với một trong những toán tử cơ bản sau:
value += increase; tương đương với value = value + increase;
a -= 5; tương đương với a = a - 5;
a /= b; tương đương với a = a / b;
price *= units + 1; tương đương với price = price * (units + 1);
và tương tự cho tất cả các toán tử khác.
Tăng và giảm
Một ví dụ khác của việc tiết kiệm khi viết mã lệnh là toán tử tăng (++) và
giảm (--). Chúng tăng hoặc giảm giá trị chứa trong một biến đi 1. Chúng
tương đương với +=1 hoặc -=1. Vì vậy, các dòng sau là tương đương:
a++;
a+=1;
a=a+1;
Một tính chất của toán tử này là nó có thể là tiền tố hoặc hậu tố, có nghĩa
là có thể viết trước tên biến (++a) hoặc sau (a++) và mặc dù trong hai biểu
thức rất đơn giản đó nó có cùng ý nghĩa nhưng trong các thao tác khác khi
mà kết quả của việc tăng hay giảm được sử dụng trong một biểu thức thì
chúng có thể có một khác biệt quan trọng về ý nghĩa: Trong trường hợp
toán tử được sử dụng như là một tiền tố (++a) giá trị được tăng trước khi
biểu thức được tính và giá trị đã tăng được sử dụng trong biểu thức; trong
trường hợp ngược lại (a++) giá trị trong biến a được tăng sau khi đã tính
toán. Hãy chú ý sự khác biệt:
Ví dụ 1
Ví dụ 2
B=3;
B=3;
A=++B;
A=B++;
// A is 4, B is 4

// A is 3, B is 4
Các toán tử quan hệ ( ==, !=, >, <, >=, <= )
Để có thể so sánh hai biểu thức với nhau chúng ta có thể sử dụng các toán
tử quan hệ. Theo chuẩn ANSI-C++ thì giá trị của thao tác quan hệ chỉ có
thể là giá trị logic - chúng chỉ có thể có giá trị true hoặc false, tuỳ theo biểu
thức kết quả là đúng hay sai.
Sau đây là các toán tử quan hệ bạn có thể sử dụng trong C++
6


==
!=
>
<</td>
>=
<=

Bằng
Khác
Lớn hơn
Nhỏ hơn
Lớn hơn hoặc bằng
Nhỏ hơn hoặc bằng

Ví dụ:
(7 == 5)
sẽ trả giá trị false
(6 >= 6)
sẽ trả giá trị true
tất nhiên thay vì sử dụng các số, chúng ta có thể sử dụng bất cứ biểu thức

nào. Cho a=2, b=3 và c=6
(a*b >= c)
sẽ trả giá trị true.
(b+4 < a*c)
sẽ trả giá trị false
Cần chú ý rằng = (một dấu bằng) lf hoàn toàn khác với == (hai dấu bằng).
Dấu đầu tiên là một toán tử gán (gán giá trị của biểu thức bên phải cho
biến ở bên trái) và dấu còn lại (==) là một toán tử quan hệ nhằm so sánh
xem hai biểu thức có bằng nhau hay không.
Trong nhiều trình dịch có trước chuẩn ANSI-C++ cũng như trong ngôn ngữ
C, các toán tử quan hệ không trả về giá trị logic true hoặc false mà trả về
giá trị int với 0tương ứng với false còn giá trị khác 0 (thường là 1) thì tương
ứng với true.
Các toán tử logic (!, &&, ||)
Toán tử ! tương đương với toán tử logic NOT, nó chỉ có một đối số ở phía
bên phải và việc duy nhất mà nó làm là đổi ngược giá trị của đối số từ true
sang false hoặc ngược lại. Ví dụ:
!(5 == trả về false vì biểu thức bên phải (5 == 5) có giá
5)
trịtrue
!(6 <=
trả về true vì (6 <= 4)có giá trị false
4)
!true
trả về false
!false trả về true
Toán tử logic && và || được sử dụng khi tính toán hai biểu thức để lấy ra
một kết quả duy nhất. Chúng tương ứng với các toán tử logic AND và OR.
Kết quả của chúng phụ thuộc vào mối quan hệ của hai đối số:
Đối số thứ nhất

Đối số thứ hai
Kết quả Kết quả
a
b
a && b
a || b
true
True
true
true
true
False
false
true
false
True
false
true
7


false

False

false

false

Ví dụ:

( (5 == 5) && (3 > 6) ) trả về false ( true && false ).
( (5 == 5) || (3 > 6)) trả về true ( true || false ).
Toán tử điều kiện ( ? ).
Toán tử điều kiện tính toán một biểu thức và trả về một giá trị khác tuỳ
thuộc vào biểu thức đó là đúng hay sai. Cấu trúc của nó như sau:
condition ? result1 : result2
Nếu condition là true thì giá trị trả về sẽ là result1, nếu không giá trị trả về
là result2.
7==5 ? 4 : 3
trả về 3 vì 7 không bằng 5
7==5+2 ? 4 : 3
trả về 4 vì 7 bằng 5+2
5>3 ? a : b
trả về a, vì 5 lớn hơn 3
a>b ? a : b
trả về giá trị lớn hơn, a hoặc b
Các toán tử thao tác bit (&, |, ^, ~, <<, >>)
Các toán tử thao tác bit thay đổi các bit biểu diễn một biến, có nghĩa là thay
đổi biểu diễn nhị phân của chúng:
Toán tử
asm
Mô tả
&
AND
Logical AND
|
OR
Logical OR
^
XOR

Logical exclusive OR
~
NOT
Đảo ngược bit
<<
SHL
Dịch bit sang trái
SHR
Dịch bit sang phải
Các toán tử chuyển đổi kiểu
Các toán tử chuyển đổi kiểu cho phép bạn chuyển đổi dữ liệu từ kiểu này
sang kiểu khác. Có vài cách để làm việc này trong C++, cách cơ bản nhất
được thừa kế từ ngôn ngữ C là đặt trước biểu thức cần chuyển đổi tên
kiểu dữ liệu được bọc trong cặp ngoặc đơn (), ví dụ:
int i;
float f = 3.14;
i = (int) f;
Đoạn mã trên chuyển số thập phân 3.14 sang một số nguyên (3). Ở đây,
toán tử chuyển đổi kiểu là (int). Một cách khác để làm điều này trong C++
là sử dụng các constructors (ở một số sách thuật ngữ này được dịch là cấu
tử nhưng tôi thấy nó có vẻ không xuôi tai lắm) thay vì dùng các toán tử:
Đặt trước biểu thức cần chuyển đổi kiểu tên kiểu mới và bao bọc biểu thức
giữa một cặp ngoặc đơn.
8


i = int ( f );
Cả hai cách chuyển đổi kiểu đều hợp lệ trong C++. Thêm vào đó ANSI-C+
+ còn có những toán tử chuyển đổi kiểu mới đặc trưng cho lập trình hướng
đối tượng.

sizeof()
Toán tử này có một tham số, đó có thể là một kiểu dữ liệu hay là một biến
và trả về kích cỡ bằng byte của kiểu hay đối tượng đó.
a = sizeof (char);
a sẽ mang giá trị 1 vì kiểu char luôn có kích cỡ 1 byte trên mọi hệ thống.
Giá trị trả về của sizeof là một hằng số vì vậy nó luôn luôn được tính trước
khi chương trình thực hiện.
6:Viết một chương trình con (Cái này sử dụng nhiều và quan trong).
Cú pháp 1 chương trình con.
-Kiểu trả về kết quả.
Kieudulieu tenchuongtrinhcon(cac bien truyen vao)
{
Thân chương trình
Return (ketquatrave );
}
VD: int8 tinhtoan(int a){
b=a.2;
return(b);
}
Nếu ta gọi hàm con
c=tinhtoan(5); thì c se mang giá trị là 10.

-Kiểu không trả về kết quả.
Void tenchuongtrinhcon(cac bien truyen vao)
9


{
Thân chương trình
}

VD: Void hienthi(int a){
Output_D(a);
}
Chương trình này xuất ra cổng D dữ liệu biến a.

7:Bài tập
Bài 1:Viết một chương trình vòng lặp for biến i chạy từ 20 về 0.
Bài 2:Viết một chương trình sử dụng if-else kiểm tra biến a nếu a>0 thì
thực hiện vòng lặp for biến i chạy từ 0 đến 10 ,nếu a<0 thì biến i chạy từ 10
về 0
Bài 3: Viết một chương trình sử dụng If-else
Nếu 5<=a<=10 thì b=10.
Nếu 11<=a<=15 thì b=15.
Nếu a<5 hoặc a>15 thì b=0.

III:Làm quen với CCS
-CCs là một môi trường lập trình phổ biến cho dòng PIC sử dụng cả ngôn
ngữ c và asm
-Ở tài liệu này,ta lập trình trên ngôn ngữ C
-Ngôn ngữ C giúp người dùng tiếp cận và học PIC nhanh hơn, ta không
cần quan tâm tới cấu trúc của Pc như thế nào, hay các thanh gi và địa chỉ
các thanh gi như nào.với C ta chỉ cần quan tâm duy nhất tới một thứ đó là
Cú pháp câu lệnh, để ta sử dụng nó lập trình cho PIC.

10


-Một điều nữa mà C mang lại là ta có thế dễ dàng viết ra ý tưởng hay thuật
toán trong đầu trên ngôn ngữ C một cách đơn giản.gần như là nghĩ được
gì viết ra đấy.


Cấu trúc một chương trình
#include<tên chương tring.h > //Gọi đến hàm định nghĩa ban đầu cho chíp.
#int_ngắt
void ngat()
{
Chương trình ngắt.
}
Void chuongtrinhcon()
{
Chương trinh con
}
Void main()
{
Thân chương trình.
}

IV:Ôn lại một số linh kiện điện tử cơ bản,
-Tụ điệu, điện trở, tranzito
-Xem lại trong quấn điện tử cơ bản. đính kèm file.

11


Chương II:
HỌC PIC CƠ BẢN
CÁC DỰ ÁN CƠ ĐƠN GIẢN CHO
NGƯỜI MỚI BẮT ĐẦU

Bài 1:CƠ BẢN VỀ VDK PIC

1)Giới thiệu về VDK PIC.
- VDK PIC là một họ vi điều khiển có khả năng lập trình để xử lý tính toán
số liệu hay điều khiển các modul thết bị ngoại vi.
-Là một dòng VDK mạnh giải quyết được nhiều bài toán ,ứng dụng trong
thực tế.
- PIC hỗ trợ lập trình trên ngôn ngữ C
-PIC hỗ trợ nhiều modul phần cứng nhưng ADC, PWM, RS232, USB,
SPI, I2C ....
-PIC mình nghiên cứu ở trong tài liệu này là PIC 16F887.Gồm có 34 chân
in out dữ liệu, 14 chân ADC, 3 timer, 8k byte rom, 256 byte EEPROM , 368
byte RAM.
- Phần mềm lập trình CCS bản 4.104
12


-Phần mềm mô phỏng Proteus 7.8
-Phần mềm và mạch nạp PIC-kit 2.

2)Mạch đơn giản để PIC có thể chạy được.
Sơ đồ nguyên lý.

3)Một số lệnh cơ bản trong lập trình.
13


Tạo trể. +delay_ms(value); tạo trễ một khoảng thời gian ms.
+delay_us(value); tạo trễ một khoảng thời gian us.
+delay_cycles (count): tạo trễ theo chu kỳ lệnh.
Tất cả các lệnh của CCS các bạn có thể xem trong phần trợ giúp của phần
mềm .


Bài 2:XUẤT DỮ LIỆU
1)Các lệnh cơ bản xuất dữ liệu
-Lệnh

output_high(PIN_X?);

Lệnh này xuất dữ liệu mức 1 ra một chân của vi điều khiển.
VD: Ta xuất ra chân A1 của vi điều khiển mức 1bằng lệnh này.
Output_high(PIN_A1);

-Lệnh

output_low(PIN_X?);

Lệnh này xuất dữ liệu mức 0 ra một chân của vi điều khiển.
VD: Ta xuất ra chân B2 của vi điều khiển mức 1bằng lệnh này.
Output_low(PIN_B2);

-Lệnh

output_bit (pin, value);

Lệnh này xuất dữ liệu value ra một chân của vi điều khiển.dữ liệu ở đây có
giá trị là 0 hoặc 1, các số khác số 0 đều có giá trị bằng 1.
VD:Ta xuất ra chân C1 của vi điều khiển một mức nào đấy
+ Mức cao: output_bit(PIN_B0,1);
output_bit(PIN_B0,3);
output_bit(PIN_B0,0x05);
Những câu lệnh trên đều có tác dụng làm cho chân B0 lên mức cao.

+Mức thấp: output_bit(PIN_B0,0);
output_bit(PIN_B0,0x00);
14


Những câu lệnh trên đều có tác dụng làm cho chân B0 xuống mức thấp.

-Lệnh

output_X ( value);

Lệnh này xuất dữ liệu ra một cổng của VDK với giá trị là value.
VD: output_B(0x00) xuất ra cổng b tất cả các chân đều ở mức thấp(mức
0).
output_B(0xff) xuất ra cổng b tất cả các chân đều ở mức cao(mức 1).
output_B(0x0f) các chân B0->B3 mức cao.Các chân B4-B7 mức thấp.

2)Thực hành xuất dữ liệu trên PIC.
+ Lập trình nhấp nháy 1 bóng led -8 bóng led,hoặc 8 chữ cái gồm nhiều
led,relay on off thiết bị.

15


+Chương trình on off một re lay nối vào chân B1, thời gian đóng cắt 2
giây.
#include <On off.h>
void main(){
while(TRUE) {
output_high(PIN_B1);

delay_ms(2000);
output_low(PIN_B1);
delay_ms(2000);
}
}

3)Bài tập ôn tập.
Bài 1: Viết một chương trình nhấp nháy 8 led đơn với ít nhất 10 kiểu nháy
khác nhau.
Bài 2: Viết một chương trình nháy 16 led đơn với 5 hiệu ứng nháy, trong đó
có 1 kiểu chạy từ phải sang trái.
Bài 3 : Viết một chương trình nháy 8 led đơn từ phải sang trái (trên xuống
dưới) sử dụng vòng lặp for và phép dịch bit.
Bài 4 : Thiết kế một biển led quảng cáo nháy chữ “DAM ME CONG
NGHE”, Mỗi chữ cái gồm 50 led đơn nói song song với nhau.Lập trình với
trên 10 kiểu nháy đẹp mắt.
16


Thiết kế mạch nguyên lý chi tiết trên giấy khổ A4, mô phỏng trên phẩn
mềm Proteus và code lập trình.(Buổi tới đi học mang đi để kiểm tra và sửa
lỗi).

Bài 3:LED 7 THANH
1)Tìm hiểu về led 7 thanh
Khái niệm cơ bản
Led 7 thanh có cấu tạo bao gồm 7 led đơn có dạng thanh xếp theo Hình
1.1 dưới và có thêm một led đơn hình tròn nhỏ thể hiện dấu chấm tròn ở
góc dưới, bên phải của led 7 thanh. 8 led đơn trên led 7 đoạn có Aode(cực
+) hoặc Cathode(cực -) được nối chung với nhau vào một điểm, được đưa

chân ra ngoài để kết nối với mạch điện.
8 cực còn lại trên mỗi led đơn được đưa thành 8 chân riêng:
Nếu led 7 đoạn có Anode(cực +) chung, đầu chung này được nối với +Vcc,
các chân còn lại dùng để điều khiển trạng thái sáng tắt của các led đơn,
led chỉ sáng khi tín hiệu đặt vào các chân này ở mức 0.
Nếu led 7 đoạn có Cathode (cực -) chung, đầu chung này được nối xuống
Ground (hay Mass), các chân còn lại dùng để điều khiển trạng thái sáng tắt
của các led đơn, led chỉ sáng khi tín hiệu đặt vào các chân này ở mức 1.

Hình 1.1
Bảng giá trị tín hiệu.
17


-Chung A
=>
-Chung K
=>

2)Thực hành hiển thị led 7 thanh.
a. Led 7 thanh đơn.
Ví dụ:sơ đồ mô phỏng như sau

Chương trình hiển thị số 1 lên led 7 thanh.
While (true){
Output_D(0xF9);
}
-Ta chỉ cần đưa dữ liệu đã tính ở trên của số muốn hiển thị ra cổng dữ liệu
nối với các chân dữ liệu của led 7.
b.Led 7 thanh kép và phương pháp quét led.

-Hiệu ứng lưu ảnh của mắt: hiểu đơn giản như thế này, có 1 bóng led tắt
rồi bật, lúc đầu cứ 1s sáng thì lại tắt 1s nghĩa là chu kỳ 2 s, rồi giảm chu kỳ
ấy xuống 1s ta vẫn thấy bóng led đấy nháy, khi ta giảm chu kỳ xuống 1ms
thì lúc đó mắt ta nhìn thấy gì? Trả lời được câu hỏi thì bạn cũng đã hiểu về
hiệu ứng lưu ảnh của mắt.
18


- Phương pháp quét led: Ta có mạch nguyên lý như dưới đây.
Gồm 2 led loại chung A được mắc chung chân dữ liệu.

bây giờ bạn hãy thử đoạn chương trình sau,và thay đổi tham số chuky nhỏ
dần từ 1s đến nhỏ hơn 1/24/a s xem nhé.(a là số led 7 thanh)
While(TRUE)
{
#define chuky 2000
output_E(0x00);
output_D(0x99);
output_E(0x01);
delay_ms(chuky);
output_E(0x00);
output_D(0x99);
output_E(0x02);
delay_ms(chuky);
}
Hãy nêu hiện tượng và kết luận ,phương pháp quét led là như nào.

19



c.Hiển thị một số có 2 chữ số trên led
VD: Hiển thị biến a có 2 chữ số ,
Int8 led7[10]= {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}
While(TRUE)
{
#define nhietdo 29
output_E(0x00);
output_D(led7[nhietdo/10]);
output_E(0x01);
delay_ms(1);
output_E(0x00);
output_D(led7[nhietdo%10]);
output_E(0x02);
delay_ms(1);
}
Bài tập:
Bài 1) Lập trình hiển thị led 7 thanh chạy từ 0->9 chu kỳ 500ms.
Bài 2) Lập trình hiển thị led 7 thanh chạy từ 000->150 chu ky 200ms.
Bài 3) Lập trình hiển thị led 7 thanh chạy từ 0->50 rồi nhảy lên 60->100.
Bài 4) Có 7 biến giờ phút giây thư ngày tháng năm được lưu trong các biến
hour,min,sec,day,date,month,year. Hãy mô phỏng trên proteus và viết
chương trình hiển thị các biến trên bằng phương pháp quét led, triển khai
sơ đồ nguyên lý chi tiết ,cụ thể trên giấy A4.Buổi sau đi học mang bài đến
nộp.

Bài 4:ĐỌC DỮ LIỆU-INPUT
1)Các lệnh cơ bản đọc vào dữ liệu.
a=input(PIN_X); //đọc giá trị logic ở một chân của vdk
VD:
a=input(PIN_A1) ;

20


Nếu chân A1 ở mức cao thì biến a mang giá trị là 1 còn chân A1 ở mức
thấp thì biến a mang giá trị là 0.
b=input_X();
VD:
b=input_B();
Trạng thái của cổng B sẽ được lưu vào biến b, nếu cổng B đang ở trạng
thái 0x2f thì sau câu lệnh trên biến b cũng mang giá trị là 0x2f.

2)Thực hành đọc dữ liệu vào vdk và xử lý.
a) Nút nhấn.
Sơ đồ mô phỏng dưới đây.

-Viết chương trình khi nhấn nút trên thì động cơ quay và nhấn nút dưới thì
động cơ ngừng quay, tức là đưa ra chân D0 mức cao sẽ làm mở Tip41
đóng re lay relay tác động thì tiếp điểm thường mở sẽ thành thường đóng,
mạch kín động cơ quay, và ngược lại
-Code
#include <nut nhan.h>
#define Relay_on output_high(PIN_D0)
#define Relay_off output_low(PIN_D0)
void main()
{
while(TRUE)
{
if(input(PIN_C0)) Relay_on;
21



if(input(PIN_C1)) Relay_off;
}
}
b. đọc dữ liệu từ 1 cổng vào.
-Sơ đồ nguyên lý.

-Lập trình đọc dữ liệu vào từ cổng C và xuất ra led cổng D.
#include <nut nhan.h>
int a;
void main()
{
while(TRUE)
{ a=input_C();
output_D(a);
}
}
c.Đọc molul thu phát RF.
-Giới thiệu về modul thu phát RF.
-Modul thu và sơ đồ chân.

22


Có 2 loại modul thu RF là loại giữ mức và loại không giữ mức.
-Modul phát 4 kênh và hình ảnh thực tế

-Kết nối bộ RF 4 kênh vào 4 chân input của vi điều khiển ta lập trình đọc
dữ liệu tương tự như nút nhấn.
-Bộ RF ở trong bài học này là loại giữ mức nên ta sẽ dùng để điều khiển 4

relay đóng cắt cho 4 thiết bị điện trong nhà.
d.Cảm biến chuyển động.
-Hình ảnh cảm biến.

23


Sơ đồ chân.

Cách sử dụng rất đơn giản: Khi có người trong vùng cảm biến có thể phát
hiện ra được thì chân Out của cảm biến sẽ out ra mức cao nhưng ở dạng
xung , ta đưa vào một chân VDk để đọc tín hiệu đó vào và xử lý bật và tắt
một relay để đóng mở một thiết bị nào đấy.
Code ví dụ.
While(true){
Int a;
If(input(PIN_B0)) a=100;
a-- ; if(a<9) a=9;
if(a>=10) output_high(PIN_D0);
else output_low(PIN_D0);
delay_ms(100); }

3)Bài tập:
1) Lập trình và mô phỏng 8 nút nhấn nối với cổng B khi nhấn nút nào
thì led 7 thanh đơn nối với cổng D sáng số đấy. VD nhấn nút nhấn
nối vào cổng B0 thì led 7 thanh hiển thị số 0.(Mức tích cực mức thấp)
24


2) Lập trình và mô phỏng chương trình một nút nhấn nối vào cổng B0

nếu nút nhấn thì giá trị trên led 7 thanh tăng lên 1 sử dụng 2 led 7
thanh hiển thị bằng phương pháp quét led.
3) Đọc dữ liệu 1 cổng từ Dipswhich và hiển thị giá trị 8 bit của cổng đó
lên led 7 thanh. VD: giá trị cổng B=0x12=18 thì led 7 thanh phải hiển
thị số 018.
4) Lập trình và mô phỏng nhận dữ liệu từ 4 đầu vào nếu ở mức cao thì
bật một relay nối ở bất kỳ 1 cổng nào đấy.còn mức thấp thì tắt relay
tương ứng.
5) Lập trình đầu vào dữ liệu cho 4 nút nhấn, cứ mỗi lần nhấn thì thay
đổi mức logic cho một chân ra của vdk để đóng cắt một relay.
6) BÀI TẬP TỔNG HỢP.
-Thiết kế một dự án điều khiển 4 thiết bị điện từ xa bằng modul RF 4
kênh (modul không giữ mức) .3 kênh A B C điều khiển 3 thiết bị
điện,nhấn một lần mở, nhấn thêm lần nữa tắt. Còn kênh D để mở
một bóng điện kết hợp với cảm biến chuyển động, khi mở bóng mà
người còn trong phòng thì bóng sáng, người ra khỏi phỏng một thời
gian thì bóng tắt.
(Bao gồm code lập trình, mô phỏng và mạch nguyên lý chi tiết)

Bài 5:CHUYỂN ĐỔI ADC
1)ADC là gì.
-Chuyển đổi ADC chính là chuyển đồi từ một tín hiệu dạng tương tự sang
một tín hiệu số .
-Trong VDK có các bộ chuyển đổi ADC với độ phân giải khác nhau 8bit
(256 bước lượng tử) 10bit(2^10 bước lượng tử) và 12bit(2^12 bước lượng
tử), độ phân giải càng lớn thì độ chính xác càng cao.
-VD ta có một tín hiệu điện áp thay đổi trong dải từ 0V-5V ta chọn điện áp
so sánh là 0-5V ,và độ phân giải ADC là 8 bit , tại một thời điểm điện áp là
2,5V thì tín hiệu tương tự này sau khi chuyển đổi có giá trị là 127.


2)Cách cấu hình và sử dụng ADC trong PIC.
-PIC 16f887 hỗ trợ 2 độ phân giải chuyển đổi ADC là 8 bit và 10 bit. Sau
đây là một chương trình đơn giản về chuyển đổi ADC và hiển thị giá trị
ADC chuyển đổi được lên LED 7 thanh.
25


×