MỤC LỤC
LỜI MỞ ĐẦU TRANG 1
NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN TRANG 2
NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN . TRANG 3
I. CHỨC NĂNG CỦA MẠCH . TRANG 4
II. MÔ TẢ MẠCH :
A. CƠ CHẾ HỌAT ĐỘNG VÀ CHỨC NĂNG CỦA DS1307 . TRANG 5-13
B. CƠ CHẾ HIỂN THỊ TRANG 14
C. KHỐI XỬ LÝ 89C51 . TRANG 14-26
D. SƠ ĐỒ NGUYÊN LÝ . TRANG 27
E. LƯU ĐỒ TRANG 28-32
F. CHƯƠNG TRÌNH CHÍNH (CODE) . TRANG 33-48
G. THI CÔNG . TRANG 49-50
PHỤ LỤC . TRANG 51-52
54 trang |
Chia sẻ: maiphuongdc | Lượt xem: 2020 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Đồ án Lịch vạn niên dùng DS1307, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
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ập1, 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.
• 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ânX1 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
• 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:
• 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ị 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.
• 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ộ:
Dặc tính và thời gian thực hiện:
B. Khối hiển thị LCD
Sơ đồ nguyên lý :
Data LCD (DB0…. DB7) ngõvào nhận thong tin dữ liệu.
E ,R/W ,RS điều khiển LCD
Led nối nguồn 5V cung cấp ánh sang cho LCD
C. Khối xử lý 89C51:
Vi điều khiển 8051 là một trong những vi điều khiển 8 bit thông dụng nhất hiện nay. Bắt đầu xuất hiện vào năm 1980, trải qua gần 30 năm, hiện đã có tới hàng trăm biến thể (derrivatives) được sản xuất bởi hơn 20 hãng khác nhau, trong đó phải kể đến các đại gia trong làng bán dẫn
(Semiconductor) như ATMEL, Texas Instrument, Philips, Analog Devices… Tại Việt Nam, các biến thể của hãng ATMEL là AT89C51, AT89C52, AT89S51, AT89S52… đã có thời gian xuất hiện trên thị trường khá lâu và có thể nói là được sử dụng rộng rãi nhất trong các loại vi điều khiển 8 bit. Chương này sẽ tập trung mô tả tương đối chi tiết cấu trúc bên trong của các biến thể nói trên (tạm gọi chung là AT89) của hãng ATMEL.
Cấu trúc Bus
Bus địa chỉ của họ vi điều khiển 8051 gồm 16 đường tín hiệu (thường gọi là bus địa chỉ 16 bit). Với số lượng bit địa chỉ như trên, không gian nhớ của chip được mở rộng tối đa là 216 = 65536 địa chỉ, tương đương 64K.
Bus dữ liệu của họ vi điều khiển 8051 gồm 8 đường tín hiệu (thường gọi là bus dữ liệu 8 bit), đó là lý do tại sao nói 8051 là họ vi điều khiển 8 bit. Với độ rộng của bus dữ liệu như vậy, các chip họ 8051 có thể xử lý các toán hạng 8 bit trong một chu kỳ lệnh.
CPU (Central Processing Unit)
CPU là đơn vị xử lý trung tâm, đó là bộ não của toàn bộ hệ thống vi điện tử được tích hợp trên chip vi điều khiển. CPU có cấu tạo chính gồm một đơn vị xử lý số học và lôgic ALU (Arithmethic Logic Unit) - nơi thực hiện tất cả các phép toán số học và phép lôgic cho quá trình xử lý.
Bộ nhớ chương trình (ProgramMemory)
Không gian bộ nhớ chương trình của AT89 là 64K byte, tuy nhiên hầu hết các vi điều khiển AT89 trên thị trường chỉ tích hợp sẵn trên chip một lượng bộ nhớ chương trình nhất định và chiếm dải địa chỉ từ 0000h trở đi trong không gian bộ nhớ chương trình.
AT89C51/AT89S51 có 4K byte bộ nhớ chương trình loại Flash tích hợp sẵn bên trong chip. Đây là bộ nhớ cho phép ghi/xóa nhiều lần bằng điện, chính vì thế cho phép người sử dụng thay đổi chương trình nhiều lần. Số lần ghi/xóa được thường lên tới hàng vạn lần.
Bộ nhớ dữ liệu (Data Memory)
Vi điều khiển họ 8051 có không gian bộ nhớ dữ liệu là 64K địa chỉ, đó cũng là dung lượng bộ nhớ dữ liệu lớn nhất mà mỗi chip thuộc họ này có thể có được (nếu phối ghép một cách chính tắc, sử dụng các đường tín hiệu của bus địa chỉ và dữ liệu). Bộ nhớ dữ liệu của các chip họ 8051 có thể thuộc một hay hai loại: SRAM hoặc EEPROM. Bộ nhớ dữ liệu SRAM được tích hợp bên trong mọi chip thuộc họ vi điều khiển này, có dung lượng khác nhau tùy loại chip, nhưng thường chỉ khoảng vài trăm byte. Đây chính là nơi chứa các biến trung gian trong quá trình hoạt động của chip. khi mất điện, do bản chất của SRAM mà giá trị của các biến này cũng bị mất theo. Khi có điện trở lại, nội dung của các ô nhớ chứa các biến này cũng là bất kỳ, không thể xác định trước. Bên cạnh bộ nhớ loại SRAM, một số chip thuộc họ
8051 còn có thêm bộ nhớ dữ liệu loại EEPROM với dung lượng tối đa vài Kbyte, tùy từng loại chip cụ thể. Dưới đây là một vài ví dụ về bộ nhớ chương trình của một số loại chip thông dụng thuộc họ 8051.
Cổng vào ra song song (I/O Port)
8051 có 4 cổng vào ra song song, có tên lần lượt là P0, P1, P2 và P3. Tất cả các cổng này đều là cổng vào ra hai chiều 8bit. Các bit của mỗi cổng là một chân trên chip, như vậy mỗi cổng sẽ có 8 chân trên chip.
Hướng dữ liệu (dùng cổng đó làm cổng ra hay cổng vào) là độc lập giữa các cổng và giữa các chân (các bit) trong cùng một cổng. Ví dụ, ta có thể định nghĩa cổng P0 là cổng ra, P1 là cổng vào hoặc ngược lại một cách tùy ý, với cả 2 cổng P2 và P3 còn lại cũng vậy. Trong cùng một cổng P0, ta cũng có thể định nghĩa chân P0.0 là cổng vào, P0.1 lại là cổng ra tùy ý.
Liên quan đến mỗi cổng vào/ra song song của 8051 chỉ có một thanh ghi SFR ( thanh ghi chức năng đặc biệt) có tên trùng với tên của cổng. Ta có các thanh ghi P0 dùng cho cổng P0, thanh ghi P1 dùng cho cổng P1 … Đây là các thanh ghi đánh địa chỉ đến từng bit (bit addressable), do đó ta có thể dùng các lệnh tác động bit đối với các bit của các thanh ghi này. Mỗi thanh ghi này gồm 8 bit tương ứng với các chân (bit) của cổng đó. Khi một chân (bit) cổng nào đó được dùng làm cổng vào thì trước đó bit tương ứng trong thanh ghi SFR phải được đặt ở mức 1. Nếu một chân (bit) cổng nào đó được dùng làm cổng ra thì giá trị của bit tương ứng trong thanh ghi SFR sẽ là giá trị lôgic muốn đưa ra chân cổng đó. Nếu muốn đưa ra mức lôgic cao (điện áp gần 5V), bit tương ứng trong thanh ghi phải được đặt bằng 1, hiển nhiên nếu muốn đưa ra mức lôgic thấp (điện áp gần 0V) thì bit tương ứng trong thanh ghi phải được đặt bằng 0. Như đã nói ở trên, các bit trong thanh ghi cổng có thể được đặt bằng 1/0 mà không làm ảnh hưởng đến các bit còn lại trong cổng đó bằng cách dùng các lệnh setb (đặt lên 1) hay clr (đặt về 0).
Sau khi đặt một chân cổng làm cổng vào, ta có thể dùng các lệnh kiểm tra bit để đọc vào và kiểm tra các mức lôgic của mạch ngoài đang áp vào là mức 0 hay mức 1. Các lệnh này là jb (nhảy nếu bit bằng 1), jnb (nhảy nếu bit bằng 0)
Sơ đồ của mạch của một chân cổng:
Cổng P0 không có điện trở treo cao (pullup resistor) bên trong, mạch lái tạo mức cao chỉ có khi sử dụng cổng này với tính năng là bus dồn kênh địa chỉ/dữ liệu. Như vậy với chức năng ra thông thường, P0 là cổng ra open drain, với chức năng vào, P0 là cổng vào cao trở (high impedance). Nếu muốn sử dụng cổng P0 làm cổng vào/ra thông thường, ta phải thêm điện trở pullup bên ngoài. Giá trị điện trở pullup bên ngoài thường từ 4K7 đến 10K.
Bộ định thời/Bộ đếm (Timer/Counter)
8051 có 2 timer tên là timer0 và timer1. Các timer này đều là timer 16bit, giá trị đếm max do đó bằng 216 = 65536 (đếm từ 0 đến 65535).
Hai timer có nguyên lý hoạt động hoàn toàn giống nhau và độc lập. Sau khi cho phép chạy, mỗi khi có thêm một xung tại đầu vào đếm, giá trị của timer sẽ tự động được tăng lên 1 đơn vị, cứ như vậy cho đến khi giá trị tăng lên vượt quá giá trị max mà thanh ghi đếm có thể biểu diễn thì giá trị đếm lại được đưa trở về giá trị min (thông thường min = 0). Sự kiện này được hiểu là sự kiện tràn timer (overflow) và có thể gây ra ngắt nếu ngắt tràn timer được cho phép (bit ETx trong thanh ghi IE = 1).
Việc cho timer chạy/dừng được thực hiện bởi các bit TR trong thanh ghi
TCON (đánh địa chỉ đến từng bit).
Khi bit TRx = 1, timerx sẽ đếm, ngược lại khi TRx = 0, timerx sẽ không đếm mặc dù vẫn có xung đưa vào. Khi dừng không đếm, giá trị của timer được giữ nguyên.
Các bit TFx là các cờ báo tràn timer, khi sự kiện tràn timer xảy ra, cờ sẽ được tự động đặt lên bằng 1 và nếu ngắt tràn timer được cho phép, ngắt sẽ xảy ra. Khi CPU xử lý ngắt tràn timerx, cờ ngắt TFx tương ứng sẽ tự động được xóa về 0.
Giá trị đếm 16bit của timerx được lưu trong hai thanh ghi THx (byte cao) và TLx (byte thấp). Hai thanh ghi này có thể ghi/đọc được bất kỳ lúc nào. Tuy nhiên nhà sản xuất khuyến cáo rằng nên dừng timer (cho bit TRx = 0) trước khi ghi/đọc các thanh ghi chứa giá trị đếm.
Các timer có thể hoạt động theo nhiều chế độ, được quy định bởi các bit trong thanh ghi TMOD (không đánh địa chỉ đến từng bit).
Để xác định thời gian, người ta chọn nguồn xung nhịp (clock) đưa vào đếm trong timer là xung nhịp bên trong (dành cho CPU). Nguồn xung nhịp này thường rất đều đặn (có tần số ổn định), do đó từ số đếm của timer người ta có thể nhân với chu kỳ xung nhịp để tính ra thời gian trôi qua. Timer lúc này được gọi chính xác với cái tên “timer”, tức bộ định thời.
Để đếm các sự kiện bên ngoài, người ta chọn nguồn xung nhịp đưa vào đếm trong timer là tín hiệu từ bên ngoài (đã được chuẩn hóa về dạng xung vuông
0V/5V). Các tín hiệu này sẽ được nối với các bit cổng có dồn kênh thêm các tính năng T0/T1/T2. Khi có sự kiện bên ngoài gây ra thay đổi mức xung ở đầu vào đếm, timer sẽ tự động tăng lên 1 đơn vị giống như trường hợp đếm xung nhịp bên trong. Lúc này, timer được gọi chính xác với cái tên khác: “counter”, tức bộ đếm (sự kiện).
Nhìn vào bảng mô tả thanh ghi TMOD bên trên, ta có thể nhận thấy có 2 bộ 4 bit giống nhau (gồm GATEx, C/Tx, Mx0 và Mx1) dành cho 2 timer0 và 1. Ý nghĩa các bit là như nhau đối với mỗi timer.
Bit GATEx quy định việc cho phép timer đếm (run timer). Nếu GATEx = 0, timerx sẽ đếm khi bit TRx bằng 1, dừng khi bit TRx bằng 0. Nếu GATEx = 1, timerx sẽ chỉ đếm khi bit TRx = 1 và tín hiệu tại chân INTx = 1, dừng khi một trong hai điều kiện trên không còn thỏa mãn. Thông thường người ta dùng timer với GATE = 0, chỉ dùng timer với GATE = 1 trong trường hợp muốn đo độ rộng xung vì lúc đó timer sẽ chỉ đếm thời gian khi xung đưa vào chân INTx ở mức cao.
Bit C/Tx quy định nguồn clock đưa vào đếm trong timer. Nếu C/Tx = 0, timer sẽ được cấu hình là bộ định thời, nếu C/Tx = 1, timer sẽ được cấu hình là bộ đếm sự kiện.
Hai bit còn lại (Mx0 và Mx1) tạo ra 4 tổ hợp các giá trị (00,01,10 và 11)
ứng với 4 chế độ hoạt động khác nhau của timerx. Trong 4 chế độ đó thường chỉ dùng chế độ timer/counter 16bit (Mx1 = 0, Mx0 = 1) và chế độ Auto Reload 8bit timer/counter (Mx1 = 1, Mx0 = 0).
Trong chế độ timer/counter 16bit, giá trị đếm (chứa trong hai thanh ghi THx và TLx) tự động được tăng lên 1 đơn vị mỗi lần nhận được thêm một xung nhịp. Khi giá trị đếm tăng vượt quá giá trị max = 65535 thì sẽ tràn về 0, cờ ngắt TFx được tự động đặt = 1. Chế độ này được dùng trong các ứng dụng đếm thời gian và đếm sự kiện.
Trong chế độ Auto Reload 8bit, giá trị đếm sẽ chỉ được chứa trong thanh ghi TLx, còn giá trị của thanh ghi THx bằng một số n (từ 0 đến 255) do người lập trình đưa vào. Khi có thêm 1 xung nhịp, giá trị đếm trong TLx đương nhiên cũng tăng lên
1 đơn vị như bình thường. Tuy nhiên trong trường hợp này, giá trị đếm lớn nhất là
255 chứ không phải 65535 như trường hợp trên vì timer/counter chỉ còn 8bit. Do vậy sự kiện tràn lúc này xảy ra nhanh hơn, chỉ cần vượt quá 255 là giá trị đếm sẽ tràn. Cờ ngắt TFx vẫn được tự động đặt = 1 như trong trường hợp tràn 16bit. Điểm khác biệt là thay vì tràn về 0, giá trị THx sẽ được tự động nạp lại (Auto Reload) vào thanh ghi TLx, do đó timer/counter sau khi tràn sẽ có giá trị bằng n (giá trị chứa trong THx) và sẽ đếm từ giá trị n trở đi. Chế độ này được dùng trong việc tạo Baud rate cho truyền thông qua cổng nối tiếp.
Để sử dụng timer của 8051, hãy thực hiện các bước sau:
- Quy định chế độ hoạt động cho timer bằng cách tính toán và ghi giá trị cho các bit trong thanh ghi TMOD.
- Ghi giá trị đếm khởi đầu mong muốn vào 2 thanh ghi đếm THx và TLx. Đôi khi ta không muốn timer/counter bắt đầu đếm từ 0 mà từ một giá trị nào đó để thời điểm tràn gần hơn, hoặc chẵn hơn trong tính toán sau này. Ví dụ nếu cho timer đếm từ 15535 thì sau 50000 xung nhịp (tức 50000 micro giây với thạch anh 12MHz) timer sẽ tràn, và thời gian một giây có thể dễ dàng tính ra khá chính xác = 20 lần tràn của timer (đương nhiên mỗi lần tràn lại phải nạp lại giá trị 15535).
- Đặt mức ưu tiên ngắt và cho phép ngắt tràn timer (nếu muốn).
- Dùng bit TRx trong thanh ghi TCON để cho timer chạy hay dừng theo ý muốn.
D.Sơ đồ nguyên lý:
E.Lưu Đồ:
Điều kiện để DS1307 họat động:
Bắt đầu :
CHƯƠNG TRÌNH TEST_CLOCK:
F.Chương trình chính (code) :
$debug
$nosymbols
;khai bao bien
databus equ p0
rs bit p2.4
rw bit p2.5
en bit p2.6
sda bit p3.5
scl bit p3.6
key_1 bit p2.0
key_2 bit p2.1
key_3 bit p2.2
key_4 bit p2.3
ADDLO EQU 40h ; Dia chi byte thap
ADDHI EQU 41h ; dia chi byte cao
TDATA EQU 42h ; chuyen du lieu
RWDATA EQU 43h ; doc ghi du lieu
COUNT EQU 44h
CHECKDATA EQU 45H
count_lcd equ 46h
var_convert equ 47h
mode equ 48h
temp_character equ 49h
temp_sec equ 4Ah
max_value equ 4Bh
min_value equ 4Ch
org 0000h
ljmp main
main:
lcall xoa_ram
lcall init_lcd
loop_test:
mov dptr,#about_db
lcall write_string_lcd
LCALL delay_key
LCALL delay_key
LCALL delay_key
LCD_RTC:
lcall test_clock
ljmp LCD_RTC
;**********************************************
; delay_key
;**********************************************
delay_key:
mov r7,#02
loop_r6:
mov r6,#200
loop_r5:
mov r5,#250
djnz r5,$
djnz r6,loop_r5
djnz r7,loop_r6
ret
;**********************************************
;Clock DS1307 address high =01
;**********************************************
test_clock:
mov mode,#00h
mov addhi,#00h
mov addlo,#00h
lcall read_24
jb acc.7,setup_new_DS1307
ljmp jump_over
setup_new_DS1307:
mov rwdata,#00h
lcall pool_write_24
jump_over:
lcall clear_lcd
seconds:
lcall set_clock_ds
lcall display_clock_pcf
ljmp seconds
display_clock_pcf:
;lcall clear_lcd
mov count_lcd,#040h
lcall pos_character_lcd
mov a,#'M'
lcall write_text
mov a,mode
orl a,#30h
lcall write_text
mov count_lcd,#001h
lcall pos_character_lcd
mov addlo,#03h
lcall read_24
mov b,#03
mul ab
mov dptr,#date_db
mov r6,a
movc a,@a+dptr
lcall write_text
inc r6
mov a,r6
movc a,@a+dptr
lcall write_text
inc r6
mov a,r6
movc a,@a+dptr
lcall write_text
mov a,#' '
lcall write_text
mov addhi,#00h
mov addlo,#04h
lcall read_24
lcall display_Bcd
mov a,#'/'
lcall write_text
mov addlo,#05h
lcall read_24
lcall display_Bcd
mov a,#'/'
lcall write_text
mov addlo,#06h
lcall read_24
lcall display_Bcd
mov count_lcd,#43h
lcall pos_character_lcd
mov addhi,#00h
mov addlo,#02h
lcall read_24
lcall display_bcd
mov a,#':'
lcall write_text
mov addhi,#00h
mov addlo,#01h
lcall read_24
lcall display_bcd
mov a,#':'
lcall write_text
mov addlo,#00h
lcall read_24
lcall display_bcd
ret
display_BCD:
mov rwdata,a
anl a,#0F0h
swap a
orl a,#00110000b
lcall write_text
mov a,rwdata
anl a,#00Fh
orl a,#00110000b
lcall write_text
ret
set_clock_ds:
jb key_1,check_key_2
lcall delay_key
inc mode
mov a,mode
cjne a,#08,exit_set_clock_ds
mov mode,#00
ljmp exit_set_clock_ds
check_key_2:
jb key_2,check_key_3
lcall delay_key
lcall up_data_rtc
ljmp exit_set_clock_ds
check_key_3:
jb key_3,check_key_4
lcall delay_key
lcall down_data_rtc
ljmp exit_set_clock_ds
check_key_4:
exit_set_clock_ds:
ret
up_data_rtc:
mov a,mode
cjne a,#00,process_up_data_rtc
ljmp final_exit_up_data_rtc
process_up_data_rtc:
mov addlo,mode
lcall read_24
mov a,rwdata
mov a,mode
mov dptr,#table_max_rtc
movc a,@a+dptr
inc a ; tang a len 1 gia tri de so sanh
mov max_value,a
mov a,mode
mov dptr,#table_min_rtc
movc a,@a+dptr
mov min_value,a
mov var_convert,rwdata ; wa trinh bien doi
lcall bcd_hex
inc var_convert
mov a,var_convert
cjne a,max_value,exit_up_data_rtc
mov var_convert,min_value
exit_up_data_rtc:
lcall hex_bcd
mov rwdata,var_convert
lcall pool_write_24
;lcall display_clock_pcf
final_exit_up_data_rtc:
ret
down_data_rtc:
mov a,mode
cjne a,#00,process_down_data_rtc
ljmp final_exit_down_data_rtc
process_down_data_rtc:
mov addlo,mode
lcall read_24
mov a,rwdata
mov a,mode
mov dptr,#table_max_rtc
movc a,@a+dptr
mov max_value,a
mov a,mode
mov dptr,#table_min_rtc
movc a,@a+dptr
dec a ; giam di 1 gia tri de so sanh
mov min_value,a
mov var_convert,rwdata ; wa trinh bien doi
lcall bcd_hex
dec var_convert
mov a,var_convert
cjne a,min_value,exit_down_data_rtc
mov var_convert,max_value
exit_down_data_rtc:
lcall hex_bcd
mov rwdata,var_convert
lcall pool_write_24
;lcall display_clock_pcf
final_exit_down_data_rtc:
ret
;**********************************************
; Lcd
;**********************************************
INIT_LCD: ;Khai bao LCD
mov r7,#07
setup_function_lcd:
setb EN
CLR RS
CLR RW
MOV databus,#00111000b
clr en
lcall check_busy_lcd
djnz r7,setup_function_lcd
setb EN
CLR RS
CLR RW
MOV databus,#00001100b
clr en
lcall check_busy_lcd
setb EN
CLR RS
CLR RW
MOV databus,#00000001b
clr en
lcall check_busy_lcd
setb EN
CLR RS
CLR RW
MOV databus,#00000010b
clr en
lcall check_busy_lcd
setb EN
CLR RS
CLR RW
MOV databus,#00000011b
clr en
lcall check_busy_lcd
Ret
pos_character_lcd:
inc count_lcd
mov a,count_lcd
cjne a,#16,End_lcd
mov count_lcd,#40h
mov a,count_lcd
ljmp write_pos_lcd
End_lcd:
cjne a,#50,write_pos_lcd
mov count_lcd,#00
mov a,count_lcd
ljmp write_pos_lcd
write_pos_lcd:
orl a,#10000000b
setb en
clr rs
clr rw
mov databus,a
clr en
lcall check_busy_lcd
nop
ret
check_busy_lcd:
setb en
clr rs
setb rw
mov databus,#0FFh ; thiet lap che do mam hinh 8 bit,2 line
mov a,databus
clr en
jb acc.7,check_busy_lcd
ret
CLEAR_LCD: ;Chuong trinh xoa man hinh
Setb EN
Clr RS
clr rw
Mov DATABUS,#02H ;Dua con tro ve dau dong
Clr EN
lcall check_busy_lcd
Setb EN
Clr RS
clr rw
Mov DATABUS,#01H ;Lenh xoa man hinh
Clr EN
lcall check_busy_lcd
mov count_lcd,#00
Ret
WRITE_TEXT: ;Chuong tring ghi ky tu vao LCD
Setb EN
Setb RS
clr rw
Mov DATABUS,A
Clr EN
Lcall check_busy_lcd
lcall pos_character_lcd
Ret
write_string_lcd:
lcall clear_lcd
mov r6,#00h
loop_write_text:
mov a,r6
movc a,@a+dptr
cjne a,#01,next_character
ret
next_character:
lcall write_text
inc r6
ljmp loop_write_text
;***************************************************
; IC2
;***************************************************
POOL_WRITE_24:
MOV CHECKDATA,RWDATA
RWRITE: MOV RWDATA,CHECKDATA
LCALL WRITE_24
LCALL READ_24
MOV A,RWDATA
CJNE A,CHECKDATA,RWRITE
RET
WRITE_24: ;CHUONG TRING GHI IC
LCALL START_24
MOV A,ADDHI ;CHUYEN DIA CHI CAO VA A
RL A ;XOAY A DE CHO RW=0 (CHE DO GHI)
ORL A,#0D0H
LCALL SENDB_24
LCALL ACK_24
MOV A,ADDLO ;CHUYEN DI CHI BYTE CAO
LCALL SENDB_24
LCALL ACK_24
MOV A,RWDATA ;CHUYEN DU LIEU CHUAN BI GHI
MOV CHECKDATA,A
LCALL SENDB_24
LCALL ACK_24
LCALL STOP_24
RET
READ_24:LCALL START_24 ;CHUONG TRINH DOC IC
MOV A,ADDHI ;CHUYEN DIA CHI BYTE CAO
RL A ;GHI VAO IC DE CHO BIET
ORL A,#0D0H
LCALL SENDB_24
LCALL ACK_24
MOV A,ADDLO ;CHUYEN DIA CHI BYTE THAP
LCALL SENDB_24 ;THIET LA DE CHO IC 24 BIET DIA CHO HIEN
LCALL ACK_24 ;TAI VOI ADDHI DIA CHI CAO , ADDLOW LAM
;DIA CHI BYTE THAP
LCALL START_24 ;BAT DU LAY DU LIEU THU IC
MOV A,ADDHI
RL A
ORL A,#0D1H ;RW=1 LAY DU LIEU TU IC
LCALL SENDB_24 ;GOI TIN HIEU DEN IC
LCALL ACK_24
LCALL READB_24
MOV RWDATA,A ;DU LIEU LAY RA DUOC LUU TRONG RAM
SETB SDA
LCALL CLOCK_24
LCALL STOP_24
RET
START_24:
SETB SDA
SETB SCL
CLR SDA
NOP
NOP
NOP
NOP
CLR SCL
RET
STOP_24:
CLR SDA
SETB SCL
NOP
NOP
NOP
NOP
SETB SDA
RET
CLOCK_24:
MOV C