TRƯỜNG ĐẠI HỌC MỎ HÀ NỘI
KHOA :
BÀI TẬP LỚN VI XỬ LÝ
Đề tài : Thiết kế mạch đồng hồ thời gian thực sử dụng DS1307 và
PIC16F877A và hiển thị lên LCD
Giáo viên hướng dẫn :
Sinh viên thực hiện :
Lớp :
MSSV :
Hà Nội : 26/03/2012.
1
Mục Lục
Mục Lục 2
1. Mô tả hệ thống :
Đề tài nhằm thiết kế 1 bộ đồng hồ thời gian thực đảm bảo tự cập nhật thời gian
của hệ thống và hiển thị giá trị lên LCD . Với thiết kế sử dụng cả nguồn ngoài và PIN
VBat làm cho hệ thống hoạt động cả khi mất điện thì hệ thống thời gian thực vẫn hoạt
động.
Ngoài ra đề tài còn có tương tác với phím bấm nhằm Reset hệ thống.
2. Sơ đồ mô phỏng trên PROTEUS
2
RE3/MCLR/VPP
1
RA1/AN1/C12IN1-
3
RA2/AN2/VREF-/CVREF/C2IN+
4
RA4/T0CKI/C1OUT
6
RA5/AN4/SS/C2OUT
7
RB6/ICSPCLK
39
RB5/AN13/T1G
38
RB4/AN11
37
RD3
22
RD2
21
RD1
20
RD0
19
RC7/RX/DT
26
RC6/TX/CK
25
RE2/AN7
10
RE1/AN6
9
RE0/AN5
8
RA3/AN3/VREF+/C1IN+
5
RD4
27
RB3/AN9/PGM/C12IN2-
36
VEE
3
LCD1
LM016L
X1
CRYSTAL
R1
4.7k
R2
4.7k
D1
LED-YELLOW
R3
4.7k
R4
4.7k
R5
1k
VBAT
3
X1
1
X2
2
SCL
6
SDA
5
SOUT
7
+ Port A: có 6 bit (tương ứng với 6 chân RA0÷RA5) các chân của cổng A có tích hợp
một số chức năng ngoại vi, nếu một thiết bị ngoại vi được enable thì cổng này sẽ không
hoạt động như một cổng vào ra .
Bình thường Port A sẽ là một cổng vào ra 2 chiều. Thanh ghi xác đinh chiều tương ứng
của các chân port A là thanh ghi TrisA. Các bit ở thanh ghi TrisA bằng 1 sẽ xác định
các chân ở port A là đầu vào ngược lại sẽ là đầu ra.
+ Port B: rộng 8 bit(tương ứng với 8 chân RB0÷RB7), là một cổng vào ra 2 chiều.
Thanh ghi qui đinh chiều của cổng B là thanh ghi Tris B. Thiết lập các bit ở thanh ghi
TrisB bằng 1 sẽ làm cho cổng B là cổng vào ngược lại sẽ là cổng ra.
+ Port C: rộng 8 bit(tương ứng với các chân RC0÷RC7), bình thường nó là một cổng
vào ra 2 chiều, thanh ghi qui định chiều của cổng là thanh ghi TrisC. Các chân
RC3,RC4 dùng để kết nối truyền nhân thông tin với các thiết bị ngoại vi.
+ Port D: rộng 8 bit (RD0÷RD7),nó có thể là cổng vào hoặc cổng ra. Port D có thể
5
được cấu hình
như một cổng vi xử lý rộng 8 bit (cổng slave song song) bằng cách
thiêt lập bit điều khiển
PSPSTATUS (TrisE.4). Ở chế độ này thì đầu vào la tín hiệu
TTL.
+ Port E: rộng 3 bit(RE0÷RE2), được cấu hình là đầu ra hoặc đầu vào. Port E có thể là
đầu vào điều khiển I/O khi bit PSPSTATUS (TrisE.4) được thiết lập.
Từ hình vẽ ta có thể thấy, pic16F877A có 2 chân Vcc và 2 chân GND, để pic có
thể hoạt động được ta phải cấp nguồn cho tất cả các chân này.
Ngoài cấp nguồn cung cấp ta phải cấp nguồn xung dao động để cho vi điều khiển hoạt
động. ta sẽ dùng một thạch anh 20MHz để cấp xung dao động. nguồn dao động được cấp
thông qua 2 chân 13 và 14 của pic.
Mạch reset cho vi điều khiển là một công tắc để hở thông qua chân MCLR của vi điều
khiển. mạch sẽ thực hiện reset khi chân này từ mức logic 1 xuống logic 0. khi công tắc
để hở thì chân này luôn mang mức logic 1 do luôn được nối với nguồn thông qua một
điện trở hạn dòng R1, điện trở này phải có giá trị nhỏ hơn hoặc bằng 10k để đảm bảo
5
SOUT
7
U2
DS1307
- DS1307 là một IC thời gian thực với nguồn cung cấp nhỏ, dùng để cập nhật thời
gian và ngày tháng với 56 bytes SRAM. Địa chỉ và dữ liệu được truyền nối tiếp qua 2
đường bus 2 chiều. Nó cung cấp thông tin về giờ, phút, giây, thứ, ngày, tháng,
năm.Ngày cuối tháng sẽ tự động được điều chỉnh với các tháng nhỏ hơn 31 ngày, bao
gồm cả việc tự động nhảy năm. Đồng hồ có thể hoạt động ở dạng 24h hoặc 12h với
chỉ thị AM/PM. DS1307 có một mạch cảm biến điện áp dùng để dò các điện áp lỗi và
tự động đóng ngắt với nguồn pin cung cấp.
- DS 1307 hoạt động với vai trò slave trên đường bus nối tiếp. Việc truy cập được thi
hành với chỉ thị START và một mã thiết bị nhất định được cung cấp bởi địa chỉ các
thanh ghi. Tiếp theo đó các thanh ghi sẽ được truy cập liên tục đến khi chỉ thị STOP
được thực thi.
Mô tả hoạt động của các chân:
7
+ X1 và X2 là đầu vào dao động cho DS1307. Cần dao động thạch anh 32.768Khz.
Vbat là nguồn nuôi cho chip. Nguồn này từ ( 2V- 3.5V) ta lấy pin có nguồn 3V.
Ðây là nguồn cho chip hoạt động liên tục khi không có nguồn Vcc mà DS1307 vẫn
hoạt động theo thời gian.
+ Vcc là nguồn cho giao tiếp I2C. Ðiện áp cung cấp là 5V chuẩn và được dùng
chung với vi điều khiển. Nếu Vcc không có mà Vbat có thì DS1307 vẫn hoạt động
bình thường nhưng mà không ghi và đọc dữ liệu được.
+) GND là nguồn MASS chung cho V
cc
và V
BAT
+ SCL(serial clock input): SCL được sử dụng để đồng bộ sự chuyển dữ liệu
14
RD5/P1B
28
RD6/P1C
29
RD7/P1D
30
RC4/SDI/SDA
23
RC5/SDO
24
RC3/SCK/SCL
18
RC2/P1A/CCP1
17
RC1/T1OSI/CCP2
16
RC0/T1OSO/T1CKI
15
RB7/ICSPDAT
40
RB6/ICSPCLK
39
RB5/AN13/T1G
38
RB4/AN11
37
RD3
22
RD2
12
D4
11
D3
10
D2
9
D1
8
D0
7
E
6
RW
5
RS
4
VSS
1
VDD
2
VEE
3
LCD1
LM016L
R1
4.7k
R2
4.7k
Để hiển thị các thông số trong quá trình giao tiếp giữa người điều khiển với hệ
ở bus đến khi nào chân E xuống mức thấp.
7-14 DB0-
DB7
Tám đường của bus dữ liệu dùng để trao đổi thông tin với MPU.
Có 2 chế độ sử dụng 8 đường bus này :
+ Chế độ 8 bit : Dữ liệu được truyền trên cả 8 đường, với bit
MSB là bit DB7.
+ Chế độ 4 bit : Dữ liệu được truyền trên 4 đường từ DB4 tới
DB7, bit MSB là DB7.
15 Lamp+ Đèn LCD
16 Lamp- Đèn LCD
d. Code của chương trình mô phỏng :
1. #include "16F887.h"
2. #include "def_877a.h"
3. #include "lcd.c" //File nay co san trong CCS
4. int8 second, minute, hour, date, day, month, year;
5. int16 year1;
6. int i;
7.
8. // Chuyen du lieu mã BINARY cua MASTER -> du lieu mã BCD cho
DS1307
9. int DECIMALtoBCD(int data) // MASTER -> DS1307
10. {
11. // x -> y trong do x la du lieu cua MASTER, y la du lieu sau
khi chuyen doi
12. // Thuat toan thuc hien bien doi tu ma DECIMAL sang ma BCD
he 10
13. int x, y, z;
14. x = data;
15. if(x<10) // vd: (x=9) -> (y=9) = 0x09
42. x = y - (6 * i);
43. z = (x/10 * 6) + x;
44. i++;
45. }
46. while(z!=y);
47. }
48. return x;
49. }
50.
51. #int_EXT
52. void set_time()
53. {
54. // Khoi tao hien thi ban dau: SAT, 15-10-2011,
07:30:00
55. second = 0; //Giay: 00
56. minute = 30; //Phut: 30
57. hour = 7; //Gio: 07 (che do 24h)
58. day = 7; //Thu 7: SAT (SATURDAY)
59. date = 15; //Ngay: 15
60. month = 10; //Thang: 10
61. year = 11; //Nam: 11
62.
63. // Ghi gia tri vao slave
64. i2c_start(); // Bat dau ghi du lieu vao Slave
65. i2c_write(0xD0); // Truyen dia chi cua DS1307 len duong truyen
I2C ( 0xD0 = Slave Address OR Write bit hay (0x68 OR 0) )
66. i2c_write(0x00); // Truyen dia chi thanh ghi 0x00 cua DS1307
12
67. i2c_write(DECIMALtoBCD(second)); // Ghi gia tri BCD giay vao
thanh ghi 0x00
88. hour = BCDtoDECIMAL(i2c_read()); // Doc gia tri gio tu thanh
ghi 0x02 cua DS1307
89. day = BCDtoDECIMAL(i2c_read()); // Doc gia tri thu tu thanh
ghi 0x03 cua DS1307
90. date = BCDtoDECIMAL(i2c_read()); // Doc gia tri ngay tu thanh
ghi 0x04 cua DS1307
91. month = BCDtoDECIMAL(i2c_read()); // Doc gia tri thang tu
thanh ghi 0x05 cua DS1307
92. year = BCDtoDECIMAL(i2c_read(0)); // Doc gia tri nam tu thanh
ghi 0x06 cua DS1307
93. i2c_stop(); // Ket thuc doc du lieu
94. }
95.
96. void display_LCD()
97. {
98. // Hàng 1 cua LCD: hien thi thu. ngay - thang -
nam
99.
13
100. lcd_gotoxy(1,1); // Bat dau o hang 1, cot 1
101. if(day==2) lcd_putc("Mon"); // Hien thi thu o hang 1, cot 1
102. else if(day==3) lcd_putc("Tue");
103. else if(day==4) lcd_putc("Wed");
104. else if(day==5) lcd_putc("Thu");
105. else if(day==6) lcd_putc("Fri");
106. else if(day==7) lcd_putc("Sat");
107. else if(day==1) lcd_putc("Sun");
108.
109. lcd_gotoxy(4,1); // Nhay sang hang 1, cot 4
110. lcd_putc("."); // Hien thi dau "." o hang 1, cot 4
140.
141. lcd_gotoxy(12,1); // Nhay sang hang 1, cot 12
142. lcd_putc("-"); // Hien thi dau "-" o hang 1, cot 12
143.
144. lcd_gotoxy(13,1); // Nhay sang hang 1, cot 13
145. year1 = 2000 + year;
146. printf(lcd_putc,"%ld", year1); // Hien thi nam o cac cot
13,14,15,16
147.
14
148. // Hàng 2 cua LCD: hien thi gio : phut : giay
149.
150. lcd_gotoxy(6,2); // Nhay xuong hang 2, cot 6
151. if(hour<10) // Gio
152. {
153. lcd_putc("0");
154. lcd_gotoxy(7,2);
155. printf(lcd_putc,"%d", hour);
156. }
157. else if(hour>=10)
158. {
159. printf(lcd_putc,"%d", hour);
160. }
161.
162. lcd_gotoxy(8,2);
163. lcd_putc(":");
164.
165. lcd_gotoxy(9,2); // Nhay sang hang 2, cot 9
166. if(minute<10) // Phut
15
197. setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
198. setup_timer_1(T1_DISABLED);
199. setup_timer_2(T2_DISABLED,0,1);
200. setup_comparator(NC_NC_NC_NC);// This device COMP currently
not supported by the PICWizard
201. enable_interrupts(INT_EXT);
202. enable_interrupts(GLOBAL);
203. //Setup_Oscillator parameter not selected from Intr Oscillator
Config tab
204.
205. // TODO: USER CODE!!
206.
207. lcd_init();
208. delay_ms(10);
209.
210. while(TRUE)
211. {
212. update_time();
213. display_LCD();
214. }
215. }
4. Kết quả mô phỏng :
16
RE3/MCLR/VPP
1
RA1/AN1/C12IN1-
3
RA2/AN2/VREF-/CVREF/C2IN+
4
RC0/T1OSO/T1CKI
15
RB7/ICSPDAT
40
RB6/ICSPCLK
39
RB5/AN13/T1G
38
RB4/AN11
37
RD3
22
RD2
21
RD1
20
RD0
19
RC7/RX/DT
26
RC6/TX/CK
25
RE2/AN7
10
RE1/AN6
9
RE0/AN5
8
RA3/AN3/VREF+/C1IN+
5
VSS
1
VDD
2
VEE
3
LCD1
LM016L
X1
CRYSTAL
R1
4.7k
R2
4.7k
D1
LED-YELLOW
R3
4.7k
R4
4.7k
R5
1k
VBAT
3
X1
1
X2
2
SCL
6