Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 34 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
34
Dung lượng
640,55 KB
Nội dung
Bài 03 TIMERS & INTERRUPTS I Timer: Hoạt động timer vi điều khiển: gồm nguồn cấp xung clock, đếm nhị phân bit báo trạng thái tràn đếm BỘ ĐẾM NHỊ PHÂN 8/16 BIT TF Có thể đặt trước giá trị ban đầu cho đếm Giá trị đếm: - bit: 0, 1, 2, … 255, 0, 1, … - 16 bit: 0, 1, 2, ….65535, 0, 1, … Timer 0: bit Các lệnh liên quan timer 0: Setup_timer_0(RTCC_DIV_4| RTCC_INTERNAL) - RTCC_INTERNAL: xung clock FOSC/4 - RTCC_DIV_4: tần số xung clock chia trước đưa vào đếm Set_timer0(byte) - Đặt trước giá trị ban đầu vào đếm timer (0 - 255) - Ví dụ: Set_timer0(56); // tràn sau 200 (=256 – 56) xung clock Get_timer0() - Đọc giá trị timer - Ví dụ: a = get_timer0(); // đọc giá trị timer0 gán vào biến a Ví dụ 01: cho tần số thạch anh MHz, tính thời gian tràn timer Setup_timer_0(RTCC_DIV_4| RTCC_INTERNAL); Set_timer0(156); Ví dụ 02: cho tần số thạch anh 20 MHz, tính thời gian tràn timer Setup_timer_0(RTCC_DIV_4| RTCC_INTERNAL); Set_timer0(56); Ví dụ 03: cho tần số thạch anh MHz, tính thời gian tràn timer Setup_timer_0(RTCC_DIV_16| RTCC_INTERNAL); Set_timer0(156); Ví dụ 04: Viết chương trình delay ms dùng timer với thạch anh MHz Sử dụng: Setup_timer_0(RTCC_DIV_4| RTCC_INTERNAL); Ví dụ 05: Viết chương trình delay x ms dùng timer với thạch anh MHz Sử dụng: Setup_timer_0(RTCC_DIV_32| RTCC_INTERNAL); Timer 1: 16 bit Các lệnh liên quan timer 1: Setup_timer_1(T1_INTERNAL|T1_DIV_BY_8) - T1_INTERNAL: xung clock FOSC/4 - T1_DIV_BY_8: tần số xung clock chia trước đưa vào đếm Set_timer1(2 byte) - Đặt trước giá trị ban đầu vào đếm timer (0 - 65535) - Ví dụ: Set_timer1(5536); // tràn sau 60.000 (=65.536-5.536) xung clock Get_timer1() - Đọc giá trị timer - Ví dụ: a = get_timer1(); // đọc giá trị timer1 gán vào biến a Ví dụ 01: cho tần số thạch anh MHz, tính thời gian tràn timer Setup_timer_1(T1_INTERNAL|T1_DIV_BY_4) Set_timer1(15536); Ví dụ 02: Viết chương trình delay s dùng timer với thạch anh MHz Sử dụng: Setup_timer_1(T1_INTERNAL|T1_DIV_BY_4) Ví dụ 03: Viết chương trình delay x s dùng timer với thạch anh MHz Sử dụng: Setup_timer_1(T1_INTERNAL|T1_DIV_BY_2) 10 Ví dụ 02: Cho sơ đồ mạch VDD 4.7uF - 10uF VDD R1 10K C2 C6 33P OSC1/CLKIN RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7 Y1 15 16 17 18 23 24 25 26 R9 4K7 Q1 R10 4K7 R11 4K7 Q2 A1013 LED4 A1013 LED7S a b c d e f g p R12 4K7 Q4 A1013 RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCL RC4/SDA RC5/SDO RC6/TX/CK RC7/RX/DT RD7/PSP7 RD6/PSP6 RD5/PSP5 RD4/PSP4 RD3/PSP3 RD2/PSP2 RD1/PSP1 RD0/PSP0 30 29 28 27 22 21 20 19 VDD 20 C2 10 C1 a b c d e f g p C1 Q3 C2 LED7S a b c d e f g p C2 10 LED3 a b c d e f g p LED7S C1 a b c d e f g p 10 a b c d e f g p LED2 LED7S VCC GND C11 33P a b c d e f g p A1013 OSC2/CLKO VCC 14 8M 10 LED1 a b c d e f g 10 p 12 13 R1 R2 R3 R4 R5 R R6 R R7 R R8 R R R R 100X8 C2 40 39 38 37 36 35 34 33 C1 RA0/AN0 RA1/AN1 RA2/AN2/Vref RA3/AN3/Vref + RA4/TOCKI RA5/AN4/SS RB7/PGD RB6/PGC RB5 RB4 RB3/PGM RB2 RB1 RB0/INT PIC16F877A 1uF 31 32 MCLR/Vpp GND VCC U2 C3 11 RESET RST Yêu cầu 01: hiển thị chữ “HELP” LED với thời gian delay ms LED HƯỚNG DẪN: #include #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP #use delay(clock=8M) // Void main() { While (1){ Output_d(0xff);// tắt led Output_b(0x91); output_low(PIN_D3); delay_ms(3);// “H” Output_d(0xff);// tắt led Output_b(0x61); output_low(PIN_D2); delay_ms(3); // “E” Output_d(0xff);// tắt led Output_b(0xe3); output_low(PIN_D1); delay_ms(3);// “L” Output_d(0xff);// tắt led Output_b(0x31); output_low(PIN_D0); delay_ms(3);// “P”} } 21 Yêu cầu 02: Dùng ngắt timer để quét LED, thời gian delay led ms Sử dụng: Setup_timer_1(T1_INTERNAL| T1_DIV_BY_1) Tính chu kì qt LED timer Hiển thị chữ “HELP” LED HƯỚNG DẪN: // Chu kì quét LED là: ~33 mS #include #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP #use delay(clock=8M) 22 // Chương trình ngắt timer #INT_TIMER1 void qled() { Output_d(0xff);// tắt led Output_b(0x91); output_low(PIN_D3); delay_ms(3);// “H” Output_d(0xff);// tắt led Output_b(0x61); output_low(PIN_D2); delay_ms(3); // “E” Output_d(0xff);// tắt led Output_b(0xe3); output_low(PIN_D1); delay_ms(3);// “L” Output_d(0xff);// tắt led Output_b(0x31); output_low(PIN_D0); delay_ms(3);// “P” } // -CHUONG TRÌNH CHÍNH Void main() { enable_interrupts(GLOBAL); enable_interrupts(INT_TIMER1); setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); while(1); } 23 // Cách khác int8 pos = 0; #INT_TIMER1 void qled() { Set_timer1(59536);//65536 – 59526 = 6000 xung -> 3ms If (pos ==0) {output_d(0xff);Output_b(0x91); output_low(PIN_D3);} If (pos ==1) {output_d(0xff);Output_b(0x61); output_low(PIN_D2);} If (pos ==2) {output_d(0xff);Output_b(0xe3); output_low(PIN_D1);} If (pos ==3) {output_d(0xff);Output_b(0x31); output_low(PIN_D0);} pos++; If (pos==4) pos=0; } // -CHUONG TRÌNH CHÍNH Void main() { enable_interrupts(GLOBAL); enable_interrupts(INT_TIMER1); setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); while(1); } 24 BÀI TẬP Cho sơ đồ mạch: VDD 4.7uF - 10uF VDD R1 10K C2 C11 33P VDD RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCL RC4/SDA RC5/SDO RC6/TX/CK RC7/RX/DT 11 VDD 15 16 17 18 23 24 25 26 R21 R22 10K 10K GND 8M OSC2/CLKO VCC 14 RD7/PSP7 RD6/PSP6 RD5/PSP5 RD4/PSP4 RD3/PSP3 RD2/PSP2 RD1/PSP1 RD0/PSP0 30 29 28 27 22 21 20 19 A K 15 16 GND VCC CS R/W CONST LMP VCC CS Y1 10 RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7 DT4 DT5 DT6 DT7 OSC1/CLKIN R4 5/3W R3 10K LMP Q2 R6 4K7 VCC A1013 12 13 10 11 12 13 14 C6 33P RS TEXT LCD LINES x 16 CHARACTERS LAMP LCD1_TC1602A1 RW 31 RA0/AN0 RA1/AN1 RA2/AN2/Vref RA3/AN3/Vref + RA4/TOCKI RA5/AN4/SS 40 39 38 37 36 35 34 33 D0 D1 D2 D3 D4 D5 D6 D7 RB7/PGD RB6/PGC RB5 RB4 RB3/PGM RB2 RB1 RB0/INT MCLR/Vpp PIC16F877A RS 1uF GND 32 U2 C3 VCC RESET RST SW2 SW1 VDD 25 BÀI TẬP Dùng ngắt timer để kiểm tra phím, thời gian quét phím 200 ms Sử dụng: Setup_timer_1(T1_INTERNAL| T1_DIV_BY_1) Viết chương trình thực hiện: hiển thị chữ “Set value:” dòng (x,y) = (5,1) hiển thị biến set_val (khởi động = 0) dòng (x,y) = (8,2); nếu: - Nhấn SW1: set_val < 200: set_val = set_val + - Nhấn SW2: Nếu set_val > 0: set_val = set_val -1 Nội dung thay đổi set_val cập nhật tức thời dịng LCD vị trí (x,y) = (8,2) Dùng ngắt timer kiểm tra phím nhấn, thời gian quét phím 200 ms, sử dụng: Setup_timer_0(RTCC_DIV_4| RTCC_INTERNAL) Viết chương trình hiển thị chữ “DONG HO” (5,1) hiển thị giờ:phút: giây (bắt đầu từ 00:00:00) (4,2) Dùng SW1 để chỉnh (0 - 23) SW2 để chỉnh phút (0-59) (Chương trình delay 1s dùng timer 1) 26 BÀI TẬP VDD Cho sơ đồ mạch: 4.7uF - 10uF VDD R1 10K C2 C6 33P OSC1/CLKIN RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7 Y1 RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCL RC4/SDA RC5/SDO RC6/TX/CK RC7/RX/DT RD7/PSP7 RD6/PSP6 RD5/PSP5 RD4/PSP4 RD3/PSP3 RD2/PSP2 RD1/PSP1 RD0/PSP0 R11 4K7 Q2 A1013 LED4 A1013 R12 4K7 Q4 A1013 D8 D7 D6 D5 D4 D2 VDD D1 D2 D3 D4 D5 D6 D7 D8 R25 R26 R27 R28 R29 R30 R31 R32 270X8 27 C2 LED7S C1 a b c d e f g p 10 C1 Q3 a b c d e f g p a b c d e f g p C2 LED7S C2 C1 C2 a b c d e f g p 10 30 29 28 27 22 21 20 19 D1 15 16 17 18 23 24 25 26 A1013 LED3 a b c d e f g p LED7S VCC GND C11 33P D1 D2 D3 D4 D5 D6 D7 D8 R10 4K7 Q1 OSC2/CLKO VCC 14 8M R9 4K7 10 10 12 13 a b c d e f g p LED2 a b c d e f g p LED7S C1 a b c d e f g 10 p LED1 R1 R2 R3 R4 R5 R R6 R R7 R R8 R R R R 100X8 RA0/AN0 RA1/AN1 RA2/AN2/Vref RA3/AN3/Vref + RA4/TOCKI RA5/AN4/SS RB7/PGD RB6/PGC RB5 RB4 RB3/PGM RB2 RB1 RB0/INT 40 39 38 37 36 35 34 33 D3 PIC16F877A 1uF 31 32 MCLR/Vpp GND VCC U2 C3 11 RESET RST BÀI TẬP Dùng ngắt timer để quét led, thời gian delay led ms Sử dụng: Setup_timer_0(RTCC_DIV_128|RTCC_INTERNAL) Viết chương trình thực hiện: hiển thị chữ “StoP” LED Tính thời gian ngắt timer Dùng ngắt timer để quét led, thời gian delay led ms Sử dụng: Setup_timer_0(RTCC_DIV_64|RTCC_INTERNAL) - Tính thời gian ngắt timer - Viết chương trình hiển thị số tăng dần từ 000 đến 999 LED 7S 2, Dùng ngắt timer để quét led, thời gian delay led ms Sử dụng: Setup_timer_1(T1_INTERNAL| T1_DIV_BY_1) - Tính thời gian ngắt timer - Viết chương trình led sáng dần từ D1 đến D8, thời gian delay 200 ms, lặp lại 50 lần đồng thời hiển thị số lần LED1 đến LED4 theo dạng: “Ct.XX” 28 BÀI TẬP Cho sơ đồ mạch: VDD 4.7uF - 10uF VDD R1 10K C2 C6 33P OSC1/CLKIN RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7 Y1 R21 R22 10K 10K RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCL RC4/SDA RC5/SDO RC6/TX/CK RC7/RX/DT GND VDD SW2 SW1 VDD 15 16 17 18 23 24 25 26 Q1 R10 4K7 R11 4K7 Q2 A1013 LED4 Q3 A1013 RD7/PSP7 RD6/PSP6 RD5/PSP5 RD4/PSP4 RD3/PSP3 RD2/PSP2 RD1/PSP1 RD0/PSP0 LED7S R12 4K7 Q4 A1013 30 29 28 27 22 21 20 19 VDD 29 C2 a b c d e f g p C1 10 a b c d e f g p C1 a b c d e f g p C2 LED7S 10 C2 C1 a b c d e f g p LED3 a b c d e f g p LED7S 10 VCC VCC C11 33P R9 4K7 A1013 OSC2/CLKO 11 14 8M 10 a b c d e f g p 12 13 a b c d e f g p LED2 LED7S 31 RA0/AN0 RA1/AN1 RA2/AN2/Vref RA3/AN3/Vref + RA4/TOCKI RA5/AN4/SS LED1 a b c d e f g 10 p C2 R1 R2 R3 R4 R5 R R6 R R7 R R8 R R R R 100X8 C1 1uF RB7/PGD RB6/PGC RB5 RB4 RB3/PGM RB2 RB1 RB0/INT 40 39 38 37 36 35 34 33 MCLR/Vpp PIC16F877A GND 32 U2 C3 VCC RESET RST BÀI TẬP Dùng ngắt timer để quét led, thời gian delay led ms Sử dụng: Setup_timer_0(RTCC_DIV_4|RTCC_INTERNAL) Viết chương trình thực hiển thị số đếm LED, giá trị ban đầu 0, và: - Nhấn SW1: số đếm < 1000: sodem = sodem+10 - Nhấn SW2: số đếm > 0: sodem = sodem-1 7* Yêu cầu giống nhấn giữ phím giá trị tăng/giảm với thời gian delay 400 ms 8* Yêu cầu giống nhấn phím liên tục giây giá trị tăng/giảm nhanh với thời gian delay 100 ms (bình thường phím tăng giảm với thời gian 400 ms) 30 BÀI TẬP Cho sơ đồ mạch: VDD 4.7uF - 10uF VDD VDD R1 10K C2 10K 10K 10K MCLR/Vpp 1uF D 31 32 U2 C3 RA0/AN0 RA1/AN1 RA2/AN2/Vref RA3/AN3/Vref + RA4/TOCKI RA5/AN4/SS PIC16F877A RB7/PGD RB6/PGC RB5 RB4 RB3/PGM RB2 RB1 RB0/INT 40 39 38 37 36 35 34 33 R1 R2 R3 R4 R5 R R6 R R7 R R8 R R R R 270X8 LED1 10 a b c d e f g p LED7S VDD C6 33P OSC1/CLKIN RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7 E 14 8M C11 33P B F 15 16 17 18 23 24 25 26 OSC2/CLKO RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCL RC4/SDA RC5/SDO RC6/TX/CK RC7/RX/DT GND A VCC 11 10 RD7/PSP7 RD6/PSP6 RD5/PSP5 RD4/PSP4 RD3/PSP3 RD2/PSP2 RD1/PSP1 RD0/PSP0 30 29 28 27 22 21 20 19 12 13 Y1 VDD 31 C2 R16 C1 R15 10K R14 C GND VCC R13 RESET RST BÀI TẬP Viết chương trình đọc bàn phím HEX hiển thị giá trị HEX led đoạn a) Qt phím chương trình b) Qt phím dùng ngắt timer1 Setup_timer_1(T1_INTERNAL| T1_DIV_BY_1) HƯỚNG DẪN: Cấu hình PORT C với RC0-RC3 ngõ vào; RC4-RC7 ngõ Xuất giá trị cột kiểm tra hàng tương ứng để biết phím nhấn 32 BÀI TẬP VDD 4.7uF - 10uF Cho sơ đồ mạch: VDD VDD R1 10K C2 C 10K 10K 10K 10K U2 C3 MCLR/Vpp 1uF D 31 32 R16 GND R15 VCC R14 RESET RST R13 RA0/AN0 RA1/AN1 RA2/AN2/Vref RA3/AN3/Vref + RA4/TOCKI RA5/AN4/SS PIC16F877A RB7/PGD RB6/PGC RB5 RB4 RB3/PGM RB2 RB1 RB0/INT 40 39 38 37 36 35 34 33 S1 S2 S3 S4 S5 S6 S7 S8 C6 33P OSC1/CLKIN RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7 A E 14 8M C11 33P B F RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCL RC4/SDA RC5/SDO RC6/TX/CK RC7/RX/DT 11 15 16 17 18 23 24 25 26 OSC2/CLKO GND VCC 10 RD7/PSP7 RD6/PSP6 RD5/PSP5 RD4/PSP4 RD3/PSP3 RD2/PSP2 RD1/PSP1 RD0/PSP0 30 29 28 27 22 21 20 19 D11 LED Q1 Q2 Q3 Q4 R26 270 D12 LED R27 270 12 13 Y1 VDD R9 4K7 Q1 A1013 R10 4K7 R11 4K7 Q2 A1013 Q3 A1013 LED7S R12 4K7 C2 a b c d e f g p C1 10 a b c d e f g p C2 LED7S a b c d e f g p C1 10 LED4 a b c d e f g p LED7S a b c d e f g p LED3 C2 10 C1 a b c d e f g p C2 LED7S C1 a b c d e f g p a b c d e f g 10 p LED2 LED1 S1 S2 S3 S4 S5 S6 S7 S8 R1 R2 R3 R4 R5 R R6 R R7 R R8 R R R R 100X8 Q4 A1013 VDD Q1 Q2 Q3 Q4 33 BÀI TẬP 10 Cho phép nhập vào số 0000 đến 9999 từ bàn phím hiển thị led đoạn Nếu số nhập vào > 100, led D11 sáng; số > 500: led D11 D12 sáng Chọn nút “F” nút xóa (CLEAR) số nhập vào Quét phím led đoạn dùng ngắt timer1 Setup_timer_1(T1_INTERNAL| T1_DIV_BY_1) HƯỚNG DẪN: Quét phím ma trận: cấu hình PORT C với RC0-RC3 ngõ vào; RC4-RC7 ngõ Xuất giá trị cột kiểm tra hàng tương ứng để biết phím nhấn 34 ... #INT _TIMER0 (tràn timer 0) #INT_RTCC #INT _TIMER1 (tràn time 1) #INT _TIMER2 (tràn timer 2) #INT_EXT (mức thấp RB0) #INT_RDA (nhận byte) (tràn timer 0) NỘI DUNG CHƯƠNG TRÌNH CHÍNH Enable _interrupts( GLOBAL)... gian tràn timer Setup _timer_ 0(RTCC_DIV_4| RTCC_INTERNAL); Set _timer0 (156); Ví dụ 02: cho tần số thạch anh 20 MHz, tính thời gian tràn timer Setup _timer_ 0(RTCC_DIV_4| RTCC_INTERNAL); Set _timer0 (56);... trị ban đầu vào đếm timer (0 - 255) - Ví dụ: Set _timer0 (56); // tràn sau 200 (=256 – 56) xung clock Get _timer0 () - Đọc giá trị timer - Ví dụ: a = get _timer0 (); // đọc giá trị timer0 gán vào biến