Giáo trình thí nghiệm vi điều khiển ứng dụng - Pdf 11

Giáo trình thí nghiệm vi điều khiển ứng dụng

1 BÀI 1 : XUẤT NHẬP I/O PORT:

I.MỤC ĐÍCH THÍ NGHIỆM :
Kiến thức sinh viên cần đạt được sau khi thực tập:
 Liệt kê các thanh ghi liên quan đến việc xử lý tính hiệu số ở các chân vi điều khiển .
 Khởi tạo các chân của vi điều khiển là ngõ ra , vào số .
 Giải thích được công dụng của hàm _delay(n) , cách dùng hàm delay để chống dội cho
nút nhấn.
 Lập trình điều khiển led theo yêu cầu .
 Giải thích ưu khuyết điểm của ngắt .

II.DỤNG CỤ THÍ NGHIỆM :
 Kít thí nghiệm + cáp USB.
 Máy tính .
 Nguồn 12V/1A.

III.CƠ SỞ LÝ THUYẾT :
1.Thanh ghi qui định tín hiệu xử lý ở chân vi điều khiển là tín hiệu số hay tín hiệu tương
tự:
Những chân có kí hiệu ANX là những chân vừa có thể xử lý tín hiệu số vừa có thể xử lý tín
hiệu tương tự . Do đó khi làm việc với những chân này ta cần chú ý đến hai thanh ghi :
H
) , hay ngõ ra là mức thấp (điện áp là V
L
) sẽ do bit RXY của thanh ghi PORTX quy
định .
 RXY=0 : Quy định chân thứ Y của PORTX là mức thấp(V
L
).
 RXY=1: Quy định chân thứ Y của PORTX là mức cao(V
H
).
(Trong đó : X=A,B,C,D,E ; Y=0-7)

Giáo trình thí nghiệm vi điều khiển ứng dụng

3

 Tóm lại ta có bảng tóm tắt sau :
ANSX
TRISXY
RXY
Kết quả
0
0

 WPUBy=1: Cho phép điện trở kéo lên ở chân thứ y của PORTB.
 Khi sử dụng điện trở kéo lên ngoài việc sử dụng thanh ghi WPUB còn phải khởi tạo bit:
RBPU









 Điện trở kéo lên nên khởi tạo khi PORTB là ngõ vào số , các PORT khác không có hỗ
trợ điện trở treo trong , do đó nếu có nhu cầu sử dụng ta có thể mắc thêm điện trở bên
ngoài.

4.2.Ngắt ngoài ở chân RB0:
Để xử lý được các tín hiệu tác động tức thời , chân RB0 có hỗ trợ xử lý ngắt (interrupt ) kí
hiệu ở chân là INT, khởi tạo ngắt ngoài ở chân RB0 ta cần chú ý đến các bit sau :
 INTE(Interrupt enable ) : bit cho phép ngắt ở PORTB
Giáo trình thí nghiệm vi điều khiển ứng dụng

4

 INTF(Interrupt flag): cờ ngắt , bit này tự động bằng 1 khi có sự kiện ngắt (cạnh lên hay
cạnh xuống) xảy ra ở chân RB0, ta phải xóa bít này trong khi lập trình .
 GIE(Global interrupt ) : bit cho phép ngắt toàn cục.
 INTEDG (interrupt edge select bit ) : Bit chọn cạnh tác động để sinh ra sự kiện ngắt ở
PORTB.
INTEDG=1: Xảy ra ngắt khi có tín hiệu cạnh lên ở PORTB

 IOCBX=1 : Cho phép ngắt on-change ở chân thứ X của PORTB.

 Các bit khởi tạo khác :
 RBIF : Cờ ngắt on-change ở PORTB, cần phải xóa bít này trong lập trình.
 RBIE : Bit cho phép ngắt on-change của PORTB.
 GIE : Bit cho phép ngắt toàn cục.

 Các bước khởi tạo ngắt on-change :
 Bước 1 : Khởi tạo PORTB là ngõ vào số , có điện trở treo.
 Bước 2 : Khởi tạo ngắt on-change ở PORTB
IOCB=0xFF; //khởi tạo toàn bộ PORTB ngắt on-change(có thể khởi tạo
một hay cả PORTB).
RBIE=1; //Cho phép ngắt xảy ra .
RBIF=0; //Xóa cờ ngắt
GIE=1; //Cho phép ngắt toàn cục
 Chú ý : Đối với ngắt on-change , việc xóa cờ ngắt (RBIF=0) không đủ để cho lần ngắt
tiếp theo được thực hiện , mà còn phải thêm điều kiện đọc hoặc viết vào thanh ghi PORTB.
Ví dụ :
unsigned char bien ;
bien = PORTB ; //đọc thanh ghi PORTB.
hoặc PORTB =5 ; //viết vào thanh ghi PORTB

4.4.Bảng so sánh giữa ngắt INT và ngắt on-change :

Ngắt ở chân INT(RB0)
Ngắt on-change
Chí có duy nhất ở chân RB0
Xảy ra trên cả PORTB
Để xảy ra ngắt thì tín hiệu logic là cạnh lên
hoặc cạnh xuống.

*Bước 1: Tạo một project mới với tên 01_01_MSSV .
*Bước 2: Nhập chương trình sau vào máy tính và hoàn thành các dấu …….
#include<htc.h>
__CONFIG(INTIO&WDTDIS&PWRTEN&MCLREN&UNPROTECT&DUNPROTECT&BO
RDIS&IESODIS&LVPDIS&FCMDIS);
void delay(unsigned char counter); //Khai báo chương trình con hàm delay
void RB_0( );void RB_1( );void RB_2( );
char so_lan_nhan;
void main( ) //Chương trình chính
{
//Disable analog ở các chân RE1,RE2,RB0,RB1,RB2
ANS6=ANS7=ANS12=ANS10=ANS8= …….;
//Khởi tạo các chân RE1,RE2 là ngõ ra , ban đầu led tắt
TRISE1=TRISE2= …….; RE1=RE2= ……. ;
//Khởi tạo chân RB0,RB1,RB2 là ngõ vào, tác động mức thấp
TRISB0=TRISB1=TRISB2= …….; RB0=RB1=RB2= …….;
//Khởi tạo điện trở kéo lên ở các chân RB0,RB1,RB2
WPUB0=WPUB1=WPUB2= …….; RBPU= ……. ;

Giáo trình thí nghiệm vi điều khiển ứng dụng

7

//( 1 )
while(1)
{
//Xác định trạng thái các nút nhấn
if(!RB0)so_lan_nhan=0; //( 2 )
else if(!RB1)so_lan_nhan=1; //( 3 )
else if(!RB2)so_lan_nhan=2; //( 4 )

RE1= …….;RE2= …….; // led RE1 sáng và led RE2 tắt
delay(1); //delay 0.1s
RE1= …….;RE2= …….; // led RE1 tat và LED2 sáng
delay(7); //delay 0.7s
}
*Bước 3: Biên dịch chương trình, nạp xuống kít thí nghiệm , tiến hành nhấn các nút nhấn và
quan sát 2 led.
*Bước 4: Thay đổi chương trình như sau:
 Thêm vào dòng : ( 1 ) đoạn code sau:
Giáo trình thí nghiệm vi điều khiển ứng dụng

8

IOCB0=IOCB1=IOCB2=1; //Cho phép ngắt onchange ở chân B0,B1,B2
RBIE=1; //Cho phép ngắt onchange toàn PORTB
RBIF=0; //Reset cờ ngắt
PEIE=1; //Cho phép ngắt ngoại vi
GIE=1; //Cho phép ngắt toàn cục
 Xóa các dòng 2,3,4.
 Thêm vào dòng: ( 5 ) đoạn code sau:
void interrupt isr( ) //Chương trình con xử lý tất cả ngắt
{
if(RBIE&&RBIF) //Chương trình con cho ngắt on-change
{
if(!RB0) so_lan_nhan=0; //nhấn RB0
else if(!RB1) so_lan_nhan=1; //nhấn RB1
else if(!RB2) so_lan_nhan=2; //nhấn RB2
RBIF=0; //Reset cờ ngắt
}
}


9

Bài 2 : Viết chương trình điều khiển led theo yêu cầu sau :
 Nhấn (không giữ) nút nhấn nối với chân RB0 lần (2n+1) : 8 led dịch từ trái qua phải.
 Nhấn (không giữ) nút nhấn nối với chân RB0 lần (2n) : 8 led dịch từ phải qua trái.
n = 0,1,3,4,5…k
Sử dụng định thời bằng hàm _delay(n) ; thạch anh Fosc = 4 Mhz.
 Sơ đồ phần cứng :

*Bước 1: Tạo một project mới với tên 01_02_MSSV.
*Bước 2 : Nhập chương trình sau vào máy tính và hoàn thành vào dấu …….
#include<htc.h>
__CONFIG(INTIO&WDTDIS&PWRTEN&MCLREN&UNPROTECT&DUNPROTECT&BO
RDIS&IESODIS&LVPDIS&FCMDIS);
char count=0;
void display(char number);
void main( )
{
char i=0;
//Disable analog các chân RE1,RE2,RB0,RB3,RB4,RB5
ANS6=ANS7=ANS9=ANS11=ANS12=ANS13=…….;
//Khởi tạo RE1 , RE2 là ngõ ra , trạng thái ban đầu led tắt
TRISE1=TRISE2=…….; RE1=RE2=…….;
//Khởi tạo RB0 là ngõ vào , tác động mức thấp
TRISB0=…….; RB0=…….;
//Cho phép điện trở kéo lên ở chân RB0;

}

}
}

void interrupt isr( )
{
if(INTE&&INTF)
{
count++;
if(count…….3)count=1;
INTF=…….;
}
}
void display(char number) //Chương trình con hiển thị led khi nhận vào một số tương ứng
{
RE1=RE2=…….; //Tắt led RE1, RE2
TRISB |= 0b00111000;
RB3=RB4=RB5=…….; //Khởi tạo chân RB3 , RB4 , RB5 là tổng trở cao
switch(number)
{
case 1:
RE2=…….; //RE2 sáng
break;
case 2:
RE1=…….; //RE1 sáng
break;
case 3: //led D6 sáng
TRISB3=0;RB3=…….;TRISB4=…….;RB4=0;
Giáo trình thí nghiệm vi điều khiển ứng dụng V.BÀI TẬP TỰ GIẢI :
Bài 3.Viết chương trình đọc giá trị phím và hiển thị giá trị lên led 7 đoạn theo sơ đồ phần
cứng sau : (Tạo một project mới với tên 01_03_MSSV)
(Phím từ 0-9 , led hiển thị số tương ứng , phím „*‟ thể hiện chữ „S‟, phím „#‟ thể hiện chữ
„H‟, lúc không nhấn thể hiện chữ „U‟ ).

Giáo trình thí nghiệm vi điều khiển ứng dụng

12

Bài 4.Viết chương trình theo yêu cầu sau , 16 led kết nối với PORTD, PORTC (tác động
mức cao) , 8 nút nhấn kết nối với PORTB : (Tạo một project mới với tên 01_04_MSSV)
 Nhấn nút RB0 :16 led dịch từ phải qua trái.
 Nhấn nút RB1:16 led dịch từ trái qua phải.
 Nhấn nút RB2:16 led chớp tắt xen kẽ.
 Nhấn nút RB3:16 led sáng dần từ trái qua phải .
 Nhấn nút RB4 :16 led sáng dần từ phải qua trái.

BÀI 2 : ADC MODULE

I.MỤC ĐÍCH THÍ NGHIỆM :
Kiến thức sinh viên cần đạt được sau khi thực tập :
 Giải thích được khái niệm và chức năng của điện áp tham chiếu.
 Thiết lập được điện áp tham chiếu trong và ngoài cho khối ADC của vi điều khiển.
 Liệt kê được các bước thiết lập đo ADC cho một hoặc nhiều kênh.
 Thiết lập được công thức tính ADC 8-bit , và ADC 10-bit ở chế độ định dạng canh trái và
canh phải .
 Tín toán được giá trị tín hiệu tương tự thu được thông qua giá trị của thanh ghi ADRESL,
ADRESH.
 Thiết lập và khởi tạo được một project có liên quan LCD , thay đổi file LCD.h phù hợp
với cấu hình phần cứng bên ngoài .

II.DỤNG CỤ THÍ NGHIỆM:
 Kít thí nghiệm + cáp USB.
 Vít (vặn biến trở).
 Máy tính .
 Nguồn 12V/1A.

III.CƠ SỞ LÝ THUYẾT :
1.Tín hiệu tương tự và tính hiệu số :
Đồ thị của bộ chuyển đổi ADC 8-bit:

 Độ phân giải (Resolution) : Từ sơ đồ trên ta thấy bộ chuyển đổi ADC có độ phân giải 8-
bit thì sẽ có 255 giá trị dùng để chứa các giá trị điện áp từ V
REF-
đến V
REF+
, như vậy nếu bộ
chuyển đổi ADC có độ phân giải n bit thì sẽ có 2
n
-1 giá trị . Độ phân giải có liên quan mật thiết
đến chất lượng chuyển đổi ADC , độ phân giải càng cao thì kết quả chuyển đổi càng chính xác .
 Điện áp tham chiếu (Reference voltage) : điện áp tham chiếu là điện áp dùng để so sánh
với tín hiệu điện áp analog cần đo , V
REF+
nên chọn bằng với mức điện áp lớn nhất cần đo ,
không nên chọn nhỏ hơn hay lớn hơn .



ADON : Bit cho phép bộ ADC hoạt động
 ADON=1 : Cho phép bộ ADC hoạt động
 ADON=0 : Không cho phép hoạt động
GO/








: Bit chỉ trạng thái chuyển đổi , bit này tự động bằng 0 khi bộ ADC chuyển đổi xong,
muốn cho lần chuyển đổi tiếp theo được thực hiện , cần phải đặt bit này lên bằng 1 trong lập
trình .

Giáo trình thí nghiệm vi điều khiển ứng dụng

16


REF+
= V
DD
ADFM : bit dùng để lựa chọn kiểu định dạng kết quả chuyển đổi : Sau khi chuyển đổi hoàn tất , kết quả sẽ được lưu theo một trong hai kiểu
Giáo trình thí nghiệm vi điều khiển ứng dụng

17

Hai thanh ghi ADRESH và ADRESL là hai thanh ghi dùng để chứa kết quả khi bộ ADC
chuyển đổi hoàn tất , bộ ADC của vi điều khiển PIC16F887 có độ phân giải 10-bit do đó cần hai
byte để chứa kết quả , tuy nhiên kết quả có thể lưu theo hai kiểu : canh trái (ADFM=0) và canh
phải (ADFM=1).
 Đối với định dạng kết quả bên trái : ADFM=0 thì ta có thể đọc kết quả như sau :
Độ phân giải 10-bit : Kết quả = ADRESH*4+ADRESL >> 6 (1)
Độ phân giải 8-bit : Kết quả = ADRESH (2)
 Đối với định dạng kết quả bên phải : ADFM=1 thì ta có thể đọc kết quả như sau :
Độ phân giải 10-bit : Kết quả = ADRESH*256+ADRESL (3)
Độ phân giải 8-bit : Kết quả = ADRESH*64+ADRESL>>2 (4)
 Rõ ràng ta thấy biểu thức (1) và (4) gây khó khăn trong việc lập trình và thời gian cần tín
toán lâu hơn , do đó ta rút ra kết luận:
 Khi cần đọc ADC 8-bit thì cần định dạng kết quả bên trái(ADFM=0)
 Khi cần đọc ADC 10-bit thì cần định dạng kết quả bên phải(ADFM=1)

2.3 Ngắt ADC :
Khối ADC cũng có thể tạo ra sự kiện ngắt (ngắt trong) , sự kiện ngắt xảy ra khi bộ ADC
chuyển đổi hoàn tất .


 Bước 4:Chờ thời gian khởi tạo.
 Bước 5:Bắt đầu cho phép chuyển đổi . GODONE=1;
 Bước 6:Chờ cho bộ ADC chuyển đổi hoàn tất bằng các dấu hiệu sau :
 Bit GODONE tự động xuống 0 , ta có thể sử dụng code sau để thực hiện việc chờ:
while(GODONE) ;
 Ngắt ADC xảy ra.(Nếu bước 3 được thực hiện)
 Bước 7 : Đọc kết quả
 ADC 8-bit : kết quả = ADRESH //canh trái
 ADC 10-bit : kết quả = ADRESH*64+ADRESL //canh phải
 Bước 8:Xóa cờ ngắt cho lần chuyển đổi tiếp theo (Nếu bước 3 được thực hiện)
 ADIF=0;

3.Làm việc với LCD 16x2 :
Để vi điều khiển PIC16F887 giao tiếp được với LCD đòi hỏi trong code chương trình cần
phải có những dòng lệnh phù hợp lcd , thường những yêu cầu lệnh này được quy định bởi chip
xử lý bên trong lcd , do đó để chương trình ngắn gọn và đơn giản , ta thường xây dựng file lcd.c
và lcd.h là những file chứa sẵn những chương trình con có những câu lệnh giao tiếp với lcd , ta
chỉ cần khai báo hai file lcd.c và lcd.h thì có thể dễ dàng giao tiếp với lcd bằng những câu lệnh
bên trong file đó .Các bước khởi tạo và làm việc với LCD :
− Bước 1 : Kiểm tra phần cứng , phải phù hợp với những khai báo trong file LCD.h
− Bước 2 : Copy 2 file LCD.c và LCD.h vào thư mục của project đang lập trình .
− Bước 3 : Add hai file trên vào Header file và Source file . Giáo trình thí nghiệm vi điều khiển ứng dụng

19

lcd_putc(„kí tự cần in‟); //Lệnh này dùng để in kí tự lên màn hình lcd tại vị trí con
trỏ .
lcd_puts(“chuỗi cần in”); //Lệnh này dùng để in chuỗi lên màn hình lcd tại vị trí con
trỏ , chú ý chuỗi cần in nằm giữa hai dấu “ ” và kí tự cần in nằm giữa hai dấu
„ ‟ .
lcd_putc(„\f‟) ; //xóa màn hình lcd , sau đó con trỏ trở về vị trí (0,0). char bien2=6;
float bien1=19.66667 ;
unsigned int bien3=60000;
printf(“In ra man hinh ”); //Hiển thị chuỗi In ra man hinh
printf(“In ra \n man hinh ”); //Hiển thị chuỗi In ra
man hinh
printf(“In gia tri :%d ”, bien2); //Hiển thị chuỗi In gia tri :6
printf(“In gia tri :%3d ”, bien2); //Hiển thị chuỗi In gia tri : 6
printf(“In gia tri :%03d ”, bien2); //Hiển thị chuỗi In gia tri :006
printf(“In gia tri :%5.3d ”, bien2); //Hiển thị chuỗi In gia tri : 006

printf(“In gia tri :%f ”, bien1); //Hiển thị chuỗi In gia tri :19.6666
printf(“In gia tri :%3.2f ”, bien1); //Hiển thị chuỗi In gia tri : 19.67

printf(“In gia tri :%d ”, bien3); //Hiển thị chuỗi In gia tri :-5536
printf(“In gia tri :%ld ”, bien3); //Hiển thị chuỗi In gia tri :60000
Giáo trình thí nghiệm vi điều khiển ứng dụng

20 while(1);

printf(“In gia tri :%5.3d ”, bien2); //Hiển thị chuỗi In gia tri : 006

printf(“In gia tri :%f ”, bien1); //Hiển thị chuỗi In gia tri :19.6666
printf(“In gia tri :%3.2f ”, bien1); //Hiển thị chuỗi In gia tri : 19.67

printf(“In gia tri :%d ”, bien3); //Hiển thị chuỗi In gia tri :-5536
printf(“In gia tri :%ld ”, bien3); //Hiển thị chuỗi In gia tri :60000 Giáo trình thí nghiệm vi điều khiển ứng dụng

21

*Bước 1 : Tạo một project mới với tên 02_01_ MSSV
*Bước 2: Nhập chương trình sau vào máy tính và hoàn thành vào dấu …….
#include<htc.h>
#include<stdio.h> //thư viện cho hàm printf( );
__CONFIG(INTIO&WDTDIS&PWRTEN&MCLREN&UNPROTECT&DUNPROTECT&BO
RDIS&IESODIS&LVPDIS&FCMDIS);
#include"lcd.h";
void main( )
{
lcd_init( ); //Khởi tạo LCD
ANS3=…….; //Enable analog ở chân RA3
TRISA3=…….;RA3=…….; //Khởi tạo RA3 là ngõ vào
VCFG0=VCFG1=…….; //Chọn điện áp tham chiếu trong
CHS3=CHS2=…….;CHS1=CHS0=…….; //Chọn kênh đo là AN3
ADFM=…….; //Định dạng dữ liệu canh trái , bởi vì chỉ sử dụng ADC 8 bit
ADCS0=ADCS1=…….; //Tần số chuyển đổi
ADON=…….; //Enable module ADC hoạt động


22

Bài 2: Viết chương trình đọc ADC 10 bit ở hai kênh AN3 , AN12 và thực hiện theo yêu cầu
sau :
 Hiển thị giá trị điện áp tại chân AN3 ở hàng (0,0) của LCD.
 Hiển thị giá trị điện áp tại chân AN12 ở hàng (0,1) của LCD.
Định thời bằng hàm delay , điện áp tham chiếu trong , Fosc = 4Mhz, giao tiếp LCD
bằng thư viện LCD.h

 Sơ đồ phần cứng : *Bước 1 : Tạo một project mới với tên 02_02_ MSSV
*Bước 2: Nhập chương trình sau vào máy tính và hoàn thành vào dấu …….
#include<htc.h>
#include<stdio.h>
__CONFIG(INTIO&WDTDIS&PWRTEN&MCLREN&UNPROTECT&DUNPROTECT&BO
RDIS&IESODIS&LVPDIS&FCMDIS);
#include "lcd.h"
void main( )
{
unsigned char old_ADRESH;
lcd_init( );

{
lcd_putc(c);
}
*Bước 3 : Jum header 3 ở vị trí BUTTON
 Nhấn giữ nút nhấn SW2 và quan sát kết quả trên LCD ở vị trí (0,0) tức là kết quả đo kênh
AN3.
 Nhấn giữ nút nhấn SW3và quan sát kết quả trên LCD ở vị trí (0,0) tức là kết quả đo kênh
AN3.
 Nhấn giữ cả hai nút SW2,SW3 và quan sát kết quả trên LCD ở vị trí (0,0) tức là kết quả
đo kênh AN3.
Dựa vào mạch điện nguyên lý, chứng minh cả 3 kết quả quan sát được .


 Khi nhấn (không giữ )RB3 thì LCD hiển thị giá trị giá trị nhiệt độ của phòng 4.
 Khi nhấn (không giữ )RB4 thì LCD hiển thị giá trị giá trị nhiệt độ của phòng 5.

Tần số hoạt động Fosc = 4MHz , phần cứng LCD được kết nối với PORTD của Vi Điều khiển
theo sơ đồ chân của thư viện lcd.h , điện áp tham chiếu bên trong , sử dụng ADC 8 bit .

Giáo trình thí nghiệm vi điều khiển ứng dụng

25 Bài 4:Viết chương trình đọc giá trị điện áp ở chân AN0 và hiển thị lên LCD 16x2 theo yêu
cầu sau : (Tạo một project mới với tên 02_04_ MSSV)
Hiển thị giá trị hai thanh ghi ADRESH và ADRESL ở vị trí (0,0) của LCD.
Hiển thị giá trị điện áp đo được ở vị trí (0,1) của LCD .
Tần số hoạt động Fosc = 4MHz , phần cứng LCD được kết nối với PORTD của Vi Điều
khiển theo sơ đồ chân của thư viện lcd.h , điện áp tham chiếu bên ngoài , sử dụng ADC 10 bit .

Bài 5 : Viết chương trình dùng vi điều khiển PIC16F887 thực hiện chức năng như một
máy tính theo sơ đồ phần cứng sau : (Tạo một project mới với tên 02_05_ MSSV)


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status