Lập trình C cho 8051 - hcmut.edu.vnbmthanh/ViXuLy/VXL-Ch06-LapTrinhC8051_P1.pdf · Lập trình...

Preview:

Citation preview

ĐẠI HỌC QUỐC GIA TP.HỒ CHÍ MINH

TRƯỜNG ĐẠI HỌC BÁCH KHOAKHOA ĐIỆN-ĐIỆN TỬ

BỘ MÔN KỸ THUẬT ĐIỆN TỬ

11

CHƯƠNG 5

Lập trình C cho 8051

(Phần 1)

Bùi Minh Thành

Bộ môn Kỹ thuật Điện tử - ĐHBK Tp. HCM

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 2

Nội dung

1. Cơ bản về ngôn ngữ C

2. Các lệnh rẽ nhánh và vòng lặp

3. Sử dụng con trỏ và mảng trong C

4. Các hàm và chương trình con

5. Chèn assembly code trong C

6. Mô hình bộ nhớ Keil C51

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 3

Nội dung

1. Cơ bản về ngôn ngữ C

2. Các lệnh rẽ nhánh và vòng lặp

3. Sử dụng con trỏ và mảng trong C

4. Các hàm và chương trình con

5. Chèn assembly code trong C

6. Mô hình bộ nhớ Keil C51

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Giới thiệu

• C là ngôn ngữ gần ngôn ngữ assembly nhất trong tất cả các ngôn ngữ cấp cao

– Lệnh tính toán trên bit

– Con trỏ (định địa chỉ gián tiếp)

• Phần lớn các vi điều khiển đều có C compiler

• Việc phát triển các ứng dụng dùng C sẽ nhanh chóng và thuận lợi hơn assembly.

• C là ngôn ngữ lập trình cấu trúc (không phải là hướng đối tượng)

• Mỗi tác vụ có thể được đóng gói trong một hàm

• Chương trình chính được đóng gói trong hàm main.4

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

C và Assembly

• Advantages

– High-level, structured programming language

– Compiler relieves programmer from some of the hardware details

– Easier to write large, complex software

– Programs more readable

• Disadvantages

– Generally larger machine code.

– Less control and ability to interact with hardware.

– Unclear number of cycles to do something.

5

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Cấu trúc một chương trình trong C

• Các câu lệnh trong C kết thúc bằng dấu “;”

• C phân biệt chữ hoa và chữ thường

• Khi viết chương trình cần chú ý viết chú thích

6

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Các loại biến trong C

7

Dạng biến Số bit Số byte Miền giá trị

Char 8 1 -128 đến 127

Unsigned char 8 1 0 đến 255

Enum 16 2 -32.768 đến 32.767

Short 16 2 -32.768 đến 32.767

Unsigned short 16 2 0 đến 65.535

Int 16 2 -32.768 đến 32.767

Unsigned int 16 2 0 đến 65.535

Long 32 4 -2.147.483.648 đến 2.147.483.647

Unsigned long 32 4 0 đến 4.294.697.295

Dạng biến Số bit Số byte Miền giá trị

Bit 1 0 0 đến 1

Sbit 1 0 0 đến 1

Sfr 8 1 0 đến 255

Sfr16 16 2 0 đến 65.535

Ngoài ra keil C còn

hỗ trợ các loại biến

để truy xuất các

thanh ghi có chức

năng đặc biệt:

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Các biến mở rộng trong Keil C

8

• 8051 extension types

– bit• 8051 bit addressable memory

• 20h to 2Fh

– sbit• A bit inside an SFR (e.g. P1.0)

– sfr• Entire byte of an SFR

– sfr16 • 16-bit SFRs (e.g. DPTR)

• These are special types for accessing 1-bit, 8-bit, and 16-bit special function registers

• Declaration

– sbit, sfr, and sfr16• Declare outside of main() program

• Essentially a friendly EQU for an SFR or SFR bit

– bit• Declare anywhere a normal variable can be declared

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Ví dụ

9

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Bảng hằng ký tự

10

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Các toán tử cơ bản của C• Multiplicative operators: a*b, a/b, a%b (remainder after division,

e.g. 10 modulo 4 = 2)

• Additive operators: a+b, a-b

• Equality operators (boolean return): a==b (is equal?), a!=b (is not equal?)

• Relational operators (boolean) a<b, a<=b, a>b, a>=b

• Logical operators a==b && a==c (AND), a==c||a<b (OR). Some compilers accept the and, or and not keywords.

• Bitwise operators << (left shift), >> (right shift), & (bit-wise AND), ^ (bit-wise XOR), | (bit-wise OR), ~ (bit complement)

11

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Các toán tử cơ bản của C• Increment and decrement a++, a--, ++a, --a

• Unuary operators -a (negative of a), +I, (i), ! (negative logical values), !(a==b) same as (a!=b)

• Sizeof operator sizeof(type) (number of bytes of type is returned) sizeof expression (number of bytes of expression returned)

• Conditional operator ?. It has the form:

conditionalExpression ? trueExpression1 : falseExpression2

12

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Thứ tự ưu tiên

13

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 14

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 15

Nội dung

1. Cơ bản về ngôn ngữ C

2. Các lệnh rẽ nhánh và vòng lặp

3. Sử dụng con trỏ và mảng trong C

4. Chèn assembly code trong C

5. Mô hình bộ nhớ Keil C51

6. Các hàm và chương trình con

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Các lệnh rẽ nhánh

• Cấu trúc if

• Cấu trúc If else

16

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Các lệnh rẽ nhánh

• Cấu trúc switch

17

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Các lệnh vòng lặp• Lệnh While

• Lệnh do while

18

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Các lệnh vòng lặp

• Lệnh for

19

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 20

Nội dung

1. Cơ bản về ngôn ngữ C

2. Các lệnh rẽ nhánh và vòng lặp

3. Sử dụng con trỏ và mảng trong C

4. Chèn assembly code trong C

5. Mô hình bộ nhớ Keil C51

6. Các hàm và chương trình con

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Con trỏ trong Assembly

• Đối với ngôn ngữ assembly, thì con trỏ trong C gần như tương đương với định địa chỉ gián tiếp và nó tương đương với việc sử dụng các thanh ghi R0 và R1 làm con trỏ trong vùng bộ nhớ trong hoặc giá trị 2bytes đặt trong DPTR để trỏ đến vùng RAM ngoài– MOV R0,#40 R0 chứa giá trị 40

– MOV R0,#40

– MOVX A,@R0 R0 trỏ đến địa chỉ 40 ở bộ nhớ ngoài

• Ta cũng có thể sử dụng DPTR chỉ đến 64kB bộ nhớ ngoài– MOVX A,@DPTR đọc bộ nhớ ngoài

21

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Pointer trong C• Mỗi biến trong C có 2 thành phần:

– Giá trị được lưu trong biến đó

– Địa chỉ của biến đó trong bộ nhớ

• Pointer là một biến dùng để lưu giữ địa chỉ của một biến khác, và biến mà pointer trỏ đến là một biến cơ bản.

• Cú pháp của con trỏ:

unsigned char *pointer0;

– Dấu hoa thị phía trước có nghĩa là nội dung chứa trong con trỏ là một địa chỉ chứ không phải là phần dữ liệu để sử dụng tính toán. Kiễu dữ liệu của biến mà pointer0 trỏ đến là unsigned char

22

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Pointer trong C

23

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Mảng trong C

• Mảng là một biến cấu trúc trong đó có nhiều phần tử cùng kiểu, mỗi phần tử là một biến thành phần của mảng. Mỗi biến thành phần này là một biến bình thường và có ước số (subscript) để phân biệt giữa phần tử này và phần tử kia.

• Cú pháp của mảng

Mảng một chiều:

kiểu tên_mảng*kích_thước+;

Mảng hai chiều:

kiểu tên_mảng*kích_thước_chiều1+*kích_thước chiều2];

• Ví dụ:

unsigned char a[10];

unsigned char a[]={0x00, 0x40, 0x88, 0xC0};

24

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Con trỏ và Mảng

25

temp_array[0]

temp_array[1]

temp_array[2]

temp_array[3]

Note: the name of an array is a pointer to the first element:

*temp_array is the same as temp_array[0]

So the following are the same:

n = *temp_array;

n = temp_array[0];

and these are also the same:

n = *(temp_array+5);

n = temp_array[5];

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Các ví dụ

26

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 27

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 28

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 29

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 30

Nội dung

1. Cơ bản về ngôn ngữ C

2. Các lệnh rẽ nhánh và vòng lặp

3. Sử dụng con trỏ và mảng trong C

4. Các hàm và chương trình con

5. Chèn assembly code trong C

6. Mô hình bộ nhớ Keil C51

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Hàm và chương trình con

• Các hàm thường sẽ có giá trị trả về:

Ví dụ:unsigned char tinh_tong(unsigned char a, unsigned char b) {

unsigned char tong;

tong=a+b;

return tong;

}

• Còn các chương trình con thì không có giá trị trả về, mà nó chỉ thực hiện các lệnh bên trong chương trình và sau đó quay về lại chương trình chính:

31

void delay(int time) {

while(time--) {

; /*Khong lam gi ca*/

}

}

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

• Viết chương trình cho led chớp tắt

32

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Sử dụng hàm

33

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Function prototype

34

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Function prototype

35

//Khai báo rồi định nghĩa hàm sau.

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Truyền đối số bằng giá trị và bằng tham khảo

36

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 37

Nội dung

1. Cơ bản về ngôn ngữ C

2. Các lệnh rẽ nhánh và vòng lặp

3. Sử dụng con trỏ và mảng trong C

4. Các hàm và chương trình con

5. Chèn assembly code trong C

6. Mô hình bộ nhớ Keil C51

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Inline assembly

• When it is more efficient, or easier, can insert assembly code in C programs.

#pragma asm

//put your assembly code here

#pragma endasm

38

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 39

Chương trình switch

và led:

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 40

Nội dung

1. Cơ bản về ngôn ngữ C

2. Các lệnh rẽ nhánh và vòng lặp

3. Sử dụng con trỏ và mảng trong C

4. Các hàm và chương trình con

5. Chèn assembly code trong C

6. Mô hình bộ nhớ Keil C51

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

C51 Memory Models

• Small

– All variables stored in internal data memory

• Be careful –stack is placed here too

– Generates the fastest, most efficient code

– Default model for Keil uVision Projects

• Compact

– All variables stored in 1 page (256 bytes) of external data memory

– Accessed using MOVX @R0

– Slower than small model, faster than large model

• Large

– All variables stored in external data memory (up to 64KByte)

– Accessed using MOVX @DPTR

– Generates more code than small or compact models

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

C51 Memory Models (con’t)

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

C51 Memory Models (con’t)

• Memory type extensions allow access to all 8051 memory types.

– A variable may be assigned to a specific memory space

– The memory type may be explicitly declared in a variable declaration• variable_type <memory_type> variable_name;

• e.g. int data x;

• Program Memory

– CODE memory type

– Up to 64Kbytes (some or all may be located on 8051 chip)

• Data Memory

– 8051 derivatives have up to 256 bytes of internal data memory

– Lower 128 bytes can be directly or indirectly addressed

– Upper 128 bytes shares the same address space as the SFR registers and can only be indirectly addressed

– Can be expanded to 64KBytes off-chip

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

C51 Memory Models (con’t)

• code

– Program memory (internal or external).

– unsigned char code const1 = 0x55;//define a constant

– char code string1*+ = “hello”;//define a string

• data

– Lower 128 bytes of internal data memory

– Accessed by direct addressing (fastest variable access)

– unsigned intdata x;//16-bit variable x

• idata

– All 256 bytes of internal data memory (8052 micro)

– Accessed by indirect addressing (slower)

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

C51 Memory Models (con’t)

• bdata

– Bit addressable area of internal data memory (addresses 20H to 2FH)

– Allows data types that can be accessed at the bit level

– unsigned char bdatastatus;

– sbit flag1 = status^0;

• xdata

– External data memory

– Slower access than internal data memory

– unsigned char xdata var1;

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

8051 Memory Usage

• In a single chip 8051 application data memory is scarce

– 128 or 256 bytes on most 8051 derivatives

• Always declare variables as the smallest possible data type

– Declare flags to be of type bit

– Use chars instead of intswhen a variable’s magnitude can be stored as 8 bits

• Use code memory to store constants and strings

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

I/O PROGRAMMING

47

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Byte Size I/O

48

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 49

Byte Size I/O (cont’)

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 50

Byte Size I/O (cont’)

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Bit-addressable I/O

51

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 52

Bit-addressable I/O (cont’)

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 53

Bit-addressable I/O (cont’)

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Accessing SFR Addresses 80 - FFH

54

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 55

Accessing SFR Addresses 80 – FFH (cont’)

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Using bit Data Type for Bit-addressable RAM

56

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

LOGIC OPERATIONS

57

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Bit-wise Operators in C

58

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 59

Bit-wise Operators in C (cont’)

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 60

Bit-wise Operators in C (cont’)

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 61

Bit-wise Operators in C (cont’)

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 62

Bit-wise Operators in C (cont’)

Bộ môn Kỹ Thuật Điện Tử - ĐHBK 63

Bit-wise Operators in C (cont’)

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

DATA CONVERSION

64

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Packed BCD to ASCII Conversion

65

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

ASCII to Packed BCD Conversion

66

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Binary (hex) to Decimal and ASCII Conversion

67

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

ACCESSING CODE ROM

68

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

RAM Data Space Usage by 8051 C Compiler

69

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

RAM Data Space Usage by 8051 C Compiler (cont’)

70

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

RAM Data Space Usage by 8051 C Compiler (cont’)

71

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Accessing code rom – Example 1

72

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Accessing code rom – Example 2

73

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Accessing code rom – Example 2 (cont’)

74

Bộ môn Kỹ Thuật Điện Tử - ĐHBK

Tài liệu tham khảo

• Hồ Trung Mỹ, Vi xử lý, Nhà xuất bản Đại học Quốc Gia Tp. HCM - 2003

• I. Scott MacKenzie , The 8051 Microcontroller, 2nd Edition, Prentice-Hall, 1995

• Derek Molloy, EE402 - Lecture note

• Slide bài giảng thầy Hồ Trung Mỹ

• Thomas W.Schultz, C and the 8051 – Second Edition.

• Dogan Ibrahim, Microcontroller Projects in C for the 8051, Newnes – 2000.

• Và nhiều tài liệu trên mạng.

75