Đề 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
đượ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
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
· 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
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
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
TOPD
Đề 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)
+ , thay đổi chế độ hiển thị:
S Đ +,Chỉnh thời gian:
Status=0
Quét led hiển thị
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:
// 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
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
}
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;