Bài giảng Kỹ thuật lập trình vi điều khiển - Phạm Trường Tùng

Mục tiêu:

Sinh viên hiểu được các khái niệm về biến, hàm, chuỗi, mảng, con trỏ

cách thức sử dụng chúng.

Sinh viên hiểu và vận dụng được các phép toán trong C

1.1. NHỮNG KHÁI NIỆM CƠ BẢN VỀ C

1.1.1. Giới thiệu

Ngôn ngữ lập trình C là một ngôn ngữ mệnh lệnh được phát triển từ

đầu thập niên 1970 bởi Dennis Ritchie để dùng trong hệ điều hành UNIX. Từ đó,

ngôn ngữ này đã lan rộng ra nhiều hệ điều hành khác và trở thành một những

ngôn ngữ phổ dụng nhất. C là ngôn ngữ rất có hiệu quả và được ưa chuộng nhất

để viết các phần mềm hệ thống, mặc dù nó cũng được dùng cho việc viết

các ứng dụng. Ngoài ra, C cũng thường được dùng làm phương tiện giảng dạy

trong khoa học máy tính mặc dù ngôn ngữ này không được thiết kế dành cho

người nhập môn (wikipedia Tiếng Việt)

1.1.2. Các thành phần trong ngôn ngữ C

1.1.2.1. Từ khóa

Từ khóa là từ có ý nghĩa xác định, nó được dùng để khai báo dữ liệu, viết

câu lệnh Trong ngôn ngữ C sử dụng trong CCS có sử dụng các loại từ khóa

sau:

ASM/ENDASM : là từ khóa dùng để liệt kê/kết thúc liệt kê cấu trúc ngôn

ngữ assembly khi lập trình.

BREAK: Từ khóa được sử dụng để thoát khỏi vòng lặp

CASE: từ khóa dùng để lựa chọn trong cấu trúc lựa chọn.

CHAR: từ khóa dùng định nghĩa kiểu biến là kiểu ký tự.

CONST: từ khóa dùng để định nghĩa hằng.

CONTINUE: là từ khóa cho phép thực hiện bước tiếp theo của vòng lặp.

DEFAULT: là từ khóa sử dụng trong cấu trúc chọn lựa switch, sử dụng để

chọn lựa trong trường hợp tất cả các trường hợp sử dụng từ khóa case không hợp

lệ.Bài giảng kỹ thuật lập trình vi điều khiển

Trang 3

DO: từ khóa sử dụng trong vòng lặp do while

DOUBLE: từ khóa định nghĩa kiểu biến.

ELSE: từ khóa rẽ nhánh trong cấu trúc lựa chọn if else

ENUM: từ khóa tạo danh sách các hằng kiểu integer

FLOAT: từ khóa định nghĩa kiểu dữ liệu.

FOR: từ khóa định nghĩa vòng lặp for

GOTO: từ khóa cho phép nhảy đến một vị trí được gắn nhãn.

IF: từ khóa định nghĩa cấu trúc rẽ nhánh if else

INT: từ khóa định nghĩa kiểu biến

INTERRUPT: từ khóa định nghĩa hàm cho phép điều khiển thủ tục ngắt

của vi điều khiển.

LONG: từ khóa định nghĩa kiểu biến.

RETURN: từ khóa cho phép ngay lập tức thoát ra khỏi vòng lặp, cấu trúc

lựa chọn hoặc một hàm và trả về một giá trị.

SHORT: từ khóa định nghĩa kiểu biến.

STRUCT: từ khóa định nghĩa cấu trúc.

SIGNED: từ khóa định nghĩa kiểu biến có dấu.

SIZEOF: từ khóa xác định kích thước byte của toán hạng.

SWITCH: từ khóa định nghĩa cấu trúc chọn lựa switch case

UNSIGNED: từ khóa định nghĩa kiểu biến không dấu.

VOID: Từ khóa sử dụng để khai báo chương trình chính và các thủ tục.

pdf 115 trang yennguyen 2700
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Kỹ thuật lập trình vi điều khiển - Phạm Trường Tùng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Kỹ thuật lập trình vi điều khiển - Phạm Trường Tùng

Bài giảng Kỹ thuật lập trình vi điều khiển - Phạm Trường Tùng
UBND TỈNH QUẢNG NGÃI 
TRƢỜNG ĐH PHẠM VĂN ĐỒNG 
BÀI GIẢNG 
KỸ THUẬT LẬP TRÌNH VI ĐIỀU KHIỂN 
(Bậc đại học 2 tín chỉ) 
Ngành công nghệ kỹ thuật cơ khí 
GIẢNG VIÊN: ThS. PHẠM TRƢỜNG TÙNG 
Quảng Ngãi, 2017 
MỤC LỤC 
MỤC LỤC .................................................................................................. 2 
LỜI NÓI ĐẦU ............................................................................................ 1 
CHƢƠNG 1. NGÔN NGỮ LẬP TRÌNH C CHO VI ĐIỀU KHIỂN ........ 2 
1.1. NHỮNG KHÁI NIỆM CƠ BẢN VỀ C .............................................. 2 
1.1.1. Giới thiệu .......................................................................................... 2 
1.1.2. Các thành phần trong ngôn ngữ C .................................................... 2 
1.2. CÁC BIẾN........................................................................................... 5 
1.2.1. Tên biến ............................................................................................ 5 
1.2.2. Khai báo biến .................................................................................... 6 
1.2.3. Khai báo và gán giá trị cho biến ....................................................... 6 
1.2.4. Phạm vi của biến: ............................................................................. 6 
1.3. CÁC HÀM........................................................................................... 6 
1.3.1 Khai báo và định nghĩa hàm .............................................................. 7 
1.3.2 Lời gọi hàm ....................................................................................... 8 
1.3.3 Tham số hình thức, tham số thực và biến cục bộ .............................. 8 
1.3.4. Quy tắc hoạt động của hàm .............................................................. 8 
1.4. CÁC PHÉP TOÁN .............................................................................. 9 
1.4.1. Phép toán số học ............................................................................... 9 
1.4.2. Phép toán quan hệ ............................................................................. 9 
1.4.3. Phép toán logic ................................................................................. 9 
1.4.4. Phép toán trên bit (bitwise) ............................................................ 10 
1.4.5. Phép gán hợp .................................................................................. 10 
1.4.6. Phép toán tăng giảm ....................................................................... 10 
1.4.7. Toán tử điều kiện ............................................................................ 11 
1.5. CÁC LỆNH ĐIỀU KHIỂN CHƢƠNG TRÌNH ............................... 11 
1.5.1. Khái niệm câu lệnh ......................................................................... 11 
1.5.2. CÁC LỆNH ĐƠN .......................................................................... 12 
1.5.3 Lệnh if ............................................................................................. 12 
1.5.4 Cấu trúc if else if ......................................................................... 13 
1.5.5. Lệnh switch ................................................................................... 14 
1.5.6. Lệnh for: ......................................................................................... 14 
1.5.7. Lệnh while ...................................................................................... 15 
1.5.8. Lệnh do-while ................................................................................. 16 
1.6. MẢNG VÀ CHUỖI .......................................................................... 17 
1.6.1. Mảng một chiều .............................................................................. 17 
1.6.2.Mảng nhiều chiều ............................................................................ 18 
1.6.3. Chuỗi .............................................................................................. 18 
1.7. CON TRỎ .......................................................................................... 21 
1.7.1. Khai báo biến con trỏ ..................................................................... 21 
1.7.2. Con trỏ với mảng ............................................................................ 21 
BÀI TẬP CHƢƠNG 1 ............................................................................. 21 
CHƢƠNG 2. CẤU TRÚC CỦA HỆ VI ĐIỀU KHIỂN .......................... 23 
2.1. CẤU TRÚC CỦA MỘT HỆ VI ĐIỀU KHIỂN CƠ BẢN ................ 23 
2.2. CẤU TRÚC BỘ NHỚ ....................................................................... 25 
2.3. ĐỊA CHỈ ............................................................................................ 25 
2.4. MỘT SỐ GIAO TIẾP NGOẠI VI CƠ BẢN .................................... 26 
BÀI TẬP CHƢƠNG 2 ............................................................................. 26 
CHƢƠNG 3. PHẦN CỨNG HỆ VI ĐIỀU KHIỂN PIC ........................ 27 
3.1. SƠ ĐỒ VÀ CHỨC NĂNG CHÂN ................................................... 27 
3.1.1. Giới thiệu ........................................................................................ 27 
3.1.2. Các thành phần cơ bản của một mạch ứng dụng vi điều khiển PIC29 
3.2. XUNG NHỊP VÀ CHU KỲ MÁY .................................................... 31 
3.3. RESET ............................................................................................... 31 
3.4. XUẤT NHẬP DỮ LIỆU ................................................................... 32 
BÀI TẬP CHƢƠNG 3 ............................................................................. 33 
CHƢƠNG 4 BỘ ĐỊNH THỜI VÀ BỘ ĐẾM .......................................... 34 
4.1. CẤU TRÚC BỘ ĐỊNH THỜI ........................................................... 35 
4.2. THIẾT LẬP CÁC BỘ ĐỊNH THỜI.................................................. 36 
4.2.1. Timer 0 ........................................................................................... 36 
4.2.2. Timer 1 ........................................................................................... 39 
4.2.3 Các lệnh CCS liên quan đến Timer 1 .............................................. 40 
4.3. CẤU TRÚC BỘ ĐẾM ...................................................................... 40 
BÀI TẬP CHƢƠNG 4. ............................................................................ 41 
CHƢƠNG 5. NGẮT ................................................................................. 42 
5.1. NGẮT BỘ ĐỊNH THỜI/BỘ ĐẾM ................................................... 44 
5.1.1. Ngắt Timer 0 .................................................................................. 44 
5.2. NGẮT NGOÀI .................................................................................. 45 
5.2.1. Ngắt ngoài ...................................................................................... 45 
BÀI TẬP CHƢƠNG 5 ............................................................................. 47 
CHƢƠNG 6 CÁC KHỐI ĐIỀU KHIỂN CHUYÊN DỤNG ................... 48 
6.1. BỘ CHUYỂN ĐỔI A/D .................................................................... 48 
6.1.1. Giới thiệu ....................................................................................... 48 
6.1.2. ADC của vi điều khiển PIC 18Fxx31 ............................................. 48 
6.2. MÔ ĐUN ĐIỀU CHẾ ĐỘ RỘNG XUNG ........................................ 59 
6.2.1. Giới thiệu ........................................................................................ 59 
6.2.2. Chu kỳ xung và độ rộng xung ........................................................ 60 
6.2.3. Độ rộng xung .................................................................................. 61 
6.2.4. chƣơng trình demo......................................................................... 61 
BÀI TẬP CHƢƠNG 6 ............................................................................. 61 
CHƢƠNG 7 CÁC GIAO TIẾP CƠ BẢN ................................................ 63 
7.1. GIAO TIẾP RS232/RS485 ................................................................ 63 
7.1.1. Phần cứng giao tiếp ........................................................................ 63 
.7.1.2. Truyền thông với RS232 với trình biên dịch CCS ....................... 64 
7.2. GIAO TIẾP I2C ................................................................................. 66 
7.3. GIAO TIẾP SPI ................................................................................. 71 
7.3.1. Các cách kết nối cơ bản .................................................................. 72 
7.3.2. Tên và chức năng của các chân ...................................................... 72 
7.3.3. Các kiểu kết nối trong SPI ............................................................. 74 
7.4. CÁC GIAO TIẾP KHÁC .................................................................. 76 
7.4.1. Giao tiếp USB ................................................................................ 76 
BÀI TẬP CHƢƠNG 7 ............................................................................. 85 
CHƢƠNG 8 LẬP TRÌNH ỨNG DỤNG ................................................. 86 
8.1. LẬP TRÌNH HIỂN THỊ VỚI LED 7 ĐOẠN ................................... 86 
8.1.1 Cấu tạo của led 7 đoạn .................................................................... 86 
8.1.2 Hiển thị 1 led 7 đoạn dùng vi điều khiển: ....................................... 87 
8.1.3 Hiển thị nhiều led 7 đoạn dùng vi điều khiển: ................................ 88 
8.2. GIAO TIẾP VỚI MÀN HÌNH LCD ................................................. 90 
8.2.1. Hiển thị dùng LCD ......................................................................... 90 
8.2.2. Các chân cơ bản của LCD 2 dòng 16 kí tự..................................... 90 
8.2.3. Khởi tạo LCD ................................................................................. 91 
8.2.4. Ghi kí tự lên LCD để hiển thị ......................................................... 93 
8.2.5. Giới thiệu một thƣ viện cho LCD 4 bit và bài tập ứng dụng ......... 94 
8.3. ĐIỀU KHIỂN PID CHO ĐỘNG CƠ DC ......................................... 97 
BÀI TẬP CHƢƠNG 8 ............................................................................. 99 
TÀI LIỆU THAM KHẢO ...................................................................... 101 
PHỤC LỤC: CƠ BẢN VỀ CCS ............................................................ 102 
1. Cơ bản về ngôn ngữ lập trình CCS .................................................... 102 
1.1. Ví dụ về một chƣơng trình viết trên ngôn ngữ CCS ....................... 102 
1.2 Cấu trúc của một chương trình viết bằng CCS: ............................... 103 
2. Các cấu trúc thuật toán của ngôn ngữ CCS ........................................ 106 
3. Các toán tử cơ bản trong CCS: ........................................................... 107 
4. Các hàm số học cơ bản trong CCS ..................................................... 108 
5. Các hàm vào ra cơ bản trong CCS ..................................................... 108 
6. Các hàm tạo trễ ................................................................................... 109 
Bài giảng kỹ thuật lập trình vi điều khiển 
 Trang 1 
LỜI NÓI ĐẦU 
Vi điều khiển hiện nay là một thiết bị không thể thiếu trong lĩnh vực điều 
khiển các hệ thống có yêu cầu về giá thành thấp. Trên thị trƣờng hiện nay có rất 
nhiều các dòng vi điều khiển khác nhau nhƣ họ 8051, PIC, ARM, Adruino 
Mỗi loại vi điều khiển đều có các ƣu và nhƣợc, đƣợc sử tập lệnh riêng để lập 
trình. 
Họ vi điều khiển PIC là dòng vi điều khiển đƣợc sử dụng nhiều trong thực 
tế do các ƣu điểm vƣợt trội của nó. Việc lập trình nó cũng đơn giản do sử dụng 
ngôn ngữ lập trình C và có một tập lệnh trên CCS rất phong phú với nhiều 
chƣơng trình mẫu. 
Chính vì vậy, với mong muốn cung cấp một cách khái quát nhất, đơn giản 
nhất cho sinh viên ngành công nghệ cơ khí tiếp cận đến lĩnh vực vi điều khiển, 
trên cơ sở đề cƣơng chi tiết đã đƣợc thông qua, bằng việc tham khảo các tài liệu 
từ các nguồn khác nhau, tôi đã biên soạn tài liệu này để các sinh viên sử dụng 
trong quá trình học tập và tham khảo về vi điều khiển PIC. 
Trong quá trình biên soạn, không tránh những thiếu sót, mong nhận đƣợc 
sự góp ý của các đồng nghiệp và sinh viên. 
Bài giảng kỹ thuật lập trình vi điều khiển 
 Trang 2 
CHƢƠNG 1. NGÔN NGỮ LẬP TRÌNH C CHO VI ĐIỀU KHIỂN 
Mục tiêu: 
Sinh viên hiểu được các khái niệm về biến, hàm, chuỗi, mảng, con trỏ 
cách thức sử dụng chúng. 
Sinh viên hiểu và vận dụng được các phép toán trong C 
1.1. NHỮNG KHÁI NIỆM CƠ BẢN VỀ C 
1.1.1. Giới thiệu 
Ngôn ngữ lập trình C là một ngôn ngữ mệnh lệnh đƣợc phát triển từ 
đầu thập niên 1970 bởi Dennis Ritchie để dùng trong hệ điều hành UNIX. Từ đó, 
ngôn ngữ này đã lan rộng ra nhiều hệ điều hành khác và trở thành một những 
ngôn ngữ phổ dụng nhất. C là ngôn ngữ rất có hiệu quả và đƣợc ƣa chuộng nhất 
để viết các phần mềm hệ thống, mặc dù nó cũng đƣợc dùng cho việc viết 
các ứng dụng. Ngoài ra, C cũng thƣờng đƣợc dùng làm phƣơng tiện giảng dạy 
trong khoa học máy tính mặc dù ngôn ngữ này không đƣợc thiết kế dành cho 
ngƣời nhập môn (wikipedia Tiếng Việt) 
1.1.2. Các thành phần trong ngôn ngữ C 
1.1.2.1. Từ khóa 
Từ khóa là từ có ý nghĩa xác định, nó đƣợc dùng để khai báo dữ liệu, viết 
câu lệnhTrong ngôn ngữ C sử dụng trong CCS có sử dụng các loại từ khóa 
sau: 
ASM/ENDASM : là từ khóa dùng để liệt kê/kết thúc liệt kê cấu trúc ngôn 
ngữ assembly khi lập trình. 
BREAK: Từ khóa đƣợc sử dụng để thoát khỏi vòng lặp 
CASE: từ khóa dùng để lựa chọn trong cấu trúc lựa chọn. 
CHAR: từ khóa dùng định nghĩa kiểu biến là kiểu ký tự. 
CONST: từ khóa dùng để định nghĩa hằng. 
CONTINUE: là từ khóa cho phép thực hiện bƣớc tiếp theo của vòng lặp. 
DEFAULT: là từ khóa sử dụng trong cấu trúc chọn lựa switch, sử dụng để 
chọn lựa trong trƣờng hợp tất cả các trƣờng hợp sử dụng từ khóa case không hợp 
lệ. 
Bài giảng kỹ thuật lập trình vi điều khiển 
 Trang 3 
DO: từ khóa sử dụng trong vòng lặp dowhile 
DOUBLE: từ khóa định nghĩa kiểu biến. 
ELSE: từ khóa rẽ nhánh trong cấu trúc lựa chọn ifelse 
ENUM: từ khóa tạo danh sách các hằng kiểu integer 
FLOAT: từ khóa định nghĩa kiểu dữ liệu. 
FOR: từ khóa định nghĩa vòng lặp for 
GOTO: từ khóa cho phép nhảy đến một vị trí đƣợc gắn nhãn. 
IF: từ khóa định nghĩa cấu trúc rẽ nhánh ifelse 
INT: từ khóa định nghĩa kiểu biến 
INTERRUPT: từ khóa định nghĩa hàm cho phép điều khiển thủ tục ngắt 
của vi điều khiển. 
LONG: từ khóa định nghĩa kiểu biến. 
RETURN: từ khóa cho phép ngay lập tức thoát ra khỏi vòng lặp, cấu trúc 
lựa chọn hoặc một hàm và trả về một giá trị. 
SHORT: từ khóa định nghĩa kiểu biến. 
STRUCT: từ khóa định nghĩa cấu trúc. 
SIGNED: từ khóa định nghĩa kiểu biến có dấu. 
SIZEOF: từ khóa xác định kích thƣớc byte của toán hạng. 
SWITCH: từ khóa định nghĩa cấu trúc chọn lựa switchcase 
UNSIGNED: từ khóa định nghĩa kiểu  ... s(20); /*Cho cho lcd khoi tao */ 
 output_low ( LCD_RS );// che do gui lenh 
 LCD_SetData ( 0x03 ); /* khoi tao che do 4 bit */ 
Bài giảng kỹ thuật lập trình vi điều khiển 
 Trang 95 
 LCD_PulseEnable(); 
 LCD_PulseEnable(); 
 LCD_PulseEnable(); 
 LCD_SetData ( 0x02 ); /* tao giao dien 4 bit */ 
 LCD_PulseEnable(); /* send dual nibbles hereafter, MSN first */ 
 LCD_PutCmd ( 0x2C ); /* function set (all lines, 5x7 characters) */ 
 LCD_PutCmd ( 0x0C ); /* display ON, cursor off, no blink */ 
 LCD_PutCmd ( 0x06 ); /* entry mode set, increment & scroll left */ 
 LCD_PutCmd ( 0x01 ); /* clear display */ 
 // Init for BarGraph 
 } 
#separate void LCD_SetPosition ( unsigned int cX ) 
 { 
 /* this subroutine works specifically for 4-bit Port A */ 
 LCD_SetData ( swap ( cX ) | 0x08 ); 
 LCD_PulseEnable(); 
 LCD_SetData ( swap ( cX ) ); 
 LCD_PulseEnable(); 
 } 
#separate void LCD_PutChar ( unsigned int cX ) 
 { 
 /* this subroutine works specifically for 4-bit Port A */ 
 output_high ( LCD_RS ); 
 LCD_PutCmd( cX ); 
 output_low ( LCD_RS ); 
 } 
#separate void LCD_PutCmd ( unsigned int cX ) 
 { 
 LCD_SetData ( swap ( cX ) ); /* send high nibble */ 
 LCD_PulseEnable(); 
Bài giảng kỹ thuật lập trình vi điều khiển 
 Trang 96 
 LCD_SetData ( swap ( cX ) ); /* send low nibble */ 
 LCD_PulseEnable(); 
 } 
#separate void LCD_PulseEnable ( void ) 
 { 
 output_high ( LCD_EN ); 
 delay_us ( 3 ); // was 10 
 output_low ( LCD_EN ); 
 delay_ms ( 3 ); // was 5 
 } 
#separate void LCD_SetData ( unsigned int CX ) 
 { 
 output_bit ( LCD_D4, CX & 0x01 ); 
 output_bit ( LCD_D5, CX & 0x02 ); 
 output_bit ( LCD_D6, CX & 0x04 ); 
 output_bit ( LCD_D7, CX & 0x08 ); 
 } 
Chƣơng trình ứng dụng: 
Ví dụ về LCD 
#include 
RA0/AN0
2
RA1/AN1
3
RA2/AN2/VREF-/CVREF
4
RA4/T0CKI/C1OUT
6
RA5/AN4/SS/C2OUT
7
RE0/AN5/RD
8
RE1/AN6/WR
9
RE2/AN7/CS
10
OSC1/CLKIN
13
OSC2/CLKOUT
14
RC1/T1OSI/CCP2
16
RC2/CCP1
17
RC3/SCK/SCL
18
RD0/PSP0
19
RD1/PSP1
20
RB7/PGD
40
RB6/PGC
39
RB5
38
RB4
37
RB3/PGM
36
RB2
35
RB1
34
RB0/INT
33
RD7/PSP7
30
RD6/PSP6
29
RD5/PSP5
28
RD4/PSP4
27
RD3/PSP3
22
RD2/PSP2
21
RC7/RX/DT
26
RC6/TX/CK
25
RC5/SDO
24
RC4/SDI/SDA
23
RA3/AN3/VREF+
5
RC0/T1OSO/T1CKI
15
MCLR/Vpp/THV
1
UDK
PIC16F877A
C1
30pF
C2
30pF
X1
CRYSTAL
R9
4K
D
7
1
4
D
6
1
3
D
5
1
2
D
4
1
1
D
3
1
0
D
2
9
D
1
8
D
0
7
E
6
R
W
5
R
S
4
V
S
S
1
V
D
D
2
V
E
E
3
LCD1
LM016L
Bài giảng kỹ thuật lập trình vi điều khiển 
 Trang 97 
#fuses HS, NOLVP, NOWDT, NOPROTECT 
#use delay (clock=4000000) //Use built-in function: delay_ms() & 
delay_us() 
#include "LCD_LIB_4BIT.c" 
VOID MAIN() 
{ 
 LCD_INIT(); 
 LCD_PUTCHAR('X'); 
 DELAY_MS(1000); 
 LCD_PUTCHAR('I'); 
 DELAY_MS(1000); 
 LCD_PUTCHAR('N'); 
 DELAY_MS(1000); 
 LCD_PUTCHAR(' '); 
 DELAY_MS(1000); 
 LCD_PUTCHAR('C'); 
 DELAY_MS(1000); 
 LCD_PUTCHAR('H'); 
 DELAY_MS(1000); 
 LCD_PUTCHAR('A'); 
 DELAY_MS(1000); 
 LCD_PUTCHAR('O'); 
8.3. ĐIỀU KHIỂN PID CHO ĐỘNG CƠ DC 
#include "PID1.h" 
//Dinh nghia cac duong dieu khien motor 
#define Sampling_time 50 //thoi gian lay mau (ms) 
#define inv_Sampling_time 20 // 1/Sampling_time 
#define PWM_Period 1023 
unsigned int16 Pulse=0,pre_Pulse=0; 
Bài giảng kỹ thuật lập trình vi điều khiển 
 Trang 98 
signed long rSpeed=0,Err=0 , pre_Err=0; //thanh phan PID 
float Kp=5, Kd=0.6, Ki=2.4; //thanh phan PID 
float pPart=0, iPart=0, dPart=0; //thanh phan PID 
unsigned long Ctrl_Speed=10; //van toc can dieu khien (desired speed) 
unsigned int16 Output;// absrSpeed; 
unsigned char sample_count=0; 
void Motor_Speed_PID(long int des_Speed); 
#int_EXT 
void EXT_isr(void) 
{ 
if(!input(PIN_B0))Pulse++; 
else Pulse--; 
} 
#int_TIMER1 
void TIMER1_isr(void) 
{ 
 Set_timer1(3035);//25ms 
 sample_count++; 
 Motor_Speed_PID(Ctrl_Speed); 
} 
void Motor_Speed_PID(unsigned long des_Speed) 
{ 
 rSpeed=Pulse-pre_Pulse; //tinh van toc (trong sampling time) 
 pre_Pulse=Pulse; 
 Err=des_Speed-abs(rSpeed); //tinh error (loi) 
 pPart=Kp*Err; 
 dPart=Kd*(Err-pre_Err)*inv_Sampling_time; 
 iPart+=Ki*Sampling_time*(Err+pre_Err)/2000; 
 Output +=pPart+dPart+iPart; //cong thuc duoc bien doi vi la dieu 
khien van toc 
Bài giảng kỹ thuật lập trình vi điều khiển 
 Trang 99 
 if (Output >PWM_Period) Output=PWM_Period-1; 
 if (Output <=0) Output=1; 
 set_pwm1_duty((int16)Output); //gan duty cycle cho CCP1 update 
PWM 
 pre_Err=Err; //luu lai gia tri error 
} 
void main() 
{ 
 set_tris_a(0xff); 
 //set_tris_b(0x01); 
 setup_spi(SPI_SS_DISABLED); 
 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); 
 setup_timer_1(T1_INTERNAL|T1_DIV_BY_2); 
 setup_timer_2(T2_DIV_BY_16,255,1); 
 setup_ccp1(CCP_PWM); 
 setup_comparator(NC_NC_NC_NC); 
 setup_vref(FALSE); 
 enable_interrupts(INT_EXT); 
 ext_int_edge( H_TO_L ); // Sets up EXT 
 enable_interrupts(INT_TIMER1); 
 enable_interrupts(GLOBAL); 
 while(true) 
 { 
 } 
} 
BÀI TẬP CHƢƠNG 8 
Bài 1: Hiển thị 1 led 7 đoạn từ 0 đến 9 
Bài 2: Sử dụng 2 Led 7 đoạn (phần cứng tự thiết kế) 
- Lập trình cho 2 led hiển thị số 35 
- Lập trình hiển thị số đếm từ 0-99 
Bài giảng kỹ thuật lập trình vi điều khiển 
 Trang 100 
Bài 3: Lập trình thực hiển hiển thị họ tên, thay đổi các chế độ hiển thị 
bằng cách gửi lệnh lên LCD 
Bài giảng kỹ thuật lập trình vi điều khiển 
 Trang 101 
TÀI LIỆU THAM KHẢO 
1. CCS C Complier Manual - Custom Computer Services - PO BOX 
2452 BROOKFIELD, WI 53008 U.S.A – 2016. 
2. Lập Trình Cho PIC Dùng PIC C Compiler – HanoiAptech Computer 
Education Center. 
3. Lập Trình Cho PIC Dùng PIC C Compiler - www.mientayvn.com. 
4. PIC18F2331/2431/4331/4431 data Sheet - Microchip Technology Inc 
2003. 
5. Programmation en C d‘un microcontrôleur - Lycée LACHENAL - M. 
BERNARD - édité le 13/11/2008. 
6. Vi điều khiển PIC – học nhanh đi vào ứng dụng – Falleaf - Diễn đàn 
PICVietnam.com. 
Bài giảng kỹ thuật lập trình vi điều khiển 
 Trang 102 
PHỤC LỤC: CƠ BẢN VỀ CCS 
1. Cơ bản về ngôn ngữ lập trình CCS 
1.1. Ví dụ về một chƣơng trình viết trên ngôn ngữ CCS 
// Đây là chú thích chương trình 
//Bắt đầu các chỉ thị tiền xử lý của chương trình 
#include // cho file định nghĩa thiết bị 16f877a.h vào chương 
trình 
#fuses HS,NOLVP,NOWDT// Cấu hình cho vi điều khiển PIC 
#use delay (clock=4000000) // dùng thạch anh tần số 4MHz 
// Khai báo biến hằng 
byte const MAP[10] = 
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; 
//=========================================== 
//=========================================== 
// Bắt đầu chương trình con hiển thị 
void display(int n) 
{ 
 char b; // khai báo biến b 
 b=((MAP[n/10]) ^ 0x00); 
 if ((n/10)==(0)) b=0xff; 
 output_b(b); // sử dụng hàm xuất giá trị ra cổng B 
 output_low(PIN_A4);// sử dụng hàm đưa giá trị chân RA4 xuống mức 
thấp 
 delay_ms(2);// Sử dụng hàm tạo trễ 2 ms 
 output_high(PIN_A4); // sử dụng hàm đưa giá trị chân RA4 lên mức cao 
 output_b((MAP[n%10]) ^ 0x00); 
 output_low(PIN_A5); 
 delay_ms(2); 
 output_high(PIN_A5); 
} 
// Kết thúc chương trình con hiển thị 
//============================================ 
Bài giảng kỹ thuật lập trình vi điều khiển 
 Trang 103 
// Bắt đầu chương trình chính 
// Đây là nơi vi điều khiển bắt đầu chạy lệnh 
//============================================ 
void main() 
{ 
 int i,count; 
 count=0; 
 while(TRUE) 
 { 
 for (i=0;i<=50;i++) 
 display(count); // dispay 50 times 
 count=(count==99) ? 1: count+1; 
 } 
} 
1.2 Cấu trúc của một chương trình viết bằng CCS: 
1.2.1 Khai báo tiền xử lý 
Bắt đầu một chƣơng trình viết bằng ngôn ngữ CCS là phần khai báo tiền xử 
lý: 
1. Đầu tiên là phần khai báo file header: 
#include 
Ví dụ: # include 
Việc khai báo này thực chất là chép cả file 18f4431.h vào chƣơng trình 
này. 
Vậy nội dung của file .h này là gì? Nội dung của file này sẽ định nghĩa tấc 
cả các tên cũng nhƣ định nghĩa các hằng sẽ đƣợc dùng trong các hàm chức năng 
của CCS. 
Có thể mở file: C:\Program Files\PICC\Devices\16f877a.h để hiểu thêm 
2. Thứ hai là phần khai báo cấu hình: 
#fuses HS,NOLVP,NOWDT 
Vi điều khiển PIC có thể hoạt động ở nhiều chế độ khác nhau, cũng nhƣ 
cách cấu hình phần cứng của nó cũng có nhiều chế độ. Mỗi chế độ nhƣ vậy đƣợc 
khai báo và dùng sẽ ảnh hƣởng đến hoạt động của các khối chức năng, cũng nhƣ 
Bài giảng kỹ thuật lập trình vi điều khiển 
 Trang 104 
các chân của vi điều khiển. Vì vậy, đối với mỗi ứng dụng, ta phải khai báo cấu 
hình cho phù hợp. 
Trong ví dụ trên, khai báo cấu hình cho bộ dao động kiểu HS, không sử 
dụng chức năng Watchdog Timer, và lập trình điện áp thấp. 
3. Thứ ba là phần khai báo tần số của thạch anh dùng cho ứng dụng, tốc 
độ này phải phù hợp với thạch anh ta dùng trong mạch. 
# USE Delay(clock=tần số thạch anh) 
Ví dụ: # USE Delay(clock=4000000)// Khai báo dùng thạch anh 4 MHz 
Điều lƣu ý là chúng ta chỉ dùng đƣợc hàm tạo thời gian trễ delay_ms(), 
delay_us() sau khi có khai báo này trong chƣơng trình. 
4. Ngoài ra, khi sử dụng bất cứ khối chức năng đặc biệt nào trong vi điều 
khiển PIC ta phải dùng chỉ thị tiền xử lý #USE để khai báo. Các khối chức năng 
đặc biệt là RS232, PWM, SPI, I2C ..v.v 
Ví dụ: #use rs232(baud=9600, xmit=PIN_C6,rcv=PIN_C7) 
1.2.2 Phần khai báo biến toàn cục 
Sau phần khai báo tiền xử lý là phần khai báo biến toàn cục nếu có. 
Cũng nhắc lại biến toàn cục là biến đƣợc sử dụng trong toàn bộ chƣơng 
trình, cả chƣơng trình chính và chƣơng trình con. Điều này khác với biến cục bộ 
là biến đƣợc khai báo trong các chƣơng trình con, hàm con, chƣơng trình chính, 
các biến này chỉ đƣợc tạo ra và sử dụng trong chính mỗi chƣơng trình khai báo 
nó. 
Nhân đây cũng giới thiệu qua dạng dữ liệu dùng trong CCS. Có một số 
các dạng cơ bản nhƣ sau: 
Khai báo biến: 
Int1,short: dạng logic 1,0 
Int,Int8,byte: dạng số nguyên 8 bit, nếu khai báo dạng số nguyên 8 bit có 
dấu thêm signed 
Int16,long: dạng số nguyên 16 bit 
Int32: dạng số nguyên 32 bit 
Char: dạng kí tự 8 bit 
Bài giảng kỹ thuật lập trình vi điều khiển 
 Trang 105 
Float: dạng số thực 32 bit 
Ví dụ: int8 a; // Khai báo a là biến số nguyên 8 bit 
Khai báo hằng số: 
Ví dụ: int8 const a=231; 
Khai báo mảng hằng số: 
Ví dụ: int const a[5]= {1, 23, 3, 4, 5} 
2.4.2.3 Phần khai báo, định nghĩa các chương trình con 
Chƣơng trình con là chƣơng trình sẽ đƣợc gọi từ chƣơng trình chính hoặc 
chƣơng trình con khác. 
Chƣơng trình con phải đƣợc khai báo và định nghĩa trong một file chƣơng 
trình ứng dụng. 
Phần khai báo phải đặt trƣớc chƣơng trình chính (trong file) 
Phần định nghĩa có thể định nghĩa ngay trong khai báo hoặc đƣợc đặt bất 
kì nơi nào sau phần khai báo biến toàn cục nếu có. 
Ngoài các chƣơng trình con bình thƣờng ra, còn có chƣơng trình con phục 
vụ ngắt đƣợc đặt sau khai báo tiền xử lý: # int_tên ngắt. Phần này sẽ đƣợc bàn kĩ 
hơn trong các bài học sau. 
1.2.3 Phần chương trình chính 
Bắt đầu bằng: 
 void main() 
{ 
} 
 Cũng nhắc lại là trong một chƣơng trình CCS , vi điều khiển sẽ chạy từ 
chƣơng trình chính, hay nói cách khác là từ dòng lệnh đầu tiên sau void main(). 
Các chƣơng trình con chỉ đƣợc gọi tại các lời gọi chƣơng trình con trong 
chƣơng trình chính hoặc từ các chƣơng trình con khác. Chƣơng trình con phục 
vụ ngắt chỉ đƣợc chạy khi có ngắt xảy ra, và ngắt đó đƣợc cho phép (sẽ bàn kĩ 
hơn trong các bài học sau). 
Bài giảng kỹ thuật lập trình vi điều khiển 
 Trang 106 
2. Các cấu trúc thuật toán của ngôn ngữ CCS 
Cấu trúc thuật toán của ngôn ngữ CCS kế thừa 100% từ ngôn ngữ C. Ở 
đây xin nhắc lại một số các cấu trúc hay dùng: 
- Cấu trúc IF: 
If (biểu thức) 
 Lệnh1; 
 Else lệnh2; 
Ví dụ: if (x==25) 
 x=1; 
else 
 x=x+1; 
- Cấu trúc lặp While: 
While (biểu thức) 
{ 
 Các lệnh; 
 } 
Ví dụ: While (count<20) 
 { 
 Output_B(count); 
 Count=count+1; 
 } 
Chú ý: while(1) sẽ thực hiện các lệnh trong khối while này mãi mãi 
- Cấu trúc lặp FOR: 
For (biểu thức 1, biểu thức 2, biểu thức 3) 
{ 
Các lệnh; 
} 
Ví dụ: for (i=1;i<=10;++i) 
 A=a+i; 
- Cấu trúc lựa chọn SWITCH: 
SWITCH (biến) 
{ 
Bài giảng kỹ thuật lập trình vi điều khiển 
 Trang 107 
 Case giá trị 1: lệnh 1; 
 Break; 
 Case giá trị 2: lệnh 2; 
 Break; 
 Case giá trị n: lệnh n 
 Break; 
 [default: lệnh n+1; break;] 
} 
Ví dụ: switch (cmd) 
 { case 0:printf("cmd 0"); 
 break; 
 case 1:printf("cmd 1"); 
 break; 
 default:printf("bad cmd"); 
 break; 
} 
Chú ý: lệnh break đƣợc dùng để thoát lập tức khỏi một vòng lặp For, 
While, Switch 
3. Các toán tử cơ bản trong CCS: 
Hoàn toàn tƣơng tự trong C. 
Nhắc lại một số toán tử hay dùng: 
- += ý nghĩa là cộng thêm một giá trị và lấy kết quả 
Ví dụ: a+=2 nghĩa là a= a+2 
Tƣơng tự đối với các phép toán trừ, chia, nhân 
-++ ý nghĩa là cộng thêm 1 đơn vị vào biến 
Ví dụ: a++; tức là a=a+1 
- &&: phép AND 
- ||: phép OR 
- !: phép NOT 
- !=: không bằng 
- >>n: dịch trái n bit 
- <<n: dịch phải n bit 
Bài giảng kỹ thuật lập trình vi điều khiển 
 Trang 108 
4. Các hàm số học cơ bản trong CCS 
Hoàn toàn giống trong C. 
Nhắc lại một số hàm cơ bản: 
Abs (): lấy trị tuyệt đối 
Ceil(): làm tròn theo hƣớng tăng 
Floor(): làm tròn theo hƣớng giảm 
Pow(): lũy thừa 
Sqrt(): lấy căn 
Chi tiết tra help CCS : trong tab contents, chọn Built-In-Function 
Chú ý là khi sử dụng các hàm này cần khai báo file header tƣơng ứng 
5. Các hàm vào ra cơ bản trong CCS 
Output_low (chân): cho chân xuống mức logic thấp (mức điện áp 0V), 
chân có thể là: 
PIN_A0, PIN_A1, ..PIN_B0, PIN_B1,.. PIN_C0,..v.v Nói chung là các 
chân có tên trong file C:\Program Files\PICC\Devices\16f877a.h 
Ví dụ: Output_low(PIN_D0) đƣa chân RD0 của PIC xuống mức thấp 
Output_high(chân): cho chân lên mức logic thấp (mức điện áp 0V), chân 
có thể là: 
PIN_A0, PIN_A1, ..PIN_B0, PIN_B1,.. PIN_C0,..v.v Nói chung là các 
chân có tên trong file C:\Program Files\PICC\Devices\16f877a.h 
Ví dụ: Output_high(PIN_a5) đƣa chân Ra5 của PIC lên mức cao 
Output_bit(chân,giá trị): là lệnh tổng hợp 2 lệnh trên, xuất giá trị ra 
chân. Giá trị có thể là 0 (mức thâp) hoặc là 1 (mức cao). Tên chân tƣơng tự nhƣ 
2 lệnh trên 
Ví dụ: output_bit(PIN_E0,1); đƣa chân E0 lên mức 1 
Output_X(giá trị): lệnh này đƣa giá trị ra cổng X. X có thể là A, B, C, D, 
E. 
Ví dụ: Output_A(0x21); đƣa giá trị 0x21 ra cổng A 
Biến=Input_X(): đƣa giá trị của cổng X vào Biến. X là A, hoặc B, C, D, 
E 
Bài giảng kỹ thuật lập trình vi điều khiển 
 Trang 109 
Ví dụ: bien1= Input_A() 
Biến=Input(chân): lệnh này đƣa giá trị của chân vào biến. Chân tƣơng tự 
nhƣ trong các lệnh. 
Ví dụ: bien2= Input(PIN_A2); 
6. Các hàm tạo trễ 
Các hàm tạo trễ gồm delay_cycles(), delay_us(), delay_ms. Tạo một 
khoảng thời gian trễ từ lúc lệnh đƣợc thực hiện. Chú ý là phải sử dụng khai báo 
tiền xử lý # use delay(clock=tần sô) thì mới dùng đƣợc các lệnh này. 
delay_cycles(số chu kỳ): tạo trễ một khoảng thời gian bằng số chu kỳ. Số 
chu kỳ=0-255 
delay_us(số micro giây): tạo trễ số micro giây. Số micro giây =0-65535 
delay_ms(số mili giây): tạo trễ số mili giây. Số mili giây= 0-65535 

File đính kèm:

  • pdfbai_giang_ky_thuat_lap_trinh_vi_dieu_khien_pham_truong_tung.pdf