Để vi điều khiển PIC16F887 giao tiếp được với LCD đòi hỏi trong 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.
− Bước 4: Tối thiểu cần phải khai báo 2 dòng lệnh sau (tô đen) trong chương trình khi có liên quan tới file LCD:
#include<htc.h> __CONFIG(…….);
#include “lcd.h” //khai báo thư viện hàm lcd.h
void main() {
lcd_init(); //lệnh khởi tạo lcd
//Các lệnh được sử dụng cho lcd có thể tham khảo trong file lcd.c ví dụ:
lcd_gotoxy(x,y); //Lệnh này dùng để di chuyển con trỏ đi đến các
vị trí trên màn hình lcd, trong đó y là giá trị của hàng dọc (y=[0,1]), x là giá trị của hàng ngang(x=[0,15]).
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í
52
while(1) {
} }
* Ngoài ra còn có thể sử dụng hàm printf nhưng cần khai báo như sau: #include<htc.h>
#include<stdio.h> //khai báo thư viện cho hàm printf __CONFIG(…….);
#include “lcd.h” //khai báo thư viện hàm lcd.h
void main()
{
lcd_init(); //lệnh khởi tạo lcd
while(1); }
void putch(char ki_tu) 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 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
{
lcd_putc(ki_tu); }
Chú ý: Khi viết chương trình có liên quan LCD mà phần cứng thực tế không có LCD hay LCD kết nối không đúng với thư viện LCD.H thì con trỏ chương trình sẽ dừng ngay lệnh lcd_init();
3.3. BÀI TẬP THỰC HÀNH
Bài 1: Viết chương trình đọc ADC 8 bit ở chân AN3 và thực hiện theo yêu cầu sau:
Hiển thị giá trị thanh ghi ANSEL ở hàng (0,0) của LCD. Hiển thị giá trị điện áp chân AN3 ở 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_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& MCLREN& BORDIS& LVPDIS);
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=…….; // dữ liệu canh trái ADCS0=ADCS1=…….; //Tần số chuyển đổi
ADON=…….; //Enable module ADC hoạt động
while(1)
{
GODONE=…….;//Cho phép ADC bắt đầu chuyển đổi
while(GODONE) …….//Chờ bộ ADC chuyển đổi xong
lcd_gotoxy(0,0); printf("\fADRESH:%d",ADRESH); lcd_gotoxy(0,1); printf("Dien ap:%3.2f",ADRESH*5.0/255.0); _delay(100000); } }
void putch(char c) //Hỗ trợ cho hàm printf in ra LCD
{
lcd_putc(c); }
* Bước 3: Biên dịch chương trình, nạp xuống kít thí nghiệm, jum header
3 ở vị trí POT, dùng vít vặn biến trở và quan sát kết quả trên LCD.
* Bước 4: Thiết lập công thức quan hệ giữa điện áp và giá trị thanh ghi
……… ……… ……… ……… ……… ………
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 & MCLREN& BORDIS& LVPDIS);
#include "lcd.h" void main()
unsigned char old_ADRESH;
lcd_init();
//Enable analog ở chân RA3 và chân RB0
ANS3= …….;ANS12= …….;
//Khởi tạo RA3,RB0 là ngõ vào
TRISA3= …….;RA3= …….;TRISB0=1;RB0=1;
VCFG0=VCFG1= …….;//Chọn điện áp tham chiếu trong
ADFM= …….; //Định dạng kết quả bên phải (ADC 10 bit)
ADCS0=ADCS1=0; //Tần số chuyển đổi
ADON= …….; //Enable module ADC
while(1) { //Chọn kênh AN3 CHS3=CHS2= …….;CHS1=CHS0= …….; GODONE= …….; while(GODONE); lcd_gotoxy(0,0); printf("\fAN3 la:%d",ADRESH*256+ADRESL); _delay(100000);
//chon kenh AN12
CHS3=CHS2= …….;CHS1=CHS0= …….; GODONE= …….; while(GODONE); lcd_gotoxy(0,1); printf("AN12 la:%d",ADRESH*256+ADRESL); _delay(100000); } } void putch(char c) {
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. (Chú ý chỉ dựa vào thông số điện trở trên mạch nguyên lý chứng minh, không được sử dụng các thông số đọc được trên lcd).
……… ……… ……… ……… ……… ……… ……… ……… ………
* Bước 4: Quan sát kết quả ở hàng (0,1) của lcd, tức là kết quả đo được ở
kênh AN12 khi có nhấn nút RB0 và khi không có nhấn nút và nhận xét ……… ……… ……… ……… ……… ……… ……… ……… ……… ………
3.4. BÀI TẬP TỰ GIẢI
Bài 3: Viết chương trình sử dụng khối ADC của vi điều khiển PIC16F887 đo nhiệt độ của 5 phòng và hiển thị lên LCD, sử dụng LM35 theo yêu cầu sau: (Tạo một project mới với tên 02_03_ MSSV)
Khi nhấn (không giữ) RB0 thì LCD hiển thị giá trị giá trị nhiệt độ của phòng 1.
Khi nhấn (không giữ) RB1thì LCD hiển thị giá trị giá trị nhiệt độ của phòng 2.
Khi nhấn (không giữ) RB2 thì LCD hiển thị giá trị giá trị nhiệt độ của phòng 3.
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.
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
Chương IV TIMER
Sau khi học xong chương Timer sinh viên đạt được những kiến thức sau: a. Giải thích được nguyên tắc hoạt động của timer0, timer1, timer 2. b. Thiết lập công thức tính định thời của từng timer.
c. Liệt kê các bit điều khiển từng hoạt động của timer.
d. Phân biệt sự khác nhau và giống nhau giữa hai chế độ timer và counter trong timer 0, timer1.
e. Giải thích chức năng của bộ chia trong timer. f. Khởi tạo ngắt cho timer0, timer 1, timer 2.
4.1. DỤNG CỤ THÍ NGHIỆM Kít thí nghiệm + cáp USB. Máy tính. Nguồn 12V/1A. Oscilloscope 4.2. CƠ SỞ LÝ THUYẾT
Timer là khối hoạt động độc lập với CPU, do đó nếu trong lập trình chúng ta sử dụng timer thì sẽ làm giảm đi thời gian xử lý, giúp vi điều khiển hoạt động nhanh hơn. Ứng dụng chủ yếu của timer là định thời trong khoảng thời gian ngắn, đếm số lượng xung clock bên ngoài cho các ứng dụng như: đếm sản phẩm, đọc số xung encoder v.v... PIC16f887 có tích hợp 3 timer: timer 0(8-bit), timer 1(16-bit), timer 2(8-bit).