SlideShare a Scribd company logo
1 of 30
Download to read offline
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 1
Môn vi xử lý
Đề tài : đồng hồ thời gian thực dùng DS 1307
I, Chức năng của mạch điện:
- Hiển thị : giờ ,phút,giây, ngày , tháng,năm,thứ trong tuần
- giao tiếp với 4 phím : status-mode-increase-decrease. Phím status dùng để chuyển chế độ từ hiển thị
giờ ,phút ,giây,thứ sang ngày ,tháng, năm. Phím mode dùng để điều chỉnh ngày, tháng, năm và giờ
,phút ,giây,thứ
II, Mô tả mạch:
-Mạch sử dụng IC thời gian thực DS 1307 giao tiếp I2C với Pic.
Pic16F877A
- Dùng 8 led 7 thanh loại 4 led/1 con.
- Dùng 8 Tranzito để điều khiển việc đóng ngắt các led.
- Vi điều khiển được dùng là PIC 16F877A
- Dùng thạch anh 20MHz để tạo dao động cho PIC.
- Dùng một mạch tiny Bootloaderđể kết nối giữa pic và máy tính , nạp chương trình trực tiếp từ
máy tính vào PIC mà không cần thông qua mạch nạp cho PIC.
III/ Cơ bản về tiny bootloader:
Đây là bootloader cho các vi điều khiển Microchip PIC
* Nó là bootloader có kích thước nhỏ nhất, ít hơn 100 word bộ nhớ chương trình
* Nó là bootloader duy nhất hỗ trợ tất cả các dòng PIC: 16F, 18F, dsPIC (những dòng
có hỗ trợ chế độ self-programming - tự nạp lại).
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 2
Đặc điểm của firmware:
* Kích thước chỉ có khoảng 100word (cho tất cả các dòng 16F, 18F, dsPIC, thực ra là nó ít hơn
100 word);
* Có thể ghi vào flash, eeprom, và có thể ghi vào các bytes cài đăt (configuration bytes) của
dòng 18F
* Khi reset, đợi 1 giây để nhận chương trình nạp, nếu không nhận được thì chuyển qua chạy
chương trình
* File .asm của bootloader rất dễ để chỉnh sửa lại,cho phù hợp với từng chip, tốc độ truyền
nhận.
Đặc điểm của phần mềm trên máy tính
* Có thể tải chương trình vào flash (trong phiên bản này của bootloader, cho phép cài đặt các
byte cài đặt (configuration bytes) và có thể thay đổi dễ dàng theo từng loại PIC)
* Làm việc với tất cả các dòng PIC đã nêu trên; tự động nhận ra nội dung file HEX và dòng PIC
* Ghi nhớ cài đặt cuối (thuận tiện cho người dùng khi thao tác với một loại PIC)
* Trong trường hợp lỗi, nó sẽ truyền một tín hiệu ngược lại cho máy tính để tái đồng bộ giữa
máy tính và PIC;
* Chế độ giao tiếp có thể được thay đổi, có thể dùng bất kỳ cổng COM nào với tốc độ baud nào
Khái niệm chung về bootloader Một bootloader là một chương trình nằm trong vi điều khiển, và
giao tiếp với máy tính (thông qua giao tiếp nối tiếp). Bootloader nhận một chương trình (đã được
dịch ra thành file HEX) từ máy tính và ghi nó vào bộ nhớ flash của vi điều khiển thông qua một
phần mềm trên máy tính, sau đó chạy chương trình đó trên vi điều khiển. Bootloader chỉ có thể
được dùng với những vi điều khiển nào cho phép ghi vào bộ nhớ flash thông qua phần mềm trên
máy tính. Bản thân bootloader phải được ghi vào trong bộ nhớ flash bằng một mạch nạp khác. Để
bootloader hoạt động, sau khi nhấn reset, một lệnh "goto bootloader" phải nằm ở địa chỉ đầu tiên
của chương trình vi điều khiển. Có 2 loại bootloader, một số loại đôi khi cần người dùng đặt lại địa
chỉ các dòng lệnh đầu, một số khác thì tự bản thân nó đặt những dòng lệnh đầu của người dùng vào
một địa chỉ khác khi mà bootloader đã nằm sẵn ở đó, và quay trở lại chương trình của người dùng
khi kết thúc đoạn chương trình bootloader.
Trong trường hợp này, tiny bootloader tự động đem các vị trí đầu của chương trình người viết, và
đặt ở phía dưới cùng với chương trình bootloader (thực ra đoạn chương trình này chỉ tối đa có 4
dòng lệnh). địa chỉ 0x0004 đã là địa chỉ bắt đầu ngắt. Chính vì vậy, nếu lập trình từ vị trí 0x0000
thì cũng chỉ viết được tối đa 4 dòng lệnh, sau đó phải nhảy đến chương trình chính. Như vậy, tiny
bootloader sẽ thực hiện thao tác, cắt 4 dòng đầu tiên từ 0x0000 đến 0x0003 , thay bằng dòng lệnh
GOTO BOOTLOADER. Và nó tự động đặt 4 dòng lệnh nằm ngay phía trên chương trình
bootloader .Sau đó, chạy chương trình tinybootloader phía bên dưới. Rồi nó quay lên chạy 4 dòng
lệnh . Kết thúc 4 dòng này, nó lại trở về vị trí chương trình chạy bình thường ở bên trên. . phiên
bản mới nhất của tiny bootloader cho phép reset trên máy tính, không cần phải bấm reset
nữa.
Đây là một loại tiny bootloader : max232
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 3
IV/ Cơ chế hoạt động và chức năng của DS1307:
Vcc: nối với nguồn
X1,X2: nối với thạch anh 32,768 kHz
Vbat: đầu vào pin 3V
GND: đất
SDA: chuỗi data
SCL: dãy xung clock
SQW/OUT: xung vuông/đầu ra driver
· 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ó
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 4
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.
Sơ đồ khối của DS1307:
Mô tả hoạt động của các chân:
· Vcc,GND: nguồn một chiều được cung cấp tới các chân này. Vcc là đầu vào 5V. Khi 5
V được cung cấp thì thiết bị có thể truy cập hoàn chỉnh và dữ liệu có thể đọc và viết.
Khi pin 3 V được nối tới thiết bị này và Vcc nhỏ hơn 1,25Vbat thì quá trình đọc và viết
không được thực thi,tuy nhiên chức năng timekeeping không bị ảnh hưởng bởi điện áp
vào thấp. Khi Vcc nhỏ hơn Vbat thì RAM và timekeeper sẽ được ngắt tới nguồn cung
cấp trong (thường là nguồn 1 chiều 3V)
· Vbat: Đầu vào pin cho bất kỳ một chuẩn pin 3V . Điện áp pin phải được giữ trong
khoảng từ 2,5 đến 3V để đảm bảo cho sự hoạt động của thiết bị.
· SCL(serial clock input): SCL được sử dụng để đồng bộ sự chuyển dữ liệu trên đường
dây nối tiếp.
· SDA(serial data input/out): là chân vào ra cho 2 đường dây nối tiếp. Chân SDA thiết kế
theo kiểu cực máng hở , đòi hỏi phải có một điện trở kéo trong khi hoạt động.
· SQW/OUT(square wave/output driver)- khi được kích hoạt thì bit SQWE được thiết lập
1, chân SQW/OUT phát đi 1 trong 4 tần số (1Hz,4kHz,8kHz,32kHz). Chân này cũng
được thiết kế theo kiểu cực máng hở vì vậy nó cũng cần có một điện trở kéo trong. Chân
này sẽ hoạt động khi cả Vcc và Vbat được cấp.
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 5
· X1,X2: được nối với một thạch anh tần số 32,768kHz.Là một mạch tạo dao động ngoài ,
để hoạt động ổn định thì phải nối thêm 2 tụ 33pF
· Cũng có DS1307 với bộ tạo dao động trong tần số 32,768kHz, với cấu hình này thì chân
X1 sẽ được nối vào tín hiệu dao động trong còn chân X2 thì để hở.
1, Sơ đồ địa chỉ RAM và RTC:
00h
07h
08h
3Fh
· Thông tin về thời gian và ngày tháng được lấy ra bằng cách đọc các byte thanh ghi thích
hợp. thời gian và ngày tháng được thiết lập cũng thông qua các byte thanh ghi này bằng
cách viết vào đó những giá trị thích hợp. nội dung của các thanh ghi dưới dạng mã
BCD(binary coded decreaseimal). Bit 7 của thanh ghi seconds là bit clock halt(CH),khi bit
này được thiết lập 1 thì dao động disable,khi nó được xoá về 0 thì dao động được enable.
Chú ý là phải enable dao động trong suốt quá trình cấu hình thiết lập (CH=0). Thanh ghi
thời gian thựuc được mô tả như sau:
Seconds
Minutes
Hours
Day
Date
Month
Year
Control
Ram 58x8
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 6
· DS1307 có thể chạy ở chế độ 24h cũng như 12h. Bit thứ 6 của thanh ghi hours là bit chọn
chế độ 24h hoặc 12h. khi bit này ở mức cao thì chế độ 12h được chọn. ở chế độ 12h thì bit
5 là bit AM/PM với mức cao là là PM. ở chế độ 24h thì bit 5 là bit chỉ 20h(từ 20h đến 23h).
· Trong quá trình truy cập dữ liệu, khi chỉ thị START được thực thi thì dòng thời gian được
truyền tới một thanh ghi thứ 2,thông tin thời gian sẽ được đọc từ thanh ghi thứ cấp
này,trong khi đó đồng hồ vẫn tiếp tục chạy.
Trong DS1307 có một thanh ghi điều khiển để điều khiển hoạt động của chân SQW/OUT
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
OUT X X SQWE X X RS1 RS0
· OUT(output control):bit này điều khiển mức ra của chân SQW/OUT khi đầu ra xung vuông
là disable. Nếu SQWE=0 thì mức logic ở chân SQW/OUT sẽ là 1 nếu OUT=1,và =0 nếu
OUT=0
· SQWE(square wave enable): bit này được thiết lập 1 sẽ enable đầu ra của bộ tạo dao động.
Tần số của đầu ra sóng vuông phụ thuộc vào giá trị của RS1 và RS0
RS1 RS0 tần số đầu ra SQW
0 0 1Hz
0 1 4,096kHz
1 0 8,192kHz
1 1 32,768kHz
DS1307 hỗ trợ bus 2 dây 2 chiều và giao thức truyền dữ liệu. thiết bị gửi dữ liệu lên bus được
gọi là bộ phát và thiết bị nhận gọi là bộ thu. thiết bị điều khiển quá trình này gọi là master. thiết bị
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 7
nhận sự điều khiển của master gọi là slave. Các bus nhận sự điều khiển của master,là thiết bị phát
ra chuỗi xung clock(SCL),master sẽ điều khiển sự truy cập bus,tạo ra các chỉ thị START và STOP
Sự truyền nhận dữ liệu trên chuỗi bus 2 dây
Tuỳ thuộc vào bit R/ w mà 2 loại truyền dữ liệu sẽ được thực thi:
· truyền dữ liệu từ master truyền và slave nhận: Master sẽ truyền byte đầu tiên là địa chỉ của
slave. Tiếp sau đó là các byte dữ liệu . slave sẽ gửi lại bit thông báo đã nhận được (bit
acknowledge) sau mỗi byte dữ liệu nhận được. dữ liệu sẽ truyền từ bit có giá trị nhất (MSB).
· truyền dữ liệu từ slave và master nhận: byte đầu tiên (địa chỉ của slave) được truyền tới slave
bởi master. Sau đó slave sẽ gửi lại master bit acknowledge. tiếp theo đó slave sẽ gửi các byte
dữ liệu tới master. Master sẽ gửi cho slave các bit acknowledge sau mỗi byte nhận được trừ
byte cuối cùng,sau khi nhận được byte cuối cùng thì bit acknowledge sẽ không được gửi .
Master phát ra tất cả các chuỗi xung clock và các chỉ thị START và STOP. sự truyền sẽ kết
thúc với chỉ thị STOP hoặc chỉ thị quay vòng START. Khi chỉ thị START quay vòng thì sự truyền
chuỗi dữ liệu tiếp theo được thực thi và các bus vẫn chưa được giải phóng. Dữ liệu truyền luôn bắt
đầu bằng bit MSB.
2, DS1307 có thể hoạt động ở 2 chế độ sau:
· chế độ slave nhận( chế độ DS1307 ghi):chuỗi dữ liệu và chuỗi xung clock sẽ được nhận
thông qua SDA và SCL. Sau mỗi byte được nhận thì 1 bit acknowledge sẽ được truyền.
các điều kiện START và STOP sẽ được nhận dạng khi bắt đầu và kết thúc một truyền 1
chuỗi. nhận dạng địa chỉ được thực hiện bởi phần cứng sau khi chấp nhận địa chỉ của slave
và bit chiều. Byte địa chỉ là byte đầu tiên nhận được sau khi điều kiện START được phát
ra từ master. Byte địa chỉ có chứa 7 bit địa chỉ của DS1307, là 1101000, tiếp theo đó là bit
chiều (R/ w ) cho phép ghi khi nó bằng 0. sau khi nhận và giải mã byte địa chỉ thì thiết bị sẽ
phát đi 1 tín hiệu acknowledge lên đường SDA. Sau khi DS1307 nhận dạng được địa chỉ
và bit ghi thì master sẽ gửi một địa chỉ thanh ghi tới DS1307 , tạo ra một con trỏ thanh ghi
trên DS1307 và master sẽ truyền từng byte dữ liệu cho DS1307 sau mỗi bit acknowledge
nhận được. sau đó master sẽ truyền điều kiện STOP khi việc ghi hoàn thành.
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 8
· chế độ slave phát ( chế độ DS1307 đọc): byte đầu tiên slave nhận được tương tự như chế
độ slave ghi. Tuy nhiên trong chế độ này thì bit chiều lại chỉ chiều truyền ngược lại. Chuỗi
dữ liệu được phát đi trên SDA bởi DS 1307 trong khi chuỗi xung clock vào chân SCL.
Các điều kiện START và STOP được nhận dạng khi bắt đầu hoặc kết thúc truyền một
chuỗi. byte địa chỉ nhận được đầu tiên khi master phát đi điều kiện START. Byte địa chỉ
chứa 7 bit địa chỉ của slave và 1 bit chiều cho phép đọc là 1. sau khi nhận và giải mã byte
địa chỉ thì thiết bị sẽ nhận 1 bit acknowledge trên đường SDA. Sau đó DS1307 bắt đầu gửi
dữ liệu tới địa chỉ con trỏ thanh ghi thông qua con trỏ thanh ghi. nếu con trỏ thanh ghi
không được viết vào trước khi chế độ đọc được thiết lập thì địa chỉ đầu tiên được đọc sẽ là
địa chỉ cuối cùng chứa trong con trỏ thanh ghi .DS1307 sẽ nhận được một tín hiệu Not
Acknowledge khi kết thúc quá trình đọc.
Đọc dữ liệu-chế độ slave phát
· thời gian thực hiện việc đọc,ghi dữ liệu của DS1307:
sơ đồ đồng bộ:
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 9
đặc tính và thời gian thực hiện:
V/ Tổng quan về vi điều khiển PIC16F877A:
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 10
PIC 16F877A trong mạch là loại có 40 chân,với 5 cổng vào ra la Port A(RA0÷RA5),Port
B(RB0÷RB7),Port C(RC0÷RC7),Port D(RD0÷RD7),Port E(RE0÷RE2). Có 3 bộ định thời là
timer0,timer1,timer2.
8K bộ nhớ chương trình flash.
Tổ chức bộ nhớ :
Có 3 khối bộ nhớ trong pic16F877A: bộ nhớ chương trình ,bộ nhớ dữ liệu và khối bộ nhớ
EEPROM. bộ nhớ chương trình và bộ nhớ dữ liệu có đường bus riêng vì vậy có thể truy cập vào
từng bộ nhớ một cách riêng rẽ.
Bộ đếm chương trình có 13 bit vì vậy không gian địa chỉ sẽ là 8k word x 8bit. Truy cập ngoài vùng
không gian trên sẽ gây lỗi.
Bộ nhớ dữ liệu được chia thành 4 bank (Bank0÷Bank3) ,trong các bank chứa các thanh ghi thường
và các thanh ghi chức năng đặc biệt. Bank được chọn phụ thuộc vào bit RP1 và RP0 (bit thứ 6 và
bit thứ 5) của thanh ghi trạng thái status.
RP1:RP0 Bank
00 0
01 1
10 2
11 3
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 11
Các thanh ghi chức năng đặc biệt được CPU và bộ ngoại vi sử dụng để điều khiển các thiết bị. các
thanh ghi này hoạt động như một thanh RAM tĩnh.
Thanh ghi trạng thái chứa trạng thái số học của ALU,trạng thái Reset và các bit chọn bank ở bộ
nhớ dữ liệu.
R/W-0 R/W-0 R/W-0 R-1 R-1 R/W-x R/W-x R/W-x
IRP RP1 RP0 TO PD Z DC C
Bit 7 bit 0
Các cổng vào ra của pic:
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ể đượ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 40k để đảm bảo điện áp cung cấp cho vi điều khiển.
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 12
mạch reset của pic16f877a
VI/ Khối hiển thị:
- Khối hiển thị dùng 8 led
+,ở chế độ hiển thị ngày tháng năm:2 led để hiện thị ngày ,2 led hiển thị tháng ,4 led hiển thị
năm .
+,ở chế độ hiển thị giờ ,phút, giây: 2 led dùng để hiển thị giờ,2 led dùng để hiển thị phút, 2 led
dùng để hiển thị giây, 1 led dùng hiển thị thứ trong tuần (chủ nhật led hiện giá trị 1,thứ 2 hiện
giá trị 2…thứ 7 hiện giá trị 7)
Tất cả các led chung đường tín hiệu a,…,g còn các chân điều khiển thì mắc với các khoá điện
tử (8 Tranzito A1015) để điều khiển việc đóng ngắt các led.
- việc cấp nguồn cho các led dựa trên thuật quét led.
Sơ đồ thuật quét led:
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 13
VII/ khối điều khiển :
Gồm 4 phím bấm: status-mode(button1)-increase(button2)-decrease(button3)
- Phím status dùng để chọn chế độ hiển thị trên các led là hiển thị ngày ,tháng , năm hay là giờ
,phút, giây,thứ
- Phím mode dùng để chỉnh giờ,phút,giây,ngày,tháng,năm
- Phím increase để tăng giá trị
- Phím decrease để giảm giá trị
bắt đầu quét led
khởi tạo hệ thống
gửi dữ liệu cho led 1
cấp nguồn cho led 1
trễ 1ms
ngắt nguồn led 1
gửi dữ liệu cho led 8
cấp nguồn cho led 8
trễ 1ms
ngắt nguồn led 8
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 14
- Thuật toán điều khiển:
+ , thay đổi chế độ hiển thị:
S
Đ
+,Chỉnh thời gian:
Status=0
Quét led hiển thị
ngày,tháng,năm
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 15
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 16
Set hours:
Set minutes:
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 17
Set year:
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 18
Set month:
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 19
Set day:
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 20
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 21
Set date:
VIII/ Sơ đồ khối của mạch:
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 22
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 23
IX,ngôn ngữ lập trình:
- ngôn ngữ lập trình cho pic là C, dùng CCS 3.227 để biên dịch
- sử dụng I2C tích hợp sẵn trong PIC để giao tiếp với DS1307
- sử dụng các hàm có sẵn trong CCS là:I2C_START;I2C_STOP; I2C_READ; I2C_WRITE
dùng để khởi tạo,đọc giá trị từ DS1307 sang PIC.
- việc hiển thị thời gian là liên tục ,ta dùng 8 byte RAM để làm bộ đệm hiển thị (các biến
led1,..led8), các giá trị thời gian đọc từ DS1307 sau khi đã chuyển sang BCD sẽ được lưu trong
các biến này.
- Ta sẽ đọc các giá trị thời gian từ DS1307 nhưng chỉ đọc giá trị giây, sau 1 phút ta mới cập nhật
toàn bộ thanh ghi thời gian của DS1307 và đưa ra hiển thị.
- Chương trình quét bàn phím sẽ xác định phím chức năng và gọi hàm xử lý tương ứng như:
chuyển chế độ, chỉnh giờ ,tăng,giảm giá trị…
X/ Code:
//#include <16F877A.h>
#include <led7seg.h>
#include <def_877a.h>
#use delay(clock=20000000)
#use i2c(Master,Slow,sda=PIN_C4,scl=PIN_C3)
// Cac dinh nghia
#define status rd4
#define mode rd5
#define increase rd6
#define decrease rd7
#define led1 ra0
#define led2 ra1
#define led3 ra2
#define led4 ra3
#define led5 ra4
#define led6 ra5
#define led7 re0
#define led8 re1
//Cac bien
int8 sec,min,hour,dow,date,month,year;
int8 const
led_code[16]={0b00000011,0b10011111,0b00100101,0b00001101,0b10011001,0b01001001,0b0100
0001,0b00011111,0b00000001,0b00001001,0b01000001,0b01000001,0b01000001,0b01000001,0b01
000001,0b01000001};
int8 sec1,sec2,min1,min2,hour1,hour2,day,date1,date2,month1,month2,year1,year2,year3,year4;
void display1();
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 24
void display2();
void update_time();
void set_time(void) ;
void set_min(void);
void set_hour(void);
void set_date(void);
void set_day(void);
void set_month(void);
void set_year(void);
void main() {
set_tris_a(0x00); // Cong A lam dau ra
set_tris_b(0x01); // Cong B lam dau ra ( tru RB0)
set_tris_e(0x00); // Cong B lam dau ra
set_tris_d(0xff); // Cong D lam dau vao ( ban phim)
porta=porte=1;
while (1) {
update_time();
display1();
if (status==0) {display2();}
if (mode==0) { set_time();}
}
}
void update_time() {
i2c_start();
i2c_write(0xD0); //Gui dia chi cua slave
i2c_write(0x00); //thiet lap lai con tro - set register pointer
i2c_stop();
I2C_start();
I2C_write(0xD1); /* gui lenh doc du lieu */
sec = i2c_read(1); /* starts w/last address stored in register pointer */
min = i2c_read(1);
hour = i2c_read(1); //che do 24h ko can AND
dow = i2c_read(1);
date = i2c_read(1);
month = i2c_read(1);
year = i2c_read(0);
i2c_stop();
//=========================
sec1=sec & 0x0F;
sec2=(sec & 0x70)>>4; //convert to BCD SEC
min1=min & 0x0F;
min2=(min & 0x70)>>4; //convert to BCD MIN
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 25
hour1=hour & 0x0F;
hour2=(hour & 0x30)>>4; //convert to BCD HOUR
day=(dow & 0x07);
date1=date & 0x0F;
date2=(date & 0x30)>>4; //convert to BCD DATE
month1=month & 0x0F;
month2=(month & 0x10)>>4; //convert to BCD MONTH
year1=year & 0x0F;
year2=(year & 0xF0)>>4; //convert to BCD YEAR
}
void display1() {
// sec - min - hour
PortB=led_code[sec1]; led6=0;//SEC1
delay_us(500); led6=1;
PortB=led_code[sec2]; led5=0;//SEC2
delay_us(500); led5=1;
PortB=led_code[min1]; led4=0;//MIN1
delay_us(500); led4=1;
PortB=led_code[min2]; led3=0;//MIN2
delay_us(500); led3=1;
PortB=led_code[hour1]; led2=0;//HOUR1
delay_us(500); led2=1;
PortB=led_code[hour2]; led1=0;//HOUR2
delay_us(500); led1=1;
PortB=led_code[day]; led8=0;//DAY
delay_us(500); led8=1;
}
void display2(){
// Dow - Date - Month - Year
int16 i=0;
while (status==0) {}
while (i<600) {
PortB=led_code[date]; led2=0;//DATE1
delay_us(500); led2=1;
PortB=led_code[date2]; led1=0;//DATE2
delay_us(500); led1=1;
PortB=led_code[month1]; led4=0;//MONTH1
delay_us(500); led4=1;
PortB=led_code[month2]; led3=0;//MONTH2
delay_us(500); led3=1;
PortB=led_code[year1]; led8=0;//YEAR1
delay_us(500); led8=1;
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 26
PortB=led_code[year2]; led7=0;//YEAR2
delay_us(500); led7=1;
PortB=led_code[0]; led6=0;//YEAR1
delay_us(500); led6=1;
PortB=led_code[2]; led5=0;//YEAR2
delay_us(500); led5=1;
i++;
}
}
void update_ds1307(void) {
int8 data=0; // luu tru du lieu tam thoi de gui vao ds1307
i2c_start();
i2c_write(0xd0);
i2c_write(0x00); // ghi du lieu bat dau tu vi tri 00
data=sec1+(sec2<<4);
data=data & 0b01111111;
i2c_write(data);
data=min1+(min2<<4);
i2c_write(data);
data=hour1+(hour2<<4);
i2c_write(data);
data=day;
i2c_write(data);
data=date1+(date2<<4);
i2c_write(data);
data=month1+(month2<<4);
i2c_write(data);
data=year1+(year2<<4);
i2c_write(data);
data=0x00;
i2c_write(data);
i2c_stop(); // ket thuc truyen du lieu
}
void set_time(void) {
set_year();
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 27
set_month();
set_date();
set_day();
set_hour();
set_min();
while (mode==0) {}
update_ds1307();
}
void set_year(void) { // Cai dat nam
while (mode==0) {} // cho phim nha
do {
if (increase==0) { // neu phim 2 duoc nhan
while (increase==0) {} // khong lam gi cho phim nha
year1++;
if ((year2==9)&(year1==10)) {year1=year2=0;}
if (year1==10) {year1=0;year2++;}
}
if (decrease==0) { // neu phim 3 duoc nhan
while (decrease==0) {} // khong lam gi cho phim nha
year1--;
if ((year2==0)&(year1==255)) {year1=year2=9;}
if (year1==255) {year1=9;year2--;}
}
portb=led_code[2];
led5=0;
delay_us(500);
led5=1;
portb=led_code[0];
led6=0;
delay_us(500);
led6=1;
portb=led_code[year2];
led7=0;
delay_us(500);
led7=1;
portb=led_code[year1];
led8=0;
delay_us(500);
led8=1;
}
while (mode==1);
}
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 28
void set_month(void) { // Cai dat thang
while (mode==0) {} // cho phim nha
do {
if (increase==0) { // neu phim 2 duoc nhan
while (increase==0) {} // khong lam gi cho phim nha
month1++;
if ((month2==1) & (month1==3)) { month2=0;month1=1;}
if (month1==10) { month2++;month1=0;}
}
if (decrease==0) { // neu phim 3 duoc nhan
while (decrease==0) {} // cho phim nha
month1--;
if ((month2==0) & (month1==0)) {month2=1;month1=2; }
if (month1==0) {month2--;month1=9;}
}
portb=led_code[month2];
led3=0;
delay_us(500);
led3=1;
portb=led_code[month1];
led4=0;
delay_us(500);
led4=1;
}
while (mode==1);
}
void set_date(void) { // Cai dat thang
while (mode==0) {} // cho phim nha
do {
if (increase==0) { // neu phim 2 duoc nhan
while (increase==0) {} // khong lam gi cho phim nha
date1++;
if ((date2==3) & (date1==2)) { date2=0;date1=1;}
if (date1==10) { date2++;date1=0;}
}
if (decrease==0) { // neu phim 3 duoc nhan
while (decrease==0) {} // cho phim nha
date1--;
if ((date2==0) & (date1==0)) {date2=3;date1=1; }
if (date1==255) {date2--;date1=9;}
}
portb=led_code[date2];
led1=0;
delay_us(500);
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 29
led1=1;
portb=led_code[date1];
led2=0;
delay_us(500);
led2=1;
}
while (mode==1);
}
void set_day(void) {
while (mode==0) {};
do {
if (increase==0) {
while (increase==0) {}
day++;
if (day==8) { day=1;}
}
if (decrease==0) {
while (decrease==0) {}
day--;
if (day==255) {day=7;}
}
portb=led_code[day];
led8=0;
delay_us(500);
led8=1;
}
while (mode==1);
}
void set_hour(void) { // Cai dat thang
while (mode==0) {} // cho phim nha
do {
if (increase==0) { // neu phim 2 duoc nhan
while (increase==0) {} // khong lam gi cho phim nha
hour1++;
if ((hour2==2) & (hour1==4)) { hour2=0;hour1=0;}
if (hour1==10) { hour2++;hour1=0;}
}
if (decrease==0) { // neu phim 3 duoc nhan
while (decrease==0) {} // cho phim nha
hour1--;
if ((hour2==0) & (hour1==255)) {hour2=2;hour1=3; }
if (hour1==255) {hour2--;hour1=9;}
}
portb=led_code[hour2];
Đề tài : đồng hồ thời gian thực dùng DS 1307
http://machdientu.net Page 30
led1=0;
delay_us(500);
led1=1;
portb=led_code[hour1];
led2=0;
delay_us(500);
led2=1;
}
while (mode==1);
}
void set_min(void) { // Cai dat thang
while (mode==0) {} // cho phim nha
do {
if (increase==0) { // neu phim 2 duoc nhan
while (increase==0) {} // khong lam gi cho phim nha
min1++;
if ((min2==5) & (min1==10)) { min2=0;min1=0;}
if (min1==10) { min2++;min1=0;}
}
if (decrease==0) { // neu phim 3 duoc nhan
while (decrease==0) {} // cho phim nha
min1--;
if ((min2==0) & (min1==255)) {min2=5;min1=9; }
if (min1==255) {min2--;min1=9;}
}
portb=led_code[min2];
led3=0;
delay_us(500);
led3=1;
portb=led_code[min1];
led4=0;
delay_us(500);
led4=1;
}
while (mode==1);
}

More Related Content

What's hot

[Cntt] bài giảng kĩ thuật vi xử lí
[Cntt] bài giảng kĩ thuật vi xử lí[Cntt] bài giảng kĩ thuật vi xử lí
[Cntt] bài giảng kĩ thuật vi xử líHong Phuoc Nguyen
 
[123doc] dieu-khien-thiet-bi-qua-module-wifi-esp8266
[123doc]   dieu-khien-thiet-bi-qua-module-wifi-esp8266[123doc]   dieu-khien-thiet-bi-qua-module-wifi-esp8266
[123doc] dieu-khien-thiet-bi-qua-module-wifi-esp8266Ngo Gia HAi
 
mạng truyền thông công nghiệp
mạng truyền thông công nghiệpmạng truyền thông công nghiệp
mạng truyền thông công nghiệpvanquanglong
 
Mang truyen thong siemen
Mang truyen thong siemenMang truyen thong siemen
Mang truyen thong siemennewmon1
 
Tài liệu lập trình plc s7 200 full-01_2011_v1
Tài liệu lập trình plc s7 200 full-01_2011_v1Tài liệu lập trình plc s7 200 full-01_2011_v1
Tài liệu lập trình plc s7 200 full-01_2011_v1quanglocbp
 
Các phương pháp thiết kế bộ điều khiển PID.docx
Các phương pháp thiết kế bộ điều khiển PID.docxCác phương pháp thiết kế bộ điều khiển PID.docx
Các phương pháp thiết kế bộ điều khiển PID.docxhunhlhongthi
 

What's hot (20)

[Cntt] bài giảng kĩ thuật vi xử lí
[Cntt] bài giảng kĩ thuật vi xử lí[Cntt] bài giảng kĩ thuật vi xử lí
[Cntt] bài giảng kĩ thuật vi xử lí
 
Luận văn: Nghiên cứu thiết kế bộ điều khiển PID mờ, HOT
Luận văn: Nghiên cứu thiết kế bộ điều khiển PID mờ, HOTLuận văn: Nghiên cứu thiết kế bộ điều khiển PID mờ, HOT
Luận văn: Nghiên cứu thiết kế bộ điều khiển PID mờ, HOT
 
[123doc] dieu-khien-thiet-bi-qua-module-wifi-esp8266
[123doc]   dieu-khien-thiet-bi-qua-module-wifi-esp8266[123doc]   dieu-khien-thiet-bi-qua-module-wifi-esp8266
[123doc] dieu-khien-thiet-bi-qua-module-wifi-esp8266
 
Đề tài: Thiết kế hệ thống điều khiển bơm nước sử dụng PLC, HOT
Đề tài: Thiết kế hệ thống điều khiển bơm nước sử dụng PLC, HOTĐề tài: Thiết kế hệ thống điều khiển bơm nước sử dụng PLC, HOT
Đề tài: Thiết kế hệ thống điều khiển bơm nước sử dụng PLC, HOT
 
mạng truyền thông công nghiệp
mạng truyền thông công nghiệpmạng truyền thông công nghiệp
mạng truyền thông công nghiệp
 
Mang truyen thong siemen
Mang truyen thong siemenMang truyen thong siemen
Mang truyen thong siemen
 
Luận văn: Bộ biến DC trong hệ thống năng lượng tái tạo, HOT
Luận văn: Bộ biến DC trong hệ thống năng lượng tái tạo, HOTLuận văn: Bộ biến DC trong hệ thống năng lượng tái tạo, HOT
Luận văn: Bộ biến DC trong hệ thống năng lượng tái tạo, HOT
 
Đề tài: Thiết kế mạch điều khiển máy bơm nước tự động, HAY
Đề tài: Thiết kế mạch điều khiển máy bơm nước tự động, HAYĐề tài: Thiết kế mạch điều khiển máy bơm nước tự động, HAY
Đề tài: Thiết kế mạch điều khiển máy bơm nước tự động, HAY
 
Tài liệu lập trình plc s7 200 full-01_2011_v1
Tài liệu lập trình plc s7 200 full-01_2011_v1Tài liệu lập trình plc s7 200 full-01_2011_v1
Tài liệu lập trình plc s7 200 full-01_2011_v1
 
Đề tài: Tiêu chuẩn IEEE 802.11 và công nghệ Wifi, HAY
Đề tài: Tiêu chuẩn IEEE 802.11 và công nghệ Wifi, HAYĐề tài: Tiêu chuẩn IEEE 802.11 và công nghệ Wifi, HAY
Đề tài: Tiêu chuẩn IEEE 802.11 và công nghệ Wifi, HAY
 
Giao tiếp TTL-CMOS
Giao tiếp TTL-CMOSGiao tiếp TTL-CMOS
Giao tiếp TTL-CMOS
 
Đề tài: Hệ thống điểm danh nhân viên sử dụng vi điều khiển ARM
Đề tài: Hệ thống điểm danh nhân viên sử dụng vi điều khiển ARMĐề tài: Hệ thống điểm danh nhân viên sử dụng vi điều khiển ARM
Đề tài: Hệ thống điểm danh nhân viên sử dụng vi điều khiển ARM
 
Đề tài: Xây dựng và điều khiển động cơ BLDC xe đạp điện, HAY
Đề tài: Xây dựng và điều khiển động cơ BLDC xe đạp điện, HAYĐề tài: Xây dựng và điều khiển động cơ BLDC xe đạp điện, HAY
Đề tài: Xây dựng và điều khiển động cơ BLDC xe đạp điện, HAY
 
Đề tài: Thiết kế và thi công mô hình điều khiển thiết bị điện, HAY
Đề tài: Thiết kế và thi công mô hình điều khiển thiết bị điện, HAYĐề tài: Thiết kế và thi công mô hình điều khiển thiết bị điện, HAY
Đề tài: Thiết kế và thi công mô hình điều khiển thiết bị điện, HAY
 
Đề tài: Ứng dụng lập trình điều khiển động cơ bước sử dụng chip
Đề tài: Ứng dụng lập trình điều khiển động cơ bước sử dụng chipĐề tài: Ứng dụng lập trình điều khiển động cơ bước sử dụng chip
Đề tài: Ứng dụng lập trình điều khiển động cơ bước sử dụng chip
 
Các phương pháp thiết kế bộ điều khiển PID.docx
Các phương pháp thiết kế bộ điều khiển PID.docxCác phương pháp thiết kế bộ điều khiển PID.docx
Các phương pháp thiết kế bộ điều khiển PID.docx
 
Đề tài: Thiết kế hệ thống phân loại sản phẩm ứng dụng PLC, HOT
Đề tài: Thiết kế hệ thống phân loại sản phẩm ứng dụng PLC, HOTĐề tài: Thiết kế hệ thống phân loại sản phẩm ứng dụng PLC, HOT
Đề tài: Thiết kế hệ thống phân loại sản phẩm ứng dụng PLC, HOT
 
Luận văn: Thiết kế mạch điều khiển tốc độ động cơ một chiều, HAY
Luận văn: Thiết kế mạch điều khiển tốc độ động cơ một chiều, HAYLuận văn: Thiết kế mạch điều khiển tốc độ động cơ một chiều, HAY
Luận văn: Thiết kế mạch điều khiển tốc độ động cơ một chiều, HAY
 
Điều khiển thiết bị điện tử bằng Android thông qua Bluetooth, 9đ
Điều khiển thiết bị điện tử bằng Android thông qua Bluetooth, 9đĐiều khiển thiết bị điện tử bằng Android thông qua Bluetooth, 9đ
Điều khiển thiết bị điện tử bằng Android thông qua Bluetooth, 9đ
 
ĐỒ ÁN: Thiết kế mạch đếm sản phẩm dùng cảm biến hồng ngoại!
ĐỒ ÁN: Thiết kế mạch đếm sản phẩm dùng cảm biến hồng ngoại!ĐỒ ÁN: Thiết kế mạch đếm sản phẩm dùng cảm biến hồng ngoại!
ĐỒ ÁN: Thiết kế mạch đếm sản phẩm dùng cảm biến hồng ngoại!
 

Similar to Tailieu.vncty.com dong-ho-thoi-gian-thuc-ds1307-pic16 f87

Tailieu.vncty.com do-an-vi-dieu-khien
Tailieu.vncty.com   do-an-vi-dieu-khienTailieu.vncty.com   do-an-vi-dieu-khien
Tailieu.vncty.com do-an-vi-dieu-khienTrần Đức Anh
 
BÁO cáo học tập về PLC MITSHUBISHI FX3U.pdf
BÁO cáo học tập về PLC MITSHUBISHI FX3U.pdfBÁO cáo học tập về PLC MITSHUBISHI FX3U.pdf
BÁO cáo học tập về PLC MITSHUBISHI FX3U.pdfMan_Ebook
 
đê Cương vi mach sô
đê Cương vi mach sôđê Cương vi mach sô
đê Cương vi mach sôCao Phong
 
418 giaotrinh avr
418 giaotrinh avr418 giaotrinh avr
418 giaotrinh avranhhoi12345
 
Giaotrinh avr tech24.vn
Giaotrinh avr tech24.vnGiaotrinh avr tech24.vn
Giaotrinh avr tech24.vnbibibobo2007
 
Mitsubishi
MitsubishiMitsubishi
Mitsubishiddungd4
 
PLC mitsubishi
PLC mitsubishiPLC mitsubishi
PLC mitsubishiquanglocbp
 
Bài 1 ĐO LƯỜNG VÀ ĐIỀU KHIỂN VỚI ARDUINO V2.pdf
Bài 1 ĐO LƯỜNG VÀ ĐIỀU KHIỂN VỚI ARDUINO V2.pdfBài 1 ĐO LƯỜNG VÀ ĐIỀU KHIỂN VỚI ARDUINO V2.pdf
Bài 1 ĐO LƯỜNG VÀ ĐIỀU KHIỂN VỚI ARDUINO V2.pdfVnhPhm18
 
Đồ Án Đo Điện Áp Hiển Thị Trên LCD
Đồ Án Đo Điện Áp Hiển Thị Trên LCDĐồ Án Đo Điện Áp Hiển Thị Trên LCD
Đồ Án Đo Điện Áp Hiển Thị Trên LCDMr Giap
 
Tailieu.vncty.com thiet-ke-dong-ho-thoi-gian-thu
Tailieu.vncty.com   thiet-ke-dong-ho-thoi-gian-thuTailieu.vncty.com   thiet-ke-dong-ho-thoi-gian-thu
Tailieu.vncty.com thiet-ke-dong-ho-thoi-gian-thuTrần Đức Anh
 
Bao cao do an dieu khien dong co dc
Bao cao do an dieu khien dong co dcBao cao do an dieu khien dong co dc
Bao cao do an dieu khien dong co dcnamnam2005nt
 
Lập trình PLC S7 1200 tiếng Việt-Chuong 7 truyền thông điểm điểm
Lập trình PLC S7 1200 tiếng Việt-Chuong 7 truyền thông điểm điểmLập trình PLC S7 1200 tiếng Việt-Chuong 7 truyền thông điểm điểm
Lập trình PLC S7 1200 tiếng Việt-Chuong 7 truyền thông điểm điểmXuân Thủy Nguyễn
 
Đồ Án Thiết Kế Lịch Vạn Niên Điện Tử Hiển Thị Trên LCD.pdf
Đồ Án Thiết Kế Lịch Vạn Niên Điện Tử Hiển Thị Trên LCD.pdfĐồ Án Thiết Kế Lịch Vạn Niên Điện Tử Hiển Thị Trên LCD.pdf
Đồ Án Thiết Kế Lịch Vạn Niên Điện Tử Hiển Thị Trên LCD.pdfNuioKila
 
Điều khiển động cơ sử dụng IC MCP4921
Điều khiển động cơ sử dụng IC MCP4921Điều khiển động cơ sử dụng IC MCP4921
Điều khiển động cơ sử dụng IC MCP4921Pham Hoang
 
Giáo trình vi điều khiển avr
Giáo trình vi điều khiển avr Giáo trình vi điều khiển avr
Giáo trình vi điều khiển avr Ky Nguyen Ad
 
Tìm hiểu cách dùng pic để chạy motor bước
Tìm hiểu cách dùng pic để chạy motor bướcTìm hiểu cách dùng pic để chạy motor bước
Tìm hiểu cách dùng pic để chạy motor bướcDan Vu
 
Bao cao thuc tap pic18 f4520
Bao cao thuc tap pic18 f4520Bao cao thuc tap pic18 f4520
Bao cao thuc tap pic18 f4520Yến Thanh Thanh
 

Similar to Tailieu.vncty.com dong-ho-thoi-gian-thuc-ds1307-pic16 f87 (20)

Cau truc may tinh
Cau truc may tinhCau truc may tinh
Cau truc may tinh
 
Msptieuluan
MsptieuluanMsptieuluan
Msptieuluan
 
Tailieu.vncty.com do-an-vi-dieu-khien
Tailieu.vncty.com   do-an-vi-dieu-khienTailieu.vncty.com   do-an-vi-dieu-khien
Tailieu.vncty.com do-an-vi-dieu-khien
 
BÁO cáo học tập về PLC MITSHUBISHI FX3U.pdf
BÁO cáo học tập về PLC MITSHUBISHI FX3U.pdfBÁO cáo học tập về PLC MITSHUBISHI FX3U.pdf
BÁO cáo học tập về PLC MITSHUBISHI FX3U.pdf
 
đê Cương vi mach sô
đê Cương vi mach sôđê Cương vi mach sô
đê Cương vi mach sô
 
Đồ án asembly thiết kế bộ đếm sản phẩm 6 kênh dùng on chip 89c51.doc
Đồ án asembly thiết kế bộ đếm sản phẩm 6 kênh dùng on chip 89c51.docĐồ án asembly thiết kế bộ đếm sản phẩm 6 kênh dùng on chip 89c51.doc
Đồ án asembly thiết kế bộ đếm sản phẩm 6 kênh dùng on chip 89c51.doc
 
418 giaotrinh avr
418 giaotrinh avr418 giaotrinh avr
418 giaotrinh avr
 
Giaotrinh avr tech24.vn
Giaotrinh avr tech24.vnGiaotrinh avr tech24.vn
Giaotrinh avr tech24.vn
 
Mitsubishi
MitsubishiMitsubishi
Mitsubishi
 
PLC mitsubishi
PLC mitsubishiPLC mitsubishi
PLC mitsubishi
 
Bài 1 ĐO LƯỜNG VÀ ĐIỀU KHIỂN VỚI ARDUINO V2.pdf
Bài 1 ĐO LƯỜNG VÀ ĐIỀU KHIỂN VỚI ARDUINO V2.pdfBài 1 ĐO LƯỜNG VÀ ĐIỀU KHIỂN VỚI ARDUINO V2.pdf
Bài 1 ĐO LƯỜNG VÀ ĐIỀU KHIỂN VỚI ARDUINO V2.pdf
 
Đồ Án Đo Điện Áp Hiển Thị Trên LCD
Đồ Án Đo Điện Áp Hiển Thị Trên LCDĐồ Án Đo Điện Áp Hiển Thị Trên LCD
Đồ Án Đo Điện Áp Hiển Thị Trên LCD
 
Tailieu.vncty.com thiet-ke-dong-ho-thoi-gian-thu
Tailieu.vncty.com   thiet-ke-dong-ho-thoi-gian-thuTailieu.vncty.com   thiet-ke-dong-ho-thoi-gian-thu
Tailieu.vncty.com thiet-ke-dong-ho-thoi-gian-thu
 
Bao cao do an dieu khien dong co dc
Bao cao do an dieu khien dong co dcBao cao do an dieu khien dong co dc
Bao cao do an dieu khien dong co dc
 
Lập trình PLC S7 1200 tiếng Việt-Chuong 7 truyền thông điểm điểm
Lập trình PLC S7 1200 tiếng Việt-Chuong 7 truyền thông điểm điểmLập trình PLC S7 1200 tiếng Việt-Chuong 7 truyền thông điểm điểm
Lập trình PLC S7 1200 tiếng Việt-Chuong 7 truyền thông điểm điểm
 
Đồ Án Thiết Kế Lịch Vạn Niên Điện Tử Hiển Thị Trên LCD.pdf
Đồ Án Thiết Kế Lịch Vạn Niên Điện Tử Hiển Thị Trên LCD.pdfĐồ Án Thiết Kế Lịch Vạn Niên Điện Tử Hiển Thị Trên LCD.pdf
Đồ Án Thiết Kế Lịch Vạn Niên Điện Tử Hiển Thị Trên LCD.pdf
 
Điều khiển động cơ sử dụng IC MCP4921
Điều khiển động cơ sử dụng IC MCP4921Điều khiển động cơ sử dụng IC MCP4921
Điều khiển động cơ sử dụng IC MCP4921
 
Giáo trình vi điều khiển avr
Giáo trình vi điều khiển avr Giáo trình vi điều khiển avr
Giáo trình vi điều khiển avr
 
Tìm hiểu cách dùng pic để chạy motor bước
Tìm hiểu cách dùng pic để chạy motor bướcTìm hiểu cách dùng pic để chạy motor bước
Tìm hiểu cách dùng pic để chạy motor bước
 
Bao cao thuc tap pic18 f4520
Bao cao thuc tap pic18 f4520Bao cao thuc tap pic18 f4520
Bao cao thuc tap pic18 f4520
 

More from Trần Đức Anh

Tailieu.vncty.com nst gioi-tinh_va_di_truyen_lien_ket_gioi_tinh_747
Tailieu.vncty.com   nst gioi-tinh_va_di_truyen_lien_ket_gioi_tinh_747Tailieu.vncty.com   nst gioi-tinh_va_di_truyen_lien_ket_gioi_tinh_747
Tailieu.vncty.com nst gioi-tinh_va_di_truyen_lien_ket_gioi_tinh_747Trần Đức Anh
 
Tailieu.vncty.com nhom 6-de_tai_flo_9602
Tailieu.vncty.com   nhom 6-de_tai_flo_9602Tailieu.vncty.com   nhom 6-de_tai_flo_9602
Tailieu.vncty.com nhom 6-de_tai_flo_9602Trần Đức Anh
 
Tailieu.vncty.com lai phan-tu_2413
Tailieu.vncty.com   lai phan-tu_2413Tailieu.vncty.com   lai phan-tu_2413
Tailieu.vncty.com lai phan-tu_2413Trần Đức Anh
 
Tailieu.vncty.com duong hoa-hoc_3666
Tailieu.vncty.com   duong hoa-hoc_3666Tailieu.vncty.com   duong hoa-hoc_3666
Tailieu.vncty.com duong hoa-hoc_3666Trần Đức Anh
 
Tailieu.vncty.com do an-nhan_giong_in_vi_tro_cay_co_ngot_stevia_4562
Tailieu.vncty.com   do an-nhan_giong_in_vi_tro_cay_co_ngot_stevia_4562Tailieu.vncty.com   do an-nhan_giong_in_vi_tro_cay_co_ngot_stevia_4562
Tailieu.vncty.com do an-nhan_giong_in_vi_tro_cay_co_ngot_stevia_4562Trần Đức Anh
 
Tailieu.vncty.com tieu luanc4v-1324
Tailieu.vncty.com   tieu luanc4v-1324Tailieu.vncty.com   tieu luanc4v-1324
Tailieu.vncty.com tieu luanc4v-1324Trần Đức Anh
 
Tailieu.vncty.com do an-cong_nghe_san_xuat_sua_tiet_trung_9366
Tailieu.vncty.com   do an-cong_nghe_san_xuat_sua_tiet_trung_9366Tailieu.vncty.com   do an-cong_nghe_san_xuat_sua_tiet_trung_9366
Tailieu.vncty.com do an-cong_nghe_san_xuat_sua_tiet_trung_9366Trần Đức Anh
 

More from Trần Đức Anh (20)

Tailieu.vncty.com 5275 1261
Tailieu.vncty.com   5275 1261Tailieu.vncty.com   5275 1261
Tailieu.vncty.com 5275 1261
 
Tailieu.vncty.com 5249 5591
Tailieu.vncty.com   5249 5591Tailieu.vncty.com   5249 5591
Tailieu.vncty.com 5249 5591
 
Tailieu.vncty.com 5219 0449
Tailieu.vncty.com   5219 0449Tailieu.vncty.com   5219 0449
Tailieu.vncty.com 5219 0449
 
Tailieu.vncty.com 5208 2542
Tailieu.vncty.com   5208 2542Tailieu.vncty.com   5208 2542
Tailieu.vncty.com 5208 2542
 
Tailieu.vncty.com 5145 0887
Tailieu.vncty.com   5145 0887Tailieu.vncty.com   5145 0887
Tailieu.vncty.com 5145 0887
 
Tailieu.vncty.com 5142 5647
Tailieu.vncty.com   5142 5647Tailieu.vncty.com   5142 5647
Tailieu.vncty.com 5142 5647
 
Tailieu.vncty.com 5138 529
Tailieu.vncty.com   5138 529Tailieu.vncty.com   5138 529
Tailieu.vncty.com 5138 529
 
Tailieu.vncty.com 5125 4608
Tailieu.vncty.com   5125 4608Tailieu.vncty.com   5125 4608
Tailieu.vncty.com 5125 4608
 
Tailieu.vncty.com 5117 1019
Tailieu.vncty.com   5117 1019Tailieu.vncty.com   5117 1019
Tailieu.vncty.com 5117 1019
 
Tailieu.vncty.com 5106 4775
Tailieu.vncty.com   5106 4775Tailieu.vncty.com   5106 4775
Tailieu.vncty.com 5106 4775
 
Tailieu.vncty.com 5089 2417
Tailieu.vncty.com   5089 2417Tailieu.vncty.com   5089 2417
Tailieu.vncty.com 5089 2417
 
Tailieu.vncty.com 5088 8018
Tailieu.vncty.com   5088 8018Tailieu.vncty.com   5088 8018
Tailieu.vncty.com 5088 8018
 
Tailieu.vncty.com 5067 1967
Tailieu.vncty.com   5067 1967Tailieu.vncty.com   5067 1967
Tailieu.vncty.com 5067 1967
 
Tailieu.vncty.com nst gioi-tinh_va_di_truyen_lien_ket_gioi_tinh_747
Tailieu.vncty.com   nst gioi-tinh_va_di_truyen_lien_ket_gioi_tinh_747Tailieu.vncty.com   nst gioi-tinh_va_di_truyen_lien_ket_gioi_tinh_747
Tailieu.vncty.com nst gioi-tinh_va_di_truyen_lien_ket_gioi_tinh_747
 
Tailieu.vncty.com nhom 6-de_tai_flo_9602
Tailieu.vncty.com   nhom 6-de_tai_flo_9602Tailieu.vncty.com   nhom 6-de_tai_flo_9602
Tailieu.vncty.com nhom 6-de_tai_flo_9602
 
Tailieu.vncty.com lai phan-tu_2413
Tailieu.vncty.com   lai phan-tu_2413Tailieu.vncty.com   lai phan-tu_2413
Tailieu.vncty.com lai phan-tu_2413
 
Tailieu.vncty.com duong hoa-hoc_3666
Tailieu.vncty.com   duong hoa-hoc_3666Tailieu.vncty.com   duong hoa-hoc_3666
Tailieu.vncty.com duong hoa-hoc_3666
 
Tailieu.vncty.com do an-nhan_giong_in_vi_tro_cay_co_ngot_stevia_4562
Tailieu.vncty.com   do an-nhan_giong_in_vi_tro_cay_co_ngot_stevia_4562Tailieu.vncty.com   do an-nhan_giong_in_vi_tro_cay_co_ngot_stevia_4562
Tailieu.vncty.com do an-nhan_giong_in_vi_tro_cay_co_ngot_stevia_4562
 
Tailieu.vncty.com tieu luanc4v-1324
Tailieu.vncty.com   tieu luanc4v-1324Tailieu.vncty.com   tieu luanc4v-1324
Tailieu.vncty.com tieu luanc4v-1324
 
Tailieu.vncty.com do an-cong_nghe_san_xuat_sua_tiet_trung_9366
Tailieu.vncty.com   do an-cong_nghe_san_xuat_sua_tiet_trung_9366Tailieu.vncty.com   do an-cong_nghe_san_xuat_sua_tiet_trung_9366
Tailieu.vncty.com do an-cong_nghe_san_xuat_sua_tiet_trung_9366
 

Tailieu.vncty.com dong-ho-thoi-gian-thuc-ds1307-pic16 f87

  • 1. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 1 Môn vi xử lý Đề tài : đồng hồ thời gian thực dùng DS 1307 I, Chức năng của mạch điện: - Hiển thị : giờ ,phút,giây, ngày , tháng,năm,thứ trong tuần - giao tiếp với 4 phím : status-mode-increase-decrease. Phím status dùng để chuyển chế độ từ hiển thị giờ ,phút ,giây,thứ sang ngày ,tháng, năm. Phím mode dùng để điều chỉnh ngày, tháng, năm và giờ ,phút ,giây,thứ II, Mô tả mạch: -Mạch sử dụng IC thời gian thực DS 1307 giao tiếp I2C với Pic. Pic16F877A - Dùng 8 led 7 thanh loại 4 led/1 con. - Dùng 8 Tranzito để điều khiển việc đóng ngắt các led. - Vi điều khiển được dùng là PIC 16F877A - Dùng thạch anh 20MHz để tạo dao động cho PIC. - Dùng một mạch tiny Bootloaderđể kết nối giữa pic và máy tính , nạp chương trình trực tiếp từ máy tính vào PIC mà không cần thông qua mạch nạp cho PIC. III/ Cơ bản về tiny bootloader: Đây là bootloader cho các vi điều khiển Microchip PIC * Nó là bootloader có kích thước nhỏ nhất, ít hơn 100 word bộ nhớ chương trình * Nó là bootloader duy nhất hỗ trợ tất cả các dòng PIC: 16F, 18F, dsPIC (những dòng có hỗ trợ chế độ self-programming - tự nạp lại).
  • 2. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 2 Đặc điểm của firmware: * Kích thước chỉ có khoảng 100word (cho tất cả các dòng 16F, 18F, dsPIC, thực ra là nó ít hơn 100 word); * Có thể ghi vào flash, eeprom, và có thể ghi vào các bytes cài đăt (configuration bytes) của dòng 18F * Khi reset, đợi 1 giây để nhận chương trình nạp, nếu không nhận được thì chuyển qua chạy chương trình * File .asm của bootloader rất dễ để chỉnh sửa lại,cho phù hợp với từng chip, tốc độ truyền nhận. Đặc điểm của phần mềm trên máy tính * Có thể tải chương trình vào flash (trong phiên bản này của bootloader, cho phép cài đặt các byte cài đặt (configuration bytes) và có thể thay đổi dễ dàng theo từng loại PIC) * Làm việc với tất cả các dòng PIC đã nêu trên; tự động nhận ra nội dung file HEX và dòng PIC * Ghi nhớ cài đặt cuối (thuận tiện cho người dùng khi thao tác với một loại PIC) * Trong trường hợp lỗi, nó sẽ truyền một tín hiệu ngược lại cho máy tính để tái đồng bộ giữa máy tính và PIC; * Chế độ giao tiếp có thể được thay đổi, có thể dùng bất kỳ cổng COM nào với tốc độ baud nào Khái niệm chung về bootloader Một bootloader là một chương trình nằm trong vi điều khiển, và giao tiếp với máy tính (thông qua giao tiếp nối tiếp). Bootloader nhận một chương trình (đã được dịch ra thành file HEX) từ máy tính và ghi nó vào bộ nhớ flash của vi điều khiển thông qua một phần mềm trên máy tính, sau đó chạy chương trình đó trên vi điều khiển. Bootloader chỉ có thể được dùng với những vi điều khiển nào cho phép ghi vào bộ nhớ flash thông qua phần mềm trên máy tính. Bản thân bootloader phải được ghi vào trong bộ nhớ flash bằng một mạch nạp khác. Để bootloader hoạt động, sau khi nhấn reset, một lệnh "goto bootloader" phải nằm ở địa chỉ đầu tiên của chương trình vi điều khiển. Có 2 loại bootloader, một số loại đôi khi cần người dùng đặt lại địa chỉ các dòng lệnh đầu, một số khác thì tự bản thân nó đặt những dòng lệnh đầu của người dùng vào một địa chỉ khác khi mà bootloader đã nằm sẵn ở đó, và quay trở lại chương trình của người dùng khi kết thúc đoạn chương trình bootloader. Trong trường hợp này, tiny bootloader tự động đem các vị trí đầu của chương trình người viết, và đặt ở phía dưới cùng với chương trình bootloader (thực ra đoạn chương trình này chỉ tối đa có 4 dòng lệnh). địa chỉ 0x0004 đã là địa chỉ bắt đầu ngắt. Chính vì vậy, nếu lập trình từ vị trí 0x0000 thì cũng chỉ viết được tối đa 4 dòng lệnh, sau đó phải nhảy đến chương trình chính. Như vậy, tiny bootloader sẽ thực hiện thao tác, cắt 4 dòng đầu tiên từ 0x0000 đến 0x0003 , thay bằng dòng lệnh GOTO BOOTLOADER. Và nó tự động đặt 4 dòng lệnh nằm ngay phía trên chương trình bootloader .Sau đó, chạy chương trình tinybootloader phía bên dưới. Rồi nó quay lên chạy 4 dòng lệnh . Kết thúc 4 dòng này, nó lại trở về vị trí chương trình chạy bình thường ở bên trên. . phiên bản mới nhất của tiny bootloader cho phép reset trên máy tính, không cần phải bấm reset nữa. Đây là một loại tiny bootloader : max232
  • 3. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 3 IV/ Cơ chế hoạt động và chức năng của DS1307: Vcc: nối với nguồn X1,X2: nối với thạch anh 32,768 kHz Vbat: đầu vào pin 3V GND: đất SDA: chuỗi data SCL: dãy xung clock SQW/OUT: xung vuông/đầu ra driver · 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ó
  • 4. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 4 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. Sơ đồ khối của DS1307: Mô tả hoạt động của các chân: · Vcc,GND: nguồn một chiều được cung cấp tới các chân này. Vcc là đầu vào 5V. Khi 5 V được cung cấp thì thiết bị có thể truy cập hoàn chỉnh và dữ liệu có thể đọc và viết. Khi pin 3 V được nối tới thiết bị này và Vcc nhỏ hơn 1,25Vbat thì quá trình đọc và viết không được thực thi,tuy nhiên chức năng timekeeping không bị ảnh hưởng bởi điện áp vào thấp. Khi Vcc nhỏ hơn Vbat thì RAM và timekeeper sẽ được ngắt tới nguồn cung cấp trong (thường là nguồn 1 chiều 3V) · Vbat: Đầu vào pin cho bất kỳ một chuẩn pin 3V . Điện áp pin phải được giữ trong khoảng từ 2,5 đến 3V để đảm bảo cho sự hoạt động của thiết bị. · SCL(serial clock input): SCL được sử dụng để đồng bộ sự chuyển dữ liệu trên đường dây nối tiếp. · SDA(serial data input/out): là chân vào ra cho 2 đường dây nối tiếp. Chân SDA thiết kế theo kiểu cực máng hở , đòi hỏi phải có một điện trở kéo trong khi hoạt động. · SQW/OUT(square wave/output driver)- khi được kích hoạt thì bit SQWE được thiết lập 1, chân SQW/OUT phát đi 1 trong 4 tần số (1Hz,4kHz,8kHz,32kHz). Chân này cũng được thiết kế theo kiểu cực máng hở vì vậy nó cũng cần có một điện trở kéo trong. Chân này sẽ hoạt động khi cả Vcc và Vbat được cấp.
  • 5. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 5 · X1,X2: được nối với một thạch anh tần số 32,768kHz.Là một mạch tạo dao động ngoài , để hoạt động ổn định thì phải nối thêm 2 tụ 33pF · Cũng có DS1307 với bộ tạo dao động trong tần số 32,768kHz, với cấu hình này thì chân X1 sẽ được nối vào tín hiệu dao động trong còn chân X2 thì để hở. 1, Sơ đồ địa chỉ RAM và RTC: 00h 07h 08h 3Fh · Thông tin về thời gian và ngày tháng được lấy ra bằng cách đọc các byte thanh ghi thích hợp. thời gian và ngày tháng được thiết lập cũng thông qua các byte thanh ghi này bằng cách viết vào đó những giá trị thích hợp. nội dung của các thanh ghi dưới dạng mã BCD(binary coded decreaseimal). Bit 7 của thanh ghi seconds là bit clock halt(CH),khi bit này được thiết lập 1 thì dao động disable,khi nó được xoá về 0 thì dao động được enable. Chú ý là phải enable dao động trong suốt quá trình cấu hình thiết lập (CH=0). Thanh ghi thời gian thựuc được mô tả như sau: Seconds Minutes Hours Day Date Month Year Control Ram 58x8
  • 6. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 6 · DS1307 có thể chạy ở chế độ 24h cũng như 12h. Bit thứ 6 của thanh ghi hours là bit chọn chế độ 24h hoặc 12h. khi bit này ở mức cao thì chế độ 12h được chọn. ở chế độ 12h thì bit 5 là bit AM/PM với mức cao là là PM. ở chế độ 24h thì bit 5 là bit chỉ 20h(từ 20h đến 23h). · Trong quá trình truy cập dữ liệu, khi chỉ thị START được thực thi thì dòng thời gian được truyền tới một thanh ghi thứ 2,thông tin thời gian sẽ được đọc từ thanh ghi thứ cấp này,trong khi đó đồng hồ vẫn tiếp tục chạy. Trong DS1307 có một thanh ghi điều khiển để điều khiển hoạt động của chân SQW/OUT Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 OUT X X SQWE X X RS1 RS0 · OUT(output control):bit này điều khiển mức ra của chân SQW/OUT khi đầu ra xung vuông là disable. Nếu SQWE=0 thì mức logic ở chân SQW/OUT sẽ là 1 nếu OUT=1,và =0 nếu OUT=0 · SQWE(square wave enable): bit này được thiết lập 1 sẽ enable đầu ra của bộ tạo dao động. Tần số của đầu ra sóng vuông phụ thuộc vào giá trị của RS1 và RS0 RS1 RS0 tần số đầu ra SQW 0 0 1Hz 0 1 4,096kHz 1 0 8,192kHz 1 1 32,768kHz DS1307 hỗ trợ bus 2 dây 2 chiều và giao thức truyền dữ liệu. thiết bị gửi dữ liệu lên bus được gọi là bộ phát và thiết bị nhận gọi là bộ thu. thiết bị điều khiển quá trình này gọi là master. thiết bị
  • 7. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 7 nhận sự điều khiển của master gọi là slave. Các bus nhận sự điều khiển của master,là thiết bị phát ra chuỗi xung clock(SCL),master sẽ điều khiển sự truy cập bus,tạo ra các chỉ thị START và STOP Sự truyền nhận dữ liệu trên chuỗi bus 2 dây Tuỳ thuộc vào bit R/ w mà 2 loại truyền dữ liệu sẽ được thực thi: · truyền dữ liệu từ master truyền và slave nhận: Master sẽ truyền byte đầu tiên là địa chỉ của slave. Tiếp sau đó là các byte dữ liệu . slave sẽ gửi lại bit thông báo đã nhận được (bit acknowledge) sau mỗi byte dữ liệu nhận được. dữ liệu sẽ truyền từ bit có giá trị nhất (MSB). · truyền dữ liệu từ slave và master nhận: byte đầu tiên (địa chỉ của slave) được truyền tới slave bởi master. Sau đó slave sẽ gửi lại master bit acknowledge. tiếp theo đó slave sẽ gửi các byte dữ liệu tới master. Master sẽ gửi cho slave các bit acknowledge sau mỗi byte nhận được trừ byte cuối cùng,sau khi nhận được byte cuối cùng thì bit acknowledge sẽ không được gửi . Master phát ra tất cả các chuỗi xung clock và các chỉ thị START và STOP. sự truyền sẽ kết thúc với chỉ thị STOP hoặc chỉ thị quay vòng START. Khi chỉ thị START quay vòng thì sự truyền chuỗi dữ liệu tiếp theo được thực thi và các bus vẫn chưa được giải phóng. Dữ liệu truyền luôn bắt đầu bằng bit MSB. 2, DS1307 có thể hoạt động ở 2 chế độ sau: · chế độ slave nhận( chế độ DS1307 ghi):chuỗi dữ liệu và chuỗi xung clock sẽ được nhận thông qua SDA và SCL. Sau mỗi byte được nhận thì 1 bit acknowledge sẽ được truyền. các điều kiện START và STOP sẽ được nhận dạng khi bắt đầu và kết thúc một truyền 1 chuỗi. nhận dạng địa chỉ được thực hiện bởi phần cứng sau khi chấp nhận địa chỉ của slave và bit chiều. Byte địa chỉ là byte đầu tiên nhận được sau khi điều kiện START được phát ra từ master. Byte địa chỉ có chứa 7 bit địa chỉ của DS1307, là 1101000, tiếp theo đó là bit chiều (R/ w ) cho phép ghi khi nó bằng 0. sau khi nhận và giải mã byte địa chỉ thì thiết bị sẽ phát đi 1 tín hiệu acknowledge lên đường SDA. Sau khi DS1307 nhận dạng được địa chỉ và bit ghi thì master sẽ gửi một địa chỉ thanh ghi tới DS1307 , tạo ra một con trỏ thanh ghi trên DS1307 và master sẽ truyền từng byte dữ liệu cho DS1307 sau mỗi bit acknowledge nhận được. sau đó master sẽ truyền điều kiện STOP khi việc ghi hoàn thành.
  • 8. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 8 · chế độ slave phát ( chế độ DS1307 đọc): byte đầu tiên slave nhận được tương tự như chế độ slave ghi. Tuy nhiên trong chế độ này thì bit chiều lại chỉ chiều truyền ngược lại. Chuỗi dữ liệu được phát đi trên SDA bởi DS 1307 trong khi chuỗi xung clock vào chân SCL. Các điều kiện START và STOP được nhận dạng khi bắt đầu hoặc kết thúc truyền một chuỗi. byte địa chỉ nhận được đầu tiên khi master phát đi điều kiện START. Byte địa chỉ chứa 7 bit địa chỉ của slave và 1 bit chiều cho phép đọc là 1. sau khi nhận và giải mã byte địa chỉ thì thiết bị sẽ nhận 1 bit acknowledge trên đường SDA. Sau đó DS1307 bắt đầu gửi dữ liệu tới địa chỉ con trỏ thanh ghi thông qua con trỏ thanh ghi. nếu con trỏ thanh ghi không được viết vào trước khi chế độ đọc được thiết lập thì địa chỉ đầu tiên được đọc sẽ là địa chỉ cuối cùng chứa trong con trỏ thanh ghi .DS1307 sẽ nhận được một tín hiệu Not Acknowledge khi kết thúc quá trình đọc. Đọc dữ liệu-chế độ slave phát · thời gian thực hiện việc đọc,ghi dữ liệu của DS1307: sơ đồ đồng bộ:
  • 9. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 9 đặc tính và thời gian thực hiện: V/ Tổng quan về vi điều khiển PIC16F877A:
  • 10. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 10 PIC 16F877A trong mạch là loại có 40 chân,với 5 cổng vào ra la Port A(RA0÷RA5),Port B(RB0÷RB7),Port C(RC0÷RC7),Port D(RD0÷RD7),Port E(RE0÷RE2). Có 3 bộ định thời là timer0,timer1,timer2. 8K bộ nhớ chương trình flash. Tổ chức bộ nhớ : Có 3 khối bộ nhớ trong pic16F877A: bộ nhớ chương trình ,bộ nhớ dữ liệu và khối bộ nhớ EEPROM. bộ nhớ chương trình và bộ nhớ dữ liệu có đường bus riêng vì vậy có thể truy cập vào từng bộ nhớ một cách riêng rẽ. Bộ đếm chương trình có 13 bit vì vậy không gian địa chỉ sẽ là 8k word x 8bit. Truy cập ngoài vùng không gian trên sẽ gây lỗi. Bộ nhớ dữ liệu được chia thành 4 bank (Bank0÷Bank3) ,trong các bank chứa các thanh ghi thường và các thanh ghi chức năng đặc biệt. Bank được chọn phụ thuộc vào bit RP1 và RP0 (bit thứ 6 và bit thứ 5) của thanh ghi trạng thái status. RP1:RP0 Bank 00 0 01 1 10 2 11 3
  • 11. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 11 Các thanh ghi chức năng đặc biệt được CPU và bộ ngoại vi sử dụng để điều khiển các thiết bị. các thanh ghi này hoạt động như một thanh RAM tĩnh. Thanh ghi trạng thái chứa trạng thái số học của ALU,trạng thái Reset và các bit chọn bank ở bộ nhớ dữ liệu. R/W-0 R/W-0 R/W-0 R-1 R-1 R/W-x R/W-x R/W-x IRP RP1 RP0 TO PD Z DC C Bit 7 bit 0 Các cổng vào ra của pic: 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ể đượ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 40k để đảm bảo điện áp cung cấp cho vi điều khiển.
  • 12. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 12 mạch reset của pic16f877a VI/ Khối hiển thị: - Khối hiển thị dùng 8 led +,ở chế độ hiển thị ngày tháng năm:2 led để hiện thị ngày ,2 led hiển thị tháng ,4 led hiển thị năm . +,ở chế độ hiển thị giờ ,phút, giây: 2 led dùng để hiển thị giờ,2 led dùng để hiển thị phút, 2 led dùng để hiển thị giây, 1 led dùng hiển thị thứ trong tuần (chủ nhật led hiện giá trị 1,thứ 2 hiện giá trị 2…thứ 7 hiện giá trị 7) Tất cả các led chung đường tín hiệu a,…,g còn các chân điều khiển thì mắc với các khoá điện tử (8 Tranzito A1015) để điều khiển việc đóng ngắt các led. - việc cấp nguồn cho các led dựa trên thuật quét led. Sơ đồ thuật quét led:
  • 13. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 13 VII/ khối điều khiển : Gồm 4 phím bấm: status-mode(button1)-increase(button2)-decrease(button3) - Phím status dùng để chọn chế độ hiển thị trên các led là hiển thị ngày ,tháng , năm hay là giờ ,phút, giây,thứ - Phím mode dùng để chỉnh giờ,phút,giây,ngày,tháng,năm - Phím increase để tăng giá trị - Phím decrease để giảm giá trị bắt đầu quét led khởi tạo hệ thống gửi dữ liệu cho led 1 cấp nguồn cho led 1 trễ 1ms ngắt nguồn led 1 gửi dữ liệu cho led 8 cấp nguồn cho led 8 trễ 1ms ngắt nguồn led 8
  • 14. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 14 - Thuật toán điều khiển: + , thay đổi chế độ hiển thị: S Đ +,Chỉnh thời gian: Status=0 Quét led hiển thị ngày,tháng,năm
  • 15. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 15
  • 16. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 16 Set hours: Set minutes:
  • 17. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 17 Set year:
  • 18. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 18 Set month:
  • 19. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 19 Set day:
  • 20. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 20
  • 21. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 21 Set date: VIII/ Sơ đồ khối của mạch:
  • 22. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 22
  • 23. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 23 IX,ngôn ngữ lập trình: - ngôn ngữ lập trình cho pic là C, dùng CCS 3.227 để biên dịch - sử dụng I2C tích hợp sẵn trong PIC để giao tiếp với DS1307 - sử dụng các hàm có sẵn trong CCS là:I2C_START;I2C_STOP; I2C_READ; I2C_WRITE dùng để khởi tạo,đọc giá trị từ DS1307 sang PIC. - việc hiển thị thời gian là liên tục ,ta dùng 8 byte RAM để làm bộ đệm hiển thị (các biến led1,..led8), các giá trị thời gian đọc từ DS1307 sau khi đã chuyển sang BCD sẽ được lưu trong các biến này. - Ta sẽ đọc các giá trị thời gian từ DS1307 nhưng chỉ đọc giá trị giây, sau 1 phút ta mới cập nhật toàn bộ thanh ghi thời gian của DS1307 và đưa ra hiển thị. - Chương trình quét bàn phím sẽ xác định phím chức năng và gọi hàm xử lý tương ứng như: chuyển chế độ, chỉnh giờ ,tăng,giảm giá trị… X/ Code: //#include <16F877A.h> #include <led7seg.h> #include <def_877a.h> #use delay(clock=20000000) #use i2c(Master,Slow,sda=PIN_C4,scl=PIN_C3) // Cac dinh nghia #define status rd4 #define mode rd5 #define increase rd6 #define decrease rd7 #define led1 ra0 #define led2 ra1 #define led3 ra2 #define led4 ra3 #define led5 ra4 #define led6 ra5 #define led7 re0 #define led8 re1 //Cac bien int8 sec,min,hour,dow,date,month,year; int8 const led_code[16]={0b00000011,0b10011111,0b00100101,0b00001101,0b10011001,0b01001001,0b0100 0001,0b00011111,0b00000001,0b00001001,0b01000001,0b01000001,0b01000001,0b01000001,0b01 000001,0b01000001}; int8 sec1,sec2,min1,min2,hour1,hour2,day,date1,date2,month1,month2,year1,year2,year3,year4; void display1();
  • 24. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 24 void display2(); void update_time(); void set_time(void) ; void set_min(void); void set_hour(void); void set_date(void); void set_day(void); void set_month(void); void set_year(void); void main() { set_tris_a(0x00); // Cong A lam dau ra set_tris_b(0x01); // Cong B lam dau ra ( tru RB0) set_tris_e(0x00); // Cong B lam dau ra set_tris_d(0xff); // Cong D lam dau vao ( ban phim) porta=porte=1; while (1) { update_time(); display1(); if (status==0) {display2();} if (mode==0) { set_time();} } } void update_time() { i2c_start(); i2c_write(0xD0); //Gui dia chi cua slave i2c_write(0x00); //thiet lap lai con tro - set register pointer i2c_stop(); I2C_start(); I2C_write(0xD1); /* gui lenh doc du lieu */ sec = i2c_read(1); /* starts w/last address stored in register pointer */ min = i2c_read(1); hour = i2c_read(1); //che do 24h ko can AND dow = i2c_read(1); date = i2c_read(1); month = i2c_read(1); year = i2c_read(0); i2c_stop(); //========================= sec1=sec & 0x0F; sec2=(sec & 0x70)>>4; //convert to BCD SEC min1=min & 0x0F; min2=(min & 0x70)>>4; //convert to BCD MIN
  • 25. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 25 hour1=hour & 0x0F; hour2=(hour & 0x30)>>4; //convert to BCD HOUR day=(dow & 0x07); date1=date & 0x0F; date2=(date & 0x30)>>4; //convert to BCD DATE month1=month & 0x0F; month2=(month & 0x10)>>4; //convert to BCD MONTH year1=year & 0x0F; year2=(year & 0xF0)>>4; //convert to BCD YEAR } void display1() { // sec - min - hour PortB=led_code[sec1]; led6=0;//SEC1 delay_us(500); led6=1; PortB=led_code[sec2]; led5=0;//SEC2 delay_us(500); led5=1; PortB=led_code[min1]; led4=0;//MIN1 delay_us(500); led4=1; PortB=led_code[min2]; led3=0;//MIN2 delay_us(500); led3=1; PortB=led_code[hour1]; led2=0;//HOUR1 delay_us(500); led2=1; PortB=led_code[hour2]; led1=0;//HOUR2 delay_us(500); led1=1; PortB=led_code[day]; led8=0;//DAY delay_us(500); led8=1; } void display2(){ // Dow - Date - Month - Year int16 i=0; while (status==0) {} while (i<600) { PortB=led_code[date]; led2=0;//DATE1 delay_us(500); led2=1; PortB=led_code[date2]; led1=0;//DATE2 delay_us(500); led1=1; PortB=led_code[month1]; led4=0;//MONTH1 delay_us(500); led4=1; PortB=led_code[month2]; led3=0;//MONTH2 delay_us(500); led3=1; PortB=led_code[year1]; led8=0;//YEAR1 delay_us(500); led8=1;
  • 26. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 26 PortB=led_code[year2]; led7=0;//YEAR2 delay_us(500); led7=1; PortB=led_code[0]; led6=0;//YEAR1 delay_us(500); led6=1; PortB=led_code[2]; led5=0;//YEAR2 delay_us(500); led5=1; i++; } } void update_ds1307(void) { int8 data=0; // luu tru du lieu tam thoi de gui vao ds1307 i2c_start(); i2c_write(0xd0); i2c_write(0x00); // ghi du lieu bat dau tu vi tri 00 data=sec1+(sec2<<4); data=data & 0b01111111; i2c_write(data); data=min1+(min2<<4); i2c_write(data); data=hour1+(hour2<<4); i2c_write(data); data=day; i2c_write(data); data=date1+(date2<<4); i2c_write(data); data=month1+(month2<<4); i2c_write(data); data=year1+(year2<<4); i2c_write(data); data=0x00; i2c_write(data); i2c_stop(); // ket thuc truyen du lieu } void set_time(void) { set_year();
  • 27. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 27 set_month(); set_date(); set_day(); set_hour(); set_min(); while (mode==0) {} update_ds1307(); } void set_year(void) { // Cai dat nam while (mode==0) {} // cho phim nha do { if (increase==0) { // neu phim 2 duoc nhan while (increase==0) {} // khong lam gi cho phim nha year1++; if ((year2==9)&(year1==10)) {year1=year2=0;} if (year1==10) {year1=0;year2++;} } if (decrease==0) { // neu phim 3 duoc nhan while (decrease==0) {} // khong lam gi cho phim nha year1--; if ((year2==0)&(year1==255)) {year1=year2=9;} if (year1==255) {year1=9;year2--;} } portb=led_code[2]; led5=0; delay_us(500); led5=1; portb=led_code[0]; led6=0; delay_us(500); led6=1; portb=led_code[year2]; led7=0; delay_us(500); led7=1; portb=led_code[year1]; led8=0; delay_us(500); led8=1; } while (mode==1); }
  • 28. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 28 void set_month(void) { // Cai dat thang while (mode==0) {} // cho phim nha do { if (increase==0) { // neu phim 2 duoc nhan while (increase==0) {} // khong lam gi cho phim nha month1++; if ((month2==1) & (month1==3)) { month2=0;month1=1;} if (month1==10) { month2++;month1=0;} } if (decrease==0) { // neu phim 3 duoc nhan while (decrease==0) {} // cho phim nha month1--; if ((month2==0) & (month1==0)) {month2=1;month1=2; } if (month1==0) {month2--;month1=9;} } portb=led_code[month2]; led3=0; delay_us(500); led3=1; portb=led_code[month1]; led4=0; delay_us(500); led4=1; } while (mode==1); } void set_date(void) { // Cai dat thang while (mode==0) {} // cho phim nha do { if (increase==0) { // neu phim 2 duoc nhan while (increase==0) {} // khong lam gi cho phim nha date1++; if ((date2==3) & (date1==2)) { date2=0;date1=1;} if (date1==10) { date2++;date1=0;} } if (decrease==0) { // neu phim 3 duoc nhan while (decrease==0) {} // cho phim nha date1--; if ((date2==0) & (date1==0)) {date2=3;date1=1; } if (date1==255) {date2--;date1=9;} } portb=led_code[date2]; led1=0; delay_us(500);
  • 29. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 29 led1=1; portb=led_code[date1]; led2=0; delay_us(500); led2=1; } while (mode==1); } void set_day(void) { while (mode==0) {}; do { if (increase==0) { while (increase==0) {} day++; if (day==8) { day=1;} } if (decrease==0) { while (decrease==0) {} day--; if (day==255) {day=7;} } portb=led_code[day]; led8=0; delay_us(500); led8=1; } while (mode==1); } void set_hour(void) { // Cai dat thang while (mode==0) {} // cho phim nha do { if (increase==0) { // neu phim 2 duoc nhan while (increase==0) {} // khong lam gi cho phim nha hour1++; if ((hour2==2) & (hour1==4)) { hour2=0;hour1=0;} if (hour1==10) { hour2++;hour1=0;} } if (decrease==0) { // neu phim 3 duoc nhan while (decrease==0) {} // cho phim nha hour1--; if ((hour2==0) & (hour1==255)) {hour2=2;hour1=3; } if (hour1==255) {hour2--;hour1=9;} } portb=led_code[hour2];
  • 30. Đề tài : đồng hồ thời gian thực dùng DS 1307 http://machdientu.net Page 30 led1=0; delay_us(500); led1=1; portb=led_code[hour1]; led2=0; delay_us(500); led2=1; } while (mode==1); } void set_min(void) { // Cai dat thang while (mode==0) {} // cho phim nha do { if (increase==0) { // neu phim 2 duoc nhan while (increase==0) {} // khong lam gi cho phim nha min1++; if ((min2==5) & (min1==10)) { min2=0;min1=0;} if (min1==10) { min2++;min1=0;} } if (decrease==0) { // neu phim 3 duoc nhan while (decrease==0) {} // cho phim nha min1--; if ((min2==0) & (min1==255)) {min2=5;min1=9; } if (min1==255) {min2--;min1=9;} } portb=led_code[min2]; led3=0; delay_us(500); led3=1; portb=led_code[min1]; led4=0; delay_us(500); led4=1; } while (mode==1); }