i BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP HỒ CHÍ MINH KHOA ĐIỆN – ĐIỆN TỬ MÔN HỌC ĐỒ ÁN 1 ĐỀ TÀI THIẾT KẾ MẠCH ĐỒNG HỒ SỐ SỬ DỤNG VI ĐIỀU KHIỂN PIC16F887 GIAO TIẾP VỚI IC THỜI GIAN T.
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP HỒ CHÍ MINH KHOA ĐIỆN – ĐIỆN TỬ MÔN HỌC: ĐỒ ÁN ĐỀ TÀI THIẾT KẾ MẠCH ĐỒNG HỒ SỐ SỬ DỤNG VI ĐIỀU KHIỂN PIC16F887 GIAO TIẾP VỚI IC THỜI GIAN THỰC DS1307 Giáo viên hướng dẫn: ThS Nguyễn Văn Phúc Sinh viên thực hiện: Thái Tuấn Vũ - 19161327 Học kì II năm học: 2021 – 2022 TP Thủ Đức, tháng năm 2022 i Sinh viên thực đề tài: Thái Tuấn Vũ - 19161327 Giảng viên cho điểm: Nhận xét giảng viên ……………………………………………………………………… ……………………………………………………………………… ……………………………………………………………………… ……………………………………………………………………… ……………………………………………………………………… ……………………………………………………………………… ……………………………………………………………………… ……………………………………………………………………… ……………………………………………………………………… ……………………………………………………………………… ……………………………………………………………………… Giảng viên ký tên ii DANH MỤC HÌNH ẢNH Hình 1: Vi điều khiển PIC 16F887 Hình 2: Sơ đồ chân vi điều khiển 16F887 Hình 3: Dạng song trình thiết bị chủ ghi liệu vào thiết bị tớ Hình 4: Dạng sóng q trình thiết bị chủ đọc liệu từ thiết bị tớ Hình : Sơ đồ chân DS1307 10 Hình 5: IC thời gian thực DS1307 10 Hình 7: Sơ đồ kết nối vi điều khiển với DS1307 11 Hình 9:Tổ chức ghi thời gian 11 Hình 8: Tổ chức nhớ DS1307 11 Hình 10: Màn hình LCD 20x4 13 Hình 11: Vùng nhớ CGRAM LCD 13 Hình 12: Hình ảnh đoạn cho số lớn 14 Hình 13: Tìm mã đoạn cho số lớn LCD 14 Hình 14: Hình ảnh số to từ đến 14 Hình 1: Sơ đồ khối thiết kế 16 Hình 2: Mạch nguyên lý khối nguồn 17 Hình 3: Mạch nguyên lý khối vi điều khiển 17 Hình 4: Mạch nguyên lý khối nút nhấn 18 Hình 5: Mạch nguyên lý khối hiển thị 19 Hình 6: Mạch nguyên lý khói thời gian thực 20 Hình 7: Mạch nguyên lý khối còi báo 20 Hình 8: Lưu đồ chương trình ghi liệu từ DS1307 21 Hình 9: Lưu đồ chương trình đọc liệu từ DS1307 21 Hình 10: Lưu đồ chương trình chuyển số nhị phân sang số BCD 22 Hình 11: Lưu đồ chương trình chỉnh 23 Hình 12: Lưu đồ chương trình chỉnh báo thức 24 Hình 13: Lưu đồ chương trình âm lịch 25 Hình 14: Lưu đồ chương trình 26 Hình 1: Mạch nguyên lý toàn hệ thống 27 Hình 2: Sơ đồ bố trí linh kiện dạng 3D thiết kế 27 Hình 3: Mạch PCB layout lớp thiết kế 27 Hình 4: Mạch thiệt tế thiết kế 28 Hình 5: Kết mô 29 Hình 6: Màn hình hiển thị thời gian 30 Hình 7: Màn hình hiển thị cài báo thức 30 iii MỤC LỤC Chương 1: TỔNG QUAN 1.1 Lý chọn đề tài 1.2 Mục tiêu nghiên cứu 1.3 Phạm vi nghiên cứu 1.4 Bố cục Chương 2: CƠ SỞ LÝ THUYẾT 2.1 Giới thiệu Vi điều khiển PIC 16F887 2.2 Giới thiệu chuẩn truyền thông I2C 2.3 Giới thiệu IC DS1307 10 2.4 Giới thiệu LCD 12 Chương 3: THIẾT KẾ VÀ XÂY DỰNG HỆ THỐNG 16 Chương 16 3.1 Sơ đồ khối thiết kế 16 3.2 Thiết kế chi tiết 16 3.2.1 Khối nguồn 16 3.2.2 Khối vi điều khiển 17 3.2.3 Khối nút nhấn 18 3.2.4 Khối hiển thị 19 3.2.5 Khối thời gian thực 19 3.2.6 Khối còi báo 20 3.3 Lưu đồ giải thuật 21 Chương 4: KẾT QUẢ THỰC HIỆN 27 4.1 Kết thực phần cứng 27 4.2 Kết thực phần mềm 29 Chương 5: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 31 TÀI LIỆU THAM KHẢO 32 MÃ NGUỒN CHƯƠNG TRÌNH 33 iv Chương 1: TỔNG QUAN 1.1 Lý chọn đề tài Chiếc đồng hồ vật gần gũi cần thiết người đời sống ngày, nhờ vào đồng hồ mà người xác định xác thời gian từ thực cơng việc Với đồng hồ hiển thị thứ, ngày, tháng, năm dương lịch âm lịch, phút giây thêm chức (báo thức) giúp xác định rõ thời gian để thực việc đó, có kế hoạch phù hợp để hồn thành tốt cơng việc Thấy hữu ích từ đồng hồ nên tác giả định thực đề tài “THIẾT KẾ ĐỒNG HỒ SỐ SỬ DỤNG VI ĐIỀU KHIỂN PIC16F887 GIAO TIẾP VỚI IC THỜI GIAN THỰC DS1307” 1.2 Mục tiêu nghiên cứu Thiết kế đồng hồ số hiển thị giờ, phút, giây; thứ, ngày, tháng, năm (âm lịch dương lịch), điều chỉnh thời gian có chức hẹn 1.3 Phạm vi nghiên cứu Thiết kế sử dụng vi điều khiển PIC16F887 giao tiếp với IC thời gian thực DS1307 thông qua chuẩn truyền thông I2C Người thiết kế sử dụng phần mềm CCS để viết biên dịch chương trình cho vi điều khiển Sử dụng thư viện “16F887.h” “cld.c” từ phần mềm CCS để hỗ trợ lập trình Thiết kế mơ layout phần mềm Proteus 1.4 Bố cục Nội dung đề tài gồm chương: Chương 1: Tổng quan: Chương trình bày lý chọn đề tài, mục tiêu phạm vi nghiên cứu đề tài Chương 2: Cơ sở lý thuyết: Giới thiệu vi điều khiển PIC16F887, chuẩn truyền thông I2C, IC thời gian thực DS1307 LCD Chương 3: Thiết kế hệ thống: Trình bày sơ đồ khối, thiết kế sơ đồ nguyên lý cho khối xây dựng lưu đồ giải thực hệ thống Chương 4: Kết thực hiện: Trình bày kết thực thiết kế Chương 5: Kết luận hướng phát triển: Đưa kết luận hướng phát triển đề tài Chương 2: CƠ SỞ LÝ THUYẾT 2.1 Giới thiệu Vi điều khiển PIC 16F887 PIC16F887 chip vi điều khiển thuộc họ PIC Microchip sản xuất (hình 2.1) PIC16F887 vi điều khiển bit xây dựng theo kiến trúc RISC nên tốc độ thực thi lệnh cao có tập lệnh tương đối ít, gần gũi với người nên người dùng dễ dàng giao tiếp với PIC 16F887 hoạt động dãy điện áp 2V - 5.5V, sử dụng dao động nội có tần số từ 31 kHz đến MHz thay đổi phần mềm Ngồi cịn gắn thêm thạch anh để điều khiển tần số hoạt động phù hợp nhận/cấp dịng khoảng 25mA Về nhớ vi điều khiển có nhớ liệu gồm: SRAM 368 bytes EEPROM 256 bytes, nhớ chương trình Flash 8192 words cho phép người dùng xóa, ghi lại chương trình nhiều lần Vi điều khiển PIC16F887 gồm Watchdog, ngắt, định thời Timer, modules CCP/PWM để điều chế độ rộng xung 35 chân I/O có 14 chân chuyển đổi tương tự để nối ngoại vi kết nối chặt chẽ với nhằm giúp người dùng thực ứng dụng điều khiển cụ thể Các giao thức truyền thông vi điều khiển USART, SPI I2C PIC 16F887 reset cấp điện tự động reset phát nguồn điện cấp bị sụt giảm chủ động reset chân RE3 cho phép chân RE3 có chức MCLR phần mềm [1] Hình 1: Vi điều khiển PIC 16F887 (Nguồn: Internet) Sơ đồ chân vi điều khiển PIC16F887 loại 40 trình bày hình 2.2 Trong chân tích hợp nhiều chức năng, 40 chân vi điều khiển PIC16F887 chia thành port Chức chân trình bày theo port [1]: Hình 2: Sơ đồ chân vi điều khiển 16F887 (Nguồn: Microchip, PIC16F882/883/884/886/887 Data Shet, trang 6) Các chân Port A: Chân RA0/AN0/ULPWU/C12IN0- (2): có chức năng: RA0: xuất/ nhập số - bit thứ port A AN0: ngõ vào tương tự kênh thứ ULPWU (Ultra Low-power Wake up input): ngõ vào đánh thức CPU công suất cực thấp C12IN0- (Comparator C1 or C2 negative input): ngõ vào âm thứ so sánh C1 C2 Chân RA1/AN1/C12IN1- (3): có chức năng: RA1: xuất/nhập số - bit thứ port A AN1: ngõ vào tương tự kênh thứ C12IN1- (Comparator C1 or C2 negative input): ngõ vào âm thứ so sánh C1 C2 Chân RA2/AN2/VREF-/CVREF/C2IN+ (4): có chức năng: RA2: xuất/nhập số - bit thứ port A AN2: ngõ vào tương tự kênh thứ VREF-: ngõ vào điện áp chuẩn (thấp) ADC CVREF: điện áp tham chiếu VREF ngõ vào so sánh C2IN+: ngõ vào dương so sánh C2 Chân RA3/AN3/VREF+/C1IN+ (5): có chức năng: RA3: xuất/nhập số - bit thứ port A AN3: ngõ vào tương tự kênh thứ VREF+: ngõ vào điện áp chuẩn (cao) A/D C1IN+: ngõ vào dương so sánh C1 Chân RA4/T0CKI/C1OUT (6): có chức năng: RA4: xuất/nhập số – bit thứ port A T0CKI: ngõ vào xung clock từ bên cho Timer0 C1OUT: ngõ so sánh Chân RA5/AN4/ SS / C2OUT (7): có chức năng: RA5: xuất/nhập số – bit thứ port A AN4: ngõ vào tương tự kênh thứ SS : ngõ vào chọn lựa SPI tớ (Slave SPI device) C2OUT: ngõ so sánh Chân RA6/OSC2/CLKOUT (14): có chức năng: RA6: xuất/nhập số – bit thứ port A OSC2: ngõ dao động thạch anh Kết nối đến thạch anh cộng hưởng CLKOUT: chế độ RC, ngõ OSC2, ¼ tần số OSC1 Chân RA7/OSC1/CLKIN (13): có chức năng: RA7: xuất/nhập số – bit thứ port A OSC1: ngõ vào dao động thạch anh ngõ vào nguồn xung bên CLKIN: ngõ vào nguồn xung bên Các chân Port B: Chân RB0/AN12/INT (33): có chức năng: RB0: xuất/nhập số – bit thứ port B AN12: ngõ vào tương tự kênh thứ 12 INT: ngõ vào nhận tín hiệu ngắt ngồi Chân RB1/AN10/C12IN3- (34): có chức năng: RB1: xuất/nhập số – bit thứ port B AN10: ngõ vào tương tự kênh thứ 10 C12IN3-: ngõ vào âm thứ so sánh C1 C2 Chân RB2/AN8 (35): có chức năng: RB2: xuất/nhập số – bit thứ port B AN8: ngõ vào tương tự kênh thứ Chân RB3/AN9/PGM/C12IN2 (36): có chức năng: RB3: xuất/nhập số – bit thứ port B AN9: ngõ vào tương tự kênh thứ PGM: Chân cho phép lập trình điện áp thấp ICSP C12IN1-: ngõ vào âm thứ so sánh C1 C2 Chân RB4/AN11 (37): có chức năng: RB4: xuất/nhập số – bit thứ port B AN11: ngõ vào tương tự kênh thứ 11 Chân RB5/ AN13/ T1G (38): có chức năng: RB5: xuất/nhập số – bit thứ port B AN13: ngõ vào tương tự kênh thứ 13 T1G (Timer1 gate input): ngõ vào Gate cho phép time1 đếm dùng để đếm độ rộng xung Chân RB6/ICSPCLK (39): có chức năng: RB6: xuất/nhập số ICSPCLK: xung clock lập trình nối tiếp Chân RB7/ICSPDAT (40): có chức năng: RB7: xuất/nhập số ICSPDAT: ngõ xuất nhập liệu lập trình nối tiếp Các chân Port C: Chân RC0/T1OSO/T1CKI (15): có chức năng: RC0: xuất/nhập số – bit thứ port C T1OSO: ngõ dao động Timer1 T1CKI: ngõ vào xung clock từ bên ngồi Timer1 Chân RC1/T1OSI/CCP2 (16): có chức năng: RC1: xuất/nhập số – bit thứ port C T1OSI: ngõ vào dao động Timer1 CCP2: ngõ vào Capture2, ngõ compare2, ngõ PWM2 Chân RC2 /P1A/CCP1 (17): có chức năng: RC2: xuất/nhập số – bit thứ port C P1A: ngõ PWM CCP1: ngõ vào Capture 1, ngõ compare 1, ngõ PWM1 Chân RC3/SCK/SCL (18): có chức năng: RC3: xuất/nhập số – bit thứ port C SCK: ngõ vào xung clock nối tiếp đồng bộ/ngõ chế độ SPI SCL: ngõ vào xung clock nối tiếp đồng bộ/ngõ chế độ I2C Chân RC4/SDI/SDA (23): có chức năng: RC4: xuất/nhập số – bit thứ port C SDI: ngõ vào liệu truyền liệu kiểu SPI SDA: xuất/nhập liệu I2C Chân RC5/SDO (24): có chức năng: RC5: xuất/nhập số – bit thứ port C SDO: ngõ xuất liệu truyền liệu kiểu SPI Chân RC6/TX/CK (25): có chức năng: RC6: xuất/nhập số – bit thứ port C 14 TX: ngõ phát liệu chế độ truyền bất đồng USART CK: ngõ cấp xung clock chế độ truyền đồng USART Chân RC7/RX/DT (26): có chức năng: RC7: xuất/nhập số – bit thứ port C RX: ngõ vào nhận liệu chế độ truyền bất đồng EUSART if(i30) { d_am= 1; if(t_am > 12) { t_am = 1; if(n_am >99) n_am = 0; else n_am ++; } else t_am ++; } else; } else; if(input(ADJ)==0) // nhan phim chinh thoi gian { while(input(ADJ)==0); // cho cho toi nut nhan duoc nha chinh_gio(); // thuc hien ham chinh thoi gian } if(input(TIMER)==0) // nhan phim chinh bao thuc { while(input(TIMER)==0); // cho cho toi nut nhan duoc nha if(dang_bao_thuc==1) { output_low(coi); // tat coi neu dang bao 40 dang_bao_thuc=0; // bao da tat coi bao thuc } else chinh_bt(); // thuc hien ham chinh bao thuc } } } //======================================== void convert_bcd() // BCD { c_g=mang_tg_rtc[0]>>4; // dich phai bit de lay hang chuc dv_g=mang_tg_rtc[0]&0x0f; // xoa bit cao de lay hang don c_p=mang_tg_rtc[1]>>4; // dich phai bit de lay hang chuc dv_p=mang_tg_rtc[1]&0x0f; // xoa vit cao de lay hang don c_h=mang_tg_rtc[2]>>4; // dich phai bit de lay hang chuc dv_h=mang_tg_rtc[2]&0x0f; // xoa vit cao de lay hang don thu = mang_tg_rtc[3]; c_d=mang_tg_rtc[4]>>4; // dich phai bit de lay hang chuc dv_d=mang_tg_rtc[4]&0x0f; // xoa vit cao de lay hang don c_t=mang_tg_rtc[5]>>4; // dich phai bit de lay hang chuc dv_t=mang_tg_rtc[5]&0x0f; // xoa vit cao de lay hang don vi c_n=mang_tg_rtc[6]>>4; // dich phai bit de lay hang chuc dv_n=mang_tg_rtc[6]&0x0f; // xoa vit cao de lay hang don } //======================================== vi vi vi vi vi ////////// CHINH BAO THUC/////// void chinh_bt()//chuong trinh chinh bao thuc { int8 mode=1,i=0; lcd_gotoxy(1,1); printf(LCD_putc," CAI BAO THUC "); // hien thi thong tin len dong while(true) { if(i=10) i = 0; // tang bien i sau moi lan quet (gioi han 0-9) if(input(UP)==0) // nhan nut tang { while(input(UP)==0); // cho nha nut tang 41 i=0; switch(mode) { case 1: if(h10) g1 ; else g1 = 59;//giay lon hon thi giam don vi be hon thi nhay ve 59 break; } } if(input(TIMER)==0) // nhan nut chinh bao thuc { while(input(TIMER)==0); i=5; mode++; // tang bien chinh thoi gian bao thuc if(mode>3) break; // thoat khoi ham chinh bao thuc sau chinh xong gia tri bao thuc } if(input(ADJ)==0) // nhan nut chinh thoi gian { while(input(ADJ)==0); // cho nut chinh thoi gian nha break; // thoat khoi ham nhan nut chinh thoi gian } } } //======================================== void chinh_gio() // ham chinh thoi gian thuc { int8 mode=1,i=0,t; ReadRTC(&mang_tg_rtc[0]); convert_bcd(); // chuyen doi thoi gian rtc so thap phan while(true) // vong lap vo han chi thoat neu co lenh break cua ham { if(i=10) i = 0; // tang bien i sau moi lan quet (gioi han 0-9) if(input(UP)==0) // nut tang duoc nhan { while(input(UP)==0); // cho nut tang duoc nha i=0; // cho i = de tiep tuc hien thi gia tri duoc chon switch(mode) // lua chon tang gia tri thuoc vao bien mode { 43 case 1: // mode = // tang gio gio t = c_h*10+dv_h; // ghep so thap phan rieng le vao mot bien tam if(t0) t ; else 47 t = 99; n_am=t; break; } } if(input(ADJ)==0) // nhan nut set { while(input(ADJ)==0); // cho nha nut set i=5; mode++; // tang bien chon gia tri chinh if(mode>10) break; // nhan chinh het gia tri thi thoat khoi ham chinh thoi gian } if(input(TIMER)==0) // nhan nut chinh bao thuc thi thoat khoi ham chinh thoi gian { while(input(TIMER)==0); // cho nha nut chinh bao thuc break; // thoat khoi ham chinh thoi gian } } //======================================== mang_tg_rtc[0] = (c_g