TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT HƯNG YÊN KHOA ĐIỆN – ĐIỆN TỬ ĐỒ ÁN TỐT NGHIỆP ĐỀ TÀI Thiết kế chế tạo bộ KIT thực tập Lập trình C ứng dụng (modul truyền thông I2C) GIÁO VIÊN HƯỚNG DẪN Ths Bùi Thị Kim.
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT HƯNG YÊN KHOA: ĐIỆN – ĐIỆN TỬ ĐỒ ÁN TỐT NGHIỆP ĐỀ TÀI: Thiết kế chế tạo KIT thực tập Lập trình C ứng dụng (modul truyền thông I2C) GIÁO VIÊN HƯỚNG DẪN: Ths Bùi Thị Kim Thoa SINH VIÊN THỰC HIỆN : Phạm Đình Tú LỚP : 112182.3 LỜI MỞ ĐẦU Ngày nay, với ứng dụng khoa học kỹ thuật tiên tiến, giới ngày thay đổi, ngày văn minh đại Trong đó, kỹ thuật điện tử có bước phát triển mạnh mẽ kỹ thuật điều khiển tự động kỹ thuật vi điều khiển Ở nước ta nay, việc lập trình ghép nối máy tính với sử dụng vi điều khiển công cụ ứng dụng rộng rãi lĩnh vực tự động hóa Cơng nghệ phát triển nhanh chóng mang lại thay đổi to lớn sản suất sống ngày Đặc biệt, trường Đại học Cao đẳng nước việc sử dụng công nghệ khoa học kỹ thuật để chế tạo mơ hình có khả ứng dụng cao học tập điều mong mỏi không thầy mà cịn niềm mong đợi nhiều sinh viên Khoa Điện – Điện tử Xuất phát từ nhu cầu thực tế, trang thiết bị giảng dạy chưa đáp ứng đủ nhu cầu học tập sinh viên, chúng em nhận đề tài “Thiết kế chế tạo KIT thực tập Lập trình C ứng dụng (Modul truyền thống I2C).Dưới hướng dẫn nhiệt tình Cơ Ths Bùi Thị Kim Thoa với nỗ lực thành viên nhóm chúng em hoàn thành đề tài giao Qua trình học tập thực hành mơn “Lập trình C” chúng em có ý tưởng phát triển KIT thực hành cách hoàn thiện nhằm giúp sinh viên thực mục tiêu mơn học đề Chúng em mong nhận đóng góp thầy bạn để sản phẩm chúng em hoàn thiện Chúng em xin chân thành cảm ơn! MỤC LỤC DANH MỤC HÌNH VẼ DANH MỤC BẢNG BIẾU CHƯƠNG : TỔNG QUAN ĐỀ TÀI 1.1 Lý chọn đề tài Ngày với phát triển khoa học kỹ thuật công nghệ, công nghiệp vi điện tử kỹ thuật số hệ thống điều khiển dần tự động hóa Với kỹ thuật tiên tiến vi xử lý, vi mạch số, ứng dụng vàolĩnh vực điều khiển, hệ thống điều khiển thơ sơ với tốc độ chậm độ xác thay hệ thống điều khiển tự động với lệnh chương trình thiết lập sẵn Nhằm trang bị cho sinh viên kiến thức cần thiết vi điều khiển Dựa tảng kiến thức môn học sinh viên tiếp thu môn học kỹ thuật chuyên nghành tiếp cận dễ dàng hợn với kỹ thuật, trang thiết bị đại Đồng thời cho phép sinh viên có nhìn trực quan, kiểm chứng khẳng định đắn kiến thức học Do việc đưa vào giáo trình phần xây dựng thiết kế Kit thực tập quan trọng thiết thực sinh viên… Sinh viên dùng Kit để điều khiển modul led đơn, led thanh, động bước, động chiều, led ma trận, LCD… Trong trường đại học, thiết bị thực hành mơn học vi xử lý giáo viên giảng dạy môn học chế tạo sinh viên tự chế tạo hướng dẫn giáo viên, ưu điểm sản phẩm chế tạo nước giá thành rẻ mà chất lượng, mẫu mã khơng thua nước ngồi Cấu hình sản phẩm nội dung thực hành phù hợp với mục đích, chương trình đào tạo, với điều kiện học tập sinh viên nước nói chung sinh viên trường Đại học SPKT Hưng Yên nói riêng Xuất phát từ tình hình thực tế cần thiết đáp ứng nhu cầu thực hành trình học tập mơn học vi điều khiển nói trên, việc thiết kế, xây dựng KIT thực tập với đầy đủ thành phần bản, vấn đề cần thiết nghành điện tử, tự động hóa trường Đại học SPKT Hưng Yên Đây vấn đề trọng tâm đồ án 1.2 Lịch sử nghiên cứu Trên giới có nhiều hãng nghiên cứu cung cấp thị trường nhiều mẫu KIT thực hành lập trình điều khiển hệ thống khác hãng Midas (Hàn Quốc), MikroElektronika (Website http://www.mikroelektronika.co.yu/ )và hãng OLIMEX(Website http://www.olimex.com) Đặc điểm sản phẩm mà hãngnày có tính mạnh, mẫu mã đẹp, phục vụ tốt nhu cầu thực hành môn học Tuy nhiên giá thành thiết bị đắt việc đặt mua không thuận tiện 1.3 Yêu cầu thiết kế 1.3.1 Phần cứng Mục đích sản phẩm phục vụ cho việc đào tạo nên cấu hình cứng phải rõ ràng, dàn trải Kích thước KIT gọn nhẹ, dễ dàng di chuyển bảo quản Các thành phần KIT thể rõ ràng, dễ nhận biết, đặc điểm phân thành modul nhỏ liên kết với modul trung tâm BUS, điều giúp người học nhìn thấy cách trực quan thành phần thí nghiệm tiến hành Đồng thời việc tổ chức thành modul nhỏ tiện cho việc sửa chữa, thiết kế mở rộng, dễ dàng trọng việc thương mại hóa sản phẩm 1.3.2 Phần mềm Sử dụng phần mềm có giao diện trực quan, dễ sử dụng ngơn ngữ lập trình đơn giản dễ hiểu Bộ thực hành có thành phần hệ lập trình cho phép người sử dụng tự phát triển ứng dụng KIT thực hành bao gồm modul: Bảng 1: Bảng thống kê khối sử dụng kit 1.NGUỒN CPU LCD LED THANH LED DON ĐỘNG CƠ DC ĐỘNG CƠ BƯỚC MODUL PHIM NHẤN 4X4 MODUL SENSOR 10 PHÍM ĐƠN 11 MODUL RELAY 12 DS1307 + RS232 CHƯƠNG 2: CƠ SỞ LÝ THUYẾT 2.1 Chọn phương án thiết kế 2.1.1 Vi điều khiển Họ vi điều khiển mà KIT chọn làm thành phần trung tâm họ PIC16Fxx lý sau đây: - PIC16Fxx họ vi điều khiển phổ biến nay, sử dụng rộng rãi ứng dụng công nghiệp việc chế tạo sản phẩn dân dụng - Họ PIC16Fxx môn học nằm chương trình đào tạo trường trung cấp, cao đẳng đại học nước, đối tượng cụ thể cho sinh viên bắt đầu nhập mơn vi điều khiển Vì vậy, việc chọn họ PIC16Fxx làm thành phần trung tâm KIT phù hợp với chương trình đào tạo điều kiện học tập sinh viên 2.1.2 Tìm hiểu vi điều khiển PIC 16F877A 2.1.2.1 Khái quát vi điều khiển PIC 16F877A Hình Hình ảnh thực tế Pic16F877A Ngày nay, vi điều khiển có ứng dụng ngày rộng rãi lĩnh vực kỹ thuật đời sống xã hội, đặc biệt lĩnh vực tự động hóa điều khiển từ xa Giờ với nhu cầu chuyên dụng hóa, tối ưu hóa (thời gian, khơng gian, giá thành) Tính bảo mật, tính chủ động cơng việc, ngày đòi hỏi khắt khe Việc đưa công nghệ lĩnh vực thiết kế mạch điện tử đáp ứng nhu cầu hoàn toàn cần thiết mang tính thực tế cao Khối xử lí trung tâm mà đóng vai trị PIC16F877A làm nhiệm vụ tiếp nhận xử lí liệu đến cách tự động Đề tài sử dụng PIC16F877A ưu điểm vượt trội so với vi điều khiển khác Về mặt tính cơng có thề xem PIC vượt trội nhiều so với 89 với nhiều module tích hợp sẵn ADC 10 BIT, PWM 10 BIT, EEPROM 256 BYTE, COMPARATER, VERF COMPARATER… Về mặt giá có đơi chút chênh lệch giá 89S52 khoảng 20.000 PIC16F877A 60.000 so sánh ta nên xem lại phần linh kiện cho việc thiết kế mạch dùng 89 muốn có ADC bạn phải mua ADC chẳng hạn ADC 0808 hay 0809 với giá vài chục ngàn Opamp sử dung PIC tích hợp cho ta sẵn module có nghĩa bạn ko cần mua ADC, Opam, EPPROM PIC có sẵn Ngoài gặp nhiều thuận lợi thiết kế board, board mạch nhỏ gọn đẹp dễ thi công nhiều, tính giá tổng cộng lúc thành phẩm PIC xem rẻ 89 Một điều đặc biệt tất PIC sử dụng có chuẩn PI tức chuẩn cơng nghiệp thay chuẩn PC (chuẩn dân dụng) Ngồi ra, PIC có ngơn ngữ hỗ trợ cho việc lập trình ngồi ngơn ngữ Asembly cịn có ngơn ngữ C có thề sử dụng CCSC, HTPIC, MirkoBasic… cịn nhiều chương trình khác để hỗ trợ cho việc lập trình bên cạnh ngơn ngữ kinh điển asmbler sử dụng MPLAB IDE Bên cạnh với bề dày phát triển lâu đời PIC tạo nhiều diễn đàn sôi PIC ngồi nước Chính có nhiều thuận lợi việc dễ dàng tìm kiếm thơng tin lập trình cho dịng PIC 2.3.1.2 Sơ đồ chân sơ đồ nguyên lý PIC 16F877A Sơ đồ chân vi điều khiển PIC 16F877A: Hình 2 Sơ đồ chân Pic16F877A Sơ đồ ví trí port vi điều khiển PIC16F877A: Hình Sơ đồ vị trí port Pic16F877A Nhận xét: Từ sơ đồ chân sơ đồ nguyên lý trên, ta rút nhận xét ban đầu sau: 10 BÀI THỰC HÀNH SỐ PHIẾU THỰC HÀNH Thiết kế lập trình cho DS1307 A, Mục Tiêu - Biết đến ngơn ngữ lập trình C - Biết cách lập trình giao thức I2C - Hiểu cách hoạt DS1307 - Biết cách lập trình thời gian thực với DS1307 B, Luyện tập Bài tập theo mẫu: thiết kế lập trình thời gian thực với DS1307 sử dụng pic 16F877A ,hiện thị LCD, thiết lập thời gian ma trận phím a, Sơ đồ nguyên lý mạch Sơ đồ nguyên lý thời gain thực DS 1307 b, Sơ đồ mạch bo 37 38 c, Chương trình #include #use fast_io(D) #include #use fast_io(B) #use i2c(Master, sda = PIN_C4, scl=PIN_C5) #include #include #define int8 uint8_t #use fast_io(a) void kiem_tra(); void cai_dat(); void main() { i2c_init(TRUE); //initialize and enable I2C peripheral //to baud rate specified in //#USE I2C delay_ms(20); lcd_init() ; while(TRUE) {lcd_gotoxy(1,1); ds1307_get_date(day,month,yr,dow); ds1307_get_time(hrs,min,sec); printf(lcd_putc,"time: %d:%d:%d ",hrs,min,sec); lcd_gotoxy(1,0); printf(lcd_putc,"date: %d:%d:20%d ",day,month,yr); if(!input(40)){delay_ms(20);while(!input(40)); k=1;cai_dat();} delay_ms(200); } } 39 d, cách kết nối -Đầu tiên kết nối vi điều khiển Pic 16F877a với mạch DS1307 dây tín hiệu SDA SCl mạch DS1307 với port C pic C4 C5 ( SDA= C4, SCL= C5) - ta kết nối LCD với vi điều kiển pic 16F877A Chân ENABLE lcd kết nối với chân RD2 vi điều kiển, chân RS lcd ta kết nối với RD0 pic , chân RW lcd kết nối với RD1 , chân Data ,5,6,7 lcd kết nối với chân RD4 RD5 RD6 RD7 pic - cuối ta kết nối ma trận phím với pic 16f877A Ta kết nối cột ma trận phím Em chọn cột với GND pic Sau e kết nối nút nhấn tương ứng với chân RA0, RA1, RA2 để tùy chỉnh thiết lập thời gian e, lưu đồ 40 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN Kết luận: Kết đạt Sau thời gian thực đồ án: “Thiết kế phần cứng mơ hình dạy học lập trình với vi điều khiển PIC 16F877A” em hoàn thành Cùng với nỗ lực cố gắng thân, giúp đỡ bạn bè lớp đặc biệt với giúp đỡ nhiệt tình, tận tâm thầy Nguyễn Tiến Dũng em thực cách tương đối tốt yêu cầu mà đề tài đặt Nhưng bên cạnh đó, thời gian thực đề tài, với trình độ kiến thức cịn có hạn nên khơng tránh khỏi sai sót Do em mong nhận ý kiến đóng góp thầy giáo bạn để đề tài em ngày hoàn thiện Ưu điểm: Sau q trình nghiên cứu thi cơng, nhóm hồn thành nội dung đề tài nêu 13 modul thiết kế chế tạo với mục đích sử dụng việc giảng dạy thực hành, thí nghiệm cho mơn học Lập trình C Ứng dụng modul q trình giảng dạy khơng trường đại học, cao đẳng trung học truyên nghiệp mà trường THPT đem lại nhựng hiệu tích cực Modul thực tập nhóm sinh viên chúng em gồn nhiều khối gói gọn vào board mạch để gọn vali nên thuận tiện cho việc sử dụng, vận chuyển bảo quản Modul kiểm tra, khắc phục lỗi chạy ứng dụng tương ứng Với cá nhân nhóm, sau thực xong đề tài có thêm nhiều kiến thức cấu trúc phần cứng vi điều khiển, lập trình vi điều khiển thiết kế giao diện lập trình điều khiển hệ thống qua máy tính Đồng thời có thêm kinh nghiệm việc thiết kếvà đặc biệt có thêm kinh nghiệm tự tin trường tiếp xúc làm việc với nhà doanh nghiệp Nhược điểm Sau trình thực đồ án chúng em thấy mặt hạn chế kit sau: - Bộ kit thực hành chưa ứng dụng cao đời sống sản suất - Bộ KIT to cồng kênh - Thiết kế phức tạp 41 Hướng phát triển đề tài: Đề tài cho phép làm việc với loại chip họ PIC16xx, khơng có chế độ kiểm tra để người dùng quan sát q trình hoạt động KIT Với hạn chế ta phát triển đề tài sử dụng loại chip khác PIC, AVR, … Xây dựng phần mềm tương tác KIT máy tính để mơ hoạt động KIT máy tính, giúp người dùng trực quan câu lệnh, hoạt động chip Sau hoàn thành đề tài chúng em học hỏi nhiều kiến thức kinh nghiệm bổ ích từ thầy cô, bạn bè, phát triển KHKT nhu cầu xã hội trình ứng dụng tiến KHCN vào sản xuất Chúng em mong thầy cô giáo cho chúng em đề tài ngày thiết thực bạn sinh viên tích cực phát huy khả sáng tạo đưa ý tưởng đời sản phẩm mới, có chỗ đứng thị trường Xin chân thành cảm ơn thầy giáo bạn đóng góp ý kiến giúp đỡ chúng em hoàn thành đề tài Sinh viên thực Phạm Đình Tú 42 TÀI LIỆU THAM KHẢO [1] Bạch Hưng Trường Giáo trình kỹ thuật vi điều khiển ĐH sư phạm kỹ thuật Hưng Yên, 2003 [2] Lâm Tăng Đức, Lê Tiến Dũng Giáo trình kỹ thuật vi điều khiển ĐH Đà Nẵng, 2006 [3] Ngơ Diên Tập Vi điều khiển với lập trình C NXB Khoa học kỹ thuật, 2006 [4] TS Vũ Hồng Sơn Giáo trình Lập trình ứng dụng C Webside tham khảo: [5] [6] [7] [8] http://www.datasheetcatalog.com http://www.dientuvietnam.com http://www.diendandientu.com.vn http://www.atmel.com CHƯƠNG TRÌNH GIAO TIẾP I2C Chương trình kết nối modul thời gian thực DS1307 - Chương trình 43 #include #use fast_io(D) #include #use fast_io(B) #use i2c(Master, sda = PIN_C4, scl=PIN_C5) #include #include #define int8 uint8_t #use fast_io(a) void kiem_tra(); void cai_dat(); void main() { i2c_init(TRUE); //initialize and enable I2C peripheral //to baud rate specified in //#USE I2C delay_ms(20); lcd_init() ; while(TRUE) {lcd_gotoxy(1,1); ds1307_get_date(day,month,yr,dow); ds1307_get_time(hrs,min,sec); printf(lcd_putc,"time: %d:%d:%d ",hrs,min,sec); lcd_gotoxy(1,0); printf(lcd_putc,"date: %d:%d:20%d ",day,month,yr); if(!input(40)){delay_ms(20);while(!input(40)); k=1;cai_dat();} delay_ms(200); } } Thư viện DS1307 #ifndef ds_1307 C #define ds_1307_c BYTE bin2bcd(BYTE binary_value); BYTE bcd2bin(BYTE bcd_value); int8 sec,min,hrs,day,month,yr,dow,k; void kiem_tra(); 44 void ds1307_init(void) { BYTE initsec = 0; BYTE initmin=0; BYTE inithr=0; BYTE initdow=0; BYTE initday=0; BYTE initmth=0; BYTE inityear=0; i2c_start(); i2c_write(0xD0); i2c_write(0x00); i2c_start(); i2c_write(0xD1); initsec= bcd2bin(i2c_read() & 0x7f); initmin= bcd2bin(i2c_read() & 0x7f); inithr = bcd2bin(i2c_read() & 0x3f); initdow= bcd2bin(i2c_read() & 0x7f); initday = bcd2bin(i2c_read() & 0x3f); initmth = bcd2bin(i2c_read() & 0x1f); inityear= bcd2bin(i2c_read(0)); i2c_stop(); delay_us(3); i2c_start(); i2c_write(0xD0); i2c_write(0x00); i2c_write(bin2bcd(initsec)); i2c_write(bin2bcd(initmin)); i2c_write(bin2bcd(inithr)); i2c_write(bin2bcd(initdow)); i2c_write(bin2bcd(initday)); i2c_write(bin2bcd(initmth)); i2c_write(bin2bcd(inityear)); i2c_start(); 45 i2c_write(0xD0); i2c_write(0x07); i2c_write(0x90); i2c_stop(); } void ds1307_set_date_time(BYTE day, BYTE mth, BYTE year, BYTE dow, BYTE hr, BYTE min, BYTE sec) { sec &= 0x7F; hr &= 0x3F; i2c_start(); i2c_write(0xD0); i2c_write(0x00); i2c_write(bin2bcd(sec)); i2c_write(bin2bcd(min)); i2c_write(bin2bcd(hr)); i2c_write(bin2bcd(dow)); i2c_write(bin2bcd(day)); i2c_write(bin2bcd(mth)); i2c_write(bin2bcd(year)); i2c_write(0x90); i2c_stop(); } void ds1307_get_date(BYTE &day, BYTE &mth, BYTE &year, BYTE &dow) { i2c_start(); i2c_write(0xD0); i2c_write(0x03); i2c_start(); i2c_write(0xD1); dow= bcd2bin(i2c_read() & 0x7f);//date day= bcd2bin(i2c_read() & 0x3f); 46 mth= bcd2bin(i2c_read() & 0x1f); year= bcd2bin(i2c_read(0)); i2c_stop(); } void ds1307_get_time(BYTE &hr, BYTE &min, BYTE &sec) { i2c_start(); i2c_write(0xD0); i2c_write(0x00); i2c_start(); i2c_write(0xD1); sec = bcd2bin(i2c_read() & 0x7f); = bcd2bin(i2c_read() & 0x7f); hr= bcd2bin(i2c_read(0) & 0x3f); i2c_stop(); } BYTE bin2bcd(BYTE binary_value) { BYTE temp; BYTE retval; temp = binary_value; retval = 0; while(true) { // Get the tens digit by doing multiple subtraction // of 10 from the binary value if(temp >= 10) { temp -= 10; retval += 0x10; } 47 else // Get the ones digit by adding the remainder { retval += temp; break; } } return(retval); } // Input range - 00 to 99 BYTE bcd2bin(BYTE bcd_value) { BYTE temp; temp = bcd_value; // Shifting upper digit right by is same as multiplying by temp >>= 1; // Isolate the bits for the upper digit temp &= 0x78; // Now return: (Tens * 8) + (Tens * 2) + Ones return(temp + (temp >> 2) + (bcd_value & 0x0f)); } void cai_dat(){ unsigned char p=0; lcd_putc("\f"); lcd_putc("cat_dat"); delay_ms(1000); lcd_putc("\f"); lcd_gotoxy(1,1); printf(lcd_putc,"set:%02d:%02d:%02d",hrs,min,sec); lcd_gotoxy(1,0); printf(lcd_putc,"set:%02d:%02d:20%d",day,month,yr); 48 while(true){ p=0; if(!input(41)){ delay_ms(20);while(!input(41)); if(k==1){sec ++;} if(k==2){min++;} if(k==3){hrs++;} if(k==6){day++;} if(k==5){month++;} if(k==4){yr++;} p=1; } if(!input(42)){ delay_ms(20);while(!input(42)); if(k==1){sec ;} if(k==2){min ;} if(k==3){hrs ;} if(k==6){day ;} if(k==5){month ;} if(k==4){yr ;} p=1; } kiem_tra(); if(p==1){ lcd_putc("\f"); lcd_gotoxy(1,1); printf(lcd_putc,"set:%d:%d:%2d",hrs,min,sec); lcd_gotoxy(1,0); printf(lcd_putc,"set:%d:%d:20%d",day,month,yr);} if(!input(40)){delay_ms(20);while(!input(40));k++;} if(k==7)break; } ds1307_set_date_time(day,month,yr,1,hrs,min,sec);//dow thu } void kiem_tra(){ 49 if(sec>250){sec=59;} if(sec>59){sec=0;} if(min>250){min=59;} if(min>59){min=0;} if(hrs>250){hrs=23;} if(hrs>23){hrs=0;} if(yr>90){yr=10;} if(yr12) {month =1;} if(month28){day=1;} if(month==2 && yr%4!=0&& day29){day=1;} if(month==2 && yr%4==0&& day30){day=1;} if(month%2==0 &&month!=2 && day30){day=1;} if(month%2==1 &&month!=2 && day