Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 28 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
28
Dung lượng
1,01 MB
Nội dung
ĐồánViđiềukhiển GVHD: Nguyễn Danh Ngọc LỜI MỞ ĐẦU Viđiềukhiển có nhiều ứng dụng thực tế, từ ứng dụng đơn giản có vài thiết bị ngoại vi hệ thống điềukhiển phức tạp Trong khuôn khổ đồán VĐK chúng em xin giới thiệu đồng hồ thời gian thực sử dụng PIC86F877A IC DS1307 Trong trình thực trình độ hiểu biết hạn chế, nên có nhiều sai sót mong thầy bạn góp ý bổ sung để hồn thiện Chúng em xin chân thành cảm ơn thầy Nguyễn Danh Ngọc tận tình hướng dẫn, đóng gớp ý kiến, kinh nghiệm tạo điều kiện thuận lợi để hoàn thành tốt đề tài SV thực hiện: Nguyễn Hữu Thọ Đinh Văn Tấn ĐồánViđiềukhiển GVHD: Nguyễn Danh Ngọc MỤC LỤC LỜI MỞ ĐẦU Chương I: TỔNG QUAN VỀ ĐỀ TÀI 1.1 Đặt vấn đề: 1.2 Giải vấn đề: Chương II: THIẾT KẾ HỆ THỐNG 2.1 Sơ đồ khối: 2.2 Sơ đồ mạch: 2.3 Linh kiện mạch: 2.4 Lưu đồ thuật toán: 15 Chương III: KẾT LUẬN 16 3.1 Kết quả: 16 3.2 Hướng phát triển đề tài: 17 PHỤ LỤC 18 ĐồánViđiềukhiển GVHD: Nguyễn Danh Ngọc Chương I: TỔNG QUAN VỀ ĐỀ TÀI 1.1 Đặt vấn đề: Với phát triển xã hội, khoa học kĩ thuật nói chung viđiềukhiểnPIC nói riêng ngày ứng dụng hầu hết lĩnh vực Một số biến thể phổ biến PIC 16F877A Việc tìm hiểu ứng dụng hết khả nhiều loại PIC trình dài lý thú hữu ích, thuận tiện, khả phát triển đa dạng dòng sản phẩm phù hợp nhiều quy mơ ứng dụng Đồng hồ thời gian thực sản phẩm đơn giản ứng dụng viđiềukhiển PIC, giúp sinh viên tìm hiểu, nghiên cứu lập trình PIC thiết kế, làm mạch thực tế 1.2 Giải vấn đề: Thiết kế đồng hồ thời gian thực hiển thị led đoạn sử dụng PIC16F877A, với yêu cầu đảm bảo về: − Tính thực thi cao, có khả phát triển − Chất lượng, độ xác cao, làm việc lâu dài, bền bỉ − Tiết kiệm chi phí, linh kiện dễ kiếm dễ sử dụng dễ dàng thay xảy cố − Có thể sử dụng riêng (đồng hồ vạn niên xem giờ, ngày tháng năm) hay sử dụng chung (lắp vào hệ thống mẹ) Từ yêu cầu chọn phương án thực sau: - Sử dụng LED đoạn để hiển thị giá thành rẻ, dễ sử dụng - Sử dụng IC thời gian thực DS1307 IC có tác dụng tạo thời gian thực tương đối xác, bao gồm giờ, phút, giây, thứ, ngày, tháng, năm - Sử dụng IC ghi dịch 74HC595 để tăng số lượng chân điềukhiển cho viđiềukhiểnĐồánViđiềukhiển GVHD: Nguyễn Danh Ngọc Chương II: THIẾT KẾ HỆ THỐNG 2.1 Sơ đồ khối: Khối hiển thị Khối nguồn Khối điềukhiểnĐiềukhiển trung tâm Cảm biến nhiệt độ Tạo thời gian thực Hình 2.1 Sơ đồ khối hệ thống - Khối nguồn: Sử dụng IC7805 tạo nguồn 5V cung cấp cho VĐK khối khác - Khối hiển thị: Hiển thị thời gian nhiệt độ Sử dụng LED đoạn anode chung - Khối điều khiển: Có chức chỉnh sửa thời gian hẹn Gồm nút ấn: Mode: Thay đổi biến điều kiện chỉnh thời gian, hẹn Up: Tăng giá trị cần điều chỉnh +1 Down: Giảm giá trị cần điều chỉnh –1 Select: Hoàn tất chỉnh sửa để hẹn - Khối tạo thời gian thực: Cung cấp thời gian thực, sử dụng IC DS1307 thông qua giao tiếp I2C - Cảm biến nhiệt độ: Sử dụng LM35 cung cấp giá trị tương tự tương ứng với mức nhiệt độĐồánViđiềukhiển 2.2 GVHD: Nguyễn Danh Ngọc Sơ đồ mạch: Hình 2.2 Sơ đồ toàn mạch ĐồánViđiềukhiển 2.3 GVHD: Nguyễn Danh Ngọc Linh kiện mạch: 2.3.1 Viđiềukhiển PIC16F877A Sử dụng thạch anh 20MHz ❖ Các đặc tính ngoại vi: Hình 2.3 Các đặc tính PIC 16F877A ĐồánViđiềukhiển GVHD: Nguyễn Danh Ngọc 2.3.2 DS1307 DS1307 chip đồng hồ thời gian thực (RTC: Real-time clock), đếm thời gian giờ, phút, giây, thứ, ngày, tháng, năm DS1307 đọc ghi thông qua giao diện nối tiếp I2C nên cấu tạo bên đơn giản X1 X2 VBAT GND Vcc SQW/OUT SCL SDA Hình 2.4 IC DS1307 sơ đồ chân Các chân DS1307 mô tả sau: - X1 X : ngõ kết nối với thạch anh 32.768 kHz làm nguồn tạo dao động - VBAT : cực dương nguồn pin 3V nuôi chip - GND: chân mass chung cho pin 3V Vcc - Vcc : nguồn cho giao diện I2C, thường 5V dùng chung với viđiềukhiển Chú ý Vcc không cấp nguồn VBAT cấp DS1307 hoạt động (nhưng không ghi đọc được) - SQW/OUT: (Square Wave / Output Driver), ngõ phụ tạo xung vuông, tần số xung lập trình - SCL SDA: đường tạo xung nhịp liệu giao diện I2C ✓ Có thể kết nối DS1307 mạch điện đơn giản ĐồánViđiềukhiển GVHD: Nguyễn Danh Ngọc 32 768 kHz 3V X1 X2 VBAT GND 5V Vcc SQW/OUT SCL SDA 5V I2C Hình 2.5 Mạch ứng dụng đơn giản DS1307 ❖ Cấu tạo bên DS1307: mạch nguồn, mạch dao động, mạch điềukhiển logic, mạch dao diện I2C, trỏ địa ghi (RAM) Sử dụng DS1307 chủ yếu ghi đọc ghi chip Do cần hiểu rõ vấn đề cấu trúc ghi cách truy xuất ghi thông qua dao diện I2C X1 X2 OSCILLATOR AND DIVIDER SQW/OUT SQUARE WAVE OUT VCC VBAT GND POWER CONTROL SCL SDA SERIAL BUS INTERFACE RTC CONTROL LOGIC RAM (56×8) ADDRESS REGISTER Hình 2.6 Cấu trúc IC DS1307 ĐồánViđiềukhiển GVHD: Nguyễn Danh Ngọc * Cấu trúc ghi: - Có tất 64 ghi bit đánh địa từ đến 63 (0x00 – 0x3F) - ghi đầu chứa thông tin thời gian bao gồm: giây (seconds), phút (minutes), (hours), thứ (day), ngày (date), tháng (month), năm (year) Thanh ghi thứ (control) điềukhiển xung ngõ SQW/OUT Còn lại 56 ghi dùng RAM - Việc ghi giá trị vào ghi đầu tương đương với việc cài đặt thời gian khởi động cho đồng hồ ➢ Tổ chức ghi thời gian theo bit: - Thời gian lưu ghi theo dạng mã BCD (Binary-Coded Decimal – số thập phân theo mã nhị phân) Vd: Muốn cài đặt cho ghi MINUTES giá trị 43 cần ghi vào ghi 01h giá trị 0x43 = 0100 0011 = 67 Khi hiển thị cần dùng phương pháp tách bit thông thường để tách thành nhóm 0100 0011 (sử dụng toán tử “>>”) xuất giá trị LED để hiển thị Th/ghi bit bit bit bit 00H CH 10 SECONDS SECONDS 00-59 01H 10 MINUTES MINUTES 00-59 02H 0-24 10HR HOURS 00-23 1-12 am/pm 10HR 0 04H 0 10 DATE 05H 0 0 10MO 10 YEAR | bit cao bit bit bit 01-12 03H 06H bit | DAY 1-7 DATE 0- ~30 MONTH 01-12 YEAR 00-99 bit thấp | Hình 2.7 Tổ chức ghi thời gian theo bit ĐồánViđiềukhiển - GVHD: Nguyễn Danh Ngọc Thanh ghi giây: bit có tên CH (clock halt - treo đồng hồ), bit set dao động chip bị vơ hiệu hóa, đồng hồ khơng hoạt động, phải reset bit xuống từ đầu - Thanh ghi giờ: bit = 0: hệ 24 h, bit 5&4 mã hóa chữ số hàng chục bit = 1: hệ 12 h, bit mã hóa chữ số hàng chục (0,1), bit mã hóa buổi ngày AM (0) PM (1) Ngoài ghi nhớ, DS1307 có ghi khác nằm riêng gọi trỏ địa hay ghi địa (address register) Giá trị ghi địa ghi nhớ mà người dùng muốn truy cập, set lệnh Write thông qua giao diện I2C * Cách truy xuất liệu: ✓ Tóm tắt cách thực giao tiếp I2C: Để thực giao tiếp chế độ Master, Vđk PIC gửi điều kiện START, bit địa Slave (SLA) + bit Write/Read, trình đọc hay ghi liệu Master Slave byte liệu bit (có thể byte dãy byte), sau byte lại có bit ACK NOT ACK Giao tiếp kết thúc với việc Master gửi điều kiện STOP DS1307 Slave I2C nên có hoạt động giao tiếp với chip Data Write Data Read Địa Slave address (SLA) DS1307 cố định mạng I2C 1101000 (0x68) Write Slave address W/R S Read 1101 000 Slave address W/R reg_address(n) A xxxx xxxx data (n) data (n) A xxxx xxxx data (n+1) data (n+1) A xxxx xxxx A P data (n+2) 10 ĐồánViđiềukhiển GVHD: Nguyễn Danh Ngọc Khi dịch liệu vào ghi 8-STAGE SHIFT REGISTER, chưa tạo xung STCP ghi 8-BIT STORAGE REGISTER giữ nguyên trạng thái ngõ giữ nguyên trạng thái Khi chân MR mức liệu ghi 8-STAGE SHIFT REGISTER bị xóa, ghi 8-BIT STORAGE REGISTER giữ nguyên trạng thái ngõ giữ nguyên trạng thái 2.3.4 LED đoạn: Sử dụng led đoạn anode chung kết nối với nguồn 5V sử dụng trở 200Ω dể hạn dòng Kết nối với viđiềukhiển thông qua IC 74HC595 Số a b c d e f g dp Mã Hex 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 0 0 0 1 1 1 1 1 03h 9Fh 25h 0Dh 99h 49h 41h 1Fh 01h 09h Bảng 2.1 Bảng mã led đoạn anode chung 14 ĐồánViđiềukhiển 2.4 GVHD: Nguyễn Danh Ngọc Lưu đồ thuật toán: Begin Khai báo biến thời gian, mảng giá trị xác định âm lịch, mã led đoạn Khai báo port xuất, nhập, chế độ giao tiếp I2C Khởi tạo ngắt port B, chuyển đổi ADC Cập nhật thời gian (đọc ghi liệu vào DS1307 qua giao tiếp I2C) Tính ngày âm Kiểm tra thời gian để bật chng báo thức Chuyển đổi ADC, tính nhiệt độ Quét led đoạn hiển thị thời gian, nhiệt độ Ngắt port B Kiểm tra nút bấm, thay đổi biến điều kiện chỉnh thời gian Thay đổi giá trị thời gian tương ứng/hẹn Return 15 ĐồánViđiềukhiển GVHD: Nguyễn Danh Ngọc Chương III: KẾT LUẬN 3.1 Kết quả: Hình 3.1 Sản phẩm 16 ĐồánViđiềukhiển GVHD: Nguyễn Danh Ngọc Đánh giá chất lượng: - Đồng hồ hoạt động ổn định, sai số nhỏ - Đáp ứng yêu cầu đặt ra: giá rẻ, nhỏ gọn, dễ sử dụng 3.2 Hướng phát triển đề tài: - Sử dụng dòng viđiềukhiển khác giá rẻ để tận dụng tối đa khả - Áp dụng vào mơ hình tự động để điềukhiển thiết bị theo thời gian 17 ĐồánViđiềukhiển GVHD: Nguyễn Danh Ngọc PHỤ LỤC Code: ▪ Thư viện: // DS1307 #use i2c(master, sda=pin_c4, scl=pin_c3) int s, reg2; int dec_bcd(int dec) { return ((dec/10)*16+dec%10); } int bcd_dec(int bcd) { return ((bcd/16)*10+bcd%16); } int ds1307_read(int address) { i2c_start(); i2c_write(0xd0); i2c_write(address); i2c_start(); i2c_write(0xd1); s = bcd_dec(i2c_read(0)); i2c_stop(); return s; } void ds1307_set_time(int hr, int min, int sec,int1 f, int1 ap) { i2c_start(); i2c_write(0xd0); // I2C write address i2c_write(0x00); // Start at REG - Seconds i2c_write(dec_bcd(sec)&0x7f); // REG i2c_write(dec_bcd(min)); // REG if (f==0) i2c_write(dec_bcd(hr)); // REG else i2c_write(dec_bcd(hr)|0x40|ap6; if (f==0) hr = bcd_dec(reg2); else { ap = reg2>>5&0x01; hr = bcd_dec(reg2&0x1f); } } void ds1307_get_date(int &day, int &mth, int &year, int &dow) { i2c_start(); i2c_write(0xd0); i2c_write(0x03); // Start at REG - Day of week i2c_start(); i2c_write(0xd1); dow = bcd_dec(i2c_read()); // REG day = bcd_dec(i2c_read()); // REG mth = bcd_dec(i2c_read()); // REG year = bcd_dec(i2c_read(0)); // REG i2c_stop(); } { ▪ Chương trình chính: #include #device *=16 adc=10 #include #include #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=20000000) #use fast_io(a) #use fast_io(b) #use fast_io(d) #use fast_io(e) #define shcp pin_e0 #define stcp pin_e1 #define ds pin_e2 #bit mode = 0x06.7 19 ĐồánViđiềukhiển GVHD: Nguyễn Danh Ngọc #bit select = 0x06.6 #bit down = 0x06.5 #bit up = 0x06.4 #bit RBIF = 0x0b.0 // co ngat RB //#bit RBIE = 0x0b.3 // bit cho phep int sec,min,hour,dow,day,month,year,ngayam,thangam,namam, temp,hh=6,mm,h1,b,d,t,q,l; int1 f,ap,aps; int const k[18]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09, 0xff,0x11,0x63,0x91,0x39,0x13,0xfd,0xfe};//0 9, ,a,c,h,o,n,-, int endm[12]={31,28,31,30,31,30,31,31,30,31,30,31}; int ALdauthangDL[3][12] = { {15,16,14,16,16,18,18,20,22,22,24,25},//2018 {26,27,25,27,27,28,29, 1, 3, 3, 5, 6},//2019 { 7, 8, 8, 9, 9,10,11,12,14,15,16,17},//2020 }; int thangALdauthangDL[3][12] = { {11,12, 1, 2, 3, 4, 5, 6, 7, 8, 9,10},//2018 {11,12, 1, 2, 3, 4, 5, 7, 8, 9,10,11},//2019 {12, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9,10},//2020 }; int DLdauthangAL[3][12] = { {17,16,17,16,15,14,13,11,10, 9, 7, 7},//2018 { 6, 5, 6, 5, 5, 3, 3,30,29,28,26,26},//2019 {25,23,24,23,23,21,21,19,17,17,15,14},//2020 }; int thangALdauthangAL[3][12] = { {12, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11},//2018 {12, 1, 2, 3, 4, 5, 6, 8, 9,10,11,12},//2019 { 1, 2, 3, 4, 4, 5, 6, 7, 8, 9,10,11},//2020 }; //===================================================================== ======== void tinhngayam() { signed int hieu=(day - DLdauthangAL[year-18][month-1]); if(hieu(month+2)) namam=year-1; else namam=year; 20 ĐồánViđiềukhiển GVHD: Nguyễn Danh Ngọc } // 74HC595 void dich(int n) { for(int i=0;i>i)>0) output_high(ds); else output_low(ds); output_high(shcp); delay_us(5); output_low(shcp); } } void hc(int n1,int n2) { dich(n2); dich(n1); output_high(stcp); delay_us(5); output_low(stcp); } // void time() { if (d==0&&b==0) { //dung thoi gian cai dat.(t==0: ko dung) sec = ds1307_read(0x00); if (sec==0) ds1307_get_time(hour,min,sec,f,ap); if ((hour==0||hour==12)&&min==0&&sec==0) { // cap nhat ngay,thang,nam luc 00h00 & 12h00 ds1307_get_date(day,month,year,dow); tinhngayam(); } } else if (t==1) { ds1307_set_time(hour,min,sec,f,ap); t=0; } else if (t==2) { ds1307_set_date(day,month,year,dow); tinhngayam(); t=0; } } void chuong(){ if (d==0&&b==0){ if (min==0&&sec==0) output_low(pin_d0); 21 ĐồánViđiềukhiển GVHD: Nguyễn Danh Ngọc if (min==0&&sec==1&&(l==0||f==0&&hour!=hh||f==1&&(hour!=h1||aps!=aps)||mm! =0)) output_high(pin_d0); if (l!=0){ if(f==0){ if (hour==hh&&min==mm&&sec==0) output_low(pin_d0); if (hour==hh&&min==mm&&sec==30) {output_high(pin_d0); l=(l==1)? 0:l;} } else { if (aps==ap&&hour==h1&&min==mm&&sec==0) output_low(pin_d0); if (aps==ap&&hour==h1&&min==mm&&sec==30) {output_high(pin_d0); l=(l==1)? 0:l;} } } } } // #separate void display0(){ if (b==0) { for (int i=0;i50)? 0:q; if (b==1) { if(l!=2) hc(l,10); else hc(15,10); output_low(pin_d7); delay_ms(3); output_high(pin_d7); hc(mm%10,10); output_low(pin_d5); delay_ms(3); output_high(pin_d5); hc(mm/10,10); output_low(pin_d4); delay_ms(3); output_high(pin_d4); if (q7)? 0:d;} } switch(d) { case 0: if(b==1) { hh=change(hh,23); if (hh12) h1=hh-12; else if (hh==0) h1=12; } if(b==2) mm=change(mm,59); if(b==3) l =change(l,2); break; case 1: if (f==0) hour=change(hour,23); else { if (up==0&&hour==11 || down==0&&hour==12) ap^=1; hour=change(hour-1,11)+1; } t=1; break; case 2: min=change(min,59); t=1; break; case 3: dow=change(dow-1,6)+1; t=2; break; case 4: day=change(day-1,30)+1; t=2; break; case 5: month=change(month-1,11)+1; t=2; break; case 6: year=change(year,99); if(year%4!=0) endm[1]=28; else endm[1]=29; t=2; break; case 7: day=(day>endm[month-1])? endm[month-1]:day; if (up==0||down==0) { f^=1; if (f==1) { if (hour>11) ap=1; else ap=0; if (hour>12) hour-=12; 26 ĐồánViđiềukhiển GVHD: Nguyễn Danh Ngọc else else //f==0 if (ap==1) else } t=1; if (hour==0) hour=12; } {if (hour3)? 0:b; } else d=0; day=(day>endm[month-1])? endm[month-1]:day; } output_high(pin_d0); delay_ms(150); RBIF=0; } //===================================================================== ======== void main() { set_tris_a(0x01); set_tris_b(0xf0); set_tris_d(0x00); set_tris_e(0x00); port_b_pullups(1); output_b(0xff); output_c(0xff); output_d(0xff); //! enable_interrupts(global); enable_interrupts(int_rb); setup_adc(adc_clock_div_32); setup_adc_ports(an0); set_adc_channel(0); ds1307_get_time(hour,min,sec,f,ap); ds1307_get_date(day,month,year,dow); tinhngayam(); while(1) { 27 ĐồánViđiềukhiển GVHD: Nguyễn Danh Ngọc time(); chuong(); if (d==0&&b==0) temp = ceil(read_adc()*500.0/1023); //10mV ~ 1DC display(); } } 28 ... mức nhiệt độ Đồ án Vi điều khiển 2.2 GVHD: Nguyễn Danh Ngọc Sơ đồ mạch: Hình 2.2 Sơ đồ tồn mạch Đồ án Vi điều khiển 2.3 GVHD: Nguyễn Danh Ngọc Linh kiện mạch: 2.3.1 Vi điều khiển PIC1 6F877A Sử... thứ, ngày, tháng, năm - Sử dụng IC ghi dịch 74HC595 để tăng số lượng chân điều khiển cho vi điều khiển Đồ án Vi điều khiển GVHD: Nguyễn Danh Ngọc Chương II: THIẾT KẾ HỆ THỐNG 2.1 Sơ đồ khối: Khối... biến điều kiện chỉnh thời gian Thay đổi giá trị thời gian tương ứng/hẹn Return 15 Đồ án Vi điều khiển GVHD: Nguyễn Danh Ngọc Chương III: KẾT LUẬN 3.1 Kết quả: Hình 3.1 Sản phẩm 16 Đồ án Vi điều khiển