You are on page 1of 26

TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI

KHOA ĐIỆN – ĐIỆN TỬ

BÁO CÁO:

BÀI TẬP LỚN


Vi Xử Lý
Giảng viên hướng dẫn : NGÔ THANH BÌNH
Các thành viên trong nhóm :
Nguyễn Quang Huy: Phan Thế Huy: 211612126
211602072 (Trưởng nhóm)
Phù Văn Huy: 211612073
Lương Bá Duy: 211602955
Tăng Thành Hưng: 211611655
Nguyễn Việt Đức: 211611495
Nguyễn Chí Long: 211613996

Lớp: Tự động hoá 1 – K62

Hà Nội – 2023

1
Mục Lục

LỜI NÓI ĐẦU.................................................................................................3


NHIỆM VỤ…………………………………………………………………4
CHƯƠNG 1: GIỚI THIỆU ĐỀ TÀI.............................................................5
1.1 Yêu cầu chức năng:..............................................................................5
1.2 Yêu cầu phi chức năng.........................................................................5
1.3 Sơ đồ khối hệ thống..............................................................................5
CHƯƠNG 2: THIẾT KẾ HỆ THỐNG.........................................................6
2.1 Bộ xử lý trung tâm...................................................................................6
2.2 Cấu trúc tổng quát PIC 16F877A.............................................................7
2.3 Các phần cứng của Vi xử lý được sử dụng trong đề tài...........................8
2.4 Các thiết bị ngoại vi...............................................................................12
2.5 Sơ đồ nguyên lý......................................................................................16
2.6 Các linh kiện sử dụng.............................................................................16
CHƯƠNG 3: XÂY DỰNG LƯU ĐỒ THUẬT TOÁN VÀ VIẾT
CHƯƠNG TRÌNH........................................................................................17
3.1 Lưu đồ thuật toán...................................................................................17
3.2 Viết chương trình:..................................................................................18
3.3 Hình ảnh mô phỏng:...............................................................................25

2
LỜI NÓI ĐẦU
Trong những năm gần đây công nghệ thông tin có những bước phát triển
nhảy vọt, đặc biệt là sự ra đời của máy tính đã tạo cho xã hội một bước phát
triển mới, nó ảnh hưởng đến hầu hết các vấn đề của xã hội và trong công
nghiệp cũng vậy. Hoà cùng với sự phát triển đó, ngày càng nhiều nhà sản xuất
đã ứng dụng các các họ vi xử lý có tính năng mạnh vào trong công nghiệp,
trong việc điều khiển và xử lý dữ liệu.
Những hạn chế của kỹ thuật tương tự như sự trôi thông số, sự làm việc cố
định dài hạn, những khó khăn của việc thực hiện chức năng điều khiển phức
tạp đã thúc đẩy việc chuyển nhanh công nghệ số. Ngoài ra điều khiển số còn
cho phép tiết kiệm linh kiện phần cứng, cho phép tiêu chuẩn hoá. Với cùng
một bộ vi xử lý, một cấu trúc phần cứng có thể dùng cho mọi ứng dụng, chỉ
cần thay mội dung ô nhớ. Tuy nhiên kỹ thuật số có những nhược điểm như xử
lý các tín hiệu rời rạc.... đồng thời tín hiệu tương tự có ưu điểm mà kỹ thuật số
không có được như tác động nhanh và liên tục. Vì vậy ngày nay xu hướng
trong điều khiển là phối hợp điều khiển số và điều khiển tương tự.
Để nắm vững được những kiến thức đã học thì việc nghiên cứu là cần thiết
đối với sinh viên. Bài tập lớn môn học Vi xử lý đã giúp cho em biết thêm
được rất nhiều về cả kiến thức lẫn kinh nghiệm.
Nhân đây em cũng xin cảm ơn rất nhiều đến thầy giáo Ngô Thanh Bình đã
tận tình hướng dẫn và chỉ bảo em để làm bài này.

3
NHIỆM VỤ
1. Giới thiệu đề tài và viết báo cáo – Nguyễn Việt Đức, Tăng Thành
Hưng.
2. Thiết kế hệ thống và làm phần cứng Proteus – Phan Thế Huy,
Nguyễn Chí Long, Phù Văn Huy.
3. Xây dựng lưu đồ thuật Toán và viết chương trình – Nguyễn
Quang Huy, Lương Bá Duy.

4
CHƯƠNG 1: GIỚI THIỆU ĐỀ TÀI
1.1 Yêu cầu chức năng:
Ghép nối PIC16F877A với module cảm biến chạm (Touch Sensor)
TTP223B và viết chương trình phát hiện phím được bấm:
1.2 Yêu cầu phi chức năng.
+ Sử dụng vi Điều Khiển PIC 16F877A.
+ Lập trình bằng ngôn ngữ C.
+ Môi trường phát triển MPlab IDE.
+ Các chức năng tương tác dễ sử dụng.
1.3 Sơ đồ khối hệ thống.

Hình 1.1: Sơ đồ khối hệ thống.

5
CHƯƠNG 2: THIẾT KẾ HỆ THỐNG
2.1 Bộ xử lý trung tâm.

Hình 2.1: Sơ đồ chân kết nối PIC16F877A.

PIC (Programmable Intelligent Computer) nghĩa là “Máy tính thông


minh khả trình” xuất phát từ Vi điều khiển PIC đầu tiên PIC1650, do hãng
General Instrument đặt tên. Sau đó hãng Microchip tiếp tục phát triển loại
PIC này và cho ra đời gần 100 loại PIC đến nay.
Ngày nay, rất nhiều dòng PIC được xuất xưởng với hàng loạt các
module ngoại vi tích hợp sẵn như UART, PWM, ADC, … với bộ nhớ chương
trình từ 512 word đến 32k word.
Các dòng PIC hiện nay:
+ Dòng PIC 12Cxx có độ dài lệnh 12bit (Basic-line).
+ Dòng PIC 10F, 12F, 16F có độ dài lệnh 14bit (Mid-range).
+ Dòng PIC 18F có độ dài lệnh 16bit (High-End).

6
2.2 Cấu trúc tổng quát PIC 16F877A.

Hình 2.2 Cấu trúc của VXL PIC

▪ 8K x 14 bits/word Flash ROM.


▪ 368 x 8 Bytes RAM.
▪ 256 x 8 Bytes EEPROM.
▪ 5 Port xuất/nhập (A, B, C, D, E) tương ứng 33 chân ra.
▪ 2 Bộ định thời 8 bit Timer 0 và Timer 2.
▪ 1 Bộ định thời 16 bit Timer 1, có thể hoạt động ở chế độ tiết kiệm
năng lượng
(SLEEP MODE) với nguồn xung clock ngoài.
▪ 2 Bộ Capture/ Compare/ PWM.(Bắt Giữ/ So Sánh/ Điều Biến Xung)
▪ 1 Bộ biến đổi Analog to Digital 10 bit, 8 ngõ vào.
▪ 2 Bộ so sánh tương tự (Compartor).
▪ 1 Bộ định thời giám sát (Watch Dog Timer).
▪ 1 Cổng giao tiếp song song 8 bit.
▪ 1 Port nối tiếp.
▪ 15 Nguồn ngắt (Interrupt).

7
▪ Chế độ tiết kiệm năng lượng (Sleep Mode).
▪ Nạp trương trình bằng cổng nối tiếp ( ICSP™ )(In-Circuit Serial
Programming™ -)
▪ Tập lệnh gồm 35 lệnh có độ dài 14 bit.
▪ Tần số hoạt động tối đa 20 MHz.
2.3 Các phần cứng của Vi xử lý được sử dụng trong đề tài.
2.3.1 Bộ định thời Timer 0:

• Timer 0 là 1 bộ timer/ counter 8 bit


• Có bộ chia trước, dùng chung với watchdog timer
• Có thể lựa chọn nguồn xung clock nội hay ngoại (nối với chân
T0CKI) tùy theo
cách cấu hình
• Có phát hiện ngắt khi tràn bộ đếm từ 0xFF về 0x00
• Cho phép chọn cạnh của xung đếm
• Không có bit cho phép chạy hay ngừng ( free run timer)
Để cấu hình cho timer 0 thì ta cần phải tác động lên thanh ghi OPTION_REG:

8
Chức năng của các bit:

 Bit 7: bit điều khiển điện trở treo port B (RBPU)


 Bit 6: bit chọn cạnh ngắt (INTEDG)
 Bit 5: bit chọn nguồn xung cho timer 0 ( T0CS)
 T0CS = 1: nguồn xung ngoại lấy từ chân T0CKI
 T0CS = 0: nguồn xung clock nội (Fosc/4)
 Bit 4: Bit chọn cạnh ngắt tích cực (T0SE)
 Bit 3: bit gán bộ chia trước (PSA)
 PSA = 1: gán cho watchdog timer (WDT)
 PSA = 0: gán cho timer 0
 Bit 2-0 : các bit chọn tỷ lệ bộ chia trước PS<2:0>

Timer 0 có thể phát hiện ngắt khi giá trị trong thanh ghi TMR0 tràn từ 0xFF
về 0x00, đưa cờ báo ngắt T0IF lên mức logic 1.
Timer 1 của PIC16F887

 Timer 1 là 1 bộ timer 16 bit, có thể chọn được nguồn xung là nội hay
ngoại (thông qua chân T1CKI)
 Có bộ chia trước
 Có phát hiện ngắt khi tràn bộ đếm từ 0xFFFF về 0x0000
 Hoạt động ở cả 2 chế độ đồng bộ và không đồng bộ
 Chế độ định thời, capture/ compare

Sơ đồ khối của timer 1:

9
2.3.2 Các thanh ghi quan trọng của timer 1:
a. Thanh ghi TMR1L và TMR1H:

2 thanh ghi này dùng để ghi giá trị counter của timer 1.
Ngoài ra, khi khối CCP hoạt động ở chế độ compare/ capture thì 2 thanh ghi
này còn có tác dụng như sau:

 Compare: 1 sự kiện được kích hoạt nếu giá trị của cặp thanh ghi
CCPRxH:CCPRxL trùng khớp với giá trị của TMR1L:TMR1H
 Capture: giá trị của cặp thanh ghi TMR1L:TMR1H được sao chép vào
cặp CCPRxH:CCPRxL trên 1 sự kiện đã đặt trước

Thanh ghi T1CON ( Timer 1 control register):

10
 Bit 7: Bit đảo cổng của timer 1 (T1GINV)

o T1GINV = 1: timer 1 đếm khi cổng ở mức 1

o T1GINV = 0: timer 0 đếm khi cổng ở mức 0


 Bit 6: Bit cho phép cổng của timer 1 (TMR1GE), bit này chỉ có tác
dụng khi TMR1ON = 1

o TMR1GE = 1: timer 1 mở nếu cổng của nó không tích


cực

o TMR1GE = 0: timer 1 mở
 Bit 5-4: Các bit chọn bộ chia trước timer 1 (T1CKPS1, T1CKPS0)

 Bit 3: bit cho phép bộ dao động timer 1 (T1OSCEN)

o T1OSCEN = 1: cho phép

o T1OSCEN = 0: tắt bộ dao động

 Bit 2: Bit đồng bộ ngõ vào xung clock ngoại timer 1 (T1SYNC), bit
này chỉ có tác dụng khi TMR1CS = 1

11
o T1SYNC = 1: không đồng bộ ngõ vào clock từ bên ngoài Bộ
đếm tiếp tục tăng bất đồng bộ với xung bên trong. Bộ đếm vẫn
đếm khi CPU ở trong chế độ ngủ và khi tràn sẽ phát sinh ngắt và
đánh thức CPU. Ngắt T1 có thể ngăn được.

o T1SYNC = 0: đồng bộ ngõ vào clock từ bên ngoài, nếu CPU ở


chế độ ngủ thì Timer1 sẽ không đếm vì mạch đồng bộ ngừng
hoạt động.

 Bit 1: Bit chọn nguồn xung timer 1 (TMR1CS)

o TMR1CS = 1: chọn nguồn xung ngoại từ chân T1CKI

o TMR1CS = 0: chọn xung nội Fosc/4

 Bit 0: Bit điều khiển timer 1 (TMR1ON)

o TMR1ON = 1: cho phép timer 1 đếm

o TMR1ON = 1: timer 1 ngừng đếm

12
2.4 Các thiết bị ngoại vi.
2.4.1 cảm biến Flame sensor

2.4.2 TÍNH NĂNG:


 Khả năng phát hiện lửa hoặc nguồn sáng có bước sóng tương tự.
 Sử dụng cảm biến hồng ngoại YG1006 với tốc độ đáp ứng nhanh
và độ nhạy cao.
 Tích hợp IC LM393 để chuyển đổi ADC, tạo 2 ngõ ra cả số và
tương tự, rất linh động trong việc sử dụng.
 Biến trở để tùy chỉnh độ nhạy cảm biến.
 Có thể ứng dụng trong các hệ thống báo cháy, robot chữa cháy,…

13
2.4.3 THÔNG SỐ CẢM BIẾN PHÁT HIỆN LỬA
 Nguồn cấp: 3.3V – 5VDC
 Dòng tiêu thụ: 15mA
 Tín hiệu ra: Digital 3.3 – 5VDC tùy nguồn cấp hoặc Analog.
 Khoảng cách: 80cm
 Góc quét: 60 độ
 Kích thước: 3.2 x 1.4 cm
2.4.4 SƠ ĐỒ CHÂN
 VCC –> 3.3V ~ 5.3V
 GND –> power supply ground
 AOUT (AO) –> analog output
 DOUT (DO) –> digital output

2.4.5 SƠ ĐỒ NGUYÊN LÝ

2.4.6 Khối LCD.

14
 Điện áp hoạt động là 5V.
 Kích thước: 80 x 36 x 12.5mm
 Chữ trắng, nền xanh dương
 Khoảng cách giữa hai chân kết nối là 0.1 inch tiện dụng khi kết nối
với Breadboard.
 Tên các chân được ghi ở mặt sau của màn hình LCD hổ trợ việc kết
nối, đi dây điện.
 Có đèn led nền, có thể dùng biến trở hoặc PWM điều chình độ
sáng để sử dụng ít điện năng hơn.
 Có thể được điều khiển với 6 dây tín hiệu
 Có bộ ký tự được xây dựng hỗ trợ tiếng Anh và tiếng Nhật, xem
thêm HD44780 datasheet để biết thêm chi tiết.

15
2.4.7 Khối tạo dao động thạch anh ngoài.

Để tạo xung nhịp cho mạch hoạt động chúng em đã sử mạch dao
động thạch anh ngoài. Thạch anh (20MHz) được nối với hai tụ gốm
22p để tang sự ổn định tần số. Tụ điện trong trường hợp này có chức
năng bù nhiệt, ổn tần.

16
2.5 Sơ đồ nguyên lý.

2.6 Các linh kiện sử dụng.


STT Tên linh kiện Số lượng
1 PIC16F877A 1
2 Flame Sensor 1
3 Thạch Anh 1
4 Tụ gốm 22pF 2
5 Biến trở 1
6 LCD 16x2 1

17
CHƯƠNG 3: XÂY DỰNG LƯU ĐỒ THUẬT TOÁN VÀ VIẾT
CHƯƠNG TRÌNH.
3.1 Lưu đồ thuật toán
+ Chế độ hoạt động:

18
3.2 Viết chương trình:
Main.c
#define RS RB2
#define EN RB3
#define D4 RB4
#define D5 RB5
#define D6 RB6
#define D7 RB7

#include <xc.h>
#define _XTAL_FREQ 20000000
#include "lcd.h"

// BEGIN CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS
oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT
enabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit
(PWRT disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bit
(BOR enabled)
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-
Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on
MCLR must be used for programming)

19
#pragma config CPD = OFF // Data EEPROM Memory Code
Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write
Enable bits (Write protection off; all program memory may be
written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code
Protection bit (Code protection off)
//END CONFIG
#define IsFlame RD0
void main(void) {
TRISB = 0x00;
TRISDbits.TRISD0 = 1;
Lcd_Init();
Lcd_Clear();
Lcd_Set_Cursor(1, 1);
Lcd_Write_String("UTC-TDH");

while (1) {
if (IsFlame == 1) {
Lcd_Set_Cursor(2, 1);
Lcd_Write_String("Flame Detected");

} else {
Lcd_Set_Cursor(2, 1);

20
Lcd_Write_String(" "); // Clear
}
}
}

lcd.h
void Lcd_Port(char a)
{
if(a & 1)
D4 = 1;
else
D4 = 0;

if(a & 2)
D5 = 1;
else
D5 = 0;

if(a & 4)
D6 = 1;
else
D6 = 0;

if(a & 8)

21
D7 = 1;
else
D7 = 0;
}
void Lcd_Cmd(char a)
{
RS = 0; // => RS = 0
Lcd_Port(a);
EN = 1; // => E = 1
__delay_ms(4);
EN = 0; // => E = 0
}

Lcd_Clear()
{
Lcd_Cmd(0);
Lcd_Cmd(1);
}

void Lcd_Set_Cursor(char a, char b)


{
char temp,z,y;
if(a == 1)
{

22
temp = 0x80 + b - 1;
z = temp>>4;
y = temp & 0x0F;
Lcd_Cmd(z);
Lcd_Cmd(y);
}
else if(a == 2)
{
temp = 0xC0 + b - 1;
z = temp>>4;
y = temp & 0x0F;
Lcd_Cmd(z);
Lcd_Cmd(y);
}
}

void Lcd_Init()
{
Lcd_Port(0x00);
__delay_ms(20);
Lcd_Cmd(0x03);
__delay_ms(5);
Lcd_Cmd(0x03);
__delay_ms(11);

23
Lcd_Cmd(0x03);
/////////////////////////////////////////////////////
Lcd_Cmd(0x02);
Lcd_Cmd(0x02);
Lcd_Cmd(0x08);
Lcd_Cmd(0x00);
Lcd_Cmd(0x0C);
Lcd_Cmd(0x00);
Lcd_Cmd(0x06);
}

void Lcd_Write_Char(char a)
{
char temp,y;
temp = a&0x0F;
y = a&0xF0;
RS = 1; // => RS = 1
Lcd_Port(y>>4); //Data transfer
EN = 1;
__delay_us(40);
EN = 0;
Lcd_Port(temp);
EN = 1;
__delay_us(40);

24
EN = 0;
}

void Lcd_Write_String(char *a)


{
int i;
for(i=0;a[i]!='\0';i++)
Lcd_Write_Char(a[i]);
}

void Lcd_Shift_Right()
{
Lcd_Cmd(0x01);
Lcd_Cmd(0x0C);
}

void Lcd_Shift_Left()
{
Lcd_Cmd(0x01);
Lcd_Cmd(0x08);
}

25
3.3 Hình ảnh mô phỏng:

26

You might also like