You are on page 1of 26

HỌC VIỆN HÀNG KHÔNG VIỆT NAM

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

KỸ THUẬT VI XỬ LÝ – VI ĐIỀU KHIỂN

TIỂU LUẬN CUỐI KỲ

Họ tên: Nguyễn Lê Bảo Duy


Mã số sinh viên: 1953020068

THÀNH PHỐ HỒ CHÍ MINH, NĂM 2021


MỤC LỤC
(Đề 2)
PHẦN 1 LÝ THUYẾT 1
1.1. Câu 1 1
1.2. Câu 2 2
1.3. Câu 3 2
PHẦN 2 MÔ PHỎNG 3
2.1. Câu 1 3
2.2. Câu 2: 6
2.3. Câu 3 8
PHẦN 3 LẬP TRÌNH 10
3.1. Ý tưởng 10
3.1.1. Câu 1: 10
3.1.2. Câu 2: 10
3.1.3. Câu 3: 10
3.2. Lưu đồ thuật toán 10
3.2.1. Câu 1: 10
3.2.2. Câu 2: 11
3.2.3. Câu 3: 11
3.3. Giải thích code 12
3.3.1. Câu 1: 12
3.3.2. Câu 2: 13
3.3.3. Câu 3: 16
PHẦN 4 KẾT LUẬN 22
4.1. Câu 1: 22
4.2. Câu 2: 22
4.3. Câu 3: 22
PHẦN 1 LÝ THUYẾT

1.1. Câu 1

Yêu cầu: Tạo ngắt ở TIMER1 với chu kỳ 1.2 giây.

Công thức tính toán:

(1)

(2)

Thạch anh được sử dụng: 20MHz

 10ms: Thực hiện 50000 lệnh

 Chọn bộ chia: 1

1:1 50000

1:2 25000

1:4 12500

1:8 6250

5
Dựa vào công thức (1) ta tính được: F = 6 Hz

Dựa vào công thức (2) để tính value:

Có được:

Prescaler = 1

value = 15536

count = 120

1
1.2. Câu 2

Yêu cầu: sử dụng RS232 để truyền dữ liệu từ PIC truyền sang PIC nhận để
điều khiển các LED

 Khi nút nhấn ở chân RB0 của PIC truyền được nhấn, đèn LED ở chân
RB0 của PIC nhận sáng, các LED khác tắt. 

 Khi nút nhấn ở chân RB1 của PIC truyền được nhấn, đèn LED ở chân
RB1 của PIC nhận sáng, các LED khác tắt. 

 Khi nút nhấn ở chân RB2 của PIC truyền được nhấn, đèn LED ở chân
RB2 của PIC nhận sáng, các LED khác tắt. 

 Khi nút nhấn ở chân RB3 của PIC truyền được nhấn, đèn LED ở chân
RB3 của PIC nhận sáng, các LED khác tắt.

1.3. Câu 3

Yêu cầu: 

 Khi nút nhấn ở chân RB5 được nhấn động cơ sẽ dừng lại, khi nút nhấn ở
chân RB6 được nhấn động cơ sẽ quay trái, khi nút nhấn ở chân RB7 được
nhấn động cơ sẽ quay phải.

 Dùng ngắt thay đổi ở PORTB để lập trình cho các nút nhấn.

 Tốc độ động cơ sẽ thay đổi khi điều chỉnh biến trở ở chân RA0. 

 LCD hiển thị giá trị analog đọc được từ chân biến trở.

2
PHẦN 2 MÔ PHỎNG

2.1. Câu 1

Hình 2.1 Sơ đồ mô phỏng câu 1

Mô tả: Lấy linh kiện bao gồm PIC16F877A, RES 220, LED-GREEN và lắp
ráp như sơ đồ ở Error: Reference source not found.

Lấy que đo probe voltage gắn vào chân RB0 để đo chu kỳ sáng/tắt của đèn
LED. Từ đó có thể biết được kết quả tính toán đã đúng hay chưa.

Kết quả mô phỏng:

3
Hình 2. 2 Kết quả mô phỏng câu 1

4
Tín hiệu xung bắt đầu từ 0 đến 2.1 cho chu kỳ đầu tiên (Error: Reference
source not found) và từ 16.8 đến 18.9 cho chu kỳ thứ hai (Error: Reference

source not found).

Hình 2. 3 Chu kì đầu tiên

5
Hình 2. 4 Chu kì thứ hai

6
2.2. Câu 2:

Hình 2. 5 Sơ đồ mô phỏng câu 2

Mô tả: Lấy linh kiện bao gồm PIC16F877A, RES 220, RES 10k, LED-
GREEN, BUTTON và lắp ráp như sơ đồ ở Hình 2.2.

Nối chân truyền RC6 của PIC truyền U2 với chân nhận RC7 của PIC nhận U1

Kết quả mô phỏng:

Khi nhấn nút BT1 thì đèn D1 sáng:

7
Tương tự như vậy khi nhấn nút BT2, BT3, BT4 thì lần lượt các đèn D2, D3,
D4 sẽ sáng.

8
Hình 2. 6 Sơ đồ mô phỏng câu 3

2.3. Câu 3

Mô tả: Lấy linh kiện bao gồm PIC16F877A, L298, LCD, CAP 100nF, RES
220, RES 10k, POT-HG, DIODE,LED-GREEN, BUTTON, BATTERY 12V,
MOTOR-ENCODER và lắp ráp như sơ đồ ở Hình 2.3.

Kết quả mô phỏng:

9
Hình 2. 7 Khi nhấn nút LEFT

10
Hình 2. 8 Khi nhấn nút RIGHT

Hình 2. 9 Khi nhấn nút STOP

11
PHẦN 3 LẬP TRÌNH

3.1. Ý tưởng

3.1.1. Câu 1:

Về phần cứng, đầu tiên sẽ tính các giá trị cần thiết để thiết lập timer1 theo chu
kì mà đề bài yêu cầu. Sau đó, sẽ lắp mạch và cài đặt các thông số như Hình
2.1 . Về code thì em sử dụng

3.1.2. Câu 2:

Về phần cứng, đầu tiên chúng ta sẽ sử dụng 2 PIC, lắp mạch và cài đặt các
thông số như Hình 2.2. Về code thì em sẽ sử dụng 2 code riêng để truyền và
nhận dữ liệu như đề yêu cầu, sử dụng vòng lập while để điểu khiển đèn led
bằng các nút nhấn.

3.1.3. Câu 3:

Về phần cứng, đầu tiên em sử dụng 1 PIC để điều khiển các nút nhấn để điều
khiển động cơ, LCD cũng như là L298 và điều chỉnh các thông số như Hình
2.3. Về code thì em sử dụng hàm switch case để hiển thị LCD và động cơ còn
các nút nhấn thì em sẽ sử dụng hàm if và while để kiểm tra trạng thái của nút
nhấn.

3.2. Lưu đồ thuật toán

3.2.1. Câu 1:

12
3.2.2. Câu 2:

3.2.3. Câu 3:

13
3.3. Giải thích code

3.3.1. Câu 1:

#include <main.h>

unsigned int16 count = 120; // khai bao bien count

unsigned int16 i,j = 0; // khai bao bien i va j

int led=0x01; // khai bao bien led

#INT_TIMER1

void timer1_interrupt(){

i++;

if(i>=count)

led=led<<1;

i=0;

j++;

if(j>7)

led=0x01;

j=0;

set_timer1(15536); // dat gia tri cho timer1

14
clear_interrupt(INT_TIMER1); // xoa co tran timer1

output_b(led);

void main()

clear_interrupt(INT_TIMER1); // xoa co tran timer1

enable_interrupts(INT_TIMER1); //cho phep ngat timer1

enable_interrupts(GLOBAL); // cho phep ngat toan cuc

setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); // cai dat timer1

set_timer1(15536); // dat gia tri cho timer1

output_b(led);

while(TRUE)

3.3.2. Câu 2:

a) PIC truyền:

#include <main.h>

#use rs232(baud = 9600, xmit = PIN_C6, rcv = PIN_C7) // khai bao RS232

void main()

15
set_tris_b(0xFF); //tat ca chan port B la input

port_b_pullups(TRUE);

while(TRUE)

if(input(PIN_B0) == 0) // kiem tra trang thai chan B0

while(input(PIN_B0)==0){}

putc('A'); // gui ki tu toi chan TX

if(input(PIN_B1) == 0) //kiem tra trang thai chan B1

while(input(PIN_B1)==0){}

putc('B'); // gui ki tu toi chan TX

if(input(PIN_B2) == 0) // kiem tra trang thai chan B2

while(input(PIN_B2)==0){}

putc('C'); // gui ki tu toi chan TX

if(input(PIN_B3) == 0) // kiem tra trang thai chan B3

while(input(PIN_B3)==0){}

16
putc('D'); // gui ki tu toi chan TX

b) PIC nhận:

#include <main.h>

#USE rs232(baud = 9600, xmit = PIN_C6, rcv = PIN_C7)

unsigned int8 kitu; //khai bao bien kitu

void main()

set_tris_b(0x00); // tat ca chan port B la output

output_b(0); // cac chan port B o muc thap

while(TRUE)

if(kbhit()==1) // xac nhan co ki tu san sang cho getc

kitu = getc();

if(kitu == 'A')

output_b(0x01); //xuat ra gia tri port B la 00000001

else if (kitu == 'B')

output_b(0x02); //xuat ra gia tri port B la 00000010

else if (kitu == 'C')

17
output_b(0x04); //xuat ra gia tri port B la 00000100

else if (kitu == 'D')

output_b(0x08); //xuat ra gia tri port B la 00001000

else;

3.3.3. Câu 3:

#include <main.h>

//khai bao chan cua LCD

#define LCD_ENABLE_PIN PIN_D2

#define LCD_RS_PIN PIN_D0

#define LCD_RW_PIN PIN_D1

#define LCD_DATA4 PIN_D4

#define LCD_DATA5 PIN_D5

#define LCD_DATA6 PIN_D6

#define LCD_DATA7 PIN_D7

//khai bao chan cua dong co

#define PIN_IN1 PIN_B0

#define PIN_IN2 PIN_B1

#define PIN_PWM1 PIN_C2

18
//khai bao chan dieu khien dong co

#define PIN_STOP PIN_B5

#define PIN_LEFT PIN_B6

#define PIN_RIGHT PIN_B7

#include <lcd.c>

unsigned int8 mode = 0; //khai bao bien mode

//khai bao ngat va adc

void port_init()

output_b(0x00);

clear_interrupt(INT_RB); // xoa co bao ngat ngoai

enable_interrupts(INT_RB); // cho phep ngat ngoai

enable_interrupts(GLOBAL); // cho phep ngat toan cuc

setup_adc(ADC_CLOCK_INTERNAL); // chon xung lay mau ADC bang


xung noi

setup_adc_ports(AN0_AN1_AN2_AN4_AN5_AN6_AN7_VSS_VREF); //
su dung cac chan cua ADC

setup_timer_2(T2_DIV_BY_16,255,1); //cau hinh timer2

setup_ccp1(CCP_PWM); // cau hinh ccp1 hoat dong o che do PWM

//hien thi trang thai dong co

19
void lcd_display(int8 col, int8 row, int16 value)

lcd_gotoxy(col,row);

switch(mode)

case 0:

lcd_putc("STOP \n"); //hien thi trang thai dung

break;

case 1:

lcd_putc("LEFT \n"); // hien thi trang thai quay trai

break;

case 2:

lcd_putc("RIGHT\n"); // hien thi trang thai quay phai

break;

printf(lcd_putc,"VALUE = %ld\r",value); // hien thi ra man hinh gia tri

#INT_RB

// ngat ngoai port b

void port_b_change()

20
if(input(PIN_STOP)==0) // kiem tra trang thai nut nhan

while(input(PIN_STOP)==0);

mode = 0;

if(input(PIN_LEFT)==0) // kiem tra trang thai nut nhan

while(input(PIN_LEFT)==0);

mode = 1;

if(input(PIN_RIGHT)==0) // kiem tra trang thai nut nhan

while(input(PIN_RIGHT)==0);

mode = 2;

//doc gia tri cua bien tro

unsigned int16 read_speed()

set_adc_channel(1); // chi dinh kenh 1 doc gia tri ADC

delay_ms(100);

21
return read_adc(); // ket thuc ham

// dieu khien dong co

void motor_control(int8 mode, int16 pwm)

switch(mode)

case 0: // dung

output_bit(PIN_IN1,0);

output_bit(PIN_IN2,0);

break;

case 1: //quay trai

set_pwm1_duty(pwm); // doc gia tri bien tro

output_bit(PIN_IN1,1);

output_bit(PIN_IN2,0);

break;

case 2: //quay phai

set_pwm1_duty(pwm); // doc gia tri bien tro

output_bit(PIN_IN1,0);

output_bit(PIN_IN2,1);

break;

22
}

void main()

int16 value; // khai bao bien value

lcd_init(); // khoi tao LCD

port_init(); //

lcd_putc("\fMOTOR CONTROLLER\n"); // hien thi ki tu

delay_ms(500);

lcd_putc("\f"); //xoa man hinh LCD

while(TRUE)

value = read_speed();

lcd_display(1,1,value);

motor_control(mode,value);

23
PHẦN 4 KẾT LUẬN

4.1. Câu 1:

Qua câu 1, em học được cách sử dụng PIC16F877A để điều khiển led cũng
như cách tính toán các giá trị cần thiết để sử dụng ngắt TIMER1.

4.2. Câu 2:

Qua câu 2, em học được cách điều khiển led bằng nút nhấn thông qua
PIC18F877A cũng như cách sử dụng RS232 để giao tiếp.

4.3. Câu 3:

Qua câu 3, em học được cách điều khiển động cơ DC bằng L298 , điều chỉnh
tốc độ động cơ, dùng ngắt thay đổi ở PORTB để lập trình cho các nút nhấn và
LCD hiển thị giá trị biến trở thông qua PIC16F877A.

24

You might also like