BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ TP. HỒ CHÍ MINH
BÀI TIỂU LUẬN
Tên học phần: Thực hành Vi Điều Khiển
Kỳ thi học kỳ 2 đợt B năm học 2020 -2021
Giảng viên hướng dẫn: Phạm Quốc Thiện
Sinh viên thực hiện:
Nguyễn Vũ Hoàng Huy
MSSV
Nguyễn Văn Pháp
MSSV
Lê Minh Tiến
MSSV
Nguyễn Văn Phước
MSSV
Lớp: 19DOTD2
Ngành: Công nghệ kỹ thuật ô tô
Khoa/Viện: Viện kỹ thuật
Tp.HCM, ngày … tháng … năm …
Tieu luan
1
Câu 1: Viết chương trình điều khiển các led bằng hai cách sử dụng ngắt ngồi và
khơng ngắt ngồi theo qui luật sau: Mỗi lần bấm vào phím bấm nối với chân RB0, đèn
sẽ sáng theo số lần bấm: bấm 1 lần đèn D1 sáng, bấm 2 lần đèn D2 sáng,… bấm 8 lần
đèn D9 sáng, bấm 9 lần quay lại chu trình trên
BÀI LÀM:
Cách 1: Ngắt ngồi
#include <16F877A.h>
#fuses HS
#use delay(clock = 20000000)
unsigned int8 maled[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
signed int16
tt;
#int_ext
void ktr_nn()
{
tt++;
if(tt>8)
tt=0;
}
void main()
{
set_tris_b(0x01);
set_tris_c(0x00);
enable_interrupts(int_ext);
enable_interrupts(global);
ext_int_edge(INT_EXT_H2L);
tt=0;
while(true)
{
output_c(maled[tt]);
}
}
Tieu luan
2
Cách 2: Khơng ngắt ngồi
#include <16F877A.h>
#fuses HS
#use delay(clock = 20000000)
#define
nn
pin_b0
unsigned int8 maled[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
signed int16
tt;
void main()
{
set_tris_b(0x01);
set_tris_c(0x00);
tt=0;
while(true)
{
output_c(maled[tt]);
if(input(nn)==0)
{
delay_ms(20);
if(input(nn)==0)
{
tt++;
if(tt>8)
tt=0;
output_c(maled[tt]);
while(input(nn)==0);
}
}
}
}
Tieu luan
3
Câu 2: Cho sơ đồ mạch viết và giải thích ý nghĩa câu lệnh sử dụng trong chương trình
a. Thực hiện đếm 0 - 59 và hiển thị trên led 7 dùng ngắt Timer (Thạch anh 4Mhz)
b. Thực hiện bằng hai cách dùng ngắt ngồi và khơng ngắt ngồi cho nút nhấn. Mỗi
lần nhấn nút số đếm tăng lên cho đến khi lớn hơn 59 thì quay lại về 0
BÀI LÀM:
Cách 1: Ngắt ngoài
#include <16F877A.h>
#fuses HS
#use delay(clock = 4000000)
unsigned int8 maled[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
signed int16
int1
tt;
quet;
#int_ext
void ktr_nn()
{
tt++;
if(tt>59)
tt=0;
}
#int_timer1
void ngat_timer()
{
set_timer1(60536);
quet=~quet;
if(quet==0)
{
output_c(0x00);
output_d(maled[tt/10]);
output_c(0x02);
}
else
{
output_c(0x00);
output_d(maled[tt%10]);
Tieu luan
output_c(0x01);
4
}
void main()
{
set_tris_b(0x01);
set_tris_c(0x00);
set_tris_d(0x00);
setup_timer_1(t1_internal|t1_div_by_1);
set_timer1(60536);
enable_interrupts(int_timer1);
enable_interrupts(int_ext);
enable_interrupts(global);
ext_int_edge(INT_EXT_H2L);
tt=0;
while(true)
{
}
}
Cách 2: Khơng ngắt ngồi
#include <16F877A.h>
#fuses HS
#use delay(clock = 4000000)
#define
nn
pin_b0
unsigned int8 maled[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
signed int16
int1
tt;
quet;
#int_timer1
void ngat_timer()
{
set_timer1(60536);
quet=~quet;
if(quet==0)
Tieu luan
5
{
output_c(0x00);
output_d(maled[tt/10]);
output_c(0x02);
}
else
{
output_c(0x00);
output_d(maled[tt%10]);
}
}
void main()
{
set_tris_b(0x01);
set_tris_c(0x00);
set_tris_d(0x00);
setup_timer_1(t1_internal|t1_div_by_1);
set_timer1(60536);
enable_interrupts(int_timer1);
enable_interrupts(global);
tt=0;
while(true)
{
if(input(nn)==0)
{
delay_ms(20);
if(input(nn)==0)
{
tt++;
if(tt>59)
tt=0;
while(input(nn)==0);
}
}
}
}
Tieu luan
output_c(0x01);
6
Câu 3: Cho sơ đồ mạch, viết chương trình và giải thích ý nghĩa các câu lệnh, theo yêu
cầu sau:
a. PIC (U1) sử dụng ADC kênh 0 và hiển thị giá trị lên LCD1
b. Truyền giá trị ADC của kênh 0 từ PIC (U1) đến PIC (U2) bằng giao tiếp UART và
hiển thị trên LCD2
BÀI LÀM:
a.
#include <16F877A.h>
#device
adc=10
#fuses HS
#use delay(clock = 20000000) //Su dung thach anh 20Mhz
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
#define LCD_ENABLE_PIN PIN_d6
#define LCD_RS_PIN
PIN_d4
#define LCD_RW_PIN
PIN_d5
#define LCD_DATA4
PIN_d0
#define LCD_DATA5
PIN_d1
#define LCD_DATA6
PIN_d2
#define LCD_DATA7
PIN_d3
#include <lcd.c>
signed int32
adc,da;
void main()
{
set_tris_a(0x01);
set_tris_d(0x00);
set_tris_c(0x80);
lcd_init();
setup_adc(adc_clock_div_2);
Tieu luan
7
setup_adc_ports(an0);
set_adc_channel(0);
while(true)
{
adc=read_adc();
da=adc*5000/1023;
putc(da/1000);
delay_ms(100);
putc(da/100%10+10);
delay_ms(100);
putc(da/10%10+20);
delay_ms(100);
putc(da%10+30);
delay_ms(100);
lcd_gotoxy(1,1);
lcd_putc("
DIEN AP
");
lcd_gotoxy(1,2);
lcd_putc("
");
lcd_putc(da/1000+0x30);
lcd_putc(da/100%10+0x30);
lcd_putc(da/10%10+0x30);
lcd_putc(da%10+0x30);
lcd_putc("mV
");
}
}
b.
#include <16F877A.h>
#device
adc=10
#fuses HS
#use delay(clock = 20000000) //Su dung thach anh 20Mhz
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
#define LCD_ENABLE_PIN PIN_d6
#define LCD_RS_PIN
#define LCD_RW_PIN
PIN_d4
PIN_d5
Tieu luan
8
#define LCD_DATA4
PIN_d0
#define LCD_DATA5
PIN_d1
#define LCD_DATA6
PIN_d2
#define LCD_DATA7
PIN_d3
#include <lcd.c>
signed int32
ng,tr,ch,dv,da,chay;
unsigned int8
data;
void main()
{
set_tris_a(0x01);
set_tris_d(0x00);
set_tris_c(0x80);
lcd_init();
chay=0;
while(true)
{
if(kbhit())
/
{
data=getch();
if(data<10)
ng=data;
else if(data<20)
tr=data-10;
else if(data<30)
ch=data-20;
else if(data<40)
dv=data-30;
chay++;
if(chay>3)
{
chay=0;
da=ng*1000 + tr*100 + ch*10 + dv;
}
Tieu luan
9
}
lcd_gotoxy(1,1);
lcd_putc("
DIEN AP
");
lcd_gotoxy(1,2);
lcd_putc("
");
lcd_putc(da/1000+0x30);
lcd_putc(da/100%10+0x30);
lcd_putc(da/10%10+0x30);
lcd_putc(da%10+0x30);
lcd_putc("mV
");
}
}
Tieu luan