HỌC VIỆN HÀNG KHÔNG VIỆT NAMKHOA ĐIỆN – ĐIỆN TỬ KỸ THUẬT VI XỬ LÝ – VI ĐIỀU KHIỂN TIỂU LUẬN CUỐI KỲ Giáo viên hướng dẫn: Th.s Võ Bá Việt Nghĩa Sinh viên thực hiện :1... Lấy probes voltag
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Ỳ
Giáo viên hướng dẫn: Th.s Võ Bá Việt Nghĩa
Sinh viên thực hiện :1 Phan Hồng Doanh -1953020071
2 Nguyễn Thị Phương Thảo - 1953020027
THÀNH PHỐ HỒ CHÍ MINH, NĂM 2021
Trang 2Mục lục
Phần 1 lí thuyết··· 1
1.1 câu 1- dùng timer điều khiển led ···1
Phần 2 mô phỏng···2
1.1 câu 1 - dùng timer 1 tạo ngắt với chu kỳ 1.2s···2
1.2 câu 2 - dùng rs232 bật tắt led đơn··· 4
1.3 câu 3 - điều khiển tốc độ động cơ··· 5
Phần 3 lập trình··· 9
1.1 lưu đồ giải thuật···9
1.1.1 câu 1- dùng timer điều khiển led··· 9
1.1.2 câu 2- dùng rs232 điều khiển led···9
1.1.3 câu 3- điều khiển động cơ··· 10
1.2 giải thích code··· 11
1.1.1 câu 1- dùng timer điều khiển led··· 11
1.1.2 câu 2- dùng rs232 điều khiển led··· 12
1.1.3 câu 3- điều khiển động cơ··· 14
Phần 4 kết luận··· 17
Trang 3Mục lục hình ảnh
hình 1.0 - sơ đồ mô phỏng bài 1··· 2
hình 1.1 - kết quả mô phỏng··· 2
hình 1.2 - chu kỳ đầu tiên···3
hình 1.3 - chu kỳ tiếp theo···3
hình 1.4 - sơ đồ mô phỏng bài 2··· 4
hình 1.5 - nút RB0 được nhấn···4
hình 1.6 - nút RB1 được nhấn···5
hình 1.7 - nút RB2 được nhấn ···5
hình 1.8 - nút RB3 được nhấn···5
hình 1.9 - sơ đồ mô phỏng bài 3··· 6
hình 2.0 - nhấn nút quay phải··· 7
hình 2.1 - nhấn nút quay trái··· 7
hình 2.2 - nhấn nút stop···8
hình 2.3 - điều khiển tốc độ động cơ bằng biến trở··· 8
Trang 4PHẦN 1 LÝ THUYẾT
1.1 Câu 1- dùng timer điều khiển led
Tính toán timer 1:
Yêu cầu dùng timer1 tạo Ngắt với chu kì 1.2 s
FTimer1= 1/1.2 = 5/6 hz
FTimer1= 20.000.000 /4 = 5.000.000hz ==> 100ms: 500.000 lệnh Chọn bộ chia trước :
==> chọn bộ chia trước prescaler = 8
Giá trị đặt trước cho thanh ghi TMR1: value = 65536-62500 = 3036
Số lần ngắt: count = 20.000.000
4.8.(65536−3036).56 = 12
Trang 5PHẦN 2 MÔ PHỎNG
1.1 Câu 1 - dùng timer1 tạo ngắt với chu kỳ 1.2s
Hình 1.0 - sơ đồ mô phỏng bài 1
+ các linh kiện cần cho mô phỏng
- 1 pic16f877A tần số 20Mhz
- 1 thạch anh tần số 20Mhz ( crystal)
- 1 điện trở 1k và 8 con 220ohm ( resistor)
- 8 đèn led màu đỏ (led red)
- 2 con tụ 22pF
Sắp xếp các linh kiện như hình 1.0 Lấy probes voltage gắn vào đầu B0 để đo chu kì sáng tắt của led từ đó có thể biết kết quả tính toán đã đúng hay chưa + kết quả mô phỏng
Hình 1.1- kết quả mô phỏng
Trang 6Hình 1.2- chu kỳ đầu tiên
Hình 1.3- chu kỳ tiếp theo
Trang 7RB0 bắt đầu sáng sau 1.2s thì tắt , tới thời điểm 1.2*8 =9.6( vì có 8 led sáng lần lượt) thì RB0 tiếp tục sáng
1.2 Câu 2 - dùng rs232 bật tắt led đơn
Hình 1.3- sơ đồ mô phỏng bài 2
+ các linh kiện cần cho mô phỏng
- 2 con pic16f877A tần số 20Mh
- 4 nút nhấn (button)
- 4 con điện trở 10k và 4 con 220ohm( resistor)
- 4 đèn led màu đỏ( led red)
Sắp xếp linh kiện cài đặt như hình 1.3
+ kết quả mô phỏng
Hình 1.4- nút RB0 được nhấn
Trang 8Hình 1.5 - nút RB1 được nhấn
Hình 1.6 - nút RB2 được nhấn
Hình 1.7 - nút RB3 được nhấn
1.3 Câu 3 điều khiển tốc độ động cơ
Trang 9Hình 1.8 - sơ đồ mô phỏng bài 3
+ các linh kiện cần cho mô phỏng
- 1 con pic16f877A tần số 20MHz
- 3 nút nhấn (button)
- 1 biến trở 10k (pot-hg)
- 1 màn hình lcd LM016L
- một động cơ dc ( motor)
- 1 con L298
- 2 tụ 100nF ( capacitor)
- 4 con diode 1N4007
- 1 cục pin 12v ( battery)
Sắp xếp cài đặt linh kiện như hình 1.8
+ kết quả mô phỏng
Trang 10Hình 1.9 - nhấn nút quay phải
Trang 11Hình 2.1 - nhấn nút stop
Hình 2.2 - dùng biến trở điều chỉnh tốc độ động cơ
Trang 12PHẦN 3 LẬP TRÌNH
1.1 Lưu đồ thuật toán
1.1.1.Câu 1- dùng timer điều khiển led
1.1.2.Câu 2- dùng rs232 điều khiển led
Trang 13Câu 3- điều khiển động cơ
Trang 141.2.Giải thích code
1.1.1 câu 1- dùng timer điều khiển led
#include <bai_1_de_2.h>
unsigned int16 count=12;
unsigned int16 i=0;
int8 seg[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};// các giá trị của
mảng sẽ sáng lần lượt từ port b0 đến b7
int k=0;
#INT_TIMER1// chỉ thị ngắt timer 1_interrupt
// hàm ngắt timer1
void timer1_interrupt(){
i++;
if(i>=count){ khi i> count thì xảy ra một lần ngắt
i=0;// gán i về =0
k++;// cộng k lên một đơn vị
if(k>7){//nếu nó lớn hơn phần tử của mảng thì gán về =0
k=0;
}
output_b(seg[k]); // output ra vị trí k của mảng
}
set_timer1(3036);// cài đặt giá trị đặt trước cho thanh ghi timer1
clear_interrupt(INT_TIMER1);// xóa cờ ngắt timer 1
}
void main()
{
clear_interrupt(INT_TIMER1);// xóa cờ ngắt timer 1
enable_interrupts(INT_TIMER1);// cho phép ngắt timer 1
Trang 15enable_interrupts(GLOBAL);// cho phép ngắt toàn cục
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);// cài đặt bộ chia trc cho
timer 1
set_timer1(3036);//cài đặt giá trị đặt trước cho thanh ghi timer1
Output_b(0x01);// ban đầu port b0 sáng.
while(TRUE)
{
}
}
1.1.2.Câu 2- dùng rs232 điều khiển led
+ code truyền
#include <TRUYEN.h>
#use rs232(uart1,baud=9600)// khai báo sử dụng rs232 trong ccs
char c;
void main()
{
while(true){
if(input(pin_B0)==0){ // nếu nút B0 được nhấn thì gán c bằng kí tự 0 while(input(pin_B0)==0);
c='0';
putc(c);// xuất kí tự đi
}
if(input(pin_B1)==0){// nếu nút B1 được nhấn thì gán c bằng kí tự 1
while(input(pin_B1)==0);
c='1';
putc(c);// xuất kí tự đi
}
if(input(pin_B2)==0){// nếu nút B2 được nhấn thì gán c bằng kí tự 2
Trang 16c='2';
putc(c);// xuất kí tự đi
}
if(input(pin_B3)==0){// nếu nút B3 được nhấn thì gán c bằng kí tự 3 while(input(pin_B3)==0);
c='3';
putc(c);// xuất kí tự đi
}
}
}
+ code nhận
#include <nhan.h>
#use rs232(uart1,baud=9600)// khai báo sử dụng rs232 trong ccs char c;
void main()
{
while(TRUE)
{
if(kbhit()==1){// kiểm tra có nhận được kí tự chưa
c=getc();// đọc kí tự nhận được từ chân RC7 và lưu vào biến c }
if(c=='0'){// nếu kí tự nhận được là 0 thì sáng port B0
output_b(0x01);
}
if(c=='1'){// nếu kí tự nhận được là 1 thì sáng port B1
output_b(0x02);
Trang 17if(c=='2'){// nếu kí tự nhận được là 2 thì sáng port B2 output_b(0x04);
}
if(c=='3'){// nếu kí tự nhận được là 3 thì sáng port B3 output_b(0x08);
}
}
}
1.1.3.câu 3- điều khiển động cơ
#include <main.h>
#define LCD_ENABLE_PIN PIN_D2
#define LCD_RS_PIN PIN_D0
#define LCD_RW_PIN PIN_D1
#include<lcd.c>// khai báo cho màn hình lcd
int8 k=0;
#INT_RB// chỉ thị ngắt rb
// hàm ngắt rb interrupt
void rb_interrupt(){
clear_interrupt(INT_RB);// xóa cờ ngắt port
if(input(pin_B5)==0){//stop
k=1;// nếu nút B5 được nhấn thì gán k=1
}
if(input(pin_B6)==0){//quay trai
k=2;// nếu nút B6 được nhấn thì gán k=2
Trang 18IF(input(PIN_B7)==0){//quay thuan
k=3;// nếu nút B7 được nhấn thì gán k=3
}
}
void lcd_imp(int16 value){// hàm hiển thị lcd
int8 thousand,hundred,tens,units;
thousand=value/1000;// số hàng nghìn
hundred=(value%1000)/100;// số hàng trăm
tens=((value%1000)%100)/10;// số hàng chục
units=(value%1000)%10;// số hàng đơn vị
lcd_gotoxy(1,1);// vị trí in ra số hàng nghìn
lcd_putc(thousand+48);// in ra số hàng nghìn
lcd_gotoxy(2,1);// vị trí in ra số hàng trăm
lcd_putc(hundred+48);// in ra số hàng trăm
lcd_gotoxy(3,1);// vị trí in ra số hàng chục
lcd_putc(tens+48);// in ra số hàng chục
lcd_gotoxy(4,1);// vị trí in ra số hàng đơn vị
lcd_putc(units+48);// in ra số hàng đơn vị
}
void main()
{
int16 value=0;
lcd_init();// khởi tạo màn hình lcd
lcd_putc('\f');// xóa màn hình trắng
clear_interrupt(INT_RB);// xóa cờ ngắt port b
enable_interrupts(INT_RB);// cho phép ngắt port b
Trang 19setup_adc_ports(ALL_ANALOG);// cấu hình các chân analog
setup_adc(ADC_CLOCK_INTERNAL);// cấu hình adc
set_adc_channel(1);//chọn kênh để đọc giá trị adc
setup_timer_2(T2_DIV_BY_16,0XFF,1);//cấu hình timer 2 để tạo period setup_ccp1(CCP_PWM);//cấu hình ccp1 hoạt động ở chế độ pwm
while(TRUE)
{
switch(k){
case 1:// nếu biến k =1 thì dừng động cơ
output_bit(PIN_B0,0);
output_bit(PIN_B1,0);
break;
case 2:// khi k = 2 thì động cơ quay trái
output_bit(PIN_B0,0);
output_bit(PIN_B1,1);
break;
case 3:// khi k =3 thì động cơ qua phải
output_bit(PIN_B0,1);
output_bit(PIN_B1,0);
break;
}
value=read_adc();// lưu giá trị adc đọc được vào biến value
set_pwm1_duty(value);// cái đặt tốc độ động cơ bằng value
lcd_imp(value);// hiển thị giá trị value lên lcd
}
}
Trang 20PHẦN 4 KẾT LUẬN
Qua phần tiểu luận này giúp em hiểu biết hơn về cách hoạt động của timer,ngắt ngoài ,ngắt port,chức năng ADC, sử dụng pwm để điều khiển động
cơ và cách sử dụng RS232, hiểu biết một cách tổng quát cách lập trình pic16f877A để điều khiển các thiết bị