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
Trang 1UBND 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
Trang 2MỤ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
Trang 31.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
Trang 44.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
Trang 57.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
Trang 65 Các hàm vào ra cơ bản trong CCS 108
6 Các hàm tạo trễ 109
Trang 7Bà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
Trang 8Bà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ệ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ệ
Trang 9Bà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
1.1.2.2 Tên
Tên được dùng để xác định các đại lượng khác nhau trong chương trình Tên dùng để đặt cho biến, hằng, hàm, con trỏ, nhãn…Tên thường được đặt để mang tính gợi nhớ ý nghĩa của các đại lượng Chiều dài tối đa của tên là 32 ký
tự Tên hợp lệ phải là một chuỗi liên tục (không có khoảng trắng) gồm các chữ,
số, gạch dưới (không sử dụng các ký tự đặc biệt như -,#, &,>,<,!,~…), ký tự đầu của tên phải là chữ hoặc dấu gạch dưới Tên không được trùng với từ khóa, mỗi
tên chỉ được sử dụng cho một đối tượng Trong ngôn ngữ C có phân biệt chữ
hoa và chữ thường (ví dụ tên ―Bien‖ khác với ―bien‖)
Trang 10Bài giảng kỹ thuật lập trình vi điều khiển
Trang 4
1.1.2.3 Kiểu dữ liệu
Trong mục này giới thiệu các kiểu dữ liệu cơ bản và đặc biệt dùng trong lập trình C bằng phần mềm CCS
a Các kiểu cơ bản
32767
đến 2147483647
b Các kiểu đặc biệt
Kiểu enum: tạo một danh sách các biến hằng
enum id{[id[=biểu thức hằng]]}
id phải là kiểu đủ lớn để chứa hằng lớn nhất trong danh sách Các id trong danh sách đƣợc tạo là một kiểu hằng Mặc định, id đầu tiên là bằng không và id sau sẽ tăng lên một đơn vị Nếu biến a bằng biểu thức hằng và id có giá trị bằng biểu thức hằng thì các id sau sẽ bằng biểu thức hằng tăng lên 1
Trang 11Bài giảng kỹ thuật lập trình vi điều khiển
Trang 5
Ví dụ: enum day_so{a,b,c=5,d}; //điều này có nghĩa là a=0, b=1 và c=5
và d=6
c Kiểu cấu trúc
Tạo ra một tập hợp có một hoặc nhiều biến, có thể khác nhau về kiểu, được nhóm lại với nhau như là một đơn vị riêng lẻ
Struct[*][id]{ kiểu của[*] id [:bit];}[id]
Ví dụ:
Struct data_record{
int a[2];
int b:2; //biến b có 2 bit int c:3; //biến c 3 bit int d;
}data_var //data_record là kiểu cấu trúc, data_var là biến
d Kiểu union
Giữ các đối tượng khác kiểu và kích cỡ, trình biên dịch sẽ lưu giữ yêu cầu
về kích thước và sắp xếp Nó cũng cung cấp cách thức thao tác trên các dữ liệu khác nhau trên cùng một vị trí lưu trữ
e Kiểu typedef
được sử dụng với bất kỳ kiểu đặc biệt hoặc cơ bản để tạo một kiểu mới để
có thể sử dụng khai báo
1.1.2.4 Ghi chú:
Khi lập trình cần phải ghi chú để giải thích các biến, hằng, chương trình con, câu lệnh để người lập trình dễ theo dõi, người đọc dễ hiểu, trong C có kiểu ghi chú sau: //nội dung ghi chú: để ghi chú một hàng ; hoặc /* nội dung ghi chú
*/: để ghi chú nhiều hàng Khi trình biên dịch, các nội dung sau dấu // và ở giữa /*…*/ được bỏ qua
1.2 CÁC BIẾN 1.2.1 Tên biến
Đặt tên biến theo quy định đặt tên ở mục 1.1.2.2
Trang 12Bài giảng kỹ thuật lập trình vi điều khiển
Trang 6
1.2.2 Khai báo biến
Cú pháp: Kiểu dữ liệu danh sách biến;
Kiểu dữ liệu: như ở mục trên
Danh sách biến là liệt kê các biến có cùng kiểu dữ liệu, cách nhau bằng dấu ―,‖ Cuối danh sách có dấu ―;‖
Ví dụ:
Int8 a,b,c; // các biến a,b,c đều có cùng kiểu int8
1.2.3 Khai báo và gán giá trị cho biến
Có thể khai báo trước rồi gán giá trị sau hoặc khai báo và gán giá trị cùng lúc
1.2.4 Phạm vi của biến:
Khi khai báo, bạn cần nắm được phạm vi của biến Nếu khai báo và sử dụng không đúng sẽ nảy sinh nhiều vấn để rắc rối có thể dẫn đến không kiểm soát được chương trình Vì vậy bạn cần chắc chắn phạm vi của biến trước khi sử dụng Phạm vi của biến gồm:
Biến toàn cục: biến được sử dụng trong tất cả các chương trình chính và chương trình con Biến này đặt ngoài tất cả các cấu trúc, các hàm (kể cả hàm chính Chu trình sống của nó bắt đầu từ khi chạy chương trình đến khi kết thúc chương trình
Biến cục bộ: biến đặt trong hàm, cấu trúc, chỉ ảnh hưởng trong phạm vi hàm và cấu trúc đó Biến sẽ được khởi tạo khi bắt đầu hàm đó và giải phóng khi kết thúc hàm
1.3 CÁC HÀM
Một chương trình viết trong ngôn ngữ C là một dãy các hàm, trong đó có
một hàm chính (hàm main()) Hàm chia các bài toán lớn thành các công việc nhỏ
hơn, giúp thực hiện những công việc lặp lại nào đó một cách nhanh chóng mà không phải viết lại đoạn chương trình Thứ tự các hàm trong chương trình là bất
kỳ, song chương trình bao giờ cũng đi thực hiện từ hàm main() Trong C chương trình con chỉ tồn tại dới dạng hàm chứ không có thủ tục
Trang 13Bài giảng kỹ thuật lập trình vi điều khiển
Trang 7
Hàm có thể xem là một đơn vị độc lập của chương trình Các hàm có vai trò ngang nhau, vì vậy không có phép xây dựng một hàm bên trong các hàm khác
1.3.1 Khai báo và định nghĩa hàm
Xây dựng một hàm bao gồm: khai báo kiểu hàm, đặt tên hàm, khai báo các đối và đưa ra câu lệnh cần thiết để thực hiện yêu cầu đề ra cho hàm Một
<Kiểu_trả_về> <tên_hàm> ( [khai báo các tham số hình thức])
Ví dụ:
{ [Khai báo các biến cục bộ]
[Các câu lệnh]
[return[biểu thức];]
}
Giải thích:
- <Kiểu_trả_về>: giá trị kiểu dữ liệu của dữ liệu sẽ trả về cho hàm
- <tên_hàm>: tên của hàm mà bạn muốn định nghĩa, được đặt theo qui tắc đặt tên của C
- [khai báo các tham số hình thức]: các tham số hình thức và kiểu của chúng
- [Khai báo các biến cục bộ]: khai báo các biến cục bộ, các biến này chỉ có tác dụng trong nội bộ hàm
- [return]: là lệnh thực hiện gán giá trị trả về cho hàm
- [biểu thức]: là giá trị trả về cho hàm, có thể là biến, hằng, biểu thức nhưng phải có giá trị xác định và có kiểu dữ liệu là kiểu đã khai báo cho hàm
Lưu ý:
- Hàm có thể có giá trị trả về hoặc không, giá trị trả về phải cùng kiểu với kiểu trả về đã khai báo hàm Nếu hàm không có giá trị trả về thì đặt từ
Trang 14Bài giảng kỹ thuật lập trình vi điều khiển
Trang 8
- Khi hàm khai báo không có kiểu ở trước nó thì nó được mặc định là kiểu int
- Không nhất thiết phải khai báo nguyên mẫu hàm Nhưng nói chung nên
có vì nó cho phép chương trình biên dịch phát hiện lỗi khi gọi
- Nguyên mẫu của hàm thực chất là dòng đầu tiên của hàm thêm vào dấu
―;‖ Tuy nhiên, trong nguyên mẫu có thể bỏ tên các tham số hình thức
1.3.2 Lời gọi hàm
Cú pháp:
tên hàm ([Danh sách các tham số thực])
Danh sách các tham số thực phải bằng số tham số hình thức và lần lượt chúng có kiểu tương ứng với nhau
1.3.3 Tham số hình thức, tham số thực và biến cục bộ
Các tham số dùng khi khai báo hàm được gọi là tham số hình thức Các tham số được cung cấp cho hàm khi gọi hàm là tham số thực Tham số thực có thể là một biểu thức, trong khi tham số hình thức thì không thể là 1 biểu thức Dãy các tham số thực phải tương ứng về kiểu với tham số hình thức
Có những hàm không cần có tham số Vì vậy, khi khai báo ta có thể dùng
từ khóa void để báo rằng hàm không cần tham số
1.3.4 Quy tắc hoạt động của hàm
Khi gặp một lời gọi hàm thì nó sẽ bắt đầu được thực hiện Nói cách khác, khi máy gặp lời gọi hàm ở một vị trí nào đó trong chương trình, máy sẽ tạm dời chỗ đó và chuyển đến hàm tương ứng Quá trình đó diễn ra theo trình tự sau:
- Cấp phát bộ nhớ cho các biến cục bộ
- Gán giá trị của các tham số thực cho các tham số hình thức tương ứng
- Thực hiện các câu lệnh trong thân hàm
- Khi gặp câu lệnh return hoặc dấu } cuối cùng của thân hàm thì máy sẽ xoá các tham số hình thức, biến cục bộ và ra khỏi hàm
Nếu trở về từ một câu lệnh return có chứa biểu thức thì giá trị của biểu thức được gán cho hàm Giá trị của hàm sẽ được sử dụng trong các biểu thức chứa nó