You are on page 1of 20

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Ỳ

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

1
Mụ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

2
Mụ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

3
PHẦ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 :

1 500.000 / 1=500.000

2 500.000 / 2=250.000

4 500.000 / 4 =125.000

8 500.000 / 8 = 62.500

==> chọn bộ chia trước prescaler = 8

Giá trị đặt trước cho thanh ghi TMR1: value = 65536-62500 = 3036
20.000.000
Số lần ngắt: count = 5 = 12
4.8.(65536−3036).
6

1
PHẦ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

2
Hình 1.2- chu kỳ đầu tiên

Hình 1.3- chu kỳ tiếp theo

3
RB0 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

4
Hì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ơ

5
Hì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

6
Hình 1.9 - nhấn nút quay phải

Hình 2.0 - nhấn nút quay trái

7
Hì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ơ

8
PHẦ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

9
Câu 3- điều khiển động cơ

10
1.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

11
enable_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

12
while(input(pin_B2)==0);
c='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);
}

13
if(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
#define LCD_DATA4 PIN_D4
#define LCD_DATA5 PIN_D5
#define LCD_DATA6 PIN_D6
#define LCD_DATA7 PIN_D7
#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

14
}
IF(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
enable_interrupts(GLOBAL);// cho phép ngắt toàn cục

15
setup_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
}
}

16
PHẦ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ị .

17

You might also like