Giáo trình Kỹ thuật lập trình vi điều khiển
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ự="">,!,~>
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‖).
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.
Tóm tắt nội dung tài liệu: Giáo trình Kỹ thuật lập trình vi điều khiển
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 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ê ... ****************************** #separate void LCD_Init () { LCD_SetData ( 0x00 ); delay_ms(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:
- giao_trinh_ky_thuat_lap_trinh_vi_dieu_khien.pdf