Đồ án Lịch vạn niên dùng DS1307

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

 

doc54 trang | Chia sẻ: maiphuongdc | Lượt xem: 2020 | Lượt tải: 1download
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

Các file đính kèm theo tài liệu này:

  • docbaocaodoan2.doc
  • docBIAdoan2.doc
  • rarMACH.rar
  • rarTRUONG TRINH.rar