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.. Lấy que đo probe voltage gắn vào chân RB0 để đo chu kỳ sáng/t
Trang 1HỌ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
Trang 2MỤC LỤC (Đề 2)
Trang 3Dựa vào công thức (1) ta tính được: F = 56 Hz
Dựa vào công thức (2) để tính value:
Có được:
Prescaler = 1
Trang 4 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ở
Trang 5PHẦ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 đènLED Từ đó có thể biết được kết quả tính toán đã đúng hay chưa
Kết quả mô phỏng:
Trang 6Hình 2 2 Kết quả mô phỏng câu 1
Trang 7Tín hiệu xung bắt đầu từ 0 đến 2.1 cho chu kỳ đầu tiên (Error: Referencesource 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
Trang 8Hình 2 4 Chu kì thứ hai
Trang 92.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 U1Kết quả mô phỏng:
Khi nhấn nút BT1 thì đèn D1 sáng:
Trang 10Tươ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.
Trang 11Hì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:
Trang 12Hình 2 7 Khi nhấn nút LEFT
Trang 13Hình 2 8 Khi nhấn nút RIGHT
Hình 2 9 Khi nhấn nút STOP
Trang 14PHẦ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:
Trang 153.2.2 Câu 2:
Trang 163.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
Trang 17clear_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
Trang 18set_tris_b(0xFF); //tat ca chan port B la input
Trang 19putc('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
Trang 20output_b(0x04); //xuat ra gia tri port B la 00000100
//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
Trang 21//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
}
Trang 22void lcd_display(int8 col, int8 row, int16 value)
Trang 23if(input(PIN_STOP)==0) // kiem tra trang thai nut nhan
//doc gia tri cua bien tro
unsigned int16 read_speed()
{
set_adc_channel(1); // chi dinh kenh 1 doc gia tri ADC
Trang 24return read_adc(); // ket thuc ham
}
// dieu khien dong co
void motor_control(int8 mode, int16 pwm)
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;
Trang 25}
}
void main()
{
int16 value; // khai bao bien value
lcd_init(); // khoi tao LCD
Trang 26Qua 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