Đề tài Đề tài : đồng hồ thờ i gian thự c dùng DS 1307
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. ết nối giữa pic và máy tính , n ạp chươ ng Dùng một mạch tiny Bootloader để k ết 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 -programming - t ự nạp lại).
http://machdientu.net
Page 1
Đề tài Đề tài : đồng hồ thờ i gian thự c dùng DS 1307 Đặ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ể dòng 18F
ghi vào flash, eeprom, và có thể ghi vào các bytes cài đăt (configuration bytes) của
* 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 ết thúc đoạn chương tr ình bootloader. khi k ết 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 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
http://machdientu.net
Page 2
Đề tài Đề tài : đồng hồ thờ i gian thự c dùng DS 1307 Đặ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ể dòng 18F
ghi vào flash, eeprom, và có thể ghi vào các bytes cài đăt (configuration bytes) của
* 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 ết thúc đoạn chương tr ình bootloader. khi k ết 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 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
http://machdientu.net
Page 2
Đề tài Đề tài : đồng hồ thờ i gian thự c dùng DS 1307
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 ,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ó
http://machdientu.net
Page 3
Đề tài : đồng hồ thờ i gian thự c dùng DS 1307 một mạch cảm biến điện áp dùng pin cung cấp.
để dò các điện áp l ỗi và t ự động đóng ngắt với nguồn
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.
http://machdientu.net
Page 4
Đề tài : đồng hồ thờ i gian thự c dùng DS 1307 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:
Seconds Minutes Hours Day Date Month Year Control Ram 58x8
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:
http://machdientu.net
Page 5
Đề tài : đồng hồ thờ i gian thự c dùng DS 1307
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 OUT
Bit6 X
Bit5 X
Bit4 SQWE
Bit3 X
Bit2 X
Bit1 RS1
Bit0 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 1 1
0 1 0 1
1Hz 4,096kHz 8,192kHz 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ị
http://machdientu.net
Page 6
Đề tài : đồng hồ thờ i gian thự c dùng DS 1307 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 m aster. 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.
http://machdientu.net
Page 7
Đề tài : đồng hồ thờ i gian thự c dùng DS 1307
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ộ:
http://machdientu.net
Page 8
Đề tài : đồng hồ thờ i gian thự c dùng DS 1307
đặc tính và thời gian thực hiện:
V/ Tổng quan về vi điều khiển PIC16F877A:
http://machdientu.net
Page 9
Đề tài : đồng hồ thờ i gian thự c dùng DS 1307
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 00 01 10 11
http://machdientu.net
Bank 0 1 2 3
Page 10
Đề tài : đồng hồ thờ i gian thự c dùng DS 1307 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 Z DC C TO PD 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.
http://machdientu.net
Page 11
Đề tài : đồng hồ thờ i gian thự c dùng DS 1307
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:
http://machdientu.net
Page 12
Đề tài : đồng hồ thờ i gian thự c dùng DS 1307 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
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ị
http://machdientu.net
Page 13
Đề tài : đồng hồ thờ i gian thự c dùng DS 1307 -
Thuật toán điều khiển: + , thay đổi chế độ hiển thị:
S Status=0
Đ Quét led hiển thị ngày,tháng,n ăm
+,Chỉnh thời gian:
http://machdientu.net
Page 14
Đề 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 Set hours:
Set minutes:
http://machdientu.net
Page 16
Đề tài : đồng hồ thờ i gian thự c dùng DS 1307
Set year:
http://machdientu.net
Page 17
Đề tài : đồng hồ thờ i gian thự c dùng DS 1307
Set month:
http://machdientu.net
Page 18
Đề tài : đồng hồ thờ i gian thự c dùng DS 1307
Set day:
http://machdientu.net
Page 19
Đề 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
Set date:
VIII/ Sơ đồ khối của mạch:
http://machdientu.net
Page 21
Đề 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 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 #include #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();
http://machdientu.net
Page 23
Đề tài : đồng hồ thờ i gian thự c dùng DS 1307 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); set_tris_b(0x01); set_tris_e(0x00); set_tris_d(0xff);
// Cong A lam dau ra // Cong B lam dau ra ( tru RB0) // Cong B lam dau ra // 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
http://machdientu.net
Page 24
Đề tài : đồng hồ thờ i gian thự c dùng DS 1307 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;
http://machdientu.net
Page 25
Đề tài : đồng hồ thờ i gian thự c dùng DS 1307 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();
http://machdientu.net
Page 26
Đề tài : đồng hồ thờ i gian thự c dùng DS 1307 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); }
http://machdientu.net
Page 27
Đề tài : đồng hồ thờ i gian thự c dùng DS 1307 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);
http://machdientu.net
Page 28
Đề tài : đồng hồ thờ i gian thự c dùng DS 1307 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];
http://machdientu.net
Page 29