21
1 BÙI QUỐC BẢO LẬP TRÌNH HỆ THỐNG NHÚNG BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 2 Vi ñiều khiển 8051

slide 8051

Embed Size (px)

Citation preview

1

BÙI QUỐC BẢO

LẬP TRÌNH HỆ THỐNG NHÚNG

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 2

Vi ñiều khiển 8051

2

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 3

Vi ñiều khiển 8051

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 4

Phần mềm

� KEIL

� PROTEUS

3

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 5

Cấu trúc bộ nhớ của 8051

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 6

4

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 7

Cấu trúc bộ nhớ của 8051

� 8051 có 3 vùng nhớ riêng biệt (bộ nhớchương trình, bộ nhớ dữ liệu trong, bộnhớ dữ liệu ngoài). Mỗi vùng nhớ ñượctruy cập bằng các câu lệnh khác nhau.

� Khi khai báo các biến, ta phải xác ñịnhvùng nhớ cho các biến ñó.

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 8

Cấu trúc bộ nhớ của ARM7 LPC2000

Các vi xử lý có kiến trúc Von-Newman (VD: ARM) dùngchung 1 không gian nhớ chobộ nhớ chương trình và dữliệu.

5

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 9

Không gian bộ nhớ chương trình

� ðược gọi là code space

� Chứa chương trình và các hằng số� VD: khai báo hằng số chứa bình phương

các số từ 0 ñến 3:code char square[4] = {0,1,4,9};

� Lệnh assembly: MOVC A, @A+DPTR

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 10

Không gian bộ nhớ dữ liệu nội

� Vùng nhớ nội truy xuất trực tiếp (00H-7FH) ñược kýhiệu là data� Lệnh assembly: MOV A, 7FH

� Vùng nhớ nội truy xuất gián tiếp (00H-FFH), ñược kýhiệu idata� Lệnh assembly:

� MOV R0, #80H� MOV A, @R0

� Hai vùng nhớ này dùng ñể chứa các biến thườngdùng và biến tạm

� VD: khai báo một biến integer:� idata unsigned int temp;

6

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 11

Không gian bộ nhớ dữ liệu ngoài

� ðược gọi là external data space (xdata)

� L�nh assembly:� MOV DPTR, #2000H

� MOVX A,@DPTR

� Chứa các biến ít dùng, các khối dữ liệu lớnhoặc ngoại vi theo kiểu memory-mapped

� VD: � xdata unsigned int[1000] ADC_value;

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 12

� VD:

� Viết hàm có prototype như sau:

unsigned int checksum (unsigned int

start, unsigned int end)

ñể tính checksum của vùng nhớch*+ng trình từ ñịa chỉ start ñến end (code)

7

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 13

unsigned int checksum (unsigned int start, unsigned int end)� {� unsigned int code *codeptr, *codeend;� unsigned int data checksum = 0;�

codeptr = (unsigned int code *)start;� codeend = (unsigned int code *)end;�

while (codeptr <= codeend)� {� checksum = checksum + (unsigned int data)*codeptr;� codeptr++; /* go to the next address */� }� return (checksum);� }

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 14

Các kiêủ thông dụng

0 to 4,294,697,295432unsigned long

-2,147,483,648 to 2,147,483,647432long

0 to 65,535216unsigned int

-32,768 to +32,767216int

0 to 65,535216unsigned short

-32,768 to +32,767216short

-32,768 to +32,767216enum

0 to 255 18unsigned char

-128 to +12718char

RangeBytesBitsType

8

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 15

Kiêủ float và double

� Trong C51, kiểu float và double giốngnhau, gồm 4 byte theo chuẩn EEE-754

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 16

Các kiểu ñặc biệt của C51

0 to 65,535 216sf16

0 to 25518sfr

0 or 11sbit

0 or 11bit

RangeBytesBitsType

9

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 17

Thanh ghi

� Keil cho phép khai báo các thanh ghibằng từ khóa sfr

� VD:� sfr P0 = 0x80; //khai báo thanh ghi P0 ở

//ñịa chỉ 80H

� P0 = 0x0F;

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 18

Tác ñộng ñến bit trong SFR

� 8051 có các lệnh tác ñộng ñến bit. ðểtác ñộng ñến bit trong thanh ghi ta dùngkhai báo sbit

� sbit name = sfr-name ^ bit-position;

� sbit name = sfr-address ^ bit-position; sbit name = sbit-address;

10

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 19

Tác ñộng ñến bit trong SFR

� sfr PSW = 0xD0;

� sbit CY = PSW^7;

� sbit CY = 0xD0^7;

� sbit CY = 0xD7;

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 20

Tác ñộng ñến bit trong SFR

� sfr char P0 = 0x80;� sbit SW = P0^0;� void main(void)� {� while(1)� {� SW = !SW;� }� }

ðịa chỉ của các biến sfr, sfr16, sbit phải nằm bênngoài hàm.

11

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 21

Vùng nhớ ñược ñịnh ñịa chỉ bit

� 8051 có vùng nhớ ñược ñịnh ñịa chỉ bit. ðểtác ñộng ñến vùng nhớ này ta dùng khai báobdata

� bdata char temp _at_ 0x2F;

� bit flag = temp ^0;

� void main(void)

� {

flag = 1;

}

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 22

� Lưu ý:

� Các khai báo code, idata, xdata, bdata,

sfr, sbit là ñặc biệt cho trường hợp lậptrình 8051.

12

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 23

� VD:

� Viết chương trình cho 8051 tạo hàm nhưsau:

� P1.0 = P1.1 AND P1.2

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 24

Cấu trúc vòng lặp vô tận (endless loop)

void main(void)

{Task1_init();

Task2_init();

While(1) //m/t vòng l2p vô t4n th5c hi�n task1 và task2

{

Task1();

Task2();

}

}

13

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 25

Endless loop

� Ưu ñiểm:� ðơn giản.

� Dễ thực hiện, sửa lỗi và bảo trì

� Không cần sử dụng nhiều tài nguyên hệthống (VD: timer)

� Dễ dàng thay ñổi ñể chạy với các vi xử lýkhác (portable)

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 26

Endless loop

� Nhược ñiểm:� Không phù hợp với các ứng dụng ñòi hỏi

thời gian chính xác (VD: ñồng hồ số).

� Tiêu tốn năng lượng vì CPU hoạt ñộng ởchế ñộ bình thường trong toàn bộ thời gian

14

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 27

Look-up table

unsigned char code square[]={0,1,4,9,16,25,36,49,64,81};

unsigned char cal_square(unsigned char num){

return square[num];}

Assembly:

MOV A,R7MOV DPTR, #SQUAREMOVC A,@A+DPTRMOV R7,A

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 28

15

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 29

Question

� ðịa chỉ của LED 7 ñoạn là bao nhiêu?

� ðể làm LED hiển thị số 8, ta dùng lệnhcho 8051 như thế nào? (dùng assembly và C)

� Xây dựng bảng mã 7 ñoạn cho LED (chocác số lớn hơn 9 tắt tất cả ñoạn LED).

� Viết chương trình C ñọc giá trị từ 4 SW và hiển thị lên LCD. (Dùng bảng tra ñểlấy mã 7 ñoạn).

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 30

Giao tiếp switch

� Switch là 1 trong những phương phápgiao tiếp chính của hệ thống nhúng

� Các contact cơ khí sẽ bị “rung” khi ñónghoặc mở.

16

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 31

Chống rung

Not pressedPress

detected

delay

Read againConfirmed

Press detected

delay

Read againJust a bounce

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 32

Giao tiếp switch

Với 8051, trước khi ñọcswitch ta phảighi “1” ra bộchốt của chânport ñang giaotiếp switch

17

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 33

� Viết chương trình C ñọc giá trị switch (cóchống rung) và xuất ra LED.

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 34

Giao tiếp keypad

18

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 35

Giao tiếp keypad

� Chương trình getkey():

� Giá trị trả về: mã phím (0-15) hoặc 255 nếu không có phím nhấn.

� Vẽ lưu ñồ

� Viết code C

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 36

Giao tiếp keypad

� Chương trình getkey_Debound()

� Giá trị trả về: mã phím (0-15) hoặc 255 nếu không có phím nhấn.

� Cách thực hiện:

� Nếu trong 20 lần liên tiếp gọi chươngtrình getkey() trả về cùng 1 giá trị, thì ñólà giá trị trả về của getkey_Debound().

19

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 37

Giao tiếp keypad

� Vẽ lưu ñồ cho chương trìnhgetkey_Debound()

� Viết code C

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 38

20

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 39

Giao tiếp keypad

� Viết chương trình getCalKey_Debound():

� Giá trị trả về là 1 trong các ký tự:

� ‘0’, ‘1’, ‘2’, ’3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘C’, ‘=‘, ‘+’, ‘-’, ‘x’, ‘/’ hoặc ‘N’ nếu không cóphím ñược nhấn

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 40

Hàm printf()

� Hàm printf() rất có ích trong quá trình viết vàdebug chương trình.

� Mặc ñịnh, hàm printf xuất 1 chuỗi ký tự raserial port của 8051

� Cấu trúc:

� int printf ( const char * format, ... );

� Chi tiết tham khảo tại:

� http://www.cplusplus.com/reference/clibrary/cstdio/printf/

21

BM Kỹ Thuật ðiện Tử - ðH Bách Khoa TP.HCM 41

Thư viện của Keil C

� Keil C hỗ trợ rất nhiều thư viện như thưviện xuất nhập (stdio), toán (math), …

� Các thư viện và hàm của Keil C có thểtham khảo tại:

http://www.keil.com/support/man/docs/c51/c51_library.htm