Bài giảng Thí nghiệm vi xử lý (Trình độ: Cao đẳng) - Nguyễn Thị Thu Lan

1.1. MỤC TIÊU Sau khi học xong bài này người học có khả năng: - Vẽ được sơ đồ kết nối mạch hiển thị đồng hồ trên phần mềm Proteus. - Thành lập lưu đồ chương trình hiển thị mạch đồng hồ đếm giây trên LED 7 đoạn và LCD. - Lập trình được chương trình điều khiển hiển thị đồng hồ số sử dụng PIC 16F877 - Thực hiện tốt các biện pháp an toàn cho người và thiết bị, tự tin trong lập trình các ứng dụng. - Đảm bảo an toàn cho người và thiết bị, tự tin trong việc sử dụng và ứng dụng các phần mềm khi lập trình. 1.2. DỤNG VỤ, HỌC CỤ SỬ DỤNG - Board Kit thí nghiệm Vi Xử Lý. - Máy tính, phần mềm mô phỏng Proteus, Keil C - Vi điều khiển 89S52 và PIC 16F877A 1.3. NỘI DUNG

pdf137 trang | Chia sẻ: Tiểu Khải Minh | Ngày: 21/02/2024 | Lượt xem: 94 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Bài giảng Thí nghiệm vi xử lý (Trình độ: Cao đẳng) - Nguyễn Thị Thu Lan, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
nt n) { output_d((MAP[n%10]) ^ 0x00); output_low(PIN_A0); delay_ms(10); output_high(PIN_A0); } //============================================ // main program //============================================ void main() { int i,count; count=0; while(TRUE) { for (i=0;i<=50;i++) display(count); // dispay 50 times count=(count==9) ? 0: count+1; } } 1.3.1.4. NHỮNG SAI HỎNG THƢỜNG GẶP - Lập sai bảng mã LED 7 ĐOẠN cho bộ thí nghiệm đa năng ĐTVT 03 của phòng thí nghiệm. - Chú ý các lệnh SETB và CLR port khi thực hiện phương pháp chốt hoặc quét trên LED 7 ĐOẠN. - Khi thực cắm chốt giao tiếp các port của vi điều khiển đến LED 7 ĐOẠN đơn cần chú ý thứ tự port được lập trình tăng hay giảm. - Vấn đề an toàn cho thiết bị khi giao tiếp với máy tính cần ngắt nguồn thiết bị trước khi cắm bus vào bộ thí nghiệm đa năng ĐTVT03 BÀI 3: ĐIỀU KHIỂN LED 7 ĐOẠN Trang 65 1.3.2 TIẾN HÀNH THỰC HIỆN THÍ NGHIỆM 1 Vẽ sơ đồ mạch điều khiển led 7 đoạn trên phần mềm Proteus 2. Viết chương trình điều khiển led 7 đoạn dùng vi điều khiển 8 bit, 16 bit 3. Viết chương trình con tạo trễ 4. Biên dịch và nạp chương trình thực thi vào bộ kit thí nghiệm vi xử lý. 1.3.3 BÀI TẬP THÍ NGHIỆM PHẦN 1: Lập trình cho vi điều khiển 8 bit AT89S52 ‒ Viết chương trình trên để giá trị xuất ra 2 Led 7 đoạn tăng dần từ 00 - 59. ‒ Viết đoạn chương trình trên để giá trị xuất ra 2 Led 7 đoạn tăng dần từ 00 - 23. ‒ Viết đoạn chương trình trên để giá trị xuất ra 2 Led 7 đoạn giảm dần từ 99 - 00. ‒ Viết đoạn chương trình trên để giá trị xuất ra 2 Led 7 đoạn giảm dần từ 59 - 00. ‒ Viết đoạn chương trình trên để giá trị xuất ra 2 Led 7 đoạn giảm dần từ 23 - 00. PHẦN 2: Lập trình cho vi điều khiển 16 bit PIC 16F887A Bài tập 1: ‒ Lập trình điều khiển hiển thị giá trị thập phân đếm từ 00-99 lên 2 led 7 đoạn trên mô phỏng và trên board thí nghiệm a. Vẽ sơ đồ nguyên lý b. Lập lưu đồ chương trình c. Chương trình tham khảo //2 led 7 đoạn được chọn trong chương trình này là led ở chân PIN_A0 và PIN_A1, giải mã mềm sử dụng phương pháp quét led, tạo trễ 2ms, tần số xung clock là 8MHz #include #fuses HS,NOLVP,NOWDT,PUT #use delay (clock=8000000) // defind crystal = 8MHz byte const MAP[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //=========================================== // this function use to display number 00=99 // input : n = number to display //=========================================== void display(int n) { BÀI 3: ĐIỀU KHIỂN LED 7 ĐOẠN Trang 66 char b; b=((MAP[n/10]) ^ 0x00); if ((n/10)==(0)) b=0xC0; output_d(b); output_low(PIN_A1); delay_ms(2); output_high(PIN_A1); output_d((MAP[n%10]) ^ 0x00); output_low(PIN_A0); delay_ms(2); output_high(PIN_A0); } //============================================ // main program //============================================ void main() { int i,count; count=0; while(TRUE) { for (i=0;i<=50;i++) display(count); // dispay 50 times count=(count==99) ? 0: count+1; } } Bài tập 2: ‒ Viết chương trình hiển thị giá trị đếm thập phân từ 0-7 lên 1 led 7 đoạn tại chân PIN_A5 trên phần mềm và trên board thí nghiệm a. Vẽ sơ đồ nguyên lý b. Lập lưu đồ chương trình BÀI 3: ĐIỀU KHIỂN LED 7 ĐOẠN Trang 67 c. Viết và thực thi chương trình theo yêu cầu trên Bài tập 3: ‒ Viết chương trình hiển thị giá trị từ 00-59 lên 2 led 7 đoạn tại chân PIN_A4 và PIN_A5. a. Vẽ sơ đồ nguyên lý b. Lập lưu đồ chương trình c. Viết và thực thi chương trình theo yêu cầu trên Bài tập 4: ‒ Viết chương trình hiển thị giá trị từ 000-999 lên 3 led 7 đoạn tại chân PIN_A0, PIN_A1 và PIN_A2. a. Vẽ sơ đồ nguyên lý b. Lập lưu đồ chương trình c. Viết và thực thi chương trình theo yêu cầu trên Bài tập 5: ‒ Viết chương trình hiển thị giá trị từ 999 – 000 lên 3 led 7 đoạn tại chân PIN_A0, PIN_A1 và PIN_A2. a. Vẽ sơ đồ nguyên lý b. Lập lưu đồ chương trình c. Viết và thực thi chương trình theo yêu cầu trên BÀI 4: GIAO TIẾP THIẾT BỊ NGOẠI VI - LCD Trang 68 Bài thí nghiệm số 4: GIAO TIẾP THIẾT BỊ NGOẠI VI – LCD Thời lƣợng: 12 giờ 1.1. MỤC TIÊU - Viết đúng chương trình hiển thị dữ liệu trên LCD sử dụng vi điều khiển PIC. - Sử dụng thành thạo phần mềm trong biên soạn và biên dịch và sửa lỗi chương trình. - Nạp và thực thi được các ứng dụng cơ bản trong điều khiển LCD hiển thị chuỗi dữ liệu bất kỳ. - Đảm bảo an toàn cho người và thiết bị, tự tin trong việc sử dụng và ứng dụng các phần mềm khi lập trình. 1.2. DỤNG VỤ, HỌC CỤ SỬ DỤNG - Board Kit thí nghiệm Vi Xử Lý. - Máy tính, phần mềm mô phỏng Proteus, Keil C - Vi điều khiển 89S52 và PIC 16F877A 1.3. NỘI DUNG 1.3.1 CƠ SỞ LÝ THUYẾT 1.3.1.1. GIỚI THIỆU LCD Hình dáng và sơ đồ chân LCD 16x2 Hình 4.1: Hình dáng – Sơ đồ chân LCD 16x2 BÀI 4: GIAO TIẾP THIẾT BỊ NGOẠI VI - LCD Trang 69 Chức năng chân LCD 16x2 Chân số Kí hiệu Mức logic I/O Chức năng 1 Vss - - Cấp mass(GND) 2 Vdd - - Cấp nguồn (5V) 3 Vee - I Điều chỉnh độ tương phản LCD 4 RS 0/1 I Lựa chọn thanh ghi lệnh 0: thanh ghi lệnh 1: thanh ghi dữ liệu 5 R/W 0/1 I 0: ghi vào LCD 1: đọc từ LCD 6 E 1,1>=0 I Tín hiệu cho phép 7 DB1 0/1 I/O Data bus line 0 (LSB) 8 DB2 0/1 I/O Data bus line 1 9 DB3 0/1 I/O Data bus line 2 10 DB4 0/1 I/O Data bus line 3 11 DB5 0/1 I/O Data bus line 4 12 DB6 0/1 I/O Data bus line 5 13 DB7 0/1 I/O Data bus line 6 14 DB8 0/1 I/O Data bus line 7 (MSB) 15 Vcc - - Nguồn cấp 16 GND - - Mass BÀI 4: GIAO TIẾP THIẾT BỊ NGOẠI VI - LCD Trang 70 1.3.1.2. SƠ ĐỒ NGUYÊN LÝ Hình 4.2: Sơ đồ nguyên lý mạch điều khiển LCD 1.3.1.3. LƢU ĐỒ GIẢI THUẬT HIỂN THỊ THÔNG TIN TRÊN 2 HÀNG Hình 4.3: Lƣu đồ giải thuật BÀI 4: GIAO TIẾP THIẾT BỊ NGOẠI VI - LCD Trang 71 1.3.1.4. CÁC LỆNH ĐIỀU KHIỂN LCD - lcd_init(); khởi tạo lcd - lcd_gotoxy(1,1); di chuyển con trỏ đến vị trí cột 1, hàng 1 - printf(lcd_putc,"Nguyen Van A"); xuất nội dung trong “” ra lcd - lcd_moveRight(16); dịch phải lcd - lcd_moveLeft(16); dịch trái lcd 1.3.1.5. HÌNH DÁNG VÀ SƠ ĐỒ CHÂN LM335: Hình 4.4: Sơ đồ chân vi mạch LM335 - Trong phần này ta có biểu thức chuyển đổi nhiệt độ từ giá trị độ K về độ C. Do có biểu thức này là do LM335 thay đổi 10mV/K, ta lại cần hiển thị độ C. Vì 0oC = 273oK. Giả sử Vref = VCC = 5V thì 0oC LM335 sẽ xuất hiện 1 điện áp là 2.73V và với điện áp này sẽ cho giá trị: BÀI 4: GIAO TIẾP THIẾT BỊ NGOẠI VI - LCD Trang 72 - Như vậy khi tính toán giá trị để hiển thi nhiệt độ C ta cần trừ đi giá trị 558.558. Vậy công thức chuyển đổi sang độ C đầy đủ là: - Giá trị 2.048 trong công thức có được là do ta dùng ADC 10 bit. Nếu với điện áp lấy mẫu 5V thì mỗi mức lượng tử tương ứng: - Ta biết rằng LM335 thay đổi 10mV/K do đó ứng với sự thay đổi 1 độ C sẽ thay đổi 2.048 mức lượng tử (10mV/4.883 = 2.048). Công thức trên là cho ADC 10 bit, với các bộ ADC 10 bit hay 12 bit việc tính toán chuyển đổi giá trị cũng tương tự 1.3.1.6. NHỮNG SAI HỎNG THƢỜNG GẶP - Cần chú ý sơ đồ chân khi giao tiếp với LCD 16x2, không cắm lộn chân. - Tính toán đúng giá trị điện áp đặt cho vi mạch LM335 - Thực hiện giao tiếp với modul cảm biến nhiệt độ với nhiều hình thức khác nhau như: o Dùng độ nóng/ lạnh của nước tránh làm đổ nước vào thiết bị và máy tính. o Dùng độ nóng của mỏ hàn tránh làm phỏng người xung quanh và bản thân. o Dùng nguồn điện tránh chạm chập làm hư hỏng thiết bị. - Vấn đề an toàn cho người và thiết bị khi giao tiếp với máy tính cần ngắt nguồn thiết bị trước khi cắm bus vào bộ thí nghiệm đa năng ĐTVT03 1.3.2 TIẾN HÀNH THỰC HIỆN THÍ NGHIỆM 1. Vẽ sơ đồ mạch nguyên lý hiển thị LCD 2. Lập lưu đồ chương trình điều khiển 3. Biên soạn code trong CCS hoặc Proteus 4. Biên dịch, sửa lỗi, nạp chương trình kiểm chứng kết quả BÀI 4: GIAO TIẾP THIẾT BỊ NGOẠI VI - LCD Trang 73 1.3.3 BÀI TẬP THÍ NGHIỆM Bài tập 1: Biên dịch và kiểm chứng kết quả đoạn code sau #include #fuses HS, NOLVP, NOWDT, NOPROTECT #use delay (clock=8000000) //Use built-in function: delay_ms() & delay_us() #include "LCD_TM.c" //use module function void main(void) { while(true) { lcd_init(); lcd_gotoxy(1,1); printf(lcd_putc,"Nguyen Van A"); lcd_gotoxy(1,2); printf(lcd_putc,"LOP C18A TĐH"); delay_ms(500); lcd_moveRight(16); lcd_init(); lcd_gotoxy(5,1); printf(lcd_putc, "The best of"); lcd_gotoxy (1,2); printf(lcd_putc, "PIC,AVR,8051..."); delay_ms(500); lcd_moveRight(16); } } - Thay đổi chuỗi dữ liệu hiển thị trên LCD và kiểm chứng kết quả - Thực hiện thay đổi chuỗi dữ liệu bất kỳ khi được yêu cầu Bài tập 2: Viết chương trình hiển thị nhiệt độ lên LCD sử dụng cảm biến LM335 - Sơ đồ mạch hiển thị BÀI 4: GIAO TIẾP THIẾT BỊ NGOẠI VI - LCD Trang 74 Hình 4.5: Sơ đồ mạch hiển thị - Lập lưu đồ chương trình - Chương trình tham khảo #include #device ADC=10 #fuses HS, NOWDT, NOPROTECT, NOLVP #use delay(clock=8000000) #include float tam,nhietdo; void main() { lcd_init(); setup_adc(adc_clock_internal); setup_adc_ports(AN0_AN1_AN3); // A0 , A1 va A3 la chan Analog set_adc_channel(3); // Chon ADC tu chan 3 delay_ms(10); while (true) { BÀI 4: GIAO TIẾP THIẾT BỊ NGOẠI VI - LCD Trang 75 tam=(read_adc()-558.558); nhietdo=(tam/2.048); lcd_gotoxy(1,1); printf(lcd_putc," NHIET DO:"); lcd_gotoxy(12,1); printf(lcd_putc,"%1.0f",nhietdo); lcd_gotoxy(14,1); lcd_putc(223); lcd_gotoxy(15,1);printf(lcd_putc,"C"); } } Bài tập 3: Vẽ sơ đồ phần cứng, tóm tắt bảng chức năng, thành lập lưu đồ, lập chương trình điều khiển chuỗi kí tự trên cột 16, hàng 1 của LCD 16x2 là “ KHOA DIEN DIEN TU” dịch trái 10 lần, sau đó đi đến cột 1, hàng 2 hiển thị chuỗi kí tự “TRUONG CD GIAO THONG VAN TAI” dịch phải 15 lần. - Sơ đồ mạch điều khiển Hình 4.6: Sơ đồ mạch điều khiển - Lập lƣu đồ giải thuật cho chƣơng trình điều khiển - Chƣơng trình tham khảo #include #fuses HS, NOLVP, NOWDT, NOPROTECT #use delay (clock=8000000) BÀI 4: GIAO TIẾP THIẾT BỊ NGOẠI VI - LCD Trang 76 #define rs PIN_B4 #define enabled PIN_B5 #define DB4 PIN_B0 #define DB5 PIN_B1 #define DB6 PIN_B2 #define DB7 PIN_B3 char const lcd_type=2; char const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6}; //======================================= // Ham xuat 4 bit du lieu ra 4 chan RB0, RB1, RB2, RB3 //======================================= void make_out_data(char buffer_data) { output_bit(DB4,bit_test(buffer_data,0)); output_bit(DB5,bit_test(buffer_data,1)); output_bit(DB6,bit_test(buffer_data,2)); output_bit(DB7,bit_test(buffer_data,3)); } //=================================== //Ham goi nua byte du lieu //=================================== void lcd_send_nibble(char buffer_nibble) { make_out_data(buffer_nibble); delay_us(10); output_high(enabled); delay_us(10); output_low(enabled); } //==================================== // Ham goi 1 byte du lieu BÀI 4: GIAO TIẾP THIẾT BỊ NGOẠI VI - LCD Trang 77 //==================================== void lcd_send_byte( char address, char n) { output_low(rs); delay_ms(1); output_bit(rs,address);//lcd.rs = address; delay_us(40); output_low(enabled);//lcd.enable = 0; lcd_send_nibble(n>>4); lcd_send_nibble(n&0x0f); delay_ms(1); } //Ham khoi tao LCD //=============================================== void lcd_init() { char i; output_low(rs); //lcd.rs = 0; output_low(enabled); //lcd.enable = 0; delay_ms(500); lcd_send_nibble(2); for(i=0;i<=3;++i) lcd_send_byte(0,LCD_INIT_STRING[i]); } //================================================ // Ham di den toa do x, y de hien thi du lieu //================================================ void lcd_gotoxy( char x, char y) { char address; switch(y) BÀI 4: GIAO TIẾP THIẾT BỊ NGOẠI VI - LCD Trang 78 { case 1 : address=0x80;break; case 2 : address=0xc0;break; } address=address+(x-1); lcd_send_byte(0,address); } //================================================= void lcd_putc( char c) { lcd_send_byte(1,c); } //================================================= void LCD_ShiftRight() { lcd_send_byte(0,0x18); } //=============================================== void LCD_ShiftLeft() { lcd_send_byte(0,0x1C); } void LCD_MoveLeft(char p) { char i; for(i=0;i<p;i++) { LCD_ShiftLeft(); delay_ms(100); } } BÀI 4: GIAO TIẾP THIẾT BỊ NGOẠI VI - LCD Trang 79 void LCD_MoveRight(char p) { char i; for(i=0;i<p;i++) { LCD_ShiftRight(); delay_ms(200); } } void main(void) { lcd_init();// khoi tao LCD while(true) { lcd_send_byte(0,1); lcd_gotoxy(17,1); printf(lcd_putc,"TRUONG CAO DANG "); lcd_gotoxy(20,2); printf(lcd_putc,"GIAO THÔNG VẬN TẢI "); LCD_MoveLeft(40) ; lcd_send_byte(0,1);// xoa lcd_gotoxy(17,1); printf(lcd_putc,"THONG BAO"); LCD_MoveLeft(25) ; /* lcd_send_byte(0,1); lcd_gotoxy(17,1); printf(lcd_putc,"TUYEN SINH"); LCD_MoveLeft(26) ; */ lcd_send_byte(0,1); BÀI 4: GIAO TIẾP THIẾT BỊ NGOẠI VI - LCD Trang 80 lcd_gotoxy(32,1); printf(lcd_putc,"NAM 2020"); LCD_MoveRight(24) ; */ lcd_send_byte(0,1); lcd_gotoxy(23,1); printf(lcd_putc,"THOI KHOA BIEU HK3"); lcd_gotoxy(25,2); printf(lcd_putc,"LOP C18A TDH"); LCD_MoveRight(33) ; } } BÀI 6: INTERRUPT – NGẮT Trang 81 Bài thí nghiệm số 5: MẠCH ĐỊNH THỜI - TIMER Thời lƣợng: 12 giờ 1.1. MỤC TIÊU - Viết đúng chương trình hiển thị dữ liệu trên tải sử dụng timer lập trình vi điều khiển PIC. - Sử dụng thành thạo phần mềm trong biên soạn và biên dịch và sửa lỗi chương trình. - Nạp và thực thi được các ứng dụng cơ bản trong điều khiển hiển thị sử dụng timer. - Đảm bảo an toàn cho người và thiết bị, tự tin trong việc sử dụng và ứng dụng các phần mềm khi lập trình 1.2. DỤNG VỤ, HỌC CỤ SỬ DỤNG - Board Kit thí nghiệm Vi Xử Lý. - Máy tính, phần mềm mô phỏng Proteus, Keil C - Vi điều khiển 89S52 và PIC 16F877A 1.3. NỘI DUNG 1.3.1 CƠ SỞ LÝ THUYẾT 1.3.1.1. CẤU TRÚC LỆNH LIÊN QUAN ĐẾN TIMER - setup_counters(rtcc_state,wdt_state): Khởi động bộ đếm của timer - rtcc_state: Trạng thái đồng hồ thời gian thực, thông số này cho biết nguồn xung clock được lấy từ đâu và mức tác động như thế nào. Rtcc_state có thể là một trong các dạng sau: - RTCC_INTERNAL: Xung clock lấy từ dao động nội. - RTCC_EXT_L_TO_H: Xung clock lấy từ bên ngoài ( chân RA4/T0CKI), tác động cạnh lên - RTCC_EXT_H_TO_L: Xung clock lấy từ bên ngoài ( chân RA4/T0CKI), tác động cạnh xuống - wdt_state: Thời gian lấy mẫu của xung clock . Wdt_state có thể là một trong các dạng sau: - RTCC_DIV_1: Lấy mẫu 1 lần trong chu kỳ xung BÀI 6: INTERRUPT – NGẮT Trang 82 - RTCC_DIV_2: Lấy mẫu 2 lần trong chu kỳ xung - RTCC_DIV_4: Lấy mẫu 4 lần trong chu kỳ xung - RTCC_DIV_8: Lấy mẫu 8 lần trong chu kỳ xung - RTCC_DIV_16: Lấy mẫu 16 lần trong chu kỳ xung - RTCC_DIV_32: Lấy mẫu 32 lần trong chu kỳ xung - RTCC_DIV_64: Lấy mẫu 64 lần trong chu kỳ xung - RTCC_DIV_128: Lấy mẫu 128 lần trong chu kỳ xung - RTCC_DIV_256: Lấy mẫu 256 lần trong chu kỳ xung - setup_timer0(value): Khởi động giá trị cho timer. Bộ timer đếm lên từ giá trị value, đến 255 sẽ tràn về 0 và tiếp tục chu kỳ đếm lên tiếp theo. - get_timer0(): Đọc thanh ghi timer, trả về giá trị thời gian thực của bộ đếm a. SƠ ĐỒ MẠCH HIỂN THỊ LED ĐƠN Hình 5.1: Sơ đồ nguyên lý mạch hiển thị LED ĐƠN b. SƠ ĐỒ KHỐI SW CHỌN TÍN HIỆU XUNG BÊN NGOÀI Hình 5.2: Sơ đồ phần cứng trên board TN đa năng DTVT03 BÀI 6: INTERRUPT – NGẮT Trang 83 1.3.1.2. BÀI TẬP MẪU Ví dụ 1: Dùng vi điêu khiển PIC 16F877A điều khiển 8 led đơn sang tắt dùng Timer T1 với thạch anh 8MHz - Sơ đồ mạch: - Sử dụng Port D để điều khiển 8 LED đơn. Với thạch anh sử dụng là 8MHz - Lưu đồ giải thuật. # include #BIT TMR1IF = 0x0C.0 #Unsigned int8 X; Void main () BÀI 6: INTERRUPT – NGẮT Trang 84 { SET_TRIS_D(0x00); X=0X00; OUTPUT_D(X) SETUP_TIMER_1(T1_INTRENAL| T1_DIV_BY_4); SET_TIMER1(0) White (TRUE) { IF(TMR1IF==1) { X=X; OUTPUT_D(X); TMR1IF=0; } } } Giải thích chƣơng trình và tính toán thời gian delay:  Khởi tạo timer 1 đếm xung nội có tần số 8MHz qua bộ chia 4 còn 1MHz. Sử dụng bộ chia trước với tỉ lệ chia là 4 nên xung vào bộ đếm với tần số còn lại là 2MHz/4 = 0.5MHz hay bằng 500KHz từ đó ta có chu kỳ là 2µs. Ta khởi tạo biến X bằng 00 và gởi biến đếm ra Port D sẽ làm các LED tắt.  Lệnh IF sẽ kiểm tra cờ tràn TMR1IF của timer 1: Nếu chưa tràn thì chờ cho đến khi tràn TMR1IF bằng 1, Lệnh dảo biến X, giá trị này gởi ra port sẽ làm các LED sang, xóa cờ tràn để báo hiệu tràn cho lần sau.  Nếu tràn lần tiếp theo thì lệnh X=X sẽ nghịch đảo biến X bằng 0x00, giá trịn này gởi ra Port sẽ làm các LED tắt,  Timer T1 đếm 65,536 thời gian đếm bằng số xung đếm nhân với chu kỳ mỗi xung:  Xung nhân với chu kỳ xung = 65,536 x 2µs = 131,072µs  131ms nên thời gian sang và tắt của 8 LED đều bằng 131ms hay chu kỳ bằng 262ms  Trong chương trình này sử dụng TMR1IF để kiểm tra thư viện không định nghĩa bit này, nên có them hang lệnh “#BIT TMR1IF=0x)C.0” để định nghĩa bit cờ tràn.  Cờ tràn nằm ở bit thứ 0, trong thanh ghi PIR1 có địa chỉ 0x0C. BÀI 6: INTERRUPT – NGẮT Trang 85 Ví dụ 2: Biên soạn và biên dịch chương trình điều khiển 8 led đơn ở port C: Sáng dần 2 led ( từ RC7)- Tắt 8 led – lặp lại. Xác định thời gian trễ của chương trình là bao nhiêu giây, xung clock là 8MHz #include #fuses HS,NOLVP,NOWDT,PUT #use delay(clock=8000000) void delay() { int counter; int16 n; set_timer0(0); for(n=0;n<50000;n++) { counter=get_timer0(); if (counter==255) { counter=0; set_timer0(0); } } } void main() { set_TRIS_C(0x00); setup_counters(RTCC_INTERNAL,RTCC_DIV_1); while(1) { output_c(0xc0); delay (); output_c(0xf0); delay (); output_c(0xfc); delay (); BÀI 6: INTERRUPT – NGẮT Trang 86 output_c(0xff); delay (); output_c(0x00); delay (); } } 1.3.1.3. NHỮNG SAI HỎNG THƢỜNG GẶP - Vẽ đúng sơ đồ kết nối đúng để mô phỏng trên Proteus - Kiểm tra giới hạn kết nối của thạch anh để gọi dung chương trình con tạo trễ. - Thực thi chương trình, biên dịch và nạp chương trình vào vi điều khiển đúng quy trình. - Vấn đề an toàn cho người và thiết bị khi giao tiếp với máy tính cần ngắt nguồn thiết bị trước khi cắm bus vào bộ thí nghiệm đa năng ĐTVT03 1.3.2 TIẾN HÀNH THỰC HIỆN THÍ NGHIỆM 1. Vẽ sơ đồ mạch điều khiển 2. Lập lưu đồ chương trình điều khiển 3. Biên soạn code trong CCS hoặc Proteus 4. Biên dịch, sửa lỗi, nạp chương trình kiểm chứng kết quả 1.3.3 BÀI TẬP THÍ NGHIỆM Bài tập 1: Viết chương trình điều khiển 8 led đơn ở port B: sáng 8 led- tắt 8 led- sáng dần từ RB0- Tắt dần từ RB7 – lặp lại. Có sử dụng timer 0 để tạo trễ 0.5s, xung clock là 8MHz a. Sơ đồ mạch hiển thị b. Lập lưu đồ giải thuật cho chương trình điều khiển c. Viết đoạn chương trình hiển thị yêu cầu trên sử dụng timer0 Bài tập 2: Viết chương trình điều khiển 16 led đơn ở port B, C: Sáng 16 Led – tắt 16 Led – sáng dần từ RB0, RC0 - Tắt dần từ RB7, RC7 – lặp lại. Có sử dụng timer 0 để tạo trễ 0.5s, xung clock là 8MHz a. Sơ đồ mạch hiển thị b. Lập lưu đồ chương trình c. Viết đoạn chương trình hiển thị yêu cầu trên sử dụng timer0 BÀI 6: INTERRUPT – NGẮT Trang 87 Bài thí nghiệm số 6: INTERRUPT – NGẮT Thời lƣợng: 12 giờ 1.1. MỤC TIÊU - Viết đúng chương trình hiển thị dữ liệu trên tải sử dụng ngắt trong lập trình vi điều khiển PIC. - Sử dụng thành thạo phần mềm trong biên soạn và biên dịch và sửa lỗi chương trình. - Nạp và thực thi được các ứng dụng cơ bản trong điều khiển hiển thị sử dụng ngắt. - Đảm bảo an toàn cho người và thiết bị, tự tin trong việc sử dụng và ứng dụng các phần mềm khi lập trình. - Đảm bảo an toàn cho người và thiết bị, tự tin trong việc sử dụng và ứng dụng các phần mềm khi lập trình. 1.2. DỤNG VỤ, HỌC CỤ SỬ DỤNG - Board Kit thí nghiệm Vi Xử Lý. - Máy tính, phần mềm mô phỏng Proteus, Keil C - Vi điều khiển 89S52 và PIC 16F877A 1.3. NỘI DUNG 1.3.1 CƠ SỞ LÝ THUYẾT 1.3.1.1. CÁC LỆNH ĐIỀU KHIỂN NGẮT #int_ext: Ngắt ngoài, nguồn tác động từ chân (RB0/INT) #int_timer0: Ngắt khi Timer 0 tràn #int_rtcc: Ngắt khi Timer 0 tràn #int_rb: Ngắt ở Port B khi có bất cứ thay đổi nào từ chân B4-B7 * enable_interrupts(level): cho phép nguồn ngắt nằm trong () * ext_int_edge (source,edge) + source: =0 +edge : Cạnh tác động ngắt có hai dạng : H_TO_L (tác động cạnh xuống) hoặc L_TO_H (tác động cạnh lên) * disable_interrupts (level) : Cấm ngắt nằm trong () BÀI 6: INTERRUPT – NGẮT Trang 88 * clear_interrupt (level) : Xóa cờ ngắt của nguồn ngắt nằm trong () 1.3.1.2. SƠ ĐỒ MẠCH ĐIỀU KHIỂN Hình 6.1 Ngắt ngoài điều khiển 8 led đơn Hình 6.2 Sơ đồ điều khiển ngắt RB BÀI 6: INTERRUPT – NGẮT Trang 89 1.3.1.3. CÁC BƢỚC CÔNG VIỆC a. Vẽ sơ đồ mạch điều khiển b. Lập lưu đồ chương trình c. Biên soạn, biên dịch chương trình trong CCS d. Nạp, kiểm chứng và chỉnh sửa chương trình đúng yêu cầu 1.3.1.4. NHỮNG SAI HỎNG THƢỜNG GẶP - Vẽ đúng sơ đồ kết nối đúng để mô phỏng trên Proteus - Kiểm tra giới hạn kết nối của thạch anh để gọi đúng chương trình con tạo ngắt. - Thực thi chương trình, biên dịch và nạp chương trình vào vi điều khiển đúng quy trình. - Vấn đề an toàn cho người và thiết bị khi giao tiếp với máy tính cần ngắt nguồn thiết bị trước khi cắm bus vào bộ thí nghiệm đa năng ĐTVT03 1.3.2 TIẾN HÀNH THỰC HIỆN THÍ NGHIỆM 1. Vẽ sơ đồ mạch điều khiển ngắt ngoài 0 điều khiển led đơn và led 7 đoạn 2. Lập lưu đồ chương trình điều khiển 3. Biên soạn code trong CCS hoặc Proteus 4. Biên dịch, sửa lỗi, nạp chương trình kiểm chứng kết quả 1.3.3 BÀI TẬP THÍ NGHIỆM 1. Bài tập 1: Yêu cầu: Biên soạn , biên dịch và quan sát hoạt động chương trình trên phần mềm Proteus a. Vẽ sơ đồ mạch hiển thị . b. Lập lƣu đồ chƣơng trình . c. Chƣơng trình tham khảo #include #use delay(clock=20000000) #int_ext void isrtext() BÀI 6: INTERRUPT – NGẮT Trang 90 { output_c(0x01); delay_ms(500); output_c(0x03); delay_ms(500); output_c(0x07); delay_ms(500); output_c(0x0f); delay_ms(500); output_c(0x1f); delay_ms(500); output_c(0x3f); delay_ms(500); output_c(0x7f); delay_ms(500); output_c(0xff); delay_ms(500); } void main() { int x; set_tris_B(0x01); set_tris_c(0x00); enable_interrupts(int_ext); enable_interrupts(global); ext_int_edge(H_TO_L); while(1) { output_c(x); delay_ms(500); x++; BÀI 6: INTERRUPT – NGẮT Trang 91 } } 2. Bài tập 2: Yêu cầu: Biên soạn , biên dịch và quan sát hoạt động chương trình trên phần mềm Proteus a. Sơ đồ mạch hiển thị Hình 6.3 Ngắt ngoài 0 điều khiển led đơn và led 7 đoạn b. Lập lƣu đồ chƣơng trình c.Chƣơng trình tham khảo #include #use delay(clock=20000000) #int_ext void isrtext() { output_high(PIN_B1); BÀI 6: INTERRUPT – NGẮT Trang 92 output_high(PIN_B2); output_C(0x7f); delay_ms(1000); output_C(0xbf); delay_ms(1000); output_C(0xdf); delay_ms(1000); output_C(0xef); delay_ms(1000); output_C(0xf7); delay_ms(1000); output_C(0xfb); delay_ms(1000); output_C(0xfd); delay_ms(1000); output_C(0xfe); delay_ms(1000); output_low(PIN_B1); output_low(PIN_B2); } int bin2BCD(int bin) { int BCD; BCD=((bin/10<<4)+bin%10); 3. Bài tập 3: + Sử dụng ngắt ngoài 0 ( tác động cạnh lên), viết chương trình thỏa 2 điều kiện Bình thường: 8 led đơn ở port C sáng dần từ trong ra ngoài, tạo trễ 0.5s Ngắt ngoài 0: Tăng giá trị đếm ở 2 led 7 đoạn lên 1 đơn vị. Giá trị bắt đầu của 2 led là 00, tăng đến 59 thì quay về. a. Vẽ sơ đồ mạch điều khiển . BÀI 6: INTERRUPT – NGẮT Trang 93 b. Lập lƣu đồ chƣơng trình . c. Viết chƣơng trình thực hiện đúng yêu cầu trên . 4. Bài tập 4: + Sử dụng ngắt ngoài 0 ( tác động cạnh lên), viết chương trình thỏa 2 điều kiện Bình thường: 8 led đơn ở port C sáng dần từ trong ra ngoài, tạo trễ 0.75s Ngắt ngoài 0: Tăng giá trị đếm ở 2 led 7 đoạn lên 1 đơn vị. Giá trị bắt đầu của 2 led là 05, tăng đến 99 thì quay về. a. Vẽ sơ đồ mạch điều khiển . b. Lập lƣu đồ chƣơng trình . c. Viết chƣơng trình thực hiện đúng yêu cầu trên . BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 93 Bài thí nghiệm số 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Thời lƣợng: 18 giờ 1.1. MỤC TIÊU Sau khi học xong bài này người học có khả năng: - Vẽ được sơ đồ kết nối mạch hiển thị đồng hồ trên phần mềm Proteus. - Thành lập lưu đồ chương trình hiển thị mạch đồng hồ đếm giây trên LED 7 đoạn và LCD. - Lập trình được chương trình điều khiển hiển thị đồng hồ số sử dụng PIC 16F877 - Thực hiện tốt các biện pháp an toàn cho người và thiết bị, tự tin trong lập trình các ứng dụng. - Đảm bảo an toàn cho người và thiết bị, tự tin trong việc sử dụng và ứng dụng các phần mềm khi lập trình. 1.2. DỤNG VỤ, HỌC CỤ SỬ DỤNG - Board Kit thí nghiệm Vi Xử Lý. - Máy tính, phần mềm mô phỏng Proteus, Keil C - Vi điều khiển 89S52 và PIC 16F877A 1.3. NỘI DUNG 1.3.1 CƠ SỞ LÝ THUYẾT BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 94 1.3.1.1. SƠ ĐỒ MẠCH HIỂN THỊ ĐỒNG HỒ DÙNG LCD Hình 7.1: Sơ đồ mạch hiển thị đồng hồ dùng LCD BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 95 1.3.1.2. SƠ ĐỒ MẠCH HIỂN THỊ LỊCH VẠN NIÊN DÙNG LED 7 ĐOẠN Hình 7.2: Sơ đồ mạch hiển thị lịch vạn niên dùng LED 7 đoạn BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 96 Hình 7.3: Sơ đồ chân DS1307 1.3.1.3. SƠ ĐỒ CHÂN: BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 97 - Chức năng: Các chân của DS1307 được mô tả như sau: + X1 và X2: là 2 ngõ kết nối với thạch anh 32.768KHz để tạo dao động cho IC DS1307 + VBAT: cực dương của một nguồn pin 3V nuôi IC + GND: Chân mass chung cho cả pin 3V và Vcc + VCC: Nguồn cho giao diện I2C, thường là 5V và dung chung với vi điều khiển. Nếu VCC không được cấp nguồn nhưng VBAT được cấp nguồn thì DS1307 vần đang hoạt động nhưng không ghi và đọc được. + SQW/OUT: một ngõ phụ tạo xung vuông, tần số của xung được tạo có thể được lập trình. Như vậy chân này hầu như không liên quan đến chức năng của DS1307 là đồng hồ thời gian thực. + SCL và SDA là 2 đƣờng giao xung nhịp và dữ liệu của giao diện I2C Một số hàm cần lƣu ý trong DS1307 Khai báo và hàm đọc, ghi DS1307: //========================== // Khai báo DS1307 //========================== #define DS1307_SDA PIN_C4 #define DS1307_SCL PIN_C3 #use i2c(master, sda=DS1307_SDA, scl=DS1307_SCL) //========================== // Khởi tạo DS1307 //========================== void init_DS1307() { output_float(DS1307_SCL); output_float(DS1307_SDA); } //========================== // Ghi dữ liệu đến DS1307 BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 98 //========================== void write_DS1307(byte address, BYTE data) { short int status; i2c_start(); i2c_write(0xd0); i2c_write(address); i2c_write(data); i2c_stop(); i2c_start(); status=i2c_write(0xd0); while(status==1) { i2c_start(); status=i2c_write(0xd0); } } //========================== // Đọc dữ liệu từ DS1307 //========================== BYTE read_DS1307(byte address) { BYTE data; i2c_start(); i2c_write(0xd0); i2c_write(address); i2c_start(); i2c_write(0xd1); data=i2c_read(0); i2c_stop(); return(data); } BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 99 1.3.1.4. NHỮNG SAI HỎNG THƢỜNG GẶP - Vẽ đúng sơ đồ kết nối đúng để mô phỏng trên Proteus - Kiểm tra giới hạn kết nối của thạch anh để gọi đúng chương trình con tạo ngắt. - Thực thi chương trình, biên dịch và nạp chương trình vào vi điều khiển đúng quy trình. - Vấn đề an toàn cho người và thiết bị khi giao tiếp với máy tính cần ngắt nguồn thiết bị trước khi cắm bus vào bộ thí nghiệm đa năng ĐTVT03 1.3.2 TIẾN HÀNH THỰC HIỆN THÍ NGHIỆM 1. Vẽ sơ đồ mạch hiển thị đồng hồ dùng LCD. 2. Lập lưu đồ chương trình 3. Chương trình tham khảo 1.3.3 BÀI TẬP THÍ NGHIỆM 1. Bài tập 1: Vẽ sơ đồ phần cứng, tóm tắt bảng chức năng, thành lập lưu đồ, viết chương trình điều khiển hiển thị đồng hồ số, dữ liệu giờ, phút, giây lấy từ DS1307. a. Vẽ sơ đồ mạch hiển thị đồng hồ dùng LCD b. Lập lưu đồ chương trình c. Chương trình tham khảo #include #fuses HS #use delay(clock=8000000) #include #include byte sec,min,hour; byte const MAP[10] = {0,1,2,3,4,5,6,7,8,9}; byte temp_sec_low, temp_sec_high, temp_min_low, temp_min_high; BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 100 byte temp_hour_low, temp_hour_high; float sec_low,sec_high, min_low, min_high, hour_low, hour_high; byte mode; // Che do int1 blink_sec, blink_min, blink_hour; #bit SW_mode = 0x08.0 // Cho che do #bit SW_inc = 0x08.1 // Chinh tang #bit SW_dec = 0x08.2 // Chinh giam #bit SW_clear = 0x08.3 // Ngung chinh //*************************** //***** Khai bao prototype void read_rtc(); void bcd_to_dec(); void display(); void key_test(); void chinhgiay(); void chinhphut(); void chinhgio(); void set_blink(); //******************************** void read_rtc() { sec = read_ds1307(0); min = read_ds1307(1); hour = read_ds1307(2); temp_sec_low = sec & 0x0F; temp_sec_high = (sec & 0xF0)>>4; temp_min_low = min & 0x0F; temp_min_high = (min & 0xF0)>>4; temp_hour_low = hour & 0x0F; temp_hour_high = (hour & 0x30)>>4; } BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 101 //****************************************************************** void bcd_to_dec() { sec_high = MAP[temp_sec_high]; sec_low = MAP[temp_sec_low]; min_high = MAP[temp_min_high]; min_low = MAP[temp_min_low]; hour_high = MAP[temp_hour_high]; hour_low = MAP[temp_hour_low]; /**************************************/ } //************************************************************* void display() { lcd_gotoxy(15,2); printf(lcd_putc,"%1.0f",sec_high); lcd_gotoxy(16,2); printf(lcd_putc,"%1.0f",sec_low); lcd_gotoxy(14,2); printf(lcd_putc,":"); lcd_gotoxy(12,2); printf(lcd_putc,"%1.0f",min_high); lcd_gotoxy(13,2); printf(lcd_putc,"%1.0f",min_low); lcd_gotoxy(11,2); printf(lcd_putc,":"); lcd_gotoxy(9,2); printf(lcd_putc,"%1.0f",hour_high); lcd_gotoxy(10,2); printf(lcd_putc,"%1.0f",hour_low); } //*************************************************** void key_test() { if (SW_mode==0) { mode++; delay_ms(150); } BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 102 else if (SW_clear==0) { mode=0; blink_sec=0; blink_min=0; blink_hour=0; } switch (mode) { case 1: { blink_sec =1; blink_min=0; blink_hour=0; chinhgiay(); break; } case 2: { blink_min =1; blink_sec=0; blink_hour=0; chinhphut(); break; } case 3: { blink_hour=1; blink_sec=0; blink_min=0; BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 103 chinhgio(); break; } case 4: { mode=0; blink_sec=0; blink_min=0; blink_hour=0; break; } } } //************************************************************** void chinhgiay() { set_blink(); if (SW_inc==0)// nut tang duoc nhan { delay_ms(1); if (sec<0x30) { write_ds1307(0,0x00); } else { write_ds1307(0,0x00); min++; write_ds1307(1,min); } } BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 104 } //************************************************************** void chinhphut() { set_blink(); if (SW_inc==0) { delay_ms(1); if (min==0x09) { write_ds1307(1,0x10); } else if (min==0x19) { write_ds1307(1,0x20); } else if (min==0x29) { write_ds1307(1,0x30); } else if (min==0x39) { write_ds1307(1,0x40); } else if (min==0x49) { write_ds1307(1,0x50); } else if (min==0x59) { BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 105 write_ds1307(1,0x00); } else { min++; write_ds1307(1,min); } } else if (SW_dec==0) { delay_ms(1); if (min==0x50) { write_ds1307(1,0x49);} else if (min==0x40) {write_ds1307(1,0x39);} else if (min==0x30) { write_ds1307(1,0x29); } else if (min==0x20) { write_ds1307(1,0x19); } else if (min==0x10) { write_ds1307(1,0x09); } else if (min==0x00) { write_ds1307(1,0x59); BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 106 } else { min--; write_ds1307(1,min); } } } //************************************************************** void chinhgio() { set_blink(); if (SW_inc==0) { delay_ms(1); if (hour==0x09) {write_ds1307(2,0x10);} else if (hour==0x19) {write_ds1307(2,0x20);} else if (hour==0x23) {write_ds1307(2,0x00);} else {hour++; write_ds1307(2,hour);} } else if (SW_dec==0) { delay_ms(1); if (hour==0x20) {write_ds1307(2,0x19);} else if (hour==0x10) {write_ds1307(2,0x09);} else if (hour==0x00) {write_ds1307(2,0x23);} else {hour--; write_ds1307(2,hour);} } } //************************************************************** BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 107 ///***********************************// void set_blink() { if (blink_sec==1) { lcd_gotoxy(15,2); printf(lcd_putc," "); // hai khoang trong delay_ms(250); lcd_gotoxy(15,2); printf(lcd_putc,"%1.0f",sec_high); lcd_gotoxy(16,2); printf(lcd_putc,"%1.0f",sec_low); } if (blink_min==1) { lcd_gotoxy(12,2); printf(lcd_putc," "); delay_ms(250); lcd_gotoxy(12,2); printf(lcd_putc,"%1.0f",min_high); lcd_gotoxy(13,2); printf(lcd_putc,"%1.0f",min_low); } if (blink_hour==1) { lcd_gotoxy(9,2); printf(lcd_putc," "); delay_ms(250); lcd_gotoxy(9,2); printf(lcd_putc,"%1.0f",hour_high); lcd_gotoxy(10,2); printf(lcd_putc,"%1.0f",hour_low); BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 108 } } //************************************************************ void main() { mode=0; blink_sec=0; blink_min=0; blink_hour=0; byte u; set_tris_b(0x00); u=read_ds1307(0); sec=u & 0x7F;// mo RTC write_ds1307(0,sec); lcd_init(); init_ds1307(); while(true) { read_rtc(); bcd_to_dec(); display(); key_test(); //********************* } } 2. Bài tập 2: Vẽ sơ đồ phần cứng, tóm tắt bảng chức năng, thành lập lưu đồ, viết chương trình điều khiển hiển thị LED 7 đoạn lịch vạn niên lấy từ DS1307. a. Vẽ sơ đồ mạch hiển thị .. .. BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 109 b. Lập lưu đồ chương trình .. .. c. Chương trình tham khảo /************************************************************* Chip type : PIC16F877A Program type : Application Clock frequency : 20 MHz Project : Realtime Clock Version : V1.0 Date : 01/09/2020 Author : NGUYEN THI THU LAN Gmail : nttlan@hcmct.edu.vn Mobile : 0908071828 Company : Khoa KT Dien Dien Tu – Truong CD GiaoThong Van Tai Comments : Chuong trinh dong ho thoi gian thuc Su dung RTC Ds1307 Hien thi Led 7 doan Hien thi thoi gian, Gio, Phut Hien thi ngay, thang, nam duong lich Hien thi ngay, thang, nam am lich Hien thi nhiet do su dung Ds1307 ************************************************************/ #include #include "ds1307.c" //#include //#include #include "PIC16F877A_registers.h" /******************* Khai bao bien toan cuc************************/ //int1 StEn=false; // unsigned char StSet=0; //bien tao nhap nhay vung cai dat // BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 110 unsigned char StNumber=0;//bien cho phep cai dat 0-11 // unsigned char Number=0; //bien phuc vu quet led 0-22 // unsigned char Temp; //Nhuet do // unsigned char sec,min,hrs,day_d,month_d,year_d,date; //thoi gian duong lich // unsigned char day_a,month_a,year_a; //thoi gian am lich // unsigned char dsec=0; //bien phuc vu update time // //unsigned char CharCode[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; /* Bang ma LED Anot chung */ unsigned char CharCode[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; /* Bang ma LED CAtot chung */ unsigned char ADC_Convert(); //chuong trinh chuyen doi ADC 10bit chanel 0 // void VietNam_Calendar(unsigned char day_d,month_d,year_d);/*Chuyen doi am lich// VietNam den nam 2030*/ void OutLed(unsigned char DATA);// Chuong trinh Xuat data ra PORTD // void Sys_init(); //Chuong trinh khoi tao chip // void Program_init(); // chuong trinh khoi tao // void Setup();//Chuong trinh cai dat thoi gian // void Led7segment(unsigned char day_d,month_d,year_d,day_a,month_a,year_a,date,// Temp,hrs,min,sec ); //chuong trinh quet LED dung ngat hoan toan tan so fV=25Hz// // /*************************************************************/ /************************************************************* /////////////////Chuong trinh dinh thoi Timer0 1.8ms//////////////////////////// ****************************************************************/ #int_RTCC void RTCC_isr(void) { Set_timer0(115); //tao tan so quet fV=25Hz Number++; BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 111 //if(Number>22){Number=1;en=1;clk=0;clk=1;en=0;}//xoa khi Scan du 22led if(Number>22){Number=1;en=0;clk=0;clk=1;en=1;}//xoa khi Scan du 22led clk=0;clk=1; //tao xung clock OutLed(0xFF); //xoa bong ma Led7segment(day_d,month_d,year_d,day_a,month_a,year_a,date,Temp,hrs,min,sec); } /************************************************************* /////////////////Chuong trinh dinh thoi Timer1 2ms////////////////////////////// *************************************************************/ #int_TIMER1 void TIMER1_isr(void) { Set_timer1(0xBDB); dsec++; if(dsec>=10) { //sau 1s cap ngat time gom gio, phut,giay dsec=0; ds1307_get_time(hrs,min,sec); if((hrs==00)&&(min==00)&&(sec<=10))//10s ngay moi update time..... { ds1307_get_date(day_d,month_d,year_d,date); VietNam_Calendar(day_d,month_d,year_d); } if(sec%10==0) Temp=ADC_convert(); //sau 10s update nhiet do } } /************************************************************ /////////////////Chuong trinh quet LED7 dung timer khong dung delay///////////// **********************************************************/ void Led7segment( unsigned char day_d,month_d,year_d,day_a,month_a,year_a,date, Temp,hrs,min,sec ) { BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 112 StSet++;if(StSet>=200) StSet=0; Switch(Number) { case 1:{ if(StNumber==1){if(StSet<=70) {OutLed(0);break;}} if(day_d<10) OutLed(0); //tat so 0 else OutLed(CharCode[day_d/10]); break; }; case 2:{ if(StNumber==1){if(StSet<=70) {OutLed(0);break;}} OutLed(CharCode[day_d%10]); break; }; case 3:{ if(StNumber==2){if(StSet<=70) {OutLed(0);break;}} if(month_d<10) OutLed(0);//tat so 0 else OutLed(CharCode[month_d/10]); break; }; case 4:{ if(StNumber==2){if(StSet<=70) {OutLed(0);break;}} OutLed(CharCode[month_d%10]); break; }; case 5:{ if(StNumber==3){if(StSet<=70) {OutLed(0);break;}} OutLed(CharCode[year_d/10]); break; }; case 6:{ BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 113 if(StNumber==3){if(StSet<=70) {OutLed(0);break;}} OutLed(CharCode[year_d%10]); break; }; case 7:{ //if(StNumber==4){if(StSet<=200) {OutLed(0xff);break;}} if(day_a<10) OutLed(0);//tat so 0 else OutLed(CharCode[day_a/10]); break; }; case 8:{ //if(StNumber==4){if(StSet<=200) {OutLed(0xff);break;}} OutLed(CharCode[day_a%10]); break; }; case 9:{ //if(StNumber==5){if(StSet<=200) {OutLed(0xff);break;}} if(month_a<10) OutLed(0);//tat so 0 else OutLed(CharCode[month_a/10]); break; }; case 10:{ //if(StNumber==5){if(StSet<=200) {OutLed(0xff);break;}} OutLed(CharCode[month_a%10]); break; }; case 11:{ //if(StNumber==6){if(StSet<=200) {OutLed(0xff);break;}} OutLed(CharCode[year_a/10]); break; }; BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 114 case 12:{ //if(StNumber==6){if(StSet<=200) {OutLed(0xff);break;}} OutLed(CharCode[year_a%10]); break; }; case 13:{ if(StNumber==4){if(StSet<=70) {OutLed(0);break;}} if(date==1) OutLed(0X39);//ngay CN hien thi chu C else OutLed(0x78); //hien thi chu t break; }; case 14:{ if(StNumber==4){if(StSet<=70) {OutLed(0);break;}} if(date==1) OutLed(0x37);//ngay CN hien thi chu n else OutLed(CharCode[date%10]); break; }; case 15:{ //if(StNumber==8){if(StSet<=200) {OutLed(0xff);break;}} if(Temp<10) OutLed(0);//tat so 0 else OutLed(CharCode[Temp/10]); break; }; case 16:{ //if(StNumber==8){if(StSet<=200) {OutLed(0xff);break;}} OutLed(CharCode[Temp%10]); break; }; case 17:{ if(StNumber==5){if(StSet<=70) {OutLed(0);break;}} OutLed(CharCode[hrs/10]); BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 115 break; }; case 18:{ if(StNumber==5){if(StSet<=70) {OutLed(0);break;}} OutLed(CharCode[hrs%10]); break; }; case 19:{ if(StNumber==6){if(StSet<=70) {OutLed(0);break;}} OutLed(CharCode[min/10]); break; }; case 20:{ if(StNumber==6){if(StSet<=70) {OutLed(0);break;}} OutLed(CharCode[min%10]); break; }; case 21:{ if(StNumber==7){if(StSet<=70) {OutLed(0);break;}} OutLed(CharCode[sec/10]); break; }; case 22:{ if(StNumber==7){if(StSet<=70) {OutLed(0);break;}} OutLed(CharCode[sec%10]); }; } } BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 116 /************************************************************** /////////////////Chuong trinh chuyen doi ADC doc nhiet do tu LM35/////////////// **************************************************************/ unsigned char ADC_Convert() { int16 Value; Value=read_adc(); Value=(FLOAT)((Value*500)/1023); return((char)Value); //tra ve gia tri do C } /*************************************************************** ///////////////////////Chuong trinh am lich Viet Nam//////////////////////////// ***************************************************************/ void VietNam_Calendar(unsigned char day_1,mon_1,year_1) { unsigned char luu,tam_1; unsigned char da,db; unsigned char lmon; if(year_1<=30) //cho phep den nam 2030 { da = ALdauthangDL[year_1-10][mon_1-1]; db = DLdauthangAL[year_1-10][mon_1-1]; luu= db-day_1; if(luu<=0) { day_a = (day_1-db+1); month_a = thangALdauthangAL[year_1-10][mon_1-1]; } else { if(luu>31){day_a = (day_1-db+1); month_a = thangALdauthangDL[year_1-10][mon_1];} BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 117 else { day_a = (day_1+da-1); month_a = thangALdauthangDL[year_1-10][mon_1-1]; } } lmon = month_a; tam_1=mon_1-lmon; if(tam_1>100&&tam_1<255) year_a = (year_1-1); else year_a = year_1; } } //!void VietNam_Calendar(unsigned char day,month,year) //!{ //! char da,db; //! if(year<=30) //cho phep den nam 2030 //! { //! da = ALdauthangDL[year-10][month-1]; //! db = DLdauthangAL[year-10][month-1]; //! if(db <= day){ //! day_a = day-db+1; //! month_a = thangALdauthangAL[year-10][month-1]; //! } else { //! day_a = (day_d+da-1); //! month_a =thangALdauthangDL[year-10][month-1]; //! } //! if(month < day_a) //! year_a = year-1; //! else //! year_a = year; BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 118 //! } //!} /************************************************************* ///////////////////////Chuong trinh Xuat data ra PORTD////////////////////////// ************************************************************/ void OutLed(unsigned char data) { PORTD = data; } char key(char data, char never) { //Cho phep tang ngay,thang,nam,thu if((!Up)&&(StNumber<=4)){ delay_ms(300); data++; if(data>never) data=1; } //Cho phep tang gio,phut,giay if((!Up)&&(StNumber>4)){ delay_ms(300); data++; if(data>never) data=0; } //Cho phep giam ngay,thang,nam,thu if((!Down)&&(StNumber<=4)){ delay_ms(300); if(data>1) data--; } //Cho phep giam ngay,thang,nam,thu if((!Down)&&(StNumber>4)){ delay_ms(300); BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 119 (signed)data--; if(data<0) data=never; } //thoat ra menu cai dat if(!ESC){ while(!ESC){;}; StNumber=0; break; } VietNam_Calendar(day_d,month_d,year_d); return(data); } void Set_time() { switch(StNumber) { //restart_WDT(); //WDT case 1:{ day_d=key(day_d,31); if((!Enter)) { while(!Enter){;}; ds1307_set_date(day_d,month_d,year_d,date); delay_ms(500); StNumber++; } break; }; case 2:{ month_d=key(month_d,12); if((!Enter)) BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 120 { while(!Enter){;}; ds1307_set_date(day_d,month_d,year_d,date); delay_ms(500); StNumber++; } break; }; case 3:{ year_d=key(year_d,30); if((!Enter)) { while(!Enter){;}; ds1307_set_date(day_d,month_d,year_d,date); delay_ms(500); StNumber++; } break; }; case 4:{ date=key(date,7); if((!Enter)) { while(!Enter){;}; ds1307_set_date(day_d,month_d,year_d,date); delay_ms(500); StNumber++; } break; }; case 5:{ disable_interrupts(INT_TIMER1); BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 121 hrs=key(hrs,24); if((!Enter)) { while(!Enter){;}; ds1307_set_time(hrs,min,sec); delay_ms(500); StNumber++; } break; }; case 6:{ disable_interrupts(INT_TIMER1); min=key(min,59); if((!Enter)) { while(!Enter){;}; ds1307_set_time(hrs,min,sec); delay_ms(500); StNumber++; } break; }; case 7:{ disable_interrupts(INT_TIMER1); sec=key(sec,59); if((!Enter)) { while(!Enter){;}; ds1307_set_time(hrs,min,sec); delay_ms(500); StNumber=255; } break; BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 122 }; case 255:{ enable_interrupts(INT_TIMER1); dsec=10; //update time StNumber=0; break; } } } void Setup() { StNumber=1; while(StNumber!=0) { //restart_WDT(); //WDT if(!Enter){ while(!Enter){;} if(StNumber<10)StNumber++; } if(!MenuDown){ while(!MenuDown){;}; if(StNumber>1)StNumber--; } if(!ESC){ while(!ESC){;}; StNumber=0; break; } Set_time(); } ds1307_get_date(day_d,month_d,year_d,date); BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 123 VietNam_Calendar(day_d,month_d,year_d); } /*********************************************************** /////////////////////////////Chuong trinh chinh //////////////////////////////// **************************************************************/ #zero_ram void main() { Sys_init(); Program_init(); while(TRUE) { restart_WDT(); //WDT if(!Enter) {while(!Enter){;}; Setup();} //if(StEn) {Setup();}; } } void Sys_init() { TRISA=0X01; TRISB=0X3F; TRISD=0X00; TRISE=0X00; setup_adc_ports(AN0); //AN0 =ADC 10bit setup_adc(ADC_CLOCK_DIV_32);// setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64|RTCC_8_bit);//3.2 ms overflow setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); //104 ms overflow flow //setup_wdt(WDT_ON); //setup_wdt(WDT_1152MS); enable_interrupts(GLOBAL); BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 124 } void Program_init() { ds1307_init(0,0,0); // initialize 1307 //ds1307_set_date_time(31,6,13,2,23,59,55); //ds1307_set_date(1,1,13,3); delay_ms(100); ds1307_get_date(day_d,month_d,year_d,date); ds1307_get_time(hrs,min,sec); VietNam_Calendar(day_d,month_d,year_d); Temp=ADC_convert(); delay_ms(200); enable_interrupts(INT_RTCC); enable_interrupts(INT_TIMER1); enable_interrupts(GLOBAL); } BÀI 7: LẬP TRÌNH ĐIỀU KHIỂN HIỂN THỊ ĐỒNG HỒ SỐ Trang 125 TÀI LIỆU THAM KHẢO [1] Khoa Điện – Điện Tử – Vi Xử Lý – Trường Cao Đẳng Giao Thông Vận Tải [2] Hoàng Đức Hải – Họ vi điều khiển 8051 - NXB Lao Động Xã Hội -2007 [3] Phạm Thanh Liêm – Giáo trình Cấu trúc máy vi tính và vi xử lý - NXB GD – 2006 [4] Lê Hải Sâm – Giáo trình Cấu trúc máy vi tính và vi xử lý - NXB GD – 2006 [5] Hệ vi điều khiển 8051-NXB Lao động & Xã Hội, 2001. (Bản dịch quyển “The 8051 Microcontroller”, I.Scott Mackenzie, NXB Prentice Hall ( 2nd Ed.) 1995 [6] Ngô Diên Tập, Vi điều khiển với lập trình C, NXB KH&KT, 2006. [7] Nguyễn Đình Phú, Vi Xử Lý 2, Trường ĐH SPKT TP.HCM - 2007 [8] Phụ lục kỹ thuật vi xử lý (tham khảo cho hệ vi điều khiển 8051), Bộ môn Kỹ thuật điện tử – Đại học Bách khoa TP HCM. [9] Bài thí nghiệm vi xử lý (hệ vi điều khiển 8051) , Bộ môn Kỹ thuật điện tử – Đại học Bách khoa TP HCM. [10] Martin Bates – Picmicrocontrollers an introduction to microelectronics, NXB Elsevier Linacre House – 2004. [11] Các trang web tham khảo:

Các file đính kèm theo tài liệu này:

  • pdfbai_giang_thi_nghiem_vi_xu_ly_trinh_do_cao_dang_nguyen_thi_t.pdf