Professional Documents
Culture Documents
1.1. Câu 1
(1)
(2)
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
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
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.
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
5
Hình 2. 4 Chu kì thứ hai
6
2.2. 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
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.
9
Hình 2. 7 Khi nhấn nút LEFT
10
Hình 2. 8 Khi nhấn nút RIGHT
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.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>
#INT_TIMER1
void timer1_interrupt(){
i++;
if(i>=count)
led=led<<1;
i=0;
j++;
if(j>7)
led=0x01;
j=0;
14
clear_interrupt(INT_TIMER1); // xoa co tran timer1
output_b(led);
void main()
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)
while(input(PIN_B0)==0){}
while(input(PIN_B1)==0){}
while(input(PIN_B2)==0){}
while(input(PIN_B3)==0){}
16
putc('D'); // gui ki tu toi chan TX
b) PIC nhận:
#include <main.h>
void main()
while(TRUE)
kitu = getc();
if(kitu == 'A')
17
output_b(0x04); //xuat ra gia tri port B la 00000100
else;
3.3.3. Câu 3:
#include <main.h>
18
//khai bao chan dieu khien dong co
#include <lcd.c>
void port_init()
output_b(0x00);
setup_adc_ports(AN0_AN1_AN2_AN4_AN5_AN6_AN7_VSS_VREF); //
su dung cac chan cua ADC
19
void lcd_display(int8 col, int8 row, int16 value)
lcd_gotoxy(col,row);
switch(mode)
case 0:
break;
case 1:
break;
case 2:
break;
#INT_RB
void port_b_change()
20
if(input(PIN_STOP)==0) // kiem tra trang thai nut nhan
while(input(PIN_STOP)==0);
mode = 0;
while(input(PIN_LEFT)==0);
mode = 1;
while(input(PIN_RIGHT)==0);
mode = 2;
delay_ms(100);
21
return read_adc(); // ket thuc ham
switch(mode)
case 0: // dung
output_bit(PIN_IN1,0);
output_bit(PIN_IN2,0);
break;
output_bit(PIN_IN1,1);
output_bit(PIN_IN2,0);
break;
output_bit(PIN_IN1,0);
output_bit(PIN_IN2,1);
break;
22
}
void main()
port_init(); //
delay_ms(500);
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