TRƯỜNG ĐẠI HỌC CÔNG NGHỆ TP... 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ìnha.. Thực hiện bằng hai cách dùng ngắt ngoài và không ngắt ngoài cho nút
Trang 1TRƯỜ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 …
Trang 2Câ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 ngoài và không ngắt ngoà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 ngoà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]);
}
}
Trang 3Cách 2: Không ngắt ngoà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);
}
}
}
}
Trang 4Câ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 ngoài và không ngắt ngoà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 tt;
int1 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]); output_c(0x01);
Trang 5}
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 ngoà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 tt;
int1 quet;
#int_timer1
void ngat_timer()
{
set_timer1(60536);
quet=~quet;
if(quet==0)
Trang 6{
output_c(0x00); output_d(maled[tt/10]); output_c(0x02); }
else
{
output_c(0x00); output_d(maled[tt%10]); output_c(0x01); }
}
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);
}
}
}
}
Trang 7Câ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);
Trang 8setup_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 PIN_d4
#define LCD_RW_PIN PIN_d5
Trang 9#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;
}
Trang 10}
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 ");
}
}