You are on page 1of 7

Mô -đun cảm biến sốc giao tiếp với vi điều khiển PIC

Mô-đun cảm biến sốc là thiết bị phát hiện khả năng tăng tốc hoặc sốc đột ngột. Nó thường bao gồm một
cảm biến phản ứng với những thay đổi về gia tốc và nó tạo ra tín hiệu đầu ra khi sốc hoặc rung vượt quá
một ngưỡng nhất định. Các mô-đun này thường được sử dụng trong các hệ thống an ninh, phát hiện tác
động và các ứng dụng khác trong đó việc phát hiện các chuyển động đột ngột là rất quan trọng.

Việc kết nối mô-đun cảm biến sốc với bộ vi điều khiển PIC bao gồm việc kết nối cảm biến với bộ vi điều
khiển và lập trình cho bộ vi điều khiển để phản hồi đầu ra của cảm biến.

PIC16F877A là một loại vi điều khiển (microcontroller) thuộc họ sản phẩm PIC
(Peripheral Interface Controller) của hãng Microchip Technology. Đây là một vi
điều khiển 8-bit mạnh mẽ và phổ biến được sử dụng trong nhiều ứng dụng
nhúng.
Các đặc điểm chính của PIC16F877A bao gồm:
 Kiến trúc 8-bit RISC (Reduced Instruction Set Computing).
 Bộ nhớ chương trình (Program Memory): 8KB Flash.
 Bộ nhớ dữ liệu (Data Memory): 368 bytes RAM.
 Số lượng chân I/O: 33 chân.
 Số lượng ngắt (interrupt): 14 ngắt.
 Số lượng Timer/Counter: 3 bộ Timer/Counter 8-bit.
 Số lượng bộ PWM: 2 bộ PWM 10-bit.
 Số lượng kênh ADC: 8 kênh ADC 10-bit.
 Giao tiếp: USART, SPI, I2C.
PIC16F877A hỗ trợ một loạt các tính năng như giao tiếp, đa nhiệm, điều khiển
năng lượng, và nhiều tính năng bảo mật. Nó được sử dụng rộng rãi trong các
ứng dụng như hệ thống điều khiển, thiết bị y tế, điều khiển công nghiệp, hệ
thống đo lường, điện tử tiêu thụ, và nhiều ứng dụng khác.
PIC16F877A sử dụng ngôn ngữ lập trình C hoặc ngôn ngữ lập trình hợp ngữ
(assembly) để phát triển ứng dụng. Có nhiều công cụ phát triển phổ biến như
MPLAB X IDE và CCS C Compiler được sử dụng để lập trình và nạp chương
trình vào vi điều khiển PIC16F877A.
Lưu ý rằng mô hình PIC16F877A có thể có một số phiên bản khác nhau với các
tính năng và bộ nhớ khác nhau, do đó, cần xác định chính xác phiên bản cụ
thể của PIC16F877A mà bạn đang sử dụng để có được thông tin chi tiết hơn.
LM016L là một màn hình LCD (Liquid Crystal Display) ký tự 16x2 được sử dụng
phổ biến trong các ứng dụng nhúng. Đây là một màn hình hiển thị đơn giản
nhưng mạnh mẽ, thường được sử dụng để hiển thị các thông điệp hoặc dữ
liệu văn bản trong các thiết bị điện tử như máy tính, thiết bị đo lường, hệ
thống điều khiển, và các ứng dụng khác.
Các đặc điểm chính của màn hình LM016L bao gồm:
 Kích thước: 16x2 ký tự, tức là có khả năng hiển thị 16 ký tự trên hàng
đầu và 16 ký tự trên hàng thứ hai.
 Giao diện: Màn hình LM016L sử dụng giao diện song song 4-bit hoặc 8-
bit để giao tiếp với vi điều khiển hoặc vi mạch điều khiển khác.
 Ngôn ngữ hiển thị: Màn hình hỗ trợ các ký tự chữ cái, chữ số và một số
ký tự đặc biệt.
 Điện áp hoạt động: Màn hình LM016L thường hoạt động ở mức điện áp
5V.
Để sử dụng màn hình LM016L, bạn cần kết nối các chân điều khiển và dữ liệu
của màn hình với vi điều khiển hoặc vi mạch điều khiển khác thông qua các
chânđiều khiển như RS (Register Select), RW (Read/Write), E (Enable), và các
chân dữ liệu DB0-DB7. Bạn cũng cần cung cấp nguồn điện và các thành phần
điện tử khác như điện trở và tụ điện để điều chỉnh độ sáng và độ tương phản
của màn hình.
Để hiển thị dữ liệu lên màn hình, bạn cần sử dụng các lệnh điều khiển màn
hình LCD thông qua giao diện của nó. Các lệnh này bao gồm việc thiết lập vị
trí con trỏ, ghi dữ liệu văn bản, xoá màn hình, tắt/bật con trỏ và các tùy chọn
khác.
Để lập trình với màn hình LM016L, bạn có thể sử dụng các ngôn ngữ lập trình
như C hoặc hợp ngữ (assembly). Có sẵn các thư viện phổ biến và ví dụ mã
nguồn để thực hiện các chức năng cơ bản của màn hình LCD như hiển thị
dòng chữ, ghi dữ liệu và điều khiển con trỏ.
Lưu ý rằng mô-đun LM016L có thể có một số phiên bản khác nhau với các
tính năng và giao diện khác nhau, do đó, cần xác định chính xác phiên bản cụ
thể của LM016L mà bạn đang sử dụng để có được thông tin chi tiết hơn và
tương thích với vi điều khiển hoặc vi mạch điều khiển của bạn.

Hoạt động đăng ký PIC16F877A


Các thanh ghi sau đây được sử dụng:
TRISA: Thanh ghi này xác định chức năng của các chân cổng B. Trong trường
hợp này, các chân B0, B1 và B2 được sử dụng để điều khiển màn hình LCD.
PORTB: Thanh ghi này chứa giá trị của các chân của cổng B
CCP1CON: Thanh ghi này xác định chế độ hoạt động của bộ định thời 1.
Trong trường hợp này, bộ định thời 1 được sử dụng để tạo xung đồng bộ hóa
cho màn hình LCD.

* Mô-đun cảm biến sốc


Cảm biến sốc là một thiết bị được thiết kế để phát hiện và phản ứng với
những rung động hoặc chấn động mạnh, đột ngột.
Chức năng chính của cảm biến sốc là kích hoạt hệ thống báo động hoặc cảnh
báo khi nó cảm nhận được một tác động hoặc lực đáng kể.

PIC16F877
PIC16F877 là bộ vi điều khiển phổ biến thuộc dòng PIC (Bộ điều khiển giao
diện ngoại vi) do Microchip Technology sản xuất. Bộ vi điều khiển này được sử
dụng rộng rãi trong các hệ thống và ứng dụng nhúng khác nhau do tính
năng, tính linh hoạt và dễ sử dụng của nó.
Chia làm 3 loại ký ức:
Bộ nhớ chương trình – Bộ nhớ chứa chương trình (mà chúng ta đã viết), sau
khi chúng ta ghi nó. Xin nhắc lại, Bộ đếm chương trình thực thi lần lượt các
lệnh được lưu trong bộ nhớ chương trình.
Bộ nhớ dữ liệu - Đây là loại bộ nhớ RAM, chứa các thanh ghi đặc biệt như SFR
(Thanh ghi chức năng đặc biệt) và GPR (Thanh ghi mục đích chung). Các biến
mà chúng tôi lưu trữ trong Bộ nhớ dữ liệu trong chương trình sẽ bị xóa sau
khi chúng tôi tắt micro. Hai bộ nhớ này có các bus dữ liệu riêng biệt, giúp việc
truy cập vào từng bộ nhớ trở nên rất dễ dàng.
Dữ liệu EEPROM (Bộ nhớ chỉ đọc có thể lập trình có thể xóa bằng điện) – Bộ
nhớ cho phép lưu trữ các biến do đốt chương trình đã viết.

Màn hình LCD hay còn gọi là Màn hình tinh thể lỏng, đóng vai trò là giao diện
đầu ra hình ảnh trong các thiết bị điện tử khác nhau. Chức năng chính của nó
là hiển thị thông tin cho người dùng
LCD thường được sử dụng trong nhiều ứng dụng, từ điện tử tiêu dùng đến
thiết bị công nghiệp.
Đây là một đoạn mã trong ngôn ngữ lập trình C cho vi điều khiển PIC16F877A
với mục đích sử dụng một cảm biến PIR (Passive Infrared) để phát hiện chuyển
động và hiển thị thông báo trên một màn hình LCD.

Dưới đây là giải thích từng phần code:

#include <16F877.h> main.h // chứa các khai báo và định nghĩa hằng
Dòng này khai báo sử dụng thư viện 16F877.h, đây là thư viện
#include <16F877.h> // khai báo thư viện
dành cho vi điều khiển PIC16F877A.
#device ADC=10 PIC16F877
Dòng này cấu hình mô-đun ADC (Analog-to-Digital Converter) #device ADC=10 // Định cấu hình mô-đun Bộ
của vi điều khiển để có độ phân giải 10 bit cho việc chuyển đổi chuyển đổi Tương tự sang Kỹ thuật số (ADC) của vi
tín hiệu analog thành tín hiệu số.
#use delay(crystal=4000000)
điều khiển PIC
Dòng này cấu hình hàm delay để tạo độ trễ trong mã. Nó cho #use delay(crystal=4000000) // Chỉ định tần số của
biết tần số của dao động t kristan, trong trường hợp này là tinh thể được sử dụng là 4.000.000 Hz hoặc 4
4,000,000 Hz hoặc 4 MHz. MHz.
#include <lcd.h>
Dòng này khai báo sử dụng thư viện lcd.h, đây là thư viện để
#include <lcd.h> // Khai báo thư viện LCD
điều khiển màn hình LCD 16x2. #include <string.h> // khai báo một chuỗi ký tự
#include <string.h> #include <main.h>
Dòng này khai báo sử dụng thư viện string.h, đây là thư viện để #define PIR input(PIN_D7) // xác định và nhận đầu
làm việc với chuỗi ký tự.
#define PIR input(PIN_D7)
vào là PIN_D7
Dòng này định nghĩa một hằng số PIR và gán giá trị của chân #define LED // xác định và nhận đầu vào dưới dạng
PIN_D7 (chân D7 trên vi điều khiển) vào hằng số này. LED
#define LED
Dòng này định nghĩa một hằng số LED.
void main() khoảng trống chính () {
Hàm main, đây là điểm bắt đầu thực thi chương trình. lcd_init();//khởi động 1cd
lcd_init(); lcd_putc('\f'); // xóa màn hình LCD
Khởi tạo màn hình LCD.
lcd_gotoxy(1,1); //cột 1 hàng 1
lcd_putc('\f');
Xóa màn hình LCD. printf(lcd_putc, "PHÁT HIỆN PIR!!!"); // sẽ in chuỗi
lcd_gotoxy(1,1); "PIR DETECT!!!" lên màn hình
Di chuyển con trỏ đến vị trí cột 1, hàng 1 trên màn hình LCD. trong khi(ĐÚNG)
printf(lcd_putc, "PIR DETECT!!!");
In chuỗi "PIR DETECT!!!" lên màn hình LCD.
{
while(TRUE) if(PIR==1) //phát hiện chuyển động
Vòng lặp vô hạn. { lcd_gotoxy(1,2); //cột 1 hàng 2
if(PIR==1) printf(lcd_putc, "CẢNH BÁO PIR"); // sẽ in chuỗi
Kiểm tra giá trị của cảm biến PIR. Nếu giá trị bằng 1 (có chuyển
động), thực hiện các lệnh bên trong khối if.
"CẢNH BÁO PIR!!!" lên màn hình
lcd_gotoxy(1,2); }
Di chuyển con trỏ đến vị trí cột 1, hàng 2 trên màn hình LCD. khác {
printf(lcd_putc, "PIR WARNING"); lcd_gotoxy(1,2); //cột 1 hàng 2
In chuỗi "PIR WARNING" lên màn hình LCD.
else
printf(lcd_putc, "PIR BÌNH THƯỜNG"); // sẽ in
Nếu giá trị của cảm biến PIR không bằng 1 (không có chuyển chuỗi "CẢNH BÁO PIR!!!" lên màn hình
động), thực hiện các lệnh bên trong khối else. }
lcd_gotoxy(1,2);
}
Di chuyển con trỏ đến vị trí cột 1, hàng 2 trên màn hình LCD.
printf(lcd_putc, "PIR NORMALY"); }
In chuỗi "PIR NORMALY" lên màn hình LCD.
Đoạn mã này sử dụng cảm biến PIR để phát hiện chuyển động.
Nếu chuyển động được phát hiện, màn hình LCD sẽ hiển thị
thông báo "PIR WARNING". Nếu không có chuyển động, mĐoạn
mã trên là một chương trình đơn giản để sử dụng cảm biến PIR
và hiển thị thông báo trên màn hình LCD. Dưới đây là phân tích
chi tiết từng phần của chương trình:
#include <16F877.h>
Dòng này khai báo sử dụng thư viện 16F877.h, đây là thư viện
chứa các khai báo và định nghĩa cho vi điều khiển PIC16F877.
#device ADC=10
Dòng này cấu hình mô-đun ADC (Analog-to-Digital Converter)
của vi điều khiển để có độ phân giải 10 bit cho việc chuyển đổi
tín hiệu analog thành tín hiệu số.
#use delay(crystal=4000000)
Dòng này cấu hình hàm delay để tạo độ trễ trong chương trình.
Trong trường hợp này, tần số dao động của vi điều khiển là
4,000,000 Hz (4 MHz).
#include <lcd.h>
Dòng này khai báo sử dụng thư viện lcd.h, đây là thư viện chứa
các hàm để điều khiển màn hình LCD.
#include <string.h>
Dòng này khai báo sử dụng thư viện string.h, đây là thư viện
chứa các hàm xử lý chuỗi ký tự.
#define PIR input(PIN_D7)
Dòng này định nghĩa một macro PIR và gán giá trị của chân
PIN_D7 (chân D7 trên vi điều khiển) vào macro này. Điều này
giúp đơn giản hóa việc sử dụng cảm biến PIR trong chương
trình.
#define LED
Dòng này định nghĩa một macro LED, tuy nhiên không có giá trị
được gán cho macro này.
void main()
Hàm main, đây là hàm chính được thực thi đầu tiên khi chương
trình bắt đầu chạy.
lcd_init();
Hàm lcd_init() được gọi để khởi tạo màn hình LCD.
lcd_putc('\f');
Hàm lcd_putc('\f') được sử dụng để xóa màn hình LCD.
lcd_gotoxy(1,1);
Hàm lcd_gotoxy(1,1) được sử dụng để đặt con trỏ hiển thị lên
hàng 1, cột 1 trên màn hình LCD.
printf(lcd_putc, "PIR DETECT!!!");
Hàm printf() được sử dụng để in chuỗi "PIR DETECT!!!" lên màn
hình LCD.
while (TRUE)
Vòng lặp vô hạn. Chương trình sẽ lặp lại các lệnh bên trong
vòng lặp này mãi mãi.
if (PIR == 1)
Kiểm tra giá trị của cảm biến PIR. Nếu giá trị bằng 1, tức là phát
hiện chuyển động, chương trình sẽ thực hiện các lệnh bên trong
khối if.
lcd_gotoxy(1,2);
Hàm lcd_gotoxy(1,2) được sử dụng để đặt con trỏ hiển thị lên
hàng 2, cột 1 trên màn hình LCD.
printf(lcd_putc, "PIR WARNING");
Hàm printf() được sử dụng để in chuỗi "PIR WARNING" lên màn
hình LCD.
else
```
Nếu giá trị của cảm biến PIR không bằng 1, chương trình sẽ thực
hi
PIC16F877 là một vi điều khiển 8-bit của hãng Microchip có 40 chân (chân I/O) và 44 chân tổng cộng (bao
gồm cả chân năng suất và chân ICSP). Dưới đây là giải thích về từng chân trên PIC16F877:
1. RB0 - RB7 (chân 33-40): Các chân này là chân I/O thông thường có thể được sử dụng làm đầu vào
hoặc đầu ra. Chúng đều có khả năng kết nối với các thành phần ngoại vi như cảm biến, đèn LED,
nút nhấn và các thiết bị giao tiếp khác.
2. RD0 - RD7 (chân 14-21): Tương tự như RB0 - RB7, các chân này cũng là chân I/O thông thường có
thể được sử dụng làm đầu vào hoặc đầu ra. Chúng cũng có khả năng kết nối với các thành phần
ngoại vi.
3. RC0 - RC7 (chân 15-22): Các chân này cũng là chân I/O thông thường nhưng có một số chức
năng đặc biệt. Ví dụ, RC6 (chân 21) và RC7 (chân 22) được sử dụng cho giao tiếp USART
(Universal Synchronous/Asynchronous Receiver/Transmitter).
4. RE0 - RE2 (chân 1-3): Đây cũng là các chân I/O thông thường có khả năng kết nối với các thành
phần ngoại vi.
5. RA0 - RA5 (chân 23-28): Các chân này có khả năng kết nối với các thành phần ngoại vi và cũng
được sử dụng làm đầu vào cho module chuyển đổi Analog-to-Digital Converter (ADC) của
PIC16F877, cho phép đọc các tín hiệu analog.
6. RB4, RB5, RB6, RB7 (chân 34-37): Các chân này cũng có chức năng đặc biệt. RB4 (chân 34) và RB5
(chân 35) được sử dụng cho giao tiếp I2C (Inter-Integrated Circuit). RB6 (chân 36) và RB7 (chân
37) có khả năng kết nối với bộ nhớ ngoại vi thông qua giao tiếp SPI (Serial Peripheral Interface).
7. MCLR (chân 4): Đây là chân Reset ngoại vi, thường được kết nối với mạch Reset để đặt lại vi điều
khiển.
8. VDD và VSS (chân 11 và chân 12): Chân VDD được kết nối với nguồn điện dương +5V, trong khi
chân VSS được kết nối với nguồn điện âm (GND).
Ngoài ra, PIC16F877 còn có các chân khác như chân OSC1 và OSC2 (chân 9 và chân 10) được sử dụng cho
mạch dao động nội, và chân PGD và PGC (chân 27 và chân 28) được sử dụng cho giao tiếp In-Circuit
Serial Programming (ICSP) để nạp chương trình vào vi điều khiển.

Vi điều khiển PIC microcontroller thường có nhiều thanh ghi khác nhau để lưu
trữ dữ liệu và điều khiển hoạt động của chương trình. Dưới đây là một số
thanh ghi thông thường mà bạn có thể tìm thấy trên một số vi điều khiển PIC:
1. Thanh ghi dữ liệu (Data Registers): Được sử dụng để lưu trữ dữ liệu
thường xuyên trong quá trình thực thi chương trình. Ví dụ: thanh ghi W
để lưu trữ dữ liệu tạm thời.
2. Thanh ghi điều khiển (Control Registers): Được sử dụng để điều khiển
hoạt động của vi điều khiển. Ví dụ: thanh ghi trạng thái (Status Register)
để lưu trữ các cờ (flags) và trạng thái hiện tại của vi điều khiển.
3. Thanh ghi chỉ số (Index Registers): Được sử dụng trong các phép tính chỉ
số và truy cập vào bộ nhớ. Ví dụ: thanh ghi FSR (File Select Register)
trong một số vi điều khiển PIC để lưu trữ chỉ số cho việc truy cập vào bộ
nhớ.
4. Thanh ghi địa chỉ (Address Registers): Được sử dụng để lưu trữ địa chỉ
bộ nhớ hoặc thanh ghi địa chỉ của các thiết bị ngoại vi. Ví dụ: thanh ghi
PCL (Program Counter Low) và PCLATH (Program Counter Low-
Alternate) để lưu trữ địa chỉ lệnh hiện tại trong bộ nhớ chương trình.
5. Thanh ghi bộ định thời (Timer Registers): Được sử dụng trong các chức
năng đếm thời gian và đo thời gian. Ví dụ: thanh ghi TMR0 (Timer 0) để
lưu trữ giá trị đếm của bộ định thời.
6. Thanh ghi cấu hình (Configuration Registers): Được sử dụng để cấu hình
các chế độ và tùy chọn của vi điều khiển. Ví dụ: thanh ghi TRIS (TRI-
State) để cấu hình chân I/O là đầu vào hoặc đầu ra.
Lưu ý rằng số lượng và chức năng của các thanh ghi có thể khác nhau đối với
từng loại và mô hình cụ thể của vi điều khiển PIC. Vì vậy, nếu bạn đang sử
dụng một mô hình PIC cụ thể, tôi khuyên bạn nên tham khảo datasheet của
nó để biết chính xác các thanh ghi có sẵn trên vi điều khiển đó.

You might also like