Tải bản đầy đủ (.pdf) (10 trang)

(TIỂU LUẬN) TIỂU LUẬN thực hành vi điều khiển 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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (148.91 KB, 10 trang )

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



×