Mục lục
Lời cảm ơn 1
Mục lục 2
DANH SÁCH BẢNG VẼ VÀ HÌNH 4
CHƯƠNG I : GIỚI THIỆU ĐỀ TÀI 5
1. Đặt vấn đề 6
2. Giải quyết vấn đề. 6
CHƯƠNG II : CƠ SỞ LÍ THUYẾT 11
1. Giới thiệu chung về VI ĐIỀU KHIỂN 12
1.1 Giới thiệu VI ĐIỀU KHIỂN 89C51 13
1.2 Tập lệnh AT89C51 21
2. Giới thiệu về IC DS1307 27
2.1 Giới thiệu chung DS 1307 28
2.2 Cơ chế hoạt động của DS1307. 29
2.3 Sơ đồ địa chỉ RAM và RTC. 32
2.4 Sự truyền dẫn dữ liệu trên chuỗi bus 2 dây: 34
2.5 DS 1307 có thể hoạt động ở 2 chế độ sau : 35
3. Giới thiệu về LED 7 đoạn 37
3.1 Hình ảnh Led 7 đoạn. 38
3.2 Cấu trúc và bảng mã hiển thị dữ liệu trên Led 7 đoạn. 39
4. Giới thiệu IC 74HC138. 43
4.1 Sơ đồ chân của IC 74HC138: 43
4.2 Chức năng của IC 74HC138. 44
CHƯƠNG III : THIẾT KẾ VÀ THI CÔNG PHẦN CỨNG 46
1. SƠ ĐỒ NGUYÊN LÍ 47
1.1 Sơ đồ mạch điều khiển. 47
1.2 Sơ đồ mạch hiển thị 49
1.3 Sơ đồ mạch nguồn 50
1.4 Mạch mô phỏng trên phần mềm Protues. 51
1.5 Mạch in được thiết kế trên Or cad 9.2 52
CHƯƠNG IV : LẬP TRÌNH ĐIỀU KHIỂN 53
1. Lưu đồ giải thuật 54
2. Code chương trình 56
CHƯƠNG V : KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 73
1. Kết luận : 74
2. Hướng phát triển: 74
3. Tài liệu tham khảo 75
76 trang |
Chia sẻ: lethao | Lượt xem: 7054 | Lượt tải: 2
Bạn đang xem trước 20 trang tài liệu Đồ án Thiết kế và thi công đồng hồ số dùng At89C51 và DS1307, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ên ở cực thu.
Ngoài ra Port 3 còn có các chức năng đặc biệt như sau :
Bảng 2.2 : chức năng đặc biệt của Port 3
Port Pin
Chức năng đặc biệt
P3.0
RXD (ngõ vào cổng nối tiếp)
P3.1
TXD (ngõ ra cổng nối tiếp)
P3.2
/INT0 (ngắt ngoài 0)
P3.3
/INT1 (ngắt ngoài 1)
P3.4
T0 (ngõ vào Timer 0)
P3.5
T1 (ngõ vào Timer 1)
P3.6
/WR (cho phép ghi dữ liệu ra bộ nhớ ngoài)
P3.7
/RD (cho phép đọc dữ liệu từ bên ngoài)
Xuất ra xung cho phép chốt byte thấp của địa chỉ trong suốt quá trình truy xuất bộ nhớ ngoài. Trong hoạt động bình thường thì ALE phát ra xung có tần số 1/6 tần số dao động thạch anh, và chúng ta có thể dùng chân này để làm xung clock hoặc định thì.
Là tín hiệu điều khiển cho phép bộ nhớ chương trình mở rộng, thường được nối đến chân của EPROM để cho phép đọc các byte mã lệnh. ở mức thấp trong thời gian lấy lệnh.
Với các thiết kế cỡ nhỏ thì chân này được nối lên nguồn, nếu cần truy xuất ROM ngoài thì chân này được nối mass.
Định thì cho AT89C51
Tất cả các VĐK thuộc họ MCS-51 đều có mạch dao động bên trong chip, ta chỉ cần thêm thạch anh và các tụ bên ngoài 2 chân XTAL1 và XTAL2 để tạo ra nguồn xung nhịp cho MCU.
Hình 4: Mạch dao động cho Vi Xử Lí
Tổ chức bộ nhớ của AT89C51.
Bộ nhớ được cài đặt kiến trúc Harvard, có vùng nhớ riêng cho chương trình (code) và cho dữ liệu.
Hình 5: Cấu trúc bộ nhớ AT89C51
hình 6: cấu trúc RAM nội của AT89C51
Lưu ý : Bộ nhớ ROM chỉ có thể sử dụng một trong hai, tức là hoặc Internal hoặc External. Còn bộ nhớ RAM thì có thể sử dụng cùng lúc cả hai.
RAM
RAM trên chip gồm nhiều phần: Phần lưu trữ đa dụng, phần lưu trữ địa chỉ hóa từng bit, các bank thanh ghi, và các thanh ghi chức năng đặc biệt. Phần chi tiết về RAM xin tham khảo thêm trong tài liệu Vi xử lý, ở đây ta chỉ xem xét một số thanh ghi chức năng đặc biệt (SFR).
PSW
CY
AC
F0
RS1
RS0
OV
P
TMOD
G1
C/1
M11
M01
G0
C/0
M10
M00
TCON
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
SCON
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
IE
EA
-
-
ES
ET1
EX1
ET0
EX0
Giới thiệu sơ lược: Timer/Counter, Interrupt, Serial Port.
Timer/Counter: Sử dụng thanh ghi TMOD và TCON để điều khiển. Có 3 chế độ hoạt động cho Timer (được chọn từ bit M1 và M0 của thanh ghi TMOD).
Chế độ 0
Chế độ 1
Chế độ 2
Chế độ 3
Interrupt: Đây là chức năng rất hay của 89C51. Khi có một tín hiệu từ một nguồn ngắt nào thì chương trình sẽ tạm ngưng lệnh hiện thời để chuyển sang chương trình phục vụ ngắt. Sau khi thực hiện xong, VXL tiếp tục thực hiện chương trình đang dở dang. Sử dụng thanh ghi IE để điều khiển việc ngắt. Ta có thể ngắt từ các nguồn ngắt khác nhau như: ngắt ngoài, ngắt Timer, ngắt bằng Port nối tiếp. Ngoài ra ta còn có thể xác định thứ tự ưu tiên ngắt thông qua thanh ghi IP.
IP
-
-
-
PS
PT1
PX1
PT0
PX0
Serial Port : Đây là cổng I/O nối tiếp hoạt động với nhiều chế độ khác nhau. Chức năng chính là chuyển đổi song song sang nối tiếp cho dữ liệu xuất ra, và chuyển từ nối tiếp sang song song cho dữ liệu nhập vào. Để nhận và phát ký tự, trên chip có một thanh ghi phục vụ là thanh ghi SBUF, và thanh ghi điều khiển việc truyền nhận là SCON. Cổng nối tiếp có thể hoạt động ở 4 chế độ :
Thanh ghi dịch 8 bit
UART 8 bit, tốc độ baud thay đổi được.
UART 9 bit, tốc độ baud cố định.
UART 9 bit , tốc độ baud thay đổi được.
Thanh ghi trong AT89C51
Bảng 2: Thanh ghi trong 8051
Tập lệnh AT89C51
Bảng 3: Các tập lệnh AT89C51
TẬP LỆNH CỦA 8051 CHIA THÀNH 5 NHÓM CHÍNH:
Các lệnh số học
Các lệnh logic
Các lệnh chuyển dữ liệu
Các lệnh x ử lý bit
Các lệnh rẽ nhánh
CHI TIẾT:
Các lệnh số học.
Gồm các lệnh Cộng (ADD), Trừ (SUBB), Nhân (MUL), Chia (DIV), tăng (INC) hoặc giảm (DEC) thanh ghi ACC, …
Bảng 4: Các lệnh số học
Các lệnh logic
Gồm các lệnh liên quan đến logic như AND (ANL), OR (OR), XOR (XRL) hai toán hạng với nhau. Ngoài ra nhóm lệnh này có thêm các lệnh Xóa (CLR), lấy bù bit (đảo bit) (CPL), quay trái (RL), quay phải (RR), …
Bảng 5: Các lệnh logic
Các lệnh chuyển dữ liệu.
Gồm các lệnh di chuyển nội dung toán hạng (MOV), hay di chuyển bộ nhớ dữ liệu (MOVX), các lệnh cất dữ liệu vào (PUSH) và lấy dữ liệu ra (POP) khỏi vùng STA.
Bảng 6: Các lệnh chuyển dữ liệu
Các lệnh xử lí bit
Gồm các lệnh xóa (CLR), set bit (SETB), lấy đảo bit (CPL), di chuyển bit (MOV), lệnh nhảy bit nếu bằng 1 (JB) hoặc bằng 0 (JNB), …
Bảng 7: Các lệnh xử lí bit
Các lệnh rẽ nhánh
Bao gồm các lệnh gọi chương trình con (ACALL, CALL, LCALL), quay về chương trình con (RET), quay về chương trình ngắt (RETI), các lệnh nhảy đến thực thi một chương trình (SJMP, LJMP, AJMP), lệnh so sánh nhảy (CJNE), giảm và nhảy nếu khác 0.
Bảng 8: Các lệnh rẽ nhánh
Giới thiệu về IC DS1307
TỔNG QUAN VỀ
IC
DS 1307
2.1 Giới thiệu chung DS 1307
IC thời gian thực là họ vi điều khiển của hãng DALASS. IC DS 1307 có một số đặc trưng cơ bản như sau:
DS 1307 là IC thời gian thực với nguồn cung cấp nhỏ dung để cập nhập thời gian và ngày tháng.
SRAM 56 bytes.
Địa chỉ và dữ liệu được truyền nối tiếp qua 2 đường bus 2 chiều.
DS 1307 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 cung cấp là 3V:
DS 1307 có 7 byte dữ liệu nằm từ địa chỉ 0x00 tới 0x06, 1 byte điều khiển, và 56 byte lưu trữ (dành cho người sử dụng).
Khi xử lí dữ liệu từ DS 1307, họ đã tự chuyển cho ta về dạng số BCD, ví dụ như ta đọc được dữ liệu từ 0x04 (tương ứng với DAY - ngày trong tháng ) và tại 0x05 (tháng) là 0x15 và 0x11.
Lưu ý đến vai trò của chân SQW/OUT. Đây là chân xung ra của DS 1307 có đến 4 chế độ 1Hz, 4.096HZ, 8.192Hz, 32.768Hz… các chế độ này đuợc quy định bởi các bít của thanh ghi Control Register ( địa chỉ 0x07 ).
Địa chỉ của DS1307 là 0xD0.
Cơ chế hoạt động: DS1307 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.
2.2 Cơ chế hoạt động của DS1307.
Hình 6: Cơ chế hoạt động của DS1307
Vcc: nối với nguồn.X1, X2: nối với thạch anh 32,768 kHz.Vbat: đầu vào pin 3V.GND: đất.SDA: chuỗi data.SCL: dãy xung clock.SQW/OUT: xung vuông/đầu ra driver.
DS1307 là một IC thời gian thực với nguồn cung cấp nhỏ, dùng để cập nhật thời gian và ngày tháng với 56 bytes SRAM. Địa chỉ và dữ liệu được truyền nối tiếp qua 2 đường bus 2 chiều. Nó cung cấp thông tin về giờ, phút, giây, 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 DS1307.
Hình 7: Sơ đồ khối DS1307
Mô tả hoạt động của các chân:
VCC, GND: Nguồn một chiều được cung cấp tới các chân này. VCC là đầu vào 5V. Khi 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 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,5V đến 3V để đảm bảo cho sự hoạt động của thiết bị.
SCL (serial clock input): SCL được sử dụng để đồng bộ sự chuyển dữ liệu trên đường dây nối tiếp.
SDA (serial data input/out): là chân vào ra cho 2 đường dây nối tiếp. Chân SDA thiết kế theo kiểu cực máng hở, đòi hỏi phải có một điện trở kéo trong khi hoạt động.
SQW/OUT(square wave/output driver)- khi được kích hoạt thì bit SQWE được thiết lập 1 chân SQW/OUT phát đi 1 trong 4 tần số (1Hz, 4kHz, 8kHz, 32kHz) . Chân này cũng được thiết kế theo kiểu cực máng hở vì vậy nó cũng cần có một điện trở kéo trong. Chân này sẽ hoạt động khi cả Vcc và VBAT được cấp.
X1, X2: được nối với một thạch anh tần số 32,768kHz. Là một mạch tạo dao động ngoài, để hoạt động ổn định thì phải nối thêm 2 tụ 33pF.
Cũng có DS1307 với bộ tạo dao động trong tần số 32,768kHz, với cấu hình này thì chân X1 sẽ được nối vào tín hiệu dao động trong còn chân X2 thì để hở.
2.3 Sơ đồ địa chỉ RAM và RTC.
Hình 8: Đị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.Chú ý: 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ực đượ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 hay 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à 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 thanh ghi thứ 2, thông tin thời gian sẽ được đọc từ thanh ghi cấp này, trong khi đó đồng hồ vẫn 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:
OUT ( out put 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à OUT=0 nếu OUT=0.
SQWE : bit này được thiết lập 1 sẽ enable đầu ra của bộ tạo dao động. Tần số đầu ra sóng vuông phụ thuộc vào giá trị của RS1 và RS0.
Hình 9: Tần số sóng vuông ở chân SQWE
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.
2.4 Sự truyền dẫ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.5 DS 1307 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.
Hình 10: Chế độ ghi dữ liệu lên DS1307
Hì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.
Hình 11: Chế độ đọc dữ liệu từ DS1307
Giới thiệu về LED 7 đoạn
TỔNG QUAN
VỀ
LED 7 ĐOẠN
3.1 Hình ảnh Led 7 đoạn.
Hình11: Các hình ảnh thực tế về Led 7 đoạn
Trong các thiết bị, để báo trạng thái hoạt động của thiết bị đó cho người sử dụng với thông số chỉ là các dãy số đơn thuần, thường người ta sử dụng "Led 7 đoạn". Led 7 đoạn được sử dụng khi các dãy số không đòi hỏi quá phức tạp, chỉ cần hiện thị số là đủ, chẳng hạn led 7 đoạn được dùng để hiển thị nhiệt độ phòng, trong các đồng hồ treo tường bằng điện tử, hiển thị số lượng sản phẩm được kiểm tra sau một công đoạn nào đó...
Led 7 đoạn có cấu tạo bao gồm 7 led đơn có dạng thanh xếp theo hình và có thêm. Một led đơn hình tròn nhỏ thể hiện dấu chấm tròn ở góc dưới, bên phải của led 7 đoạn. 8 led đơn trên led 7 đoạn có Anode (cực +) hoặc Cathode (cực -) được nối chung với nhau vào một điểm, được đưa chân ra ngoài để kết nối với mạch điện. 8 cực còn lại trên mỗi led đơn được đưa thành 8 chân riêng, cũng được đưa ra ngoài để kết nối với mạch điện. Nếu led 7 đoạn có Anode (cực +) chung, đầu chung này được nối với +Vcc, các chân còn lại dùng để điều khiển trạng thái sáng tắt của các led đơn, led chỉ sáng khi tín hiệu đặt vào các chân này ở mức 0. Nếu led 7 đoạn có Cathode (cực -) chung, đầu chung này được nối xuống Ground (hay Mass), các chân còn lại dùng để điều khiển trạng thái sáng tắt của các led đơn, led chỉ sáng khi tín hiệu đặt vào các chân này ở mức 1.
Vì led 7 đoạn chứa bên trong nó các led đơn, do đó khi kết nối cần đảm bảo dòng qua mỗi led đơn trong khoảng 10mA-20mA để bảo vệ led. Nếu kết nối với nguồn 5V có thể hạn dòng bằng điện trở 330Ω trước các chân nhận tín hiệu điều khiển.
3.2 Cấu trúc và bảng mã hiển thị dữ liệu trên Led 7 đoạn.
Hình 12: Hình dạng của Led 7 đoạn
Led anode chung :
Hình 12: Led anode chung
Đối với dạng Led anode chung, chân COM phải có mức logic 1 và muốn sáng Led thì tương ứng các chân a- f , dp phải ở mức 0.
Số
a
b
c
d
e
f
g
dp
Mã hex
0
1
2
3
4
5
6
7
8
9
Bảng : Bảng mã cho Led anode chung (a là MSB, dp là LSB)
Bảng 9: Bảng mã cho Led anode chung (a là LSB, dp là MSB)
Led cathode chung:
Hình 13: Led Cathode chung
Đối với dạng Led cathode chung , chân COM phải có mức logic 0 và muốn sáng Led thì tương ứng các chân a-f, dp phải ở mức logic 1.
Bảng 10: Bảng mã cho Led Cathode chung ( a là MSB, dp là LSB)
Bảng 11: Bảng mã cho Cathode chung ( a là LSB, dp là MSB)
Giới thiệu IC 74HC138.
GIỚI THIỆU
IC
74HC138
4.1 Sơ đồ chân của IC 74HC138:
Hình 14: Sơ đồ chân IC 74HC138
IC 74HC138 là bộ giả mã địa chỉ với 3 đầu vào (A0, A1, A2) và 8 đầu ra phủ định (Y0 đến Y7 ). Nó có 3 đầu vào cho phép: 2 đầu vào tích cực thấp (1E, 2E) và một đầu vào tích cực mức cao (E3). Tất cả các đầu ra của 74HC138 sẽ ở mức cao trừ khi E1 ở mức thấp và E3 ở mức cao. Khi các đầu vào 1E, 2E ở mức thấp và E3 ở mức cao thì đầu ra của 74HC138 sẽ được quyết định bởi đầu vào.
4.2 Chức năng của IC 74HC138.
Bảng 12: Bảng chức năng của IC 74HC138
H: mức cao – L: mức thấp – X : không làm việc
Các đặc điểm của IC74HC138.
+ Số drive đầu ra: 10 LSTTL Loads.
+ Các giao diện đầu ra tới CMOS, NMOS and TTL.
+ Dải điện áp hoạt động : 2.0V → 6.0 V.
+ Dòng điện vào thấp: 1.0 µA .
+ Khả năng loại trừ tạp âm cao trong CMOS Devices.
+ Phù hợp với những yêu cầu đã được định nghĩa bởi JEDEC theo chuẩn 7A.
+ Đặc trưng ESD : HBM >2000V- machine Model > 200V.
+ Độ phức tạp của chip: 100 FETs or 29 cổng tương đương.
+ Những thiết bị sự dụng miễn phí.
CHƯƠNG III : THIẾT KẾ VÀ THI CÔNG PHẦN CỨNG
THIẾT KẾ
VÀ
THI CÔNG MẠCH
SƠ ĐỒ NGUYÊN LÍ
SƠ ĐỒ
NGUYÊN LÍ
1.1 Sơ đồ mạch điều khiển.
Hình 15: Mạch điều khiển thiết kế trên Protues 7.6
1.2 Sơ đồ mạch hiển thị
Hình 16: Mạch hiển thị thiết kế trên Protues 7.6
1.3 Sơ đồ mạch nguồn
Hình 17: Sơ đồ mạch nguồn
1.4 Mạch mô phỏng trên phần mềm Protues.
Hình 18: Mạch mô phỏng trên Protues 7.6
1.5 Mạch in được thiết kế trên Or cad 9.2
Hình 19: Sơ đồ mạch in
CHƯƠNG IV : LẬP TRÌNH ĐIỀU KHIỂN
LẬP TRÌNH
ĐIỀU KHIỂN
1. Lưu đồ giải thuật
Lưu đồ giải thuật cho chương trình chính :
Hình 20: Lưu đồ giải thuật cho chương trình chính
Lưu đồ giải thuật quét nút nhấn.
Hình 21: Lưu đồ giải thuật quét nút nhấn
2. Code chương trình
Chương trình điều khiển
#include
#include
//==========================================
//Cac chan dieu khien
#define led_port P0
#define ic_counter P2
#define reg_sec 0x0
#define reg_min 0x1
#define reg_hour 0x2
#define reg_day 0x3
#define reg_date 0x4
#define reg_month 0x5
#define reg_year 0x6
sbit scl = P1^0;
sbit sda = P1^1;
sbit ic_time = P2^4;
sbit ic_date = P2^5;
sbit menu = P3^0;
sbit plus = P3^1;
sbit minus = P3^2;
sbit al_cancel = P3^3;
//==========================================
//Cac bien toan cuc dung trong chuong trinh
unsigned char led_code[13]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xfe,0x00};
unsigned char led_buffer[13];
unsigned char scan_led,counter,var_menu;
unsigned char sec,min,hour,day,date,month,year;
bit var_arlam;
//Quet led 7 doan dung timer 0
//Tan so quet khoang 25Hz moi led sang khoang 1000/(25*13)=3ms
void khoi_tao_timer0(void)
{
EA=0;//cam ngat toan cuc
TMOD=0x2;//timer0 che do 8 bit tu dong nap lai
TL0=0x6;//Gia tri bat dau dem = 6 (tre 250us)
TH0=0x6;//gia tri TH dc nap vao TL (che do 8 bit)
ET0=1;//cho phep ngat timer0
EA=1;//cho phep ngat toan cuc
TR0=1;//Bat dau chay timer0
}
//quet 13 LED Sau 12 lan Timer0 ngat thi thay doi cac led sang
void quet_led(void)interrupt 2 //dia chi vecto ngat timer0
{
counter++;
if(counter==12)//sau 12x250us=3ms thi thay doi hien thi led
{
if(scan_led0 khong co led nao duoc hien thi
{
ic_counter=scan_led;//hien thi cac led o hang 1 (gio, phut,giay,thu)
//chan enb cua IC_COUNTER =>0 khong co led nao duoc hien thi
ic_time=1;//hien thi gio phut giay
}else
{
ic_counter=scan_led-7;// hien thi led hang 2 (ngay thang nam)(tru di so led da hien thi o hang 1)
ic_date=1;//hien thi ngay thang nam
} // ic_counter=scan_led-0x7+0xf0 led thu 7 la led thu 0 cua hang 2
led_port=led_code[(led_buffer[scan_led])];
scan_led++;
if(scan_led>=13) //vuot qua 13 led thi tro ve ban dau
{
scan_led=0;
}
}
if(counter>=13)
{
counter=0;//dem lai tu dau
}
}
//-----------***************Chuyen doi tu DEC sang BCD************-----------------
unsigned char dec_2_bcd(unsigned char value1)//chuyen doi tu he decima sang BCD
{
return ((value1/10)*16+value1%10); //deo' hieu tai sao lai khac (value1/10)<<4+value1%10
}
//----------**************Chuyen doi tu BCD sang DEC**********---------------------
unsigned char bcd_2_dec(unsigned char value2)//chuyen doi tu he BCD sang DECIMA
{
return ((value2/16)*10+value2%16);
}
//--------***********tao thoi gian tre dung lenh _nop_();**********-------------
void delay(int time_delay)
{
unsigned int temp;
for(temp=0;temp<=time_delay;temp++)
{
_nop_();
}
}
void delay_2(int time_delay)
{
unsigned int temp,i;
for(i=0;i<time_delay;i++)
{
for(temp=0;temp<1000;temp++)
{
_nop_();
}
}
}
//------******Khoi dong I2C******---------
void i2c_start(void)
{
scl=1;
sda=1;
_nop_();
_nop_();
sda=0;
scl=0;
}
//-----******Ket thuc I2C*******---------
void i2c_stop(void)
{
sda=0;
scl=1;
_nop_();
_nop_();
sda=1;
scl=0;
}
//-------*******Gui du lieu len duong I2C******------
void write_i2c(unsigned char data_2_send)
{
unsigned char temp;
for(temp=0;temp<8;temp++)
{
sda=(data_2_send&0x80)? 1:0; //dua bit du lieu ra chan SDA
scl=1; //
_nop_();
_nop_(); //
scl=0;
data_2_send<<=1; //bit co trong so lon hon dc truyen truoc
}
scl=1; //nhan bit ACK tu SLAVER
_nop_();
_nop_();
scl=0;
}
//------------**********Doc di lieu tren duong I2C******---------
unsigned char read_i2c(void)
{
unsigned char temp,i;
for(i=0;i<8;i++) // nhan vao 8 bit
{
scl=1;
temp<<=1;
temp=temp|sda;
scl=0;
}
sda=1;//gui bit ACK
scl=1;//master nhan/gui bit du lieu(sda) khi scl o muc cao
_nop_();
_nop_();
scl=0;//du lieu(sda) thay doi khi scl muc thap*/
return temp;//tra gia tri cho ham
}
//------*****Ghi du lieu len RTC qua duong I2C*****----------
void write_rtc(char value,addr)
{
i2c_start();//start i2c
write_i2c(0xd0);//0xd0 la ID cua DS1307
write_i2c(addr);
write_i2c(value);
i2c_stop();
}
//---------********Doc du lieu tu RTC qua duong I2C*****--------
char read_rtc(char addr)
{
unsigned char temp;
i2c_start();
write_i2c(0xd0);//
write_i2c(addr); //bat dau doc du lieu tu thanh ghi co dia chi 0x0
i2c_start();
write_i2c(0xd1); //0xd0 + 0x01 la ID cua ds107 va che do doc du lieu
temp=read_i2c();//con tro dang tro toi dia chi 0x0 chua du lieu second
i2c_stop();//Stop I2C
return temp;
}
//-----------***********Lay du lieu thoi gian tu cac thanh ghi trong RTC*******---------
void get_time()
{
sec=read_rtc(reg_sec);
min=read_rtc(reg_min);
hour=read_rtc(reg_hour);
day=read_rtc(reg_day);
date=read_rtc(reg_date);
month=read_rtc(reg_month);
year=read_rtc(reg_year);
}
///////---------------***********Ghi du lieu va bo dem****-----------
void write_led_buffer(void)
{
unsigned char temp;
led_buffer[0]=(day&0x7);
//*******Hien thi gio*************
if((temp=(hour&0x30)>>4)==0)//khong hien thi so 0 o hang chuc
{
led_buffer[1]=0x0a;
}else
{
led_buffer[1]=temp;//Lay 2 bit cao
}
led_buffer[2]=(hour&0x0f); //Lay 4 bit thap
//*******Hien thi phut**********
led_buffer[3]=(min&0x70)>>4; //lay 3 bit cao
led_buffer[4]=min&0x0f; //Lay 4 bit thap
//*******Hien thi giay*********
led_buffer[5]=(sec&0x70)>>4;
led_buffer[6]=sec&0x0f;
//*******Hien thi ngay**********
if((temp=(date&0x70)>>4)==0)//khong hien thi so 0 o hang chuc
{
led_buffer[7]=0x0a;
}else
{
led_buffer[7]=temp;
}
led_buffer[8]=date&0x0f;
//*********Hien thi thang************
if(((month&0x30)>>4)==0)//khong hien thi so 0 o hang chuc
{
led_buffer[9]=0x0a;
}else
{
led_buffer[9]=(month&0x30)>>4;
}
led_buffer[10]=month&0x0f;
//******Hien thi nam***********
led_buffer[11]=(year&0x70)>>4;
led_buffer[12]=year&0x0f;}
//-----------------**********Cai dat che do cho RTC****------------------
void setup_rtc(void)
{
unsigned char temp;
/*i2c_start();
write_i2c(0xd0);//che do ghi du lieu vao RTC
write_i2c(0x08);//thanh ghi control
write_i2c(0x10);//xung ra 1Hz muc thap khi khong dc kich hoat
i2c_stop();*/
write_rtc(0x10,0x07);
temp=read_rtc(0x02);
write_rtc(0x02,temp&0x7f);
}
//-----------------**************Do phim**********----------------------
void do_phim(void)
{
if(menu==0)//phim menu duoc an
{
delay_2(50);
if(var_arlam==0)//Neu khong thuc hien chuc nang hen gio
{
if(var_menu<=7)
{
var_menu++; //thuc hien menu tiep
}else
{
var_menu=1;//quay tro ve menu dau tien
}
}else
{
var_arlam=0;//hen gio xong
}
delay_2(50);
}
if(al_cancel==0)
{
var_menu=0;
var_arlam=1;
delay(10000);
}
}
//-----------******Chinh Giay********---------
void menu1(void)
{
if((plus==0)||(minus==0))
{
write_rtc(0x0,reg_sec); //Reset GIAY
delay_2(50);
}
}
//----------*********Chinh PHUT*********------------
void menu2(void)
{
unsigned char temp;
temp=bcd_2_dec(min);
if(plus==0)
{
if(temp<59)
{
temp++;
}else
{
te
Các file đính kèm theo tài liệu này:
- Thiết Kế và Thi Công đồng hồ số dùng At89C51 và DS 1307.doc