You are on page 1of 8

ĐÁP ÁN

KIỂM TRA CUỐI HỌC KỲ 1, 2017-2018


Lớp Chính quy CQ – Ngày 29/12/2017
Môn thi: THIẾT KẾ HỆ THỐNG NHÚNG - Thời gian: 90 phút
(Sinh viên được phép tham khảo tài liệu; không được phép sử dụng máy vi tính, laptop)

Bài 1: (3đ) Hãy trả lời câu hỏi sau về ngoại vi cho vi điều khiển PIC16F877
a) (0.5đ) Hãy vẽ mạch giao tiếp ngõ ra RB1 để điều khiển 1 relay thông qua transistor NPN. Cuộn dây relay
được kích bằng điện áp 5V, dòng điện qua cuộn dây khi đó là 100mA. Transistor có hfe bằng 200, V CES =
0V, VBES=0.7V.
Điều kiện để transistor bão hòa: hfe.IBS  ICS
ICS = 100mA
IBS = (VOH – VBES)/ RB = (5-0.7)/RB
(giả sử VOH = 5V)
=> 200.(5-0.7)/RB  ICS
8.2k
=> RB  200.(5-0.7) / 100 = 8.6 k
RB1 Trong các dãy số điện trở: 1, 1.2, 1.5, 1.8, 2.2, 2.4,
2.5,2.7, 3.3, 3.9, 4.7, 5.0, 5.1, 5.6, 6.8, 8.2, 9.1
Chọn RB = 8.2K
(SV chỉ cần chọn 1 đáp án RB  8.6k)

b) (0.5đ) Hãy viết đoạn lệnh CCS C cài đặt cho phép ngắt timer 1, cài đặt timer 1 để có thời gian delay là
250us. Cho tần số clock cấp cho PIC16F877 là 8MHz, tỉ số chia clock Prescaler là 4.
enable_interrupt(int_timer1);
enable_interrupt(global);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);
set_timer1(-125);

c) (1đ) Hãy vẽ mạch giao tiếp truyền UART giữa 2 vi điều khiển PIC16F877 với chế độ song công. Viết
chương trình gửi ký tự “data” với tốc độ baud 2400 từ vi điều khiển này sang vi điều khiển kia.
C3
C1
U1 22pF U2
22pF 13 33 13 33
OSC1/CLKIN RB0/INT OSC1/CLKIN RB0/INT
14
OSC2/CLKOUT RB1
34 X2 14
OSC2/CLKOUT RB1
34
X1 1
MCLR/Vpp/THV RB2
35 4M 1
MCLR/Vpp/THV RB2
35
4M 36 36
2
RB3/PGM
37 C4 2
RB3/PGM
37
C2 3
RA0/AN0 RB4
38 3
RA0/AN0 RB4
38
RA1/AN1 RB5 RA1/AN1 RB5
4 39 4 39
RA2/AN2/VREF- RB6/PGC RA2/AN2/VREF- RB6/PGC
5 40 22pF 5 40
RA3/AN3/VREF+ RB7/PGD RA3/AN3/VREF+ RB7/PGD
22pF 6 6
RA4/T0CKI RA4/T0CKI
7 15 7 15
RA5/AN4/SS RC0/T1OSO/T1CKI RA5/AN4/SS RC0/T1OSO/T1CKI
16 16
RC1/T1OSI/CCP2 RC1/T1OSI/CCP2
8 17 8 17
RE0/AN5/RD RC2/CCP1 RE0/AN5/RD RC2/CCP1
9 18 9 18
RE1/AN6/WR RC3/SCK/SCL RE1/AN6/WR RC3/SCK/SCL
10 23 10 23
RE2/AN7/CS RC4/SDI/SDA RE2/AN7/CS RC4/SDI/SDA
24 24
RC5/SDO RC5/SDO
25 25
RC6/TX/CK RC6/TX/CK
26 26
RC7/RX/DT RC7/RX/DT
19 19
RD0/PSP0 RD0/PSP0
20 20
RD1/PSP1 RD1/PSP1
21 21
RD2/PSP2 RD2/PSP2
22 22
RD3/PSP3 RD3/PSP3
27 27
RD4/PSP4 RD4/PSP4
28 28
RD5/PSP5 RD5/PSP5
29 29
RD6/PSP6 RD6/PSP6
30 30
RD7/PSP7 RD7/PSP7
PIC16F877 PIC16F877

Ghi chú: TX của vi điều khiển này nối với RX của vi điều khiển kia
#use delay(clock = 4000000)
#use rs232(uart1);
void main() {
int y;
setup_uart(2400);
while(1) {
printf(“data”);
putc(13);
delay_ms(500);
}
}

d) (1.0đ) Hãy vẽ sơ đồ mạch giao tiếp I2C giữa 1 vi điều khiển PIC16F877 và EEPROM 24FC256. Viết
đoạn code C để ghi 1 ký tự ‘A’ vào 24FC256 tại địa chỉ 0123h
C1
U1
22pF 13 33
OSC1/CLKIN RB0/INT 5V
14 34
OSC2/CLKOUT RB1
X1 1
MCLR/Vpp/THV RB2
35
4M 36
RB3/PGM
2 37
C2 3
RA0/AN0 RB4
38
RA1/AN1 RB5
4 39
RA2/AN2/VREF- RB6/PGC
5 40
RA3/AN3/VREF+ RB7/PGD
22pF 6
RA4/T0CKI R1 R2
7 15 10k 10k
RA5/AN4/SS RC0/T1OSO/T1CKI
16
8
RC1/T1OSI/CCP2
17 U2
RE0/AN5/RD RC2/CCP1
9 18 6 1
RE1/AN6/WR RC3/SCK/SCL SCK A0
10 23 5 2
RE2/AN7/CS RC4/SDI/SDA SDA A1
24 7 3
RC5/SDO WP A2
25
RC6/TX/CK
26 24FC256
RC7/RX/DT
19
RD0/PSP0
20
RD1/PSP1
21
RD2/PSP2
22
RD3/PSP3
27
RD4/PSP4
28
RD5/PSP5
29
RD6/PSP6
30
RD7/PSP7
PIC16F877

Ghi chú: Phải có điện trở kéo lên nguồn tại 2 chân SCK và SDA
#include <16F877.h>
#use delay(clock = 4000000)
#use i2c(MASTER, SCL=PIN_C3, SDA = PIN_C4)
void main()
{
i2c_start(); // start write cycle
i2c_write(0xA0); // send control byte
i2c_write(0x01); // send high address
i2c_write(0x23); // send low address
i2c_write(‘A’); // send data
i2c_stop();
}

Bài 2: (4đ) Cho thiết kế nhúng của máy đo nồng độ cồn được mô tả như sau:
 Hệ thống gồm: 2 nút bấm START và CLEAR, 1 cảm biến nồng độ cồn MQ-3, và 1 màn hình hiển thị số
đếm, 1 LED màu đỏ, 1 LED màu xanh, và nguồn PIN ngõ ra 5V / 2000mAh
 Hoạt động: khi bấm nút START hệ thống đọc cảm biến nồng độ cồn và hiển thị giá trị đo được theo thang
8bit (0-255) lên màn hình hiển thị. Nếu giá trị đọc được >100 thì LED màu đỏ sáng, ngược lại LED màu
xanh sáng. Khi bấm CLEAR thì hệ thống reset và màn hình hiển thị 0, đồng thời 2 LED tắt.
Ghi chú:
-Cảm biến MQ-3 có ngõ ra analog 0~5V
-Sinh viên tự chọn vi điều khiển, bộ hiển thị, ngõ giao tiếp nút bấm, nguồn pin.

a) (0.5đ) Hãy viết đặc tả kỹ thuật cho hệ thống (yêu cầu ghi rõ ngõ vào, ngõ ra, nguyên lý hoạt động, và các
constrains)
Đặc tả kỹ thuật:
Ngõ vào: 2 nút bấm START, CLEAR, cảm biến MQ-3
Ngõ ra: Màn hình LCD
Nguyên lý hoạt động: khi bấm nút START hệ thống đọc cảm biến nồng độ cồn và hiển thị giá trị đo
được theo thang 8bit (0-255) lên màn hình hiển thị. Nếu giá trị đọc được >150 thì LED màu đỏ sáng,
ngược lại LED màu xanh sáng. Khi bấm CLEAR thì hệ thống reset và màn hình hiển thị 0, đồng thời 2
LED tắt.
Constrains:
- Giá thành rẻ: <200.000đ
- Khối lượng nhẹ <300g
- Nguồn 5V cấp tối thiểu 2000mAh
b) (0.5đ) Hãy viết đặc tả phần cứng cho hệ thống và vẽ sơ đồ khối (cần ghi rõ loại vi điều khiển, loại hiển
thị, loại nguồn pin, ngõ giao tiếp nút bấm là chân nào)
Đặc tả phần cứng
Vi điều khiển: PIC16F877, thạch anh 4MHz
Loại hiển thị: LCD1602 giao tiếp song song 4 bit
Nút nhấn: tích cực mức 0, nút START, CLEAR giao tiếp các chân RB0, MCLR
Nguồn: sử dụng PIN Li-ion 9V, IC ổn áp 7805
Sơ đồ khối:

Vi điều khiển LCD1602


Nút START
PIC16F877
Nút CLEAR

Cảm biến LED đỏ


MQ-3
LED xanh
Nguồn pin

c) (1.0đ) Hãy vẽ sơ đồ chi tiết của hệ thống (vẽ cả mạch nguồn).


C1
U1
1uF 13 33 START
OSC1/CLKIN RB0/INT
X1 14
OSC2/CLKOUT RB1
34 LED-RED
35 LED-GREEN
C2 4MHz
AOUT 2
RB2
36 LCD1
RA0/AN0 RB3/PGM LM016L
3 37
RA1/AN1 RB4
4 38
RA2/AN2/VREF-/CVREF RB5
1uF 5 39
RA3/AN3/VREF+ RB6/PGC
6 40
RA4/T0CKI/C1OUT RB7/PGD
7
RA5/AN4/SS/C2OUT
15
RC0/T1OSO/T1CKI
R3 8 16
RE0/AN5/RD RC1/T1OSI/CCP2
9 17
RE1/AN6/WR RC2/CCP1 VDD
VSS

VEE
10 18

RW
RS

D0
D1
D2
D3
D4
D5
D6
D7
10k RE2/AN7/CS RC3/SCK/SCL

E
23
CLEAR 1
RC4/SDI/SDA
24
MCLR/Vpp/THV RC5/SDO
1
2
3

4
5
6

7
8
9
10
11
12
13
14
25
RC6/TX/CK
26
RC7/RX/DT
19
RD0/PSP0
20
RD1/PSP1
21
RD2/PSP2
R1 RD3/PSP3
22
10k 27
RD4/PSP4
28
START RD5/PSP5
29
RD6/PSP6
START 30
RD7/PSP7
PIC16F877A

D1
LED-RED
R2
MQ-3
DOUT U2 10k
LED-RED
AOUT 7805

1 3
VI VO D2
R4
GND

LED-GREEN
10k
BAT1 LED-GREEN
C3 C4
2

9V
100uF 1000uF

d) (1đ) Hãy viết đặc tả phần mềm và vẽ lưu đồ giải thuật chương trình chính của hệ thống.
Đặc tả phần mềm
Yêu cầu phần mềm:
- Đọc trạng thái nút nhấn, đọc cảm biến nồng độ cồn, hiển thị lên LCD, và cảnh báo bằng LED đỏ
và xanh
Các hàm chức năng:
- Hàm đọc cảm biến nồng độ cồn: đọc ADC và lưu giá trị vào 1 biến
- Hàm hiển thị LCD: hiển thị số tối đa 255 (cần số 8bit)
- Hàm chính điều khiển: đọc trạng thái nút nhấn, hiển thị giá trị nồng độ cồn, và báo LED xanh và
đỏ
Lưu đồ chương trình chính

Ghi chú: nút CLEAR chính là chân RESET, nên không cần lập trình cho nút này

RESET

Khởi động LCD, ADC

M =0; tắt 2 LED

Hiển thị LCD giá trị M

N START?
Y
Cập nhật LCD
Đọc ADC và lưu vào M
N

N
M>100 Bật LED xanh
?
Y
Bật LED đỏ

e) (1đ) Hãy viết chương trình CCS C điều khiển hệ thống trên.
#include <16f877a.h>
#device ADC=8
#use delay(clock = 4000000)
#include <LCD.C>
int read_key()
{
if(input(PIN_B0)==1)
{ delay_ms(10); //delay chong rung phim
if (input(PIN_B0)==1)
{ while (input(PIN_B0)==1);//cho phim nha
return 1;//nut START
}
}
return 0;
}
void main()
{
int nongdo=0;
lcd_init();
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(RA_ANALOG);
set_adc_channel(0);
output_low(PIN_RB1);
output_low(PIN_RB2);
lcd_gotoxy(1,1);
printf(lcd_putc,"Nhan START...");

while (1)
{
if(read_key())
{ nongdo = read_adc();
if (nongdo>100) output_high(PIN_RB1);
else output_high(PIN_RB2);
lcd_gotoxy(1,1);
printf(lcd_putc,"Nong do con:");
lcd_gotoxy(14, 2);
printf(lcd_putc,"%3u", nongdo);
}

}
}

Bài 3: (3đ) Cho một hệ thống nhúng điều khiển khóa cửa ra vào sử dụng đầu đọc RFID
 Vi điều khiển trung tâm: PIC16F877, thạch anh 20MHz
 Ngoại vi:
o Đầu đọc thẻ RFID giao tiếp UART với vi điều khiển
o Ngõ ra điều khiển đóng/mở chốt cửa thông qua transistor NPN.
(Chốt cửa được đóng bằng cách cấp điện áp 12V vào hai đầu cuộn dây điều khiển)
Hoạt động: Sau khi reset, vi xử lý cho phép ngắt nhận UART (#int_rda) và chờ dữ liệu gửi từ đầu đọc
RFID. Khi người dùng đưa thẻ RFID vào, đầu đọc thẻ sẽ gửi 5 byte liên tiếp đến vi điều khiển. Khi nhận đủ 5
byte, vi điều khiển so sánh với 5 byte khóa KEY đã được định nghĩa trước. Nếu 5 byte dữ liệu giống nhau, vi điều
khiển sẽ điều khiển cửa mở trong 5 giây và sau đó khóa.

a) (1đ) Hãy vẽ sơ đồ mạch chi tiết của hệ thống


C1 U1
13 33
OSC1/CLKIN RB0/INT RXD
14 34
OSC2/CLKOUT RB1
1uF 35
RB2 TXD
X1 2
RA0/AN0 RB3/PGM
36
20MHz 3 37
C2 4
RA1/AN1 RB4
38
RTS
RA2/AN2/VREF-/CVREF RB5
5 39
RA3/AN3/VREF+ RB6/PGC CTS
6 40
RA4/T0CKI/C1OUT RB7/PGD
1uF 7
RA5/AN4/SS/C2OUT
15 RFID reader
RC0/T1OSO/T1CKI
8 16
RE0/AN5/RD RC1/T1OSI/CCP2 +12V
9 17
RE1/AN6/WR RC2/CCP1
10 18
RE2/AN7/CS RC3/SCK/SCL
R3 RC4/SDI/SDA
23
1 24
MCLR/Vpp/THV RC5/SDO
10k RC6/TX/CK
25 CHOT CUA
26
RC7/RX/DT
RESET D1
19 DIODE
RD0/PSP0
20
RD1/PSP1
21
RD2/PSP2
22
RD3/PSP3
RD4/PSP4
27 R12 Q1
28 RELAY
RD5/PSP5 NPN
29 1k
RD6/PSP6
30
RD7/PSP7
PIC16F877A

b) (1đ) Hãy vẽ lưu đồ giải thuật chương trình chính điều khiển hệ thống

RESET

c) (1đ) Hãy viết chương trình CCS CUART


Khởi động điều khiển hệ thống
#include "16F877A.h"
#use delay(clock = 20000000)
#use rs232(UART1) Cho phép ngắt nhận UART
const int KEY[5] = {1, 2, 3, 4, 5};
int A[5];
int1 key_out=0; N
Nhận đủ 5
int i=0;
byte?
int1 sosanh() Y
{
So sánh 5 byte với KEY
int k=0;
int out=1;
N
for(k=0; k<5; k++)
Đúng KEY?
{ if (A[k]!=KEY[k]) out = 0;
} Y
return out; Điều khiển mở khóa
}
#int_rda
void rda_isa() Delay 5 giây
{
A[i]=getc()-0x30;// convert from ASCII code to number
Điều khiển đóng khóa
printf("%d: %d \n", i, A[i]);// for debugging
putc(13);
i++;
}
void main()
{
delay_ms(500);
setup_uart(9600);
enable_interrupts(int_rda);
enable_interrupts(global);
printf("start");putc(13);
output_high(PIN_E0);
while(1) {
if (i==5)
{ i = 0;
key_out = sosanh();
printf("key_out = %d \n", key_out);putc(13); // for debugging
}
if(key_out)
{ output_high(PIN_D0);
delay_ms(5000);
output_low(PIN_D0);
key_out = 0;
}
}
}

You might also like