Đồ án Thiết kế và thi công đồng hồ số dùng At89C51 và DS1307

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

 

 

doc76 trang | Chia sẻ: lethao | Lượt xem: 6938 | Lượt tải: 2download
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:

  • docThiết Kế và Thi Công đồng hồ số dùng At89C51 và DS 1307.doc