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

Đề thi lập trình nhúng giữa kì có đáp án

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 (86.16 KB, 4 trang )

ĐH Quốc Gia Tp.HCM
ĐH Bách Khoa
Khoa Điện-Điện tử
Bộ môn Điện tử
o0o

ĐỀ THI GIỮA HỌC KỲ 2, 2011-2012
Lớp CQ DD08
Môn thi: Lập trình nhúng - Thời gian: 50 phút

(Sinh viên được phép tham khảo tài liệu;
Sinh viên không được phép sử dụng máy vi tính, laptop)



Bài 1: (3 điểm) Cho 2 đoạn code C sau:
(a)

(b)

char
func
(void)

{

static char sum1 = 0;
char sum2 = 0;
sum1 = sum1 + 1;
sum2 = sum2 + 2;
return (sum1 + sum2);


}
void main(void) {
char i;
char S=0;
for(i=0;i<3;i++) S = S+func();
}
int inc(int a, int *b
)

{

a = a*2;
(*b) ++;
return a + (*b);
}
void main(void) {
int i;
int n1 = 2;
int n2 = 3;
int T=0;
for(i=0;i<3;i++) T += inc (n1, &n2 );
}
a) Sau khi thực hiện chương trình (a), kết quả biến S là bao nhiêu? Giải thích.
b) Sau khi thực hiện chương trình (b), giá trị của biến T là bao nhiêu? Giải thích.
Trả lời:
Chú ý: bi
ế
n static lưu giá tr



cũ sau khi thoát
khỏi hàm
Vòng lặp i=0
sum1 = 0 + 1 = 1
sum2 = 0 + 2 = 2
S = 0+3 = 3
Vòng lặp i=1
sum1 = 1 + 1 = 2
sum2 = 0 + 2 = 2
S = 3+4 = 7
Vòng lặp i=2
sum1 = 2 + 1 = 3
sum2 = 0 + 2 = 2
S = 7+5=12
=> Đáp án là S = 12

Chú ý: đ

i s


ki

u con tr


s


lưu giá tr



cũ sau
khi thoát khỏi hàm, đối số kiểu truyền giá trị sẽ
không thay đổi giá trị sau khi thoát khỏi hàm
Vòng lặp i=0
n1 = 2
n2 = 3 + 1 = 4
T = 8
Vòng lặp i=1
n1 = 2
n2 = 4 + 1 = 5
T = 8 + 9 = 17
Vòng lặp i=2
n1 = 2
n2 = 5 + 1 = 6
T = 17 + 10 = 27
=> đáp án là T = 27


Bài 2: (3 điểm) Hãy viết chương trình C cho vi điều khiển 8051 theo yêu cầu sau:
• Vi điều khiển đọc giá trị nhị phân 8-bit không dấu tại Port 0 và Port1
• Nếu giá trị tại Port 0 > giá trị tại Port 1 thì ngõ ra P3.0 bằng 1
• Nếu giá trị tại Port 0 < giá trị tại Port 1 thì ngõ ra P3.1 bằng 1
• Nếu giá trị tại Port 0 = giá trị tại Port 1 thì ngõ ra P3.2 bằng 1
• Những trường hợp khác P3.0, P3.1, P3.2 bằng 0.
Hãy viết chương trình C theo cấu trúc 2 files:
• main.h: mô tả định nghĩa các Port vào và ra
• main.c: thực hiện tạo ngõ ra theo giải thuật đề ra
Trả lời:

/* main.h */

sfr P0 = 0x80;
sfr P1 = 0x90;
sfr P3 = 0xB0;
sbit GT = P3^0;
sbit LT = P3^1;
sbit EQ = P3^2;
/* main.c */

#include "main.h"
void main() {
char A, B;
while(1){
A = P0; B = P1;
if (A>B)
{ GT = 1; LT = 0; EQ = 0;
}
else if (A<B)
{ GT = 0; LT = 1; EQ = 0;
}
else
{ GT = 0; LT = 0; EQ = 1;
}
}
}


Bài 3: (4 điểm) Cho một hệ thống nhúng sử dụng 8051 thực hiện 2 tác vụ sau:
• Tác vụ 1: Hiển thị 8 LED đuổi bắt tại Port 1, mỗi chu kỳ 1 LED sáng trong 1 giây, tích cực mức 0.

• Tác vụ 2: Hiển thị 8 LED chớp tắt luân phiên chẵn lẻ tại Port3, ví dụ: trong chu kỳ 1, LED 0, 2, 4,
6 sáng; trong chu kỳ 2, LED 1, 3, 5, 7 sáng, LED tích cực mức 0. Chu kỳ chớp tắt là 0.5 giây.

a) (1 điểm) Hãy vẽ sơ đồ máy trạng thái cho hệ thống trên
b) (3 điểm) Hãy viết chương trình C để thực hiện chức năng điều khiển hệ thống trên.

Trả lời:
a) Sơ đồ máy trạng thái











P1=7F

P1=BF

P1=DF

P1=EF

P1=FB

P1=F7


P1=FD

P1=FE

P3=AA

P3=55

b) Chương trình C
/* main.h */

sfr P1 = 0x90;
sfr P3 = 0xB0;

/* main.c */

#include "main.h"
void delay500ms() {
int i;
for(i=0;i<250;i++); // phụ thuộc vào clock sử dụng
}
void update_led_chasing()
{
static char state;
switch(state)
{
case 0:
P1 = 0x7F; state = 1; break;
case 1:

P1 = 0xBF; state = 2; break;
case 2:
P1 = 0xDF; state = 3; break;
case 3:
P1 = 0xEF; state = 4; break;
case 4:
P1 = 0xF7; state = 5; break;
case 5:
P1 = 0xFB; state = 6; break;
case 6:
P1 = 0xFD; state = 7; break;
case 7:
P1 = 0xFE; state = 0; break;
default:
state = 0; P1 = 0xFF; break;
}
}
void update_led_blinking()
{
static char state;
switch(state)
{
case 0:
P3 = 0xAA; state = 1; break;
case 1:
P3 = 0x55; state = 0; break;
default:
state = 0; P3 = 0xFF; break;
}
}

void main()
{
while(1)
{


update_led_chasing();

update_led_blinking();
delay500ms();
update_led_blinking();
delay500ms();
}
}



Chủ nhiệm bộ môn duyệt Người ra đề

TS. Trương Quang Vinh

×