TÊN ĐỀ TÀI: ĐỒNG HỒ HIỂN THỊ THỜI GIAN THỰC TRÊN LCD CÓ HẸN GIỜ 1.Yêu cầu đề tài: - Sử dụng vi điều khiển 89C51 - Chương trình điều khiển có thể thay đổi được. 2. Nội dung cần hoàn thành: - Tính toán, lựa chọn các thông số kỹ thuật cho mạch - Chế tạo mô hình - Sản phẩm đáp ứng được yêu cầu mỹ thuật ,kỹ thuật - Quyển thuyết minh đề tài ,các bản vẽ, sơ đồ , mô tả đầy đủ nội dung đề tài. 3. Sản phẩm: - 01 cuốn thuyết minh. - Mô hình phần cứng. Giáo viên hướng dẫn :Đặng Văn Khanh. -Ngày giao đề tài: -Ngày hoàn thành:
Mục Lục
TÊN ÐỀ TÀI: ÐỒNG HỒ HIỂN THỊ THỜI GIAN THỰC TRÊN LCD 1
NHẬN XÉT CỦA GIÁO VIÊN HưỚNG DẪN 2
NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN 2
Mục Lục. 2
LỜI NÓI ÐẦU 2
CHƯƠNG I: GIỚI THIỆU ÐỀ TÀI. 2
1.1. Giới thiệu. 2
1.2. Sõ ðồ khối 2
1.3. Chức nãng các khối 2
CHƯƠNG II: GIỚI THIỆU PHẦN CỨNG 2
2.1. Sõ ðồ mạch. 2
2.2. Giới thiệu về các linh kiện trong mạch. 2
2.2.1. Giới thiệu chung về vi ðiều khiển AT98C51. 2
2.2.2. LCD 2
2.2.3. IC thời gian thực DS1307. 2
CHƯƠNG III: THIẾT KẾ CHÝÕNG TRÌNH 2
1.1. Mạch mô phỏng. 2
1.2. Thuật toán. 2
3.2. Chưong trình. 2
TỔNG KẾT 2
TÀI LIỆU THAM KHẢO 2
58 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 3471 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Đồng hồ hiển thị thời gian thực trên lcd có hẹn giờ, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
TÊN ĐỀ TÀI: ĐỒNG HỒ HIỂN THỊ THỜI GIAN THỰC TRÊN LCD
CÓ HẸN GIỜ
1.Yêu cầu đề tài:
- Sử dụng vi điều khiển 89C51
- Chương trình điều khiển có thể thay đổi được.
2. Nội dung cần hoàn thành:
- Tính toán, lựa chọn các thông số kỹ thuật cho mạch
- Chế tạo mô hình
- Sản phẩm đáp ứng được yêu cầu mỹ thuật ,kỹ thuật
- Quyển thuyết minh đề tài ,các bản vẽ, sơ đồ ,…mô tả đầy đủ nội dung đề tài.
3. Sản phẩm:
- 01 cuốn thuyết minh.
- Mô hình phần cứng.
Giáo viên hướng dẫn :Đặng Văn Khanh.
-Ngày giao đề tài:
-Ngày hoàn thành:
NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN
……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………
Hưng Yên, Ngày….tháng….năm 2011 Giáo viên hướng dẫn
Đặng Văn Khanh
NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN
……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………
Hưng Yên, Ngày….tháng….năm 2011
Giáo viên phản biện
Mục Lục
LỜI NÓI ĐẦU
Ngày nay với sự phát triển không ngừng công nghệ khoa học kỹ thuật, việc ứng dụng các thành tựu khoa học vào cuộc sống ngày càng mạnh mẽ dần giải thoát lao động chân tay cho con người. Ngàng công nghệ kỹ thuật điện tử là một trong những ngành phát triển với tốc độ chóng mặt với rất nhiều ứng dụng rộng rãi trong cuộc sống hàng ngày. Từ hệ thống internet toàn cầu đến những dây chuyền sản xuất tự động hóa hiện đại và những thiết bị điện tử dân dụng rất tiện ích và đa dạng.
Sau một thời gian học tập trên giảng đường của trường Đại Học Sư Phạm Kỹ Thuật Hưng Yên,chúng em đã được tiếp cận với những kiến thức khoa học và công nghệ hiện đại. Cùng với kinh nghiệm thực tế, chúng em đã có cơ hội chuyển những kiến thức lý thuyết đã học được thành sản phẩm thực tế qua đề tài đồ án môn học tích hợp mức một ,với nội dung là “Hiển thị thời gian thực trên LCD có hẹn giờ”,dùng vi điều khiển.
Trong quá trình thực hiện đề tài nêu trên ,chúng em đã nhận được sự quan tâm và chỉ bảo tận tình của thầy Đặng Văn Khanh ,cùng với sự giúp đỡ của các thầy cô giáo trong khoa và bạn bè chúng em đã hoàn thành được sản phẩm của mình .
Song với khả năng được học tập nghiên cứu và tự nghiên cứu còn hạn chế về nội dung và kiến thức trong phạm vi đồ án ,sẽ không tránh khỏi những thiếu sót và hạn chế .Thông qua đồ án này ,chúng em rất mong được các thầy cô chỉ bảo thêm, để chúng em có điều kiện nâng cao trình độ ,hiểu biết cũng như kỹ năng của bản thân.Chúng em rất mong được tiếp thu những ý kiến đóng góp của các thầy cô!
Chúng em xin chân thành cảm ơn!
CHƯƠNG I: GIỚI THIỆU ĐỀ TÀI
1.1. Giới thiệu
Trong các ứng dụng dân dụng và công nghiệp, các bộ vi mạch vi điều khiển được ứng dụng rộng rãi và đã phát huy được tính năng ưu việt của nó và ngày càng được sử dụng rộng rãi. Việc sử dụng các bộ vi điều khiển để điều khiển các công việc mang tính lặp lại có chu kỳ là cần thiết để thay thế sự giám sát của con người. Ở đây em xin trình bày việc ứng dụng vi điều khiển để hiển thị, báo giờ thời gian thực trên LCD.
1.2. Sơ đồ khối
KHỐI HIỂN THỊ
KHỐI VI ĐIỀU KHIỂN
CHUÔNG BÁO
KHỐI THỜI GIAN THỰC
KHỐI HIỆU CHỈNH
1.3. Chức năng các khối
+ Khối điều chỉnh gồm 4 nút nhấn để đặt, hiệu chỉnh và hẹn thời gian.
+ Khối hiển thị là LCD.
+ Khối điều khiển sử dụng vi điều khiển AT89C51 điều khiển toàn bộ các hoạt động chính của mạch : nhận tín hiệu điều khiển của khối điều chỉnh và tìn hiệu của từ con thời gian thực xuất ra khối hiển thị và chuông báo.
+ Khối chuông báo là một chuông hoặc còi điện để báo hẹn giờ.
+ Khối thời gian thực là DS1307.
CHƯƠNG II: GIỚI THIỆU PHẦN CỨNG
Sơ đồ mạch
Mạch nguồn
Hình 2.1: Sơ đồ nguyên lý mạch nguồn
Mạch điều khiển
Hình 2.2: Sơ đồ nguyên lý mạch điều khiển
Mạch Hiển Thị:
Hình 2.3: Sơ đồ nguyên lý mạch hiển thị
Giới thiệu về các linh kiện trong mạch
Giới thiệu chung về vi điều khiển AT98C51
AT89C51 là vi điều khiển do Atmel sản xuất, chế tạo theo công nghệ CMOS có các đặc tính như sau:
-4 KB PEROM (Flash Progarammable and Erasable Read Only Memory), có khả năng tới 1000 chu kỳ ghi xóa.
-Tần số hoạt động từ :0Hz đến 24 MHZ
- 3 mức khóa bộ nhớ lập trình
-128 Byte RAM nội
-4 Port xuất /nhập I/O 8 bit
-2 bộ Timer /counter 16 bit
-6 nguồn ngắt
-Giao tiếp nối tiếp với điều khiển bằng phần cứng
-64 KB vùng nhớ mã ngoài
-64 vùng nhớ dữ liệu ngoài
- Cho pháp xử lý bit.
-210 vị trí nhớ có thể định vị bit.
-4 chu kỳ máy (4 µs đối với thạch anh 12MHz) cho hoạt động nhân hoặc chia.
- Có các chế độ nghỉ (Low-power Idle) và chế độ nguồn giảm (Power-down).
Sơ đồ khối:
Hình 2.4: Sơ đồ khối VĐK 89C51
Sơ đồ chân tín hiệu của 80C51 và 89C51:
1 40
2 39
3 38
4 37
5 36
6 35
7 34
8 33
9 32
10 31
11 30
12 29
13 28
14 27
15 26
16 25
17 24
18 23
19 22
20 21
P1.0 --
P1.1--
P1.2--
P1.3--
P1.4--
P1.5--
P1.6--
P1.7--
RST--
(RxD) P3.0--
(TxD) P3.1--
(/INT0) P3.2--
(/INT1) P3.3--
(T0) P3.4--
(T1) P3.5--
(/Wr) P3.6--
(/Rd) P3.7--
XTAL2--
XTAL1--
GND--
--Vcc
--P0.0 (AD0)
--P0.1 (AD1)
--P0.2 (AD2)
--P0.3 (AD3)
--P0.4 (AD4)
--P0.5 (AD5)
--P0.6 (AD6)
--P0.7 (AD7)
--/EA/Vpp
--ALE/(/PROG)
--/PSEN
--P2.7 (A15)
--P2.6 (A14)
--P2.5 (A13)
--P2.4 (A12)
--P2.3 (A11)
--P2.2 (A10)
--P2.1 (A9)
--P2.0 (A8)
Hình 2.5: Sơ đồ chân của vi điều khiển
Chức năng của các chân như sau:
+ Port 0 (chân 32-39) có 2 chức năng:
Chức năng IO (xuất /nhập): Dùng cho các thiết kế nhỏ .Tuy nhiên ,khi dung chức năng này thì Port 0 phải dung thêm các điện trở kéo (Pull –up), giá trị của điện trở phụ thuộc vào thành phần kết nói với Port 0
Khi dùng làm ngõ ra, Port 0 có thể kéo được 8 ngõ TTL. Khi dùng làm ngõ vào, Port 0 phải được set mức logic 1 trước đó.
Chức năng địa chỉ / dữ liệu đa hợp: khi dùng các thiết kế lớn, đòi hỏi phải sử dụng bộ nhớ ngoài thì Port 0 vừa là bus dữ liệu (8 bit) vừa là bus địa chỉ(8 bit thấp).
Ngoài ra khi lập trình cho AT89C51, Port 0 còn dùng để nhận mã khi lập trình và xuất mà khi kiểm tra (quá trình kiểm tra đòi hỏi phải có điện trở kéo lên).
+ Port1 (chân 1 – 8) chỉ có một chức năng là IO, không dùng cho mục đích khác (chỉ trong 8032/8052/8952 thì dùng thêm P1.0 và P1.1 cho bộ định thời thứ 3). Tại Port 1 đã có điện trở kéo lên nên không cần thêm điện trở ngoài.
Port 1 có khả năng kéo được 4 ngõ TTL và còn dùng làm 8 bit địa chỉ thấp trong quá trình lập trình hay kiểm tra.
Khi dùng làm ngõ vào, Port 1 phải được set mức logic 1 trước đó.
+ Port 2 (chân 21 – 28) là port có 2 chức năng:
Chức năng IO (xuất / nhập): có khả năng kéo được 4 ngõ TTL.
Chức năng địa chỉ: dùng làm 8 bit địa chỉ cao khi cần bộ nhớ ngoài có địa chỉ16 bit. Khi đó, Port 2 không được dùng cho mục đích IO.
Khi dùng làm ngõ vào, Port 2 phải được set mức logic 1 trước đó.
Khi lập trình, Port 2 dùng làm 8 bit địa chỉ cao hay một số tín hiệu điều khiển.
+ Port 3 (chân 10 – 17) là port có 2 chức năng:
Chức năng IO: có khả năng kéo được 4 ngõ TTL.
Khi dùng làm ngõ vào, Port 3 phải được set mức logic 1 trước đó.
Chức năng khác: mô tả như bảng dưới đây
Bảng 2.1: Chức năng chân Port 3
Nguồn: Chân 40: VCC = 5V± 20%
Chân 20: GND
PSEN (Program Store Enable) (chân 29): Cho phép đọc bộ nhớ chương trình mở rộng đối với các ứng dụng sử dụng ROM ngoài, thường được nối đến chân OC (Out put Control) của ROM đểđọc các byte mã lệnh. PSEN sẽ ở mức logic 0 trong thời gian AT89C51 lấylệnh.Trong quá trình này, PSEN sẽ tích cực 2 lần trong 1 chu kỳ máy.
Mã lệnh của chương trình được đọc từ ROM thông qua bus dữ liệu (Port0) và bus địa chỉ (Port0 + Port2).
Khi 8951 thi hành chương trình trong ROM nội, PSEN sẽ ở mức logic 1.
ALE/ PROG (Address Latch Enable / Program) (chân 30): Cho phép tách các đường địa chỉ và dữ liệu tại Port 0 khi truy xuất bộ nhớ ngoài. ALE thường nối với chân Clock của IC chốt (74373,74573).
Các xung tín hiệu ALE có tốc độ bằng 1/6 lần tần số dao động trên chip và có thể được dùng làm tín hiệu clock cho các phần khác của hệ thống. Xung này có thể cấm bằng cách set bit 0 của SFR tại địa chỉ 8Eh lên 1. Khi đó, ALE chỉ có tác dụng khi dùng làm ngõ vào xung lập trình cho ROM nội ( PROG ).
EA/VPP (External Access) (chân 31): Dùng để cho phép thực thi chương trình từ ROM ngoài. Khi nối chân 31 với Vcc, AT89C51 sẽ thực thi chương trình từ ROM nội (tối đa 8KB),ngượclại thì thực thi từ ROM ngoài (tối đa 64KB). Ngoài ra chân EA được lấy làm chân cấp nguồn 12V lập trình cho ROM.
RST (chân 9): Cho phép reset AT89C51 khi ngõ vào tín hiệu đưa lên mức “1” trong ít nhất là 2 chu kỳ máy.
X1,X2(Chân 18.19): Ngõ vào và ngõ ra bộ dao động, khi sử dụng có thể chỉ cần kết nối thêm thạch anh và các tụ như hình vẽ trong sơ đồ. Tần số thạch anh thường sử dụng cho AT89C51 là 12Mhz.
Hình 2.6: Sơ đồ kết nối thạch anh
2.2.2. LCD
Cấu trúc cơ bản của LCD:
+ Cấu Tạo: Tính chất quang học của các tinh thể lỏng chúng được sử dụng trong các hiển thị LCD (Liquid Crystal Display) .Các tinh thể bình thường chúng ở thể rắn với sự định hướng đặc biệt . Tuy nhiên ở đây các thẻ lỏng được cấu trúc từ các tinh thể động. Các tinh thể này có thể điều chỉnh bởi một điện trường đây là một cách để điều khiển chất lỏng thay đổi từ trong suốt đến trạng thái mờ đục(Chắn sáng). Sơ đồ cấu trúc cơ bản của LCD như hình dưới:
Hình 2.7: Sơ đồ cấu trúc của LCD
+ Nguyên Lý:
Tinh thể lỏng thì được chứa giữa hai tấm thủy tinh.Các điện cực chúng được làm bay hơi và nắng đọng lên bên trong của các tấm thủy tinh,các điện cực thì được cách li bởi tinh thể lỏng.Các tấm lọc phân cực sáng thì nằm bên ngoài trên tấm thủy tinh.Có thể phụ thuộc vào vị trí của mặt phẳng phân cực ,mà ánh sáng tới đi qua các điện cực có thể lọt qua tế bào hoặc không.Tương ứng với mặt phẳng phân cực, tế bào không được điều khiển xuất hiện hoàn toàn sáng hoặc tối.Ngày nay,hiển thị LCD được chế tạo chủ yếu là sáng khi không có điều khiển.Để hiển thị các hệ thống chữ số hoặc ma trận điểm,thì các điện cực phải được chế tạo theo dạng như vậy. Nếu một điện áp được cung cấp cho các điện cực và một điện trường sẽ được tạo ra giữa các điện cực ,các phân tử của tinh thể lỏng được điều chỉnh .Những ảnh tối tương ứng với hình dạng của điện cực được tạo ra trong trường hợp màn hình hoàn toàn trong suốt ,trong lúc đó những ảnh được tạo ra trong trường hợp màn hình hiển thị ở trạng thái cực mờ(chắn sáng:Ảnh trắng nền đen). Màn hình hiển thị LCD vì vậy không phát sáng, do đó một nguồn sáng bên ngoài thì luôn cần phải có. Với vấn đề chiếu sáng của màn hình LCD ,có 3 cách khác nhau:
-Chế độ phản chiếu(Reflective Mode).
Trong chế độ này ánh sáng được chiếu tới từ phía trước của màn hình qua các tấm lọc phân cực và điện cực rồi gặp đến gương(Mirror) phản xạ trở lại tạo nguồn sáng xuyên qua màn hình đến mắt người.Trong trường hợp này ánh sáng ban ngày hoặc ánh sáng trong phòng cũng đủ để làm nguồn sáng.
-Chế độ xuyên thẳng(Transflective Mode).
Trong chế độ này ánh sáng được chiếu từ phía trước và phía sau của màn hình để tăng hiệu quả chiếu sáng. Gương phản xạ được sử dụng ở đây là một lớp bán dẫn trong suốt chỉ cho ánh sáng từ phía sau đi qua và ánh sáng từ phía trước tới.
-Chế độ truyền(Transmission Mode).
Trong chế độ này ánh sáng được chiếu từ phía saucuar màn hình bằng một nguồn sáng nhân tạo có thẻ là một bóng đèn hoặc LED thậm chí là một miếng phát sáng đặc biệt.
Tùy theo nhà sản xuất và loại LCD mà nguồn cung cấp từ 3 đến 15v.
Chúng được mô tả như hình vẽ dưới đây:
Hình 2.8: Các kiểu cấu trúc của màn hình LCD
Chức năng các chân:
Chân
Tên
Chức Năng
1
Vss
Chân nối đất cho LCD, khi thiết kế mạch ta nối chân này với GND của mạch điều khiển
2
Vdd
Chân cấp nguồn cho LCD, khi thiết kế mạch ta nối chân này với Vcc=5V của mạch điều khiển
3
Vee
Chân này dùng để điều chỉnh độ tương phản của LCD
4
RS
Chân chọn thanh ghi (Register select).
+ Logic “0”: Bus DB0-DB7 sẽ nối với thanh ghi lệnh IR của LCD (ở chế độ “ghi” - write) hoặc nối với bộ đếm địa chỉ của LCD (ở chế độ “đọc” - read)
+ Logic “1”: Bus DB0-DB7 sẽ nối với thanh ghi dữ liệu DR bên trong LCD.
5
RW
Chân chọn chế độ đọc/ghi (Read/Write). Nối chân R/W với logic “0” để
LCD hoạt động ở chế độ ghi, hoặc nối với logic “1” để LCD ở chế độ đọc.
6
E
Chân cho phép (Enable). Sau khi các tín hiệu được đặt lên bus DB0-DB7, các lệnh chỉ được chấp nhận khi có 1 xung cho phép của chân E.
+ Ở chế độ ghi: Dữ liệu ở bus sẽ được LCD chuyển vào(chấp nhận) thanh ghi bên trong nó khi phát hiện một xung (high-to-low transition) của tín hiệu chân E.
+ Ở chế độ đọc: Dữ liệu sẽ được LCD xuất ra DB0-DB7 khi phát hiện
cạnh lên (low- to-high transition) ở chân E và được LCD giữ ở bus đến khi nào chân E xuống mức thấp.
7 14
DB0- DB7
Tám đường của bus dữ liệu dùng để trao đổi thông tin với MPU. Có 2
chế độ sử dụng 8 đường bus này :
+ Chế độ 8 bit : Dữ liệu được truyền trên cả 8 đường, với bit MSB là bit
DB7.
+ Chế độ 4 bit : Dữ liệu được truyền trên 4 đường từ DB4 tới DB7, bit
MSB là DB7.
15,16
A,K
Đèn của LCD
2.2.3. IC thời gian thực DS1307
Chức năng các chân:
Hình 2.9: Sơ đồ chân DS1307
X1,X2: nối với thạch anh 32,768 kHz
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 5V đượ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 3V đượ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ị.
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.
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
SQW/OUT(square wave/output driver)- khi được kích hoạt thì bit SQWE được thiết lập, 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.
Một vài thông số kỹ thuật:
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 gianvà ngày tháng với 56 bytes NV 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ó 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:
Hình 2.10: Sơ đồ khối của DS1307
Địa chỉ Ram và RTC: 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.
Bảng 2.2: Bảng địa chỉ RAM
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).
+ OUT(output control): Bit này điều khiển mức ra của chân SQW/OUT khi đầu raxung vuông bị cấm. 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ẽ cho phép đầ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.
Hoạt động:
DS1307 hỗ trợ truyền dữ liệu bus 2 dây 2 chiều. Một thiết bị gửi dữ liệu lên đường truyền được định nghĩa như là 1 máy phát và một thiết bị nhận dữ liệu như là máy nhận. Thiết bị điều khiển thông điệp gọi là Master. Thiết bị được điều khiển bởi Master được gọi là Slaver. Đường truyền (Bus) phải được điều khiển bởi thiết bị master mà phát ra xung nối tiếp (Serial Clock_SCL) điều khiển sự truy cập đường truyền và phát ra điều kiện bắt đầu, dừng (Start ,Stop condition). DS1307 hoạt động như là Slave trên bus 2 dây.
Hình 11: Cấc hình bus 2 dây điển hình
Việc truyền dữ liệu chỉ có thể được bắt đầu khi bus không bận
Trong lúc truyền dữ liệu, đường dữ liệu phải ổn định bất cứ khi nào đường Clock là cao (High). Do đó, các điều kiền về đường truyền sau được định nghĩa:
Bus not busy:cả đường dữ liệu và xung đều ở mức cao (High)
Start data transfer: một sự thay đổi trong trang thái của đường dữ liệu từ HIGH - LOW trong khi xung clock vẫn cao (H), đây là điều kiện bắt đầu (Start Condition).
Stop data transfer: một sự thay đổi trong trang thái của đường dữ liệu từ LOW - HIGH trong khi xung clock vẫn cao (H), đây là điều kiện dừng (Stop
Condition) .
Data valid: trạng thái của đường dữ liệu biểu diễn dữ liệu hợp lệ khi mà : sau điều kiện Start đường dữ liệu ổn định trong khoảng thời gian chu kỳ cao (HIGH) của tín hiệu clock. Dữ liệu trên đường phải thay đổi trong chu kỳ thấp (LOW) của tín hiệu clock. Có 1 xung clock/ 1 bit dữ liệu. Mỗi dữ liệu truyền đi với điều kiện Start và kết thúc với điều kiện Stop. Số byte dữ liệu
truyền giữa điều kiện Start và Stop là không giới hạn và được quyết định bởi thiết bị master. Sau khi một byte được truyền thì được báo nhận ở bộ thu với bit thứ 9.
Acknowledge: Mỗi thiết bị nhận khi được định địa chỉ thì phải phát ra tín hiệu báo nhận sau khi nhận mỗi byte. Thiết bị master phải phat ra thêm 1 xung clock để ghép với bit báo nhận này. Thiết bị báo nhận phải kéo đường SDA xuống trong suốt xung clock báo nhận như là cách mà đường SDA ổn định thấp trong chu kỳ High của xung clock báo nhận. Dĩ nhiên, thời gian thiết lập và thời gian giữ (chờ) phải được tính toán đến. Master phải báo hiệu kết thúc dữ liệu đến Slave bằng cách không phát ra một bit báo nhận trên byte cuối cùng mà được ghi vào Slave. Trong trường hơp này, Slave phải để đường dữ liệu ở mức cao (H) để cho phép Master phát ra điều kiện STOP.
Hai chế độ hoạt động của DS1307:
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.
CHƯƠNG III: THIẾT KẾ CHƯƠNG TRÌNH
Mạch mô phỏng
Thuật toán
Đ
S
OUT_CMD
A=[0]
A=@A+DPTR
A=END_SIG
CMD
DPTR++
RET
S
Đ
Check BF
RS=[0]
RW=[1]
LCD_PORT=#0FFH
E=[1]
E=[0]
RET
BF=[1]
DTA
E=[0]
E=[1]
RS=[1]
RW=[0]
LCD_PORT=A
BF=[1]
RET
S
Đ
RS=[0]
RW=[0]
LCD_PORT=A
E=[0]
E=[1]
BF=[1]
RET
CMD
Đ
S
EX1ISR
ALARM_FLAG
A_RING=[0]
ALARM_FLAG=[0]
ALARM_PORT=[1]
A_RING=[0]?
ALARM OFF
RET
HEX_DEC
B=[10H]
A\B
70H=B
B=[0AH]
RET
A.B
A=A+70H
STO_COND
SDA=[0]
SDA=[1]
_2W_BUSY=[1]
RET
SCL_HIGH
No
Yes
Đ
SDA=[0]
RET
STA_COND
_2W_BUSY=[1]
ACK=[0]
SDA=[1]
SCL_HIGH
HOLD
SCL=[0]
DELAY 5Oms
PUSH ms
TIMER 0,MODE 1
TH 0=#HIGH(50000)
TL 0=#LOW(50000)
TRO=[1]
TRO=[0]
TF0=[0]
ms--
TF0=0?
PUSH ms
RET
ms=0?
No
Yes
No
Yes
Yes
No
Yes
Yes
Noo
No
A_Hour
=
Hour
?
Yes
_
A
Min
=
Minute
?
N
DISP_RTC
Đặt Vị Trí Con trỏ
Hiển Thị Thời Gian
Alarm_ON=1?
A_Ring = 0
A_Ring = 1
RET
A_Min = Minute?
A_Hour = Hour?
A&0FH
A=A+[30H]
A=A+[30H]
POP ACC
PUSH ACC
A & OFH
DTA
DTA
POP ACC
RET
DISP_VAL
PUSL ACC
SWAP A
2
1
4
3
1
4
3
2
Chương trình
$include(reg51.inc)
E bit p1.0
RW bit p1.1
RS bit p1.2
SCL bit p3.0
SDA bit p3.1
Time_Key bit p3.2
Alarm_Key bit p3.3
Down bit p3.4
Up bit p3.5
Alarm_Port bit p3.7 ;Noi den coi bip
BF bit p2.7
Lcd_Port equ p2
Flag data 20h
Last_Read bit Flag.0
Mode_12 bit Flag.1
Mode_AM bit Flag.2
Ack bit Flag.3
_2W_Busy bit Flag.4
OSC bit Flag.5
Time_flag bit Flag.6
Alarm_FLag bit Flag.7
Alarm_On bit 08h
Alarm_ring bit 09h
Byte_Count data 30h
Second data 28h
Minute data 29h
Hour data 2Ah
Day data 2bh
Date data 2ch
Month data 2dh
Year data 2eh
Sig data 2Fh
A_hour data 50h
A_Minute data 31h
DS1307W equ 0D0h
DS1307R equ 0D1h
End_Sig equ 11010000b ;dau hieu bao ket thuc chuoi lenh
;hoac chuoi cac ki tu hien thi
Mode8Bit equ 38h ;2 hang, ma tran 5x7
Disp_Off equ 08h ;Tat hien thi, DDR khong bi anh huong
Disp_On equ 0Ch ;bat hien thi
Cursor_On equ 0Eh ;Bat hien thi, bat con tro
Disp_All equ 0Fh ;Bat hien thi, bat con tro, bat nhap nhay
Clr_Disp equ 01h ;xoa DDR, AC=1, tat hien thi
Cursor_Home equ 03h ;AC=0
;============Thiet lap che do====================
Inc_Ctrl equ 06h ;Tang AC moi khi co hoat dong doc, ghi toi
LCD
Dec_Ctrl equ 04h ;Giam AC moi khi co hoat dong doc, ghi toi
LCD
L_Ctrl equ 07h ;Dich trai DDR moi khi co hoat dong doc,
; ghi toi LCD
R_Ctrl equ 05h ;Dich phai DDR moi khi co hoat dong doc,
; ghi toi LCD
;========Dich con tro va hien thi====
L_Cur equ 10h ;Giam AC, dich con tro sang trai
R_Cur equ 14h ;Tang AC, dich con tro sang phai
L_Disp equ 18h ;Dich toan bo DDR, hien thi sang trai,
;con tro cung dich theo
R_Disp equ 1Ch ;Dich toan bo DDR, hien thi
; sang phai, con tro cung dich theo
Org 00h
jmp Main
Org 03h
Setb Time_Flag ;Ngat ngoai 0, chinh gio
reti
Org 13h
jmp EX1ISR
;----------CHUONG TRINH CHINH---------------------------
Org 30h
Main: ; Chuong trinh chinh
mov ie,#85h ;Cho phep ngat ngoai 0 va ngat ngoai 1
mov r2,#01h
call delayms
mov dptr,#Ready ;Khoi tao LCD, 8bit, bat hien thi
call Out_Cmd
mov dptr,#CGRAM
call Out_Cg
mov r2,#15
mov dptr,#Mes1
call Out_Str
call delayms
mov a,#0C1h
call Cmd
mov a,#01h
call Cmd
mov dptr,#Mes2
call Out_Str
mov a,#0C1h
call Cmd
mov dptr,#Mes3
call Out_Str
mov r2,#1
call Delayms
mov a,#Clr_Disp
call Cmd
mov r2,#01h
clr Time_Flag
clr Alarm_Flag
clr Alarm_ON
clr Alarm_ring
setb Alarm_Port
mov a_hour,#00h
mov a_Minute,#00h
call Sta_Cond
mov a,#DS1307W
call Send
mov a,#08h
call send
call Sto_Cond
call Sta_cond
mov a,#DS1307R
call Send
call recv
call Sto_Cond
cjne a,#'~',done
sjmp Read_Clock
done:
mov a,#01h
call Cmd
mov Second,#00h
mov Minute,#0
mov Hour,#10h
mov day,#06h
mov date,#12h
mov month,#06h
mov year,#09h
mov sig,#'~'
mov r1,#second
mov r0,#00h
kk:
mov a,#DS1307W
call Send
mov a,r0
mov a,@r1
call Send
inc r1
inc r0
call Sto_Cond
cjne r0,#9,kk
call Sto_Cond
;---Doc va hien thi dong ho---------------------------------------------
Read_Clock:
mov r1,#28h ;bat dau cua vung nho tam ma doc duoc tu DS1307
mov byte_count,#00h ;dem so byte
clr Last_Read
call Sta_cond
mov a,#DS1307W
call Send
mov a,#00h ;tro den thanh ghi 00h chua DS1307
call Send
call Sto_cond
call Sta_cond
mov a,#DS1307R
call Send
Read_Loop:
mov a,byte_count ;kiem tra xem phai byte cuoi cung chua
cjne a,#07h,No_Last
setb Last_Read
No_Last:
call Recv
call Sto_Cond
mov @r1,a
mov a,byte_count
cjne a,#00h,Not_First ;nhay neu khong phai dang doc
;thanh ghi dau tien
clr OSC
mov a,@r1
jnb acc.7,Not_First ;neu bit 7 la 1, co OSC=1
setb OSC
clr ACC.7
mov @r1,a
Not_First:
inc r1
inc byte_count
mov a,byte_count
cjne a,#08h,Read_Loop
call Sto_Cond
call Disp_RTC
jnb Time_Flag,Check2
clr EA
clr Time_Flag
call Set_time
clr Time_Flag
setb EA
jmp Read_Clock
Check2:
jnb Alarm_Flag,Check3
clr Alarm_Flag
setb Alarm_On
call Set_Alarm
jnb Alarm_on,Check3
mov dptr,#ready
call Out_Cmd
mov dptr,#D_A_ok
call Out_STr
mov a,#0C5h
call Cmd
mov a,a_Hour
call Disp_Val
mov a,#':'
call Dta
mov a,A_Minute
call Disp_Val
push 2
mov r2,#50
call Delayms
pop 2
mov a,#01h
call Cmd
setb ea
jmp Read_Clock
Check3: ;kiem tra den gio hen thi do chuong
jnb Alarm_Ring,aa
call Alarm_Alarm
aa: jmp Read_Clock
EX1ISR:
Setb Alarm_Flag ;Ngat ngoai 1, chinh gio
jnb Alarm_ring,ii
setb Alarm_port
mov a,#01h
call Cmd
mov dptr,#D_No_Alarm
call Out_Str
mov r2,#50
call Delayms
mov a,#01
call Cmd
mov r2,#01
clr Alarm_on
clr alarm_ring
clr Alarm_Flag
ii: reti
;----Cai dat thoi gian------------------------------------
Set_Time:
call Bip
jnb Time_Key,$
mov a,#Clr_Disp
call Cmd
mov r2,#01h
mov dptr,#M_Set_Time
call Out_Str
mov r2,#50
call Delayms
Set_Hour:
mov a,#Clr_Disp
call Cmd
mov r2,#01h
mov dptr,#M_Set_Hour
call Out_Str
mov a,#0C7h
call Cmd
mov a,hour
anl a,#3Fh ;che do 24h
mov r4,a
call Disp_Val
L_Set_hour1:
mov a,#0c7h
call cmd
mov a,r4 ;lay so gio
call hex_dec
jb Up,Ch_Down_31
call Bip
call De_bounce
inc a
cjne a,#24,Conti_31
mov a,#00
Conti_31:
call Dec_Hex
call Disp_Val
mov r4,a
jmp L_Set_Hour1
Ch_Down_31: ;kiem tra nhan phim DOWN
jb Down,Ch_Time_key_31
call Bip
call De_bounce
dec a
cjne a,#0FFh,Conti_31 ;Tiep tuc giam neu gio chua ve 0
mov a,#23
jmp Conti_31
Ch_Time_Key_31:
jb Time_Key,Ch_Alarm_Key_31
call Bip
call De_bounce
call dec_hex ;dua tro ve lai ma BCD de dua vao thanh ghi
mov Hour,a
jmp Set_Minute
Ch_Alarm_Key_31:
jb Alarm_Key,L_Set_Hour1
call Bip
call De_Bounce
call dec_hex ;dua tro ve lai ma BCD de dua vao thanh ghi
mov Hour,a
jmp Set_Finish
;------------------ Set phut (minute) ---------------------------------------------
Set_Minute:
mov dptr,#Clear
call Out_Cmd
mov r2,#01h
mov dptr,#M_Set_Minute
call Out_Str
mov a,#0c7h
call Cmd
mov a,Minute
push acc
call Disp_Val
pop acc
call Hex_Dec
L_Set_Minute:
push acc
mov a,#0c7h
call cmd
pop acc
jb up,Ch_Down_8
call Bip
call De_bounce
inc a
cjne a,#60,Conti_8
mov a,#00
Conti_8:
call Dec_Hex
call Disp_Val
call Hex_Dec
jmp L_Set_Minute
Ch_Down_8:
jb Down,Ch_Time_Key_8
call Bip
call De_bounce
dec a
cjne a,#0FFh,Conti_8
mov a,#59
jmp Conti_8 ;vi khi da nhan phim tang hoac giam
;thi deu hien thi giong nhau
Ch_Time_Key_8:
jb Time_Key,Ch_Alarm_Key_8
call Bip
call De_Bounce
call Dec_Hex
mov Minute,a
jmp Set_Second
Ch_Alarm_Key_8:
jb Alarm_Key,L_Set_Minute
call Bip
call De_bounce
call Dec_Hex
mov Minute,a
jmp Set_Finish
;------- Set giay (Second) ----------------------------------------------------
Set_Second:
mov dptr,#Clear
call Out_Cmd
mov r2,#01h
mov dptr,#M_Set_Second
call Out_Str
mov a,#0c7h
call Cmd
mov a,Second
push acc
call Disp_Val
pop acc
call Hex_Dec
L_Set_Second:
push acc
mov a,#0c7h
call cmd
pop acc
jb up,Ch_Down_9
call Bip
call De_bounce
inc a
cjne a,#60,Conti_9
mov a,#00
Conti_9:
call Dec_Hex
call Disp_Val
call Hex_Dec
jmp L_Set_Second
Ch_Down_9:
jb Down,Ch_Time_Key_9
call Bip
call De_bounce
dec a
cjne a,#0FFh,Conti_9
mov a,#59
jmp Conti_9
Ch_Time_Key_9:
jb Time_Key,Ch_Alarm_Key_9
call Bip
call De_Bounce
call Dec_Hex
mov Second,a
jmp Set_Day
Ch_Alarm_Key_9:
jb Alarm_Key,L_Set_Second
call Bip
call De_bounce
call Dec_Hex
mov Second,a
jmp Set_Finish
;-------------------------Day (thu)------------------------------------------------
Set_Day:
mov dptr,#Clear
call Out_Cmd
mov r2,#01h
mov dptr,#M_Set_Day
call Out_Str
mov a,#0C5h
call Cmd
mov a,Day
call Disp_Day
L_Set_Day:
Push acc
mov a,#0C5h
call Cmd
pop acc
jb Up,Ch_Down_4
call Bip
call De_bounce
inc a
cjne a,#8,Conti_41
mov a,#01
Conti_41:
call Disp_Day
jmp L_Set_Day
Ch_Down_4:
jb Down,Ch_Time_Key_4
call Bip
call De_Bounce
dec a
jnz Conti_42 ;Neu a #0 thi tiep tuc, con khong thi set a=7
mov a,#07
Conti_42:
call Disp_Day
jmp L_Set_Day
Ch_Time_Key_4:
jb Time_Key,Ch_Alarm_Key_4
call Bip
call De_bounce
call Dec_Hex
mov Day,a
jmp Set_date
Ch_Alarm_Key_4:
jb Alarm_Key,L_Set_Day
call Bip
call De_bounce
call Dec_Hex
mov Day,a
jmp Set_Finish
;------- Set ngay (date) ----------------------------------------------------
Set_Date:
mov dptr,#Clear
call Out_Cmd
mov r2,#01h
mov dptr,#M_Set_Date
call Out_Str
mov a,#0c7h
call Cmd
mov a,date
push acc
call Disp_Val
pop acc
call Hex_Dec
L_Set_Date:
push acc
mov a,#0c7h
call cmd
pop acc
jb up,Ch_Down_5
call Bip
call De_bounce
inc a
cjne a,#32,Conti_5
mov a,#1
Conti_5:
call Dec_Hex
call Disp_Val
call Hex_Dec
jmp L_Set_Date
Ch_Down_5:
jb Down,Ch_Time_Key_5
call Bip
call De_bounce
dec a
jnz Conti_5
mov a,#31
jmp Conti_5 ;vi khi da nhan phim tang hoac giam thi deu
;hien thi giong nhau
Ch_Time_Key_5:
jb Time_Key,Ch_Alarm_Key_5
call Bip
call De_Bounce
call Dec_hex
mov Date,a
jmp Set_month
Ch_Alarm_Key_5:
jb Alarm_Key,L_Set_Date
call Bip
call De_bounce
call Dec_hex
mov Date,a
jmp Set_Finish
;---------------------- Set thang (month)----------------------------------
Set_Month:
mov dptr,#Clear
call Out_Cmd
mov r2,#01h
mov dptr,#M_Set_Month
call Out_Str
mov a,#0c7h
call Cmd
mov a,Month
push acc
call Disp_Val
pop acc
call Hex_Dec
L_Set_Month:
push acc
mov a,#0c7h
call cmd
pop acc
jb up,Ch_Down_6
call Bip
call De_bounce
inc a
cjne a,#13,Conti_6
mov a,#1
Conti_6:
call Dec_Hex
call Disp_Val
call Hex_Dec
jmp L_Set_month
Ch_Down_6:
jb Down,Ch_Time_Key_6
call Bip
call De_bounce
dec a
jnz Conti_6
mov a,#12
jmp Conti_6 ;vi khi da nhan phim tang hoac giam
; thi deu hien thi giong nhau
Ch_Time_Key_6:
jb Time_Key,Ch_Alarm_Key_6
call Bip
call De_Bounce
call Dec_Hex
mov Month,a
jmp Set_year
Ch_Alarm_Key_6:
jb Alarm_Key,L_Set_Month
call Bip
call De_bounce
call Dec_Hex
mov Month,a
jmp Set_Finish
;----------------------- Set year------------------------------------------
Set_Year:
mov dptr,#Clear
call Out_Cmd
mov r2,#01h
mov dptr,#M_Set_Year
call Out_Str
mov a,#0c7h
call Cmd
mov a,Year
push acc
call Disp_Val
pop acc
call Hex_Dec
L_Set_Year:
push acc
mov a,#0c7h
call cmd
pop acc
jb up,Ch_Down_7
call Bip
call De_bounce
inc a
cjne a,#100,Conti_7
mov a,#0
Conti_7:
call Dec_Hex
call Disp_Val
call Hex_Dec
jmp L_Set_Year
Ch_Down_7:
jb Down,Ch_Time_Key_7
call Bip
call De_bounce
dec a
cjne a,#0FFH,Conti_7
mov a,#99
jmp Conti_7 ;vi khi da nhan phim tang hoac giam
; thi deu hien thi giong nhau
Ch_Time_Key_7:
jb Time_Key,Ch_Alarm_Key_7
call Bip
call De_Bounce
call Dec_Hex
mov Year,a
jmp Set_Finish
Ch_Alarm_Key_7:
jb Alarm_Key,L_Set_Year
call Bip
call De_bounce
call Dec_Hex
mov Year,a
jmp Set_Finish
;--- khi da thiet lap xong, ghi thoi gian vao cac thanh ghi--
Set_Finish:
call Sta_Cond
mov a,#DS1307W
call Send
mov a,#00h
call Send
mov r1,#second
Send_Set:
mov a,@r1
call Send
inc r1
cjne r1,#2Fh,Send_Set
call Sto_Cond
mov dptr,#clear
call Out_cmd
mov dptr,#Set_Ok
call Out_Str
mov r2,#50
call delayms
mov r2,#01
mov dptr,#clear
call Out_Cmd
ret
;----------- SET ALARM ---------------------------
Set_Alarm:
call Bip
clr EA ;cam ngat
clr Alarm_flag
mov dptr,#Ready
call Out_Cmd
mov r2,#01h
mov dptr,#M_Set_Alarm
call Out_Str
mov r2,#50
call Delayms
;------- Set gio hen ----------------------------------------------------
A_Set_hour:
mov A,#Clr_Disp
call Cmd
mov r2,#01h
mov dptr,#M_Set_Hour
call Out_Str
mov a,#0c7h
call Cmd
mov a,A_hour
call Disp_Val
call Hex_Dec
A_L_Set_Hour:
push acc
mov a,#0c7h
call cmd
pop acc
jb up,A_Ch_Down_7
call Bip
call De_bounce
inc a
cjne a,#24,A_Conti_7
mov a,#00
A_Conti_7:
call Dec_Hex
call Disp_Val
call Hex_Dec
jmp A_L_Set_Hour
A_Ch_Down_7:
jb Down,A_Ch_Alarm_Key_7
call Bip
call De_bounce
dec a
cjne a,#0FFh,A_Conti_7
mov a,#23
jmp A_Conti_7 ;vi khi da nhan phim tang hoac giam
; thi deu hien thi giong nhau
A_Ch_Alarm_Key_7:
jb Alarm_Key,A_Ch_Time_Key_7
call Bip
call De_Bounce
call Dec_Hex
mov A_Hour,a
jmp A_Set_Minute
A_Ch_Time_Key_7:
jb time_Key,A_L_Set_Hour
call Bip
call De_bounce
jmp Cancel
;------- Set phut (minute) ----------------------------------------------------
A_Set_Minute:
mov dptr,#Ready
call Out_Cmd
mov r2,#01h
mov dptr,#M_Set_Minute
call Out_Str
mov a,#0c7h
call Cmd
mov a,A_Minute
call Disp_Val
call Hex_Dec
A_L_Set_Minute:
push acc
mov a,#0c7h
call cmd
pop acc
jb up,A_Ch_Down_8
call Bip
call De_bounce
inc a
cjne a,#60,A_Conti_8
mov a,#00
A_Conti_8:
call Dec_Hex
call Disp_Val
call Hex_Dec
jmp A_L_Set_Minute
A_Ch_Down_8:
jb Down,A_Ch_Alarm_Key_8
call Bip
call De_bounce
dec a
cjne a,#0FFh,A_Conti_8
mov a,#59
jmp A_Conti_8 ;vi khi da nhan phim tang hoac giam
; thi deu hien thi giong nhau
A_Ch_Alarm_Key_8:
jb Alarm_Key,A_Ch_Time_Key_8
call Bip
call De_Bounce
call Dec_Hex
mov A_Minute,a
jmp return3
A_Ch_Time_Key_8:
jb time_Key,A_L_Set_Minute
call Bip
call De_bounce
;----------------------- Huy bo thiet lap hen gio---------------------------------
Cancel:
mov dptr,#ready
call Out_cmd
mov dptr,#D_No_Alarm
call Out_str
push 2
mov r2,#50
call delayms
pop 2
mov a,#01h
call Cmd
clr Alarm_on
clr Alarm_ring
setb ea
return3:
ret
;-------Chong nay phim-------------------------------------------
De_bounce:
push 2
mov r2,#10
call delayms
pop 2
ret
;--------------coi ---------------------------------------------------
alarm_alarm: ;Alarm Ring
clr alarm_port
mov r3,#0ffh
a_loop:
mov r4,#0ffh
djnz r4,$
djnz r3,a_loop
setb alarm_port
mov r3,#0ffh
a_loop1:
mov r4,#0ffh
djnz r4,$
djnz r3,a_loop1
clr alarm_port
mov r3,#0ffh
a_loop2:
mov r4,#0ffh
djnz r4,$
djnz r3,a_loop2
setb alarm_port
mov r3,#0ffh
a_loop3:
mov r4,#0ffh
djnz r4,$
djnz r3,a_loop3
clr alarm_port
mov r3,#0ffh
a_loop4:
mov r4,#0ffh
djnz r4,$
djnz r3,a_loop4
setb alarm_port
mov r3,#0ffh
a_loop5:
mov r4,#0ffh
djnz r4,$
djnz r3,a_loop5
clr alarm_port
mov r3,#0ffh
a_loop6:
mov r4,#0ffh
djnz r4,$
djnz r3,a_loop6
setb alarm_port
ret
;-----------Chuyen doi tu hexa sang dec-----------------------
Hex_Dec:
mov b,#10h
div ab
mov 70h,b
mov b,#0ah
mul ab
add a,70h
ret
;------Hien thi thu trong tuan-----------------
Disp_Day:
push acc
cjne a,#01,D_Mon
mov dptr,#Sun
call Out_Str
jmp exit
D_Mon:
cjne a,#02h,D_Tue
mov dptr,#Mon
call Out_Str
jmp exit
D_Tue:
cjne a,#03h,D_Wed
mov dptr,#Tue
call Out_Str
jmp exit
D_Wed:
cjne a,#04h,D_Thu
mov dptr,#Wed
call Out_Str
jmp exit
D_Thu:
cjne a,#05h,D_Fri
mov dptr,#Thu
call Out_Str
jmp exit
D_Fri:
cjne a,#06h,D_Sat
mov dptr,#Fri
call Out_Str
jmp exit
D_Sat:
mov dptr,#Sat
call Out_Str
Exit:
pop acc
ret
;----Hien thi gia tri thap phan voi so dua vao la ma BCD (lay tu DS1307)-
Disp_Val:
push acc
swap a
anl a,#0Fh
add a,#30h ;ki tu so tuong ung voi ma BCD
call Dta
pop acc
push acc
anl a,#0Fh
add a,#30h
call Dta
pop acc
ret
;------Gui du lieu tu VDK den DS1307 ---------
Send:
mov r7,#08 ;dem so bit
L_Send:
jnb acc.7,SDA_0 ;chuyen bit 7 cua thanh ghi A vao SDA
setb SDA
jmp Cont
SDA_0:
Clr SDA
Cont:
call SCL_High
rl A ;chuyen dan bit cao den thap
clr SCL
djnz r7,L_Send
setb SDA ;chot de doc xung bao nhan
call SCL_High
clr ACK
jnb SDA,Ack_0
setb ACK
ACK_0:
call Hold
clr Scl
call Hold
ret
;-----Nhan du lieu tu DS1307 -------
Recv:
mov r7,#08h
mov a,#00h
L_Recv:
call SCL_High
mov C,SDA ;dua gia tri doc duoc 0 SDA vao co Carry
rlc a
clr SCL
djnz r7,L_Recv
jb Last_Read,N_Send_ACK ;neu khong phai la lan doc cuoi cung
;thi gui bit bao nhan
clr SDA
N_Send_ACK:
call SCL_High
clr SCl
ret
;-------Dieu kien bat dau DS1307-------
Sta_Cond:
setb _2W_Busy
clr Ack
setb SDA
call SCL_High
clr SDA
call Hold
clr SCL
ret
;-------Dieu kien dung cua DS1307--------
Sto_Cond:
clr SDA
call SCL_High
setb SDA
clr _2W_Busy
ret
;-------thiet lap duong clock len bit cao-------------
SCL_High:
setb SCL
jnb SCL,$
ret
Out_Str: ;Xuat 1 chuoi ki tu ra man hinh LCD
mov a,#00h
movc a,@a+dptr
cjne a,#End_Sig,Next_Char ;Xuat den khi ket thuc chuoi
jmp return ;Tro lai chuong trinh
Next_Char:
call Dta ;Gui du lieu den LCD
push 2 ;Cat gia tri R2, so miligiay
call Delayms
pop 2
inc dptr
jmp Out_Str
Out_Cmd: ;Xuat 1 chuoi lenh den LCD
mov a,#00h
movc a,@a+dptr
cjne a,#End_Sig,Next_Cmd
jmp Return
Next_Cmd:
call cmd
inc dptr
jmp Out_Cmd
Out_Cg: ;Xay dung ki tu dac biet vao CGRAM
mov R6,#40h ;bat dau dia chi cua CGRAM tai 00h
CG:
mov a,r6
call cmd
inc r6
mov a,#00h
movc a,@a+dptr
cjne a,#End_Sig,Next_Cg
jmp return
Next_Cg:
call dta
inc dptr
jmp CG
Cmd: ;Xuat 1 lenh den LCD
call Check_BF
clr RS
clr RW
jmp Out
Dta: ;Xuat du lieu den LCD
call Check_BF
setb RS
clr RW
Out:
mov Lcd_Port,a
setb E
clr E
ret
Check_BF: ;Kiem tra co ban BF
clr RS
setb RW
mov Lcd_Port,#0FFh ;Chot de doc co ban
L_Check:
clr E
Setb E
jb BF,L_Check
Return:
ret
;-----Delay ms, so ms duoc dua vao R2 o chuong trinh chinh------------
Delayms:
push 2 ;Delay 50 ms
mov Tmod,#01h
L_Delay:
mov Th0,#High(50000)
mov Tl0,#Low(50000)
setb tr0
jnb tf0,$
clr tf0
djnz r2,L_Delay
clr tr0
pop 2
ret
;------Thoi gian giu giua cac hoat dong cua DS1307--------------
Hold:
nop
nop
nop
nop
ret
;---Xuat ra man hinh LCD du lieu nhan duoc tu LCD---------
Disp_RTC:
mov a,#80h ;dua con tro ve dau hang thu 1
call Cmd
mov r1,#2Bh ;thu (day)
mov a,@r1
call Disp_Day
mov a,#88h ;vi tri thu 9, hang 1
call Cmd
mov r1,#2Ch ;ngay
mov a,@r1
call Disp_Val
mov a,#'/'
call Dta
mov r1,#2Dh ;thang
mov a,@r1
call Disp_Val
mov a,#'/'
call Dta
mov a,year
call Disp_year
jnb Alarm_on,D_Next ;hien thi cai chuong neu co hen gio
mov a,#0C2h
call Cmd
mov a,#01h
call Dta
D_next:
mov a,#0C7h ;vi tri thu 8,hang 2
call Cmd
mov r1,#2Ah ;gio
mov a,@r1
call Disp_Hour
mov a,#':'
call Dta
mov r1,#29h ;phut
mov a,@r1
call Disp_Val
mov a,#':'
call Dta
mov r1,#28h ;giay
mov a,@r1
call Disp_Val
jnb Alarm_on,return4
mov a,A_hour
cjne a,hour,return4
mov a,A_minute
cjne a,Minute,return5
setb Alarm_ring
jmp return4
return5:
clr Alarm_ring
return4:
ret
;--------------Hien thi gio-----------------------
Disp_hour:
anl a,#3Fh
call Disp_Val
Ret
;------Chuyen doi tu Dec sang HEXA-----------------------
Dec_Hex:
mov b,#0ah
div ab
mov 70h,b
mov b,#10h
mul ab
add a,70h
ret
;-----Tao tieng Bip moi khi nhan phim---------------------
Bip:
push 2
mov r2,#01
clr alarm_port
call delayms
setb alarm_port
pop 2
ret
;-------Chuoi lenh va chuoi hien thi-------------------------
Ready: db Mode8Bit,Disp_On,Clr_Disp,End_Sig
Clear: db Clr_Disp,Disp_On,End_Sig
CGRAM: db 00h,0Eh,15h,1dh,11h,0eh,00,00 ;hinh dong ho
db 4h,0eh,0eh,0eh,1fh,0h,4h,0h ;hinh cai chuong
db 0h,1h,3h,16h,1ch,8h,0h,0h ;OK
db 1h,3h,0fh,0fh,0fh,3h,1h,0h ;SPEAKER OFF
db 8h,10h,0h,18h,0h,10h,8h,0h ;SPEAKER ON
db 0ah,1fh,1fh,1fh,0eh,4h,0h,0h ;hinh trai tim
db 2h,3h,2h,0eh,1eh,0ch,0h,0h,End_Sig ;MUSIC
Sun: db '',End_Sig
Mon: db '',End_Sig
Tue: db '',End_Sig
Wed: db '',End_Sig
Thu: db '',End_Sig
Fri: db '',End_Sig
Sat: db '',End_Sig
Mes1: db 'DO AN VDK',End_Sig
Mes2: db 'HOANG VAN NGAN',End_Sig
Mes3: db 'TRIEU VAN LUC',End_Sig
M_Set_time: db 0,'SET TIME !',End_Sig
M_Set_Second:
db 'SECOND =',End_Sig
M_Set_Minute:
db 'MINUTE =',End_Sig
M_Set_Hour:
db 'HOUR =',End_Sig
M_Set_Day: db 'DAY =',End_Sig
M_Set_Date: db 'DATE =',End_Sig
M_Set_Month:
db 'MONTH =',End_Sig
M_Set_Year:
db 'YEAR =',End_Sig
M_Set_Alarm:
db 1,' SET ALARM !',End_Sig
Set_ok: db 2,' SET TIME',End_sig
D_No_Alarm: db 2,' ALARM OFF',End_Sig
D_A_ok: db 2,' ALARM ON :',End_Sig
End
TỔNG KẾT
Ưu điểm: Sử dụng khối hiển thị LCD làm cho cấu trúc mạch đơn giản hơn, kết lối giữa các khối dễ dàng hơn so với hiển thị trên led 7 thanh.
Hiển thị trên LCD khả năng hiển thị phong phú và đa dạng hơn. Có thể hiển thị số, chữ, hình ảnh, đồ họa.
Sản phẩm được ứng dụng rất rộng rãi trong đời sống hàng ngày: Trong hệ thống đồng hồ số,hệ thống bơm nước tự động . . .
Hạn chế của đề tài: Do thời gian có hạn và kiến thức còn hạn chế nên mạch chỉ dừng lại ở mức độ hiển thị thời gian thực và hẹn giờ. Gía thành còn cao hơn so với thị trường.
Hướng phát triển đề tài: Tạo ra sản phẩm có nhiều tính năng hơn, như hiển thị ngày,tháng âm và nhiệt độ phòng.
Dưới sự hướng dẫn nhiệt tình của thầy giáo Đặng Văn Khanh và các thầy cô giáo trong khoa điện _điện tử, chúng em đã hoàn thành đồ án đúng tiến độ được giao và đúc kết được nhiều kinh nghiệm cho bản thân. Song do năng lực và thời gian có hạn không thể tránh khỏi thiếu xót rất mong nhận được những đóng góp từ quý thầy cô giáo và bạn đọc.
Chúng em xin chân thành cảm ơn!
TÀI LIỆU THAM KHẢO
Vi điều khiển lập trình và ứng dụng_ Kiều Xuân Thực
WWW.dientuvietnam.net
WWW.ebook.vn
Các file đính kèm theo tài liệu này:
- Đồng hồ hiển thị thời gian thực trên lcd có hẹn giờ.docx