CHƯƠNG I: MỞ ĐẦU
I. KHÁI QUÁT VẤN ĐỀ
Trong giai đoạn hiện nay với sự phát triển vượt bật của công nghệ Nano hàng loạt IC mới được chế tạo. Những IC này thông minh hơn rất nhiều so với các IC trước và đặc biệt là chúng ta có thể ghi/xóa dữ liệu vào một cách dể dàng. Vì thế nó được sử dụng trong nhiều thiết bị Điện - Điện Tử và ngày càng thể hiện được bản chất ưu việt của mình. Điển hình là dòng IC 8051/8052.
Với sự ra đời của dòng IC mới đã làm thúc đẩy sự phát triển của nhũng IC thời gian thực như DS1307, DS12887 Song song đó truyền dữ liệu không dây cũng bắt phát triển với nhiều kiểu truyền khác nhau và phức tạp, trong tất cả các kiểu truyền đó thì truyền dữ liệu bằng tia hồng ngoại được xem là đơn giản nhất.
Cùng với sự phát triển của khoa học kỹ thuật đã góp phần nâng cao đời sống của con người. Cũng chính vì thế mà mọi người cần phải biết chính xác ngày, giờ để thu xếp việc làm cho hợp lý.
Xuất phát từ thực tiển này em đã đi đến quyết định “Thiết kế Lịch Vạn Niên Điện Tử”. Nhằm đáp ứng nhu cầu ham muốn học hỏi của bản thân, cũng như là góp phần nâng giá trị của những mạch điện tử trong đời sống của con người.
II. LỊCH SỬ GIẢI QUYẾT VẤN ĐỀ 
Đề tài này trước khi tôi thực hiện đã có một số sinh viên trường đại học Bách Khoa Thành Phố Hồ Chí Minh thực hiện nhưng kết quả chưa được như mong muốn vì mạch chạy không ổn định và thường hay bị “treo”. Hơn nửa họ chỉ “Thiết kế Lịch Vạn Niên Điện Tử” với những công tắt để điều chỉnh, không dùng remote hồng ngoại để điểu chỉnh. Chính vì thế tôi quyết định chọn đề tài này và kết hợp thêm bộ điều khiển từ xa dùng remote hồng ngoại. Vì tôi mong muốn tạo ra một thiết bị với nhiều thuận lợi hơn cho người dùng và độ tin cậy cao.
 III. MỤC ĐÍCH YÊU CẦU CỦA ĐỀ TÀI
Trong luận án này tôi sử dụng một con IC thời gian thực (DS1307) kết hợp với vi điều khiển 89S52 để tạo thành giao diện I2C, 89S52 có nhiệm vụ đọc/ghi (giờ, phút, giây, thứ, ngày thời gian báo thức) từ chip DS1307. Khi thời gian báo thức trùng với thời gian thực thì loa sẽ phát ra âm thanh trong 1 phút, đồng thời khi có tín hiệu phát ra từ remote hồng ngoại thì 89S52 bắt đầu giãi mã tín hiệu này, sau khi giải mã 89S52 ghi dữ liệu nhận được vào DS1307. Ngoài ra mạch còn sử dụng cảm biến nhiệt (LM35), ngỏ ra của cảm biến này được đưa qua bộ biến đổi tương tự sang số (ADC0804), dữ liệu được 89S52 đọc ra từ ADC0804 và hiển thị kết quả ra led 7 đoạn. 
Từ đây có thể suy ra mục đích yêu cầu của đề tài như sau:
- Mạch hiển thị giờ, phút, giây, thứ, ngày, tháng, năm một cách chính xác 
- Đo nhiệt độ và hiển thị ra led 7 đoạn
- Bộ cài đặt thời gian được sử dụng bằng remote hồng ngoại, xác xuất lỗi khi ấn remote là thấp nhất
- Khi thời gian báo thức trùng với thời gian thực thì loa phải phát ra âm thanh báo thức
- Giá thành sản phẩm không quá đắc.
Dựa vào yêu cầu của đề tài tôi đã phân ra thành 2 khối lớn:
- Khối A: Đo nhiệt độ và hiển thị kết quả ra led 7 đoạn
- Khối B: Đồng hồ thời gian thực và bộ điều khiển từ xa dùng remote hồng ngoại
                
              
                                            
                                
            
 
            
                 107 trang
107 trang | 
Chia sẻ: lvcdongnoi | Lượt xem: 4029 | Lượt tải: 3 
              
            Bạn đang xem trước 20 trang tài liệu Đề tài Thiết kế lịch vạn niên điện tử, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ch hợp cả Photodiot thu hồng ngoại, bộ khuyếch đại, bộ lọc chống nhiễu, bộ điều chế…. Mắt thu hồng ngoại có nhiều hình dạng kích thước khác nhau nhưng cơ bản là đóng trong 1 vỏ nhựa đen chỉ cho tia hồng ngoại đi qua, có lưới bên ngoài hoặc bên trong để chống nhiễu. Mắt thu hồng ngoại (TSOP1338) gồm có 3 chân: chân 3 OUT, chân 2 nguồn cấp điện áp Vs và 1 chân nối mass.
Sơ đồ khối bên trong mắt thu hồng ngoại (TSOP1338)
Mắt thu hoạt động ở tần số điều chế 36 hoặc 38Khz tuy nhiên có thể dùng lẫn 2 loại này với nhau. 
Tầm thu cho phép khoảng 10m 
Khi không có sóng tới, tín hiệu ra ở mức cao.
	4. Khảo sát tín hiệu hồng ngoại phát ra từ Remote SONY
Remote Sony sử dụng mã hóa theo độ rộng xung, đây là kiểu mã hoá đơn giản. Vì vậy việc giải mã được thực hiện khá dể dàng.
Giản đồ thời gian của tín hiệu remote SONY
Tín hiệu sóng mang từ LED hồng ngoại của remote SONY phát ra có tần số khoảng từ 36 Khz đến 38 Khz. Sóng mang này chuyên chở tín hiệu dữ liệu đã được mã hóa có dạng như sau:
Ta thấy:
Bit 0 được mã hóa bằng một xung ở mức thấp 600µs và chuyển trạng thái sang mức cao 600µs.
Bit 1 được mã hóa bằng một xung ở mức thấp 600µs và chuyển trạng tháí sang mức cao 1200µs.
Khi ta bấm một phím nào đó trên remote thì remote sẽ phát đi một loạt tín hiệu xung có dạng như sau:
Đầu tiên xung Start sẽ được phát đi trước và có dạng là một tín hiệu mức cao trong khoảng thời gian 1800µs. Tiếp theo là các bit dữ liệu. Tổng cộng có 12 bit dữ liệu và kết thúc bằng một xung Stop ở mức thấp trong thời gian 1800µs. Tiếp theo thì tín hiệu sẽ được duy trì ở mức thấp trong khoảng thời gian 20ms và xung Start thứ 2 sẽ được phát đi để báo hiệu cho sự tiếp tục của một khung dữ liệu thứ 2. Khung dữ liệu này hoàn toàn giống với khung dữ liệu trước đó. Và cứ như thế tiếp tục cho đến khi nào ta buông phím remote ra thì thôi.
	Lưu ý: Bit đầu tiên sau bit START là bit LSB, ta đặt tên nó là bit B0, bit cuối cùng sẽ là bit MSB (B11).
 	 B0---B6 : 7 bit mã lệnh
 	 B7---B11 : 5 bit địa chỉ
Nếu sử dụng mắt nhận hồng ngoại có sẵn trên thị trường thì tất cả dạng sóng trên sẽ bị đảo lại như sau:
Để thu và giải mã được tín hiệu hồng ngoại từ REMOTE SONY, thực tế ta không cần thu toàn bộ 12 bit mã hoá. Ta chỉ cần thu 7 bit COMMAND và có thể bỏ qua 5 bit địa chỉ, bởi với cùng một điều khiển thì tất cả các nút bấm đều phát ra mã địa chỉ như nhau, chỉ khác nhau mã lệnh. Mã Address được hãng SONY sử dụng để phân biệt giữa các MODEL REMOTE SONY khác nhau.
II. ĐỒNG HỒ THỜI GIAN THỰC
	1. Tổng quan về DS1307
	1.1. Sơ đồ chân DS1307
DS1307 là chip đồng hồ thời gian thực (RTC : Real-time clock), khái niệm thời gian thực ở đây được dùng với ý nghĩa thời gian tuyệt đối mà con người đang sử dụng, tính bằng giây, phút, giờ…DS1307 là một sản phẩm của Dallas Semiconductor (một công ty thuộc Maxim Integrated Products). Chip này có 7 thanh ghi 8-bit chứa thời gian là: giây, phút, giờ, thứ (trong tuần), ngày, tháng, năm. Ngoài ra DS1307 còn có 1 thanh ghi điều khiển ngõ ra phụ và 56 thanh ghi trống có thể dùng như RAM. DS1307 được đọc và ghi thông qua giao diện nối tiếp I2C nên cấu tạo bên ngoài rất đơn giản. DS1307 xuất hiện ở 2 gói SOIC và DIP có 8 chân như trong hình sau.
Hai gói cấu tạo của chip DS1307
       Các chân của DS1307 được mô tả như sau:       - X1 và X2: là 2 ngõ kết nối với 1 thạch anh 32.768KHz làm nguồn tạo dao động cho chip       - VBAT: cực dương của một nguồn pin 3V nuôi chip       - GND: chân mass chung cho cả pin 3V và Vcc       - Vcc: nguồn cho giao diện I2C, thường là 5V và dùng chung với vi điều khiển. Chú ý: nếu Vcc không được cấp nguồn nhưng VBAT được cấp thì DS1307 vẫn đang hoạt động (nhưng không ghi và đọc được). - SQW/OUT: Đây là chân tạo ngõ ra xung vuông của DS1307 có 4 chế độ 1Hz, 4.096HZ, 8.192Hz, 32.768Hz... các chế độ này đuợc quy định bởi các bit của thanh ghi Control Register (địa chỉ 0x07).       - SCL và SDA là đường giữ xung nhịp và đường dữ liệu của giao diện I2C mà chúng ta sẽ tìm hiểu sau.
	1.2. Cấu tạo bên trong DS1307
Sơ đồ khối bên trong chip DS1307
Cấu tạo bên trong DS1307 bao gồm một số thành phần như mạch nguồn, mạch dao động, mạch điều khiển logic, mạch giao điện I2C, con trỏ địa chỉ và các thanh ghi (hay RAM). Do đa số các thành phần bên trong DS1307 là thành phần “cứng” nên chúng ta không có quá nhiều việc khi sử dụng DS1307. Sử dụng DS1307 chủ yếu là ghi và đọc các thanh ghi của chip này. Vì thế cần hiểu rõ 2 vấn đề cơ bản đó là cấu trúc các thanh ghi và cách truy xuất các thanh ghi này thông qua giao diện I2C
Như đã trình bày, bộ nhớ DS1307 có tất cả 64 thanh ghi 8-bit được đánh địa chỉ từ 0 đến 63 (từ 0x00h đến 0x3Fh). Tuy nhiên, thực chất chỉ có 8 thanh ghi đầu là dùng cho chức năng “đồng hồ”, còn lại 56 thanh ghi bỏ trống có thể được dùng chứa biến tạm như RAM nếu muốn. Bảy thanh ghi đầu tiên chứa thông tin về thời gian của đồng hồ bao gồm: giây (SECONDS), phút (MINUETS), giờ (HOURS), thứ (DAY), ngày (DATE), tháng (MONTH) và năm (YEAR). Việc ghi giá trị vào 7 thanh ghi này tương đương với việc “cài đặt” thời gian khởi động cho RTC. Việc đọc giá từ 7 thanh ghi là quá trình đọc thời gian thực mà RTC tạo ra.
Tổ chức bộ nhớ trong DS1307
Vì 8 thanh ghi đầu tiên là quan trọng nhất trong hoạt động của DS1307, chúng ta sẽ khảo sát các thanh ghi này một cách chi tiết. Trước hết hãy quan sát tổ chức theo từng bit của các thanh ghi này trong hình sau:
Chú ý là tất cả các giá trị thời gian lưu trong các thanh ghi theo dạng BCD (Binary-Coded Decimal).
Thanh ghi giây (SECONDS): thanh ghi này là thanh ghi đầu tiên trong bộ nhớ của DS1307, địa chỉ của nó là 0x00. Bốn bit thấp của thanh ghi này chứa mã BCD 4-bit của chữ số hàng đơn vị của giá trị giây. Do giá trị cao nhất của chữ số hàng chục là 5 nên chỉ cần 3 là đủ. Bit cao nhất (bit thứ 7) trong thanh ghi này là 1 bit điều khiển có tên CH (Clock halt – treo đồng hồ), nếu bit này được set bằng 1 bộ dao động trong chip bị vô hiệu hóa, đồng hồ không hoạt động. Vì vậy, nhất thiết phải reset bit này xuống 0 ngay từ đầu.
Thanh ghi phút (MINUTES): có địa chỉ 0x01h, chứa giá trị phút của đồng hồ. Tương tự thanh ghi SECONDS, chỉ có 7 bit của thanh ghi này được dùng lưu mã BCD của phút, bit thứ 7 luôn luôn bằng 0.
Thanh ghi giờ (HOURS): có thể nói đây là thanh ghi phức tạp nhất trong chip DS1307. Thanh ghi này có địa chỉ 0x02h. Trước hết 4 bit thấp của thanh ghi này được dùng cho chữ số hàng đơn vị của giờ. Do DS1307 hỗ trợ 2 loại hệ thống hiển thị giờ là: 12h và 24h giờ, vì vậy bit thứ 6 được dùng để xác lập hệ thống giờ. Nếu bit thứ 6 = 0 thì hệ thống 24h được chọn, khi đó 2 bit thứ 5 và thứ 4 dùng mã hóa chữ số hàng chục của giá trị giờ. Do giá trị lớn nhất của chữ số hàng chục trong trường hợp này là 2 nên cần 2 bit để mã hóa. Nếu bit thứ 6 = 1 thì hệ thống 12h được chọn. Với trường hợp này chỉ có 1 bit thứ 4 dùng mã hóa chữ số hàng chục của giờ, bit thứ 5 chỉ buổi trong ngày (AM hoặc PM). Bit thứ 5 = 0 là AM và bit thứ 5 = 1 là PM. Bit thứ 7 luôn bằng 0.
Thanh ghi thứ (DAY – ngày trong tuần): nằm ở địa chỉ 0x03h. Thanh ghi DAY chỉ mang giá trị từ 1 đến 7 tương ứng từ Chủ nhật đến thứ 7 trong 1 tuần. Vì thế, chỉ có 3 bit thấp trong thanh ghi này có nghĩa. Các bit còn lại luôn bằng 0.
Thanh ghi ngày (DATE – ngày trong tháng): nằm ở địa chỉ 0x04h. Thanh ghi DATE mang giá trị từ 1 đến 31, chỉ có 5 bit đầu tiên là có nghĩa. Các bit còn lại luôn bằng 0.
Thanh ghi tháng (MONTH): nằm ở địa chỉ 0x05h. Thanh ghi MONTH mang giá trị từ 1 đến 12, chỉ có 4 bit đầu tiên là có nghĩa. Các bit còn lại bằng 0.
Thanh ghi năm (YEAR): nằm ở địa chỉ 0x06h. Thanh ghi YEAR mang giá trị từ 0 đến 99. Chip DS1307 chỉ dùng cho 100 năm, nên giá trị năm chỉ có 2 chữ số, phần đầu của năm do người dùng tự thêm vào.
Thanh ghi điều khiển (CONTROL REGISTER): có địa chỉ là 0x07h, thanh ghi CONTROL REGISTER được dùng để điều khiển tần số xung vuông ở ngỏ ra SQW/OUT. Giá trị các bít trong thanh ghi CONTROL REGISTER được biểu diển như sau:
Bit 7_Output Control (OUT): dùng để kiểm soát mức logic tại SQW/OUT.
Bit 4_Square-Wave Enable (SQWE): bit này được set lên bằng 1 để tạo dao động ở đầu ra.
Bits 1 and 0_ Rate Select (RS[1:0]): 2 bit này dùng điều khiển tần số dao động ở ngỏ ra SQW/OUT, với 4 tần số được chọn như sau:
2. Khái quát giao diện I2C 
I2C là viết tắc của từ Inter - Integrated Circuit là một chuẩn truyền thông nối tiếp đồng bộ do hãng điện tử Philips Semiconductor sáng lập và xây dựng thành chuẩn năm 1990.
Các khái niệm cơ bản trong giao diện I2C:
Master (chip chủ): là chip khởi động quá trình truyền nhận, phát đi địa chỉ của thiết bị cần giao tiếp và tạo xung giữ nhịp trên đường SCL.
Slave (chip tớ): là chip có một địa chỉ cố định, được gọi bởi Master và phục vụ yêu cầu từ Master.
SDA (Serial Data): là đường dữ liệu nối tiếp, tất cả các thông tin về địa chỉ hay dữ liệu đều được truyền trên đường này theo thứ tự từng bit một. Chú ý là trong chuẩn I2C, bit có trọng số lớn nhất (MSB) được truyền đi trước nhất.
SCL (Serial Clock): là đường xung giữ nhịp nối tiếp. I2C là chuần truyền thông nối tiếp đồng bộ, cần có 1 đường tạo xung giữ nhịp cho quá trình truyền/nhận, cứ mỗi xung trên đường giữ nhịp SCL, một bit dữ liệu trên đường SDA sẽ được lấy mẫu (sample). Dữ liệu nối tiếp trên đường SDA được lấy mẫu khi đường SCL ở mức cao trong một chu kỳ giữ nhịp, vì thế đường SDA không được đổi trạng thái khi SCL ở mức cao (trừ điều kiện START và STOP). Chân SDA có thể được đổi trạng thái khi SCL ở mức thấp.
Một giao tiếp I2C gồm có 2 dây: Serial Data (SDA) và Serial Clock (SCL). SDA là đường truyền dữ liệu theo 2 hướng (từ master đến slave và ngược lại), còn SCL là đường truyền xung đồng hồ chỉ truyền theo một hướng (từ master đến slave).
Trong một giao diện I2C thì có một thiết bị là chủ (master) và một thiết bị là tớ (slave). Tại sao lại có sự phân biệt này? Đó là vì trên một giao diện I2C thì quyền điều khiển thuộc về thiết bị chủ. Thiết bị chủ nắm vai trò tạo xung đồng bộ cho toàn hệ thống, khi giữa 2 thiết bị chủ/tớ giao tiếp thì thiết bị chủ có nhiệm vụ tạo ra xung đồng bộ và quản lý đến thiết bị tớ trong suốt quá trình giao tiếp. Thiết bị chủ giữ vai trò chủ động, còn thiết bị tớ giữ vai trò bị động trong quá trình giao tiếp.
Một giao diện I2C có thể hoạt động ở nhiều chế độ khác nhau: 
 - Một chủ một tớ (one master – one slave) 
 - Một chủ nhiều tớ (one master – multi slave) 
 - Nhiều chủ nhiều tớ (Multi master – multi slave)
Vài điều kiện cần biết khi thiết lập một giao tiếp I2C: 
 - Điều kiện START (gọi tắt là S): điều kiện START được thiết lập khi có một sự chuyển đổi trạng thái từ cao xuống thấp tại SDA, khi SCL đang ở mức cao (mức cao là 1, mức thấp là 0). 
- Điều kiện STOP (gọi tắt là P): điều kiện STOP được thiết lập khi có một sự chuyển đổi trạng thái từ thấp lên cao tại SDA, khi SCL đang ở mức cao.
- Điều kiện REPEAT START (bắt đầu lặp lại): khoảng giữa điều kiện START và STOP là khoảng bận của đường truyền, các master khác không tác động được vào đường truyền trong khoảng này. Trường hợp sau khi kết thúc quá trình truyền/nhận mà master không gởi điều kiện STOP lại gởi thêm 1 điều kiện START gọi là REPEAT START. Khả năng này thường được dùng khi master muốn lấy dữ liệu liên tiếp từ các Slaves. 
Mô tả điều kiện START, STOP và REPEAT START
 - Bit ACK: dùng để báo hiệu dữ liệu đã được nhận, bit ACK được tạo ra tại thời điểm xung clock thứ 9 bằng cách kéo chân SDA xuống mức thấp.
- Bit NACK: dùng để báo hiệu dữ liệu đã bị lỗi hoặc byte truyền cuối cùng, bit NACK cũng được tạo ra tại thời điểm xung clock thứ 9 bằng cách kéo chân SDA lên mức cao.
Bit ACK/NACK trong giao diện I2C
Định dạng dữ liệu truyền:
Dữ liệu được truyền trên bus I2C theo từng bit, bit dữ liệu được truyền  đi tại mỗi sườn lên của xung đồng hồ trên đường dây SCL, quá trình thay đổi bit dữ 
liệu xảy ra khi SCL đang ở mức thấp. 
Quá trình truyền nhận 1 bit dữ liệu
Mỗi byte dữ liệu được truyền có độ dài là 8 bit. Số byte có thể truyền trong một lần là không hạn chế. Mỗi byte được truyền đi theo sau là một bit ACK, bit có trong số lớn nhất (MSB) sẽ được truyền đi đầu tiên, các bit kế tiếp sẽ được truyền đi lần lượt. Sau 8 xung clock thì dữ liệu đã được truyền đi, ở xung clock thứ 9 thì bit ACK được truyền đi báo hiệu đã nhận đủ 8 bits. Thiết bị truyền sau khi nhận được bit ACK sẽ tiếp tục thực hiện quá trình truyền hoặc kết thúc.
Dữ liệu được truyền trên giao diện I2C
Một byte truyền đi có kèm theo bit ACK là điều kiện bắt buộc, nhằm đảm bảo cho quá trình truyền nhận được chính xác. Khi không nhận được đúng địa chỉ hay muốn kết thúc quá trình giao tiếp, thiết bị nhận sẽ gởi một xung Not_ACK (NACK) để báo cho thiết bị chủ biết. Thiết bị chủ sẽ tạo ra xung STOP để kết thúc hay lặp lại một xung START để bắt đấu quá trình mới.
	3. Mode (chế độ) truyền dữ liệu giữa DS1307 và AT89S52
	Trong giao tiếp I2C giữa DS1307 và 89S52 thì chip 89S52 đóng vai trò là một master và DS1307 đóng vai trò là một slave. Do chỉ có một master và một chip giao tiếp với nhau nên chỉ có 2 mode (chế độ) hoạt động giao tiếp giữa 2 chip này. Hai mode đó là: Data Write (từ AT89S52 đến DS14307) và Data Read (từ DS1307 vào AT89S52).
	3.1. Mode Data Write (chế độ ghi dữ liệu)
	Mode Data Write (chế độ truyền dữ liệu từ master đến slave) được dùng khi xác lập giá trị ban đầu cho các thanh ghi thời gian hoặc dùng để canh chỉnh thời gian cho chip DS1307. Cấu trúc truyền dữ liệu trong mode Data Write được mô tả như hình sau:
Chế độ data write
	Ø Trước hết hãy nói về địa chỉ SLA (Slave Address) của chip DS1307 trong mạng I2C, trên mạng I2C mỗi thiết bị sẽ có một địa chỉ riêng gọi là SLA. SLA được tính theo lý thuyết chuẩn I2C sẽ có giá trị tối đa là 128 (do có 128 thiết bị trong 1 mạng I2C). Chip DS1307 là một Slave nên cũng có một địa chỉ SLA, giá trị này được set cố định là 1101000b (68h). Do SLA của DS1307 cố định nên trong 1 mạng I2C sẽ không thể tồn tại cùng lúc 2 chip này.
	Ø Quan sát hình trên ta thấy, đầu tiên master (AT89S52) sẽ gởi điều kiện START đến Slave (DS1307), tiếp theo sau master sẽ là 7 bit địa chỉ SLA của slave (cố định là: 1101000b). Do chế độ này là Data Write nên bit W = 0 và sẽ được gởi kèm sau SLA. Bit ACK (A) được slave trả về cho master sau mỗi quá trình giao tiếp.
	Ø Tiếp theo sau địa chỉ SLA sẽ là 1 byte chứa địa chỉ của thanh ghi cần truy cập (Word Address). Cần phân biệt địa chỉ của thanh ghi cần truy cập và địa chỉ SLA. Như đã đề cập trên, địa chỉ của thanh ghi cần truy cập sẽ được lưu trong thanh ghi địa chỉ (hay con trỏ địa chỉ), vì vậy byte dữ liệu đầu tiên sẽ được chứa trong thanh ghi địa chỉ của DS1307.
	Ø Sau byte địa chỉ thanh ghi là một dãy các byte dữ liệu được ghi vào bộ nhớ của DS1307. Byte dữ liệu đầu tiên sẽ được ghi vào thanh ghi có địa chỉ được chỉ định bởi Word Address, sau khi ghi xong 1 byte thì Word Address tự động tăng nên các byte tiếp theo sẽ được ghi liên tiếp vào DS1307 ở các thanh ghi kế sau. Số lượng bytes dữ liệu cần ghi do master quyết định và không được vượt quá dung lương bộ nhớ của DS1307. Quá trình ghi kết thúc khi master phát ra điều kiện STOP.
	 Chú ý: Sau khi ghi thành công 1 byte thì DS1307 sẽ trả lời lại bằng một bit ACK. Nếu như byte được ghi vào là byte cuối cùng thì DS1307 sẽ trả lời lại bằng 1 bit Not_ACK (NACK).
	Nếu sau khi gởi byte Word Address, master không gởi các byte dữ liệu mà gởi liền điều kiện STOP thì không có thanh ghi nào được ghi. Trường hợp này được dùng để set địa chỉ Word Address để phục vụ cho quá trình đọc.
	3.2. Mode Data Read (chế độ dọc dữ liệu)
	Mode Data Read (chế độ truyền dữ liệu từ salve về master) được sử dụng khi đọc thời gian thực từ DS1307 về AT89S52. Cấu trúc truyền dữ liệu trong mode Data Write được mô tả như hình sau:
Chế độ Data Read
	Nguyên tắt truyền trong chế độ Data Read cơ bản cũng giống như trong truyền chế độ Data Write. Trong chế độ Data Read bit R = 1 sẽ được gởi kèm sau 7 bit SLA. Sau đó liên tiếp các byte dữ liệu được truyền từ DS1307 đến AT89S52. Điểm khác biệt trong cách bố trí dữ liệu của chế độ này so với chế độ Data Write là không có byte địa chỉ thanh ghi dữ liệu nào được gởi đến. Tất cả các byte theo sau SLA+R đều là dữ liệu đọc từ bộ nhớ của DS1307.
	Lưu ý: dữ liệu được đọc tại thanh ghi được chỉ định bởi con trỏ địa chỉ, vì vậy muốn đọc chính xác dữ liệu từ một địa chỉ nào đó, chúng ta cần thực hiện quá trình ghi giá trị cho con trỏ định địa chỉ trước khi thực hiên quá trình đọc. Để ghi giá trị vào con trỏ định địa chỉ chúng ta sẽ gọi chương trình Data Write với chỉ 1 byte được ghi sau SLA+W như phần chú ý ở trên.
CHƯƠNG III: THIẾT KẾ PHẦN CỨNG
A. ĐO NHIỆT ĐỘ
I. SƠ ĐỒ VÀ CHỨC NĂNG TỪNG KHỐI
Cảm biến nhiệt và khuếch đại
Biến đổi ADC và khối xử lýtrung tâm (CPU_1)
Hiển thị thứ 1
(LED 7 đoạn)
Hiệu ứng dùng LED đơn
1. Sơ đồ khối
	2. Chức năng của từng khối
	2.1. Cảm biến nhiệt và khuếch đại
Trong phần đo nhiệt độ thì đây là khối tạo ra sự thay đổi điện thế từ 0V đến 1.97V tương ứng với sự thay đổi nhiệt độ bên ngoài từ 00C đến 1000C.
	2.2. Biến đổi ADC và khối xử lý trung tâm (CPU_1)
Đây là khối quang trọng dùng để điều khiển mọi hoạt động của mạch. Khối này thực hiện quá trình biến tín hiệu tương tự sang tín hiệu số thông qua bộ biến đổi ADC, sau đó xuất dữ liệu này ra khối hiển thị thứ nhất. Các quá trình này được điều
 khiển bởi vi xử lý AT89S52.
	2.3. Khối hiển thị thứ 1 sử dụng LED 7 đoạn
Đây là khối giao diện với người sử dụng, dùng để chốt lại dữ liệu cho người dùng quan sát.
	2.4. Hiệu ứng dùng LED đơn
	Đây cũng là khối giao diện vời người dùng, khối này góp phần làm cho sản phẩm được thiết kế thêm đẹp hơn. 
II. SƠ ĐỒ CHI TIẾT VÀ NGUYÊN TẮT HOẠT ĐỘNG
	1. Sơ đồ chi tiết
A
Vout1
Vout2
Vin
	1.1. Cảm biến nhiệt và bộ khuếch đại
B
Thiết lập thông số:
	Do cảm biến nhiệt LM35D có độ phân giải là 10mV/10C mà độ phân giải của ADC0804 được chọn là 19.53mV/10C. Vì vậy phải thiết kế một bộ khuếch đại với hệ số khuếch đại (K) là 1.953 (chọn K = 1.97), cách chọn hệ số K được tính như sau:
	+ Xét tại 2 điểm A và B:
Điện thế tại 2 điểm A và B được tính như sau:
	VA = VB = Vout1.= Vout1.	(1)
	+ Quan sát sơ đồ mạch ta thấy:
Dòng điện đi vào từ Vout1 qua RI1 sẽ đi qua RF1, RF2 nên:
	(2)
Thay giá trị của VA vào biểu thức 2 ta tìm được:
	Vout2 = .Vout1	(3)
	 + Với cách tính tương tự như vậy ta có:
	Vin = Vout1	(4)
Từ (3) và (4) ta được:
	Vout2 = .Vin	(5)
Thay các giá trị điện trở vào (5) ta có:
	Vout2 = .Vin
	Vout2 =1.97.Vin
	1.2. Biến đổi ADC và khối xử lý trung tâm (CPU_1)
Thiết lập thông số:
	Chọn độ phân giải cho ADC0804 là 19.53mV (tương ứng với chân VREF/2 để hở).
Chọn điện trở R1 và tụ C2 cho bộ dao động của ADC0804:
	Ta có tần số dao đông được xác định bằng công thức:
Ta chọn R1 = 10k và C2 = 150pf.
Vậy tần số dao đông của ADC0904 là: f = 606khz
Số mức đầu ra là: N = .Vin
T0 cần đo = với K = 1.97 là hệ số của bộ khuếch đại dùng IC LM358.
	1.3. Khối hiển thị thứ 1 sử dụng LED 7 đoạn
Thiết lập thông số:
	Led 7 đoạn có cấu tạo gồm 8 led đơn, để thấp sáng 1 led 7 đoạn thì phải có dòng điện chạy qua mỗi led đơn này, dòng điện này phải có độ lớn từ 10mA–15mA để led sáng vừa và không bị đứt. Vậy dòng điện qua led được tính như sau:
	 IL = 
RL = = = 300W
Chọn RL = 220W ² IL = 13.6mA
	1.4. Hiệu ứng dùng LED đơn
Thiết lập thông số:
	Dòng điện thắp sáng 1 led là từ 10mA – 15mA, để thắp sáng 12 led mắc song song thì phải cần dòng điện từ 120mA – 180mA.
	Chọn dòng điện qua 12 led là 180mA ² Ic = 180mA
	 Mà IC = 
RC = = = 14.4 W
	Chọn Rc = 10 W
	Mặt khác ta có:
	IB = 
RB = 
Để BJT hoạt động trong vùng bảo hoà thì:
	 IB ≥ ≥ ≥ 1.8mA
RB ≤ ≤ ≤ 2.39 KW
Chọn RB = 2.2 KW
	2. Nguyên tắt hoạt động
	Khi hệ thống được cấp nguồn (Vcc = 5V) tất cả các linh kiện trong mạch bắt đầu hoạt động. Đầu tiên chip AT89S52 (CPU_1) kích hoạt bộ biến đổi ADC0804, khi bộ biến đổi này đã thực hiện xong quá trình biến đổi, CPU_1 sẽ đọc dữ liệu từ bộ biến đổi ADC0804 và hiển thị kết quả ra led 7 đoạn (sử dụng kỹ thuật chốt). Sau đó CPU_1 chạy chương trình để tạo hiệu ứng bên ngoài sử dụng led đơn, khi kết thúc chương trình này CPU_1 quay lại thực hiện quá trình như ban đầu.
B. ĐỒNG HỒ THỜI GIAN THỰC VÀ BỘ ĐIỀU KHIỂN TỪ XA DÙNG REMOTE HỒNG NGOẠI
I. SƠ ĐỒ VÀ CHỨC NĂNG TỪNG KHỐI
	1. Sơ đồ khối
Khối xử lý trung tâm (CPU_2)
Thời gian thực
(DS1307)
Hiển thị thứ 2
Thu tín hiệu hồng ngoại
Âm thanh
Phát tín hiệu hồng ngoại
	2. Chức năng của từng khối
	2.1. Khối thời gian thực
Trong hệ thống đồng hồ thời gian thực, khối này giữ một vai trò rất quang trọng, khối này quyết định đến độ chính xác của sản phẩm. Vì đây là khối tạo thời gian thực cho hệ thống.
	2.2. Khối phát hồng ngoại
Thiết bị phát sử dụng Remote SONY, khi ấn một phím trên remote thì Remote này sẽ phát đi một chuỗi dữ liệu hồng ngoại tương ứng với mỗi phím ấn.
	2.3. Khối thu hồng ngoại.
Thiết bị thu hồng ngoại được sử dụng là một mắt thu hồng ngoại 3 chân có bán sẳn trên thị trường (TSOP1738). Mắt thu hồng ngoại được sử dụng để thu lại chuỗi dữ liệu mà remote phát ra.
	2.4. Khối xử lý trung tâm (CPU_2)
Đây được xem là khối quang trong nhất. Chức năng là đọc/ghi dữ liệu vào chip thời gian thực (DS1307), giải mã tín hiệu hồng ngoại được phát ra từ remote SONY. Cuối cùng là xuất tất cả các dữ liệu đã được xử lý ra bên ngoài thông qua khối hiển thị thứ 2 và khối âm thanh.
	2.5. Khối âm thanh và hiển thị thứ 2
Đây là 2 khối giao diện cho người dùng, dùng để xuất dữ liệu ra bên ngoài.
II.SƠ ĐỒ CHI TIẾT VÀ NGUYÊN TẮT HOẠT ĐỘNG
	1. Sơ đồ chi tiết
	1.1. Khối thời gian thực (DS1307)
Thiết lập thông số:
Dòng điện chạy qua 4 led là:
	I = = = 30mA
Do 4 led được mắc song song với nhau nên dòng điện chạy qua mỗi led là như nhau:
I1 = I2 = I3 = I4 = I/4 = 30mA/4 = 7.5mA	
Chú ý: do ngõ ra SCL và SDA có cấu tạo dạng cực thu để hở (giống như port_0 của vi điều khiển) nên cần phải có điện trở kéo lên (chọn R = 10 KW). 
	1.2. Khối thu hồng ngoại
Sơ đồ kết nối mắt thu hồng ngoại TSOP1738 như sau: 
	1.3. Khối xử lý trung tâm (CPU_2)
	1.4. Khối âm thanh
IC UM66 là IC nhạc được sử dụng rất nhiều, bởi vì UM66 dể sử dụng, rẽ tiền và tiếng nhạc phát ra cũng khá hay. UM66 thường được sử dụng trong các đồng hồ báo thức hay là các thiết bị đồ chơi điện tử. Sơ đồ khối của UM66 được mô tả như hình sau:
	1.5. Khối hiển thị thứ 2
2. Nguyên tắt hoạt động
Khi hệ thống được cấp nguồn chip AT89S52 (CPU_2) bắt đầu đọc thời gian thực RTC. Khi thời gian đã được đọc, CPU_2 tiến hành xử lý (kiểm tra xem thời gian vừa đọc có trùng với thời gian báo thức hay không? Nếu trùng thì CPU_2 kích hoạt hệ thống âm thanh và ngược lai). Khi thực hiện xong quá trình xử lý kết quả, CPU_2 xuất dữ liệu ra led 7 đoạn. Sau đó CPU_2 quay về thực hiện quá trình như ban đầu. Trong trường hợp CPU_2 nhận được tín hiệu truyền về từ mắt thu hồng ngoại, CPU_2 tạm ngưng hoạt động tất cả các chương trình để phục vụ chương trình ngắt, CPU_2 bắt đầu giải mã tín hiệu hồng ngoại được phát ra từ remote SONY. Khi giải mã xong CPU_2 gọi chương trình để tạo hiệu ứng khi điều chỉnh, cuối cùng dữ liệu được CPU_2 ghi vào RTC và thoát khỏi chương trình ngắt. 
CHƯƠNG III: THIẾT KẾ PHẦN MỀM
	Để viết một chưong trình có nhiều cách ví dụ như viết một mạch từ trên xuống dưới theo phương pháp này CPU sẽ đọc từng tự theo các chỉ thị trong chương trình từ điạ chĩ thấp đến địa chỉ cao và thực hiện chúng cho đến địa chỉ cuối cùng. Trong trường hợp này người đọc rất dễ theo dõi chương trình và nắm được ý đồ của người viết, tuy nhiên nó có nhược điểm là kích thước chương trình lớn. Giới hạn cuả phương pháp lập trình tuần tự làm phát sinh một phương pháp lập trình khác là lập trình cấu trúc. Trong chương trình này với những đoạn thường xuyên lặp lại trong chương trình người ta đem chúng ra khỏi chương trình chính (gọi là chương trình con) chúng có thể được đặt ở đầu hoặc cuối chương trình chính (tuỳ theo phần mềm). Tại một địa chỉ xác định nơi chúng ta đem đi được thay bằng lệnh LCALL xxxx. Trong đó xxxx là điạ chỉ chúng ta đặt chương trình con. Khi gặp chỉ thị này CPU sẽ nhảy đến chỉ thị được đặt sau chỉ thị LCALL và thi hành đoạn chương trình đó. Để quá trình làm việc không bị gián đoạn ở cuối đoạn chương trình ta đặt chỉ thị RET (Return). Khi gặp chỉ thị này CPU sẽ quay về chương trình chính và tiếp tục công việc bị bỏ dở. Phương pháp này khá hiệu quả trong việc giảm kích thước chương trình. Tuy nhiên nó làm cho người sử dụng khó theo dõi chương trình do mất tính liên tục. Để khắc phục nhược điểm này người ta đặt cho mỗi đoạn chương trình như thế một cái tên hay nhãn (label). Tên đặt phải giúp người đọc hình dung được chức năng của chương trình con, nhớ rằng đoạn chương trình con có tác dụng dừng chương trình chính trong một khoảng thời gian t nào đó. Chúng ta cũng qui định đoạn chương trình con là nơi chương trình chính đặt dữ liệu xử lý cũng như nơi chương trình chính sẽ lấy kết quả về bằng cách này người đọc chỉ cần nhớ chương trình được gọi sẽ làm công việc gì và nơi đặt (lưu) dữ liệu có liên quan.
	Phần mềm phục vụ cho hệ thống của tôi cũng được thiết kế dựa trên quan điểm này. Để viết chương trình điều khiển hệ thống có thể dùng một trong các ngôn ngữ như Assembler, passcal, C…. Ở đây tôi viết chương trình bằng ngôn ngữ assembler (ASM) của hệ thống 8 bit dùng chip AT89S52.
A. ĐO NHIỆT ĐỘ
I. LƯU ĐỒ VÀ GIẢI THUẬT CHƯƠNG TRÌNH
	1. Giải thuật
	1.1. Giải thuật chương trình chính
Bước 1:Truy xuất dữ liệu từ bộ biến đổi ADC
Bước 2: Hiển thị kết quả 
Bước 3: Tạo hiệu ứng cho led đơn, sau đó quay lại bước 1
	1.2. Giải thuật chương trình con “ TRUY_CAP_ADC”
Tạo một xung từ thấp lên cao áp đến chân WR để ADC0804 bắt đầu quá trình chuyển đổi.
Chờ cho quá trình biến đổi được thực hiên xong (chân INTR xuống mức thấp).
Tạo một xung từ cao xuống thấp áp đến chân RD để đọc dữ liệu ra từ chip ADC0804.
Đưa đữ liệu vào thanh ghi R0 và thoát khỏi chương trình.
	2. Lưu đồ
	2.1. Lưu đồ chương trình chính
BEGIN
Khởi tạo giá trị 
ban đầu
END
Truy cập vào chip ADC0804
Hiển thị nhiệt độ ra led 7 đoạn
Hiệu ứng thứ 1
(dùng led đơn)
Hiệu ứng thứ 2
(dùng led đơn)
2.2. Lưu đồ chương trình con
 2.2.1. Lưu đồ chương trình con “ TRUY_CAP_ADC”
START
Kích hoạt bộ biến đổi ADC0804
RET
Chờ quá trình biến đổi hoàn thành
INTR = = 0?
Dưa dữ liệu
vào thanh ghi R0
Đọc dữ liệu từ chip ADC0804
Y
N
	2.2.2. Lưu đồ chương trình con “HIENTHI_1”
RET
Xuất ra led thứ 2
P_Nguyên
STARTT
Xuất ra led thứ 1
Lấy A chia B
P_Dư
Thiết lập giá trị
A = R0, B = 10
II. PHẦN MỀM DO NHIỆT ĐỘ (CODE_1)
Phần mềm đo nhiệt độ (Code_1) được lập trình bằng ngôn ngữ Assembler (ASM), soạn thảo và biên dịch bằng chương trình Keil Version. Nội dung Code_1 nằm ở thư mục phụ lục “trang 76”.
B. ĐỒNG HỒ THỜI GIAN THỰC VÀ BỘ ĐIỀU KHIỂN TỪ XA DÙNG REMOTE HỒNG NGOẠI.
I. LƯU ĐỒ VÀ GIẢI THUẬT CHƯƠNG TRÌNH
	1. Giải thuật
1.1. Giải thuật chương trình chính
Bước 1: Đọc thời gian thực từ RTC (chip DS1307)
Bước 2: Hiển thị thời gian vừa đọc ra led 7 đoạn
Bước 3: Kiểm tra thời gian báo thức
Bước 4: Kiểm tra chế độ chuông báo theo từng giờ
Bước 5: Tạo hiệu ứng chỉnh khi cài đặt giờ, sau đó quay lại bước 1.
1.2. Giải thuật chương trình ngắt “GIAI_MA_REMOTE_SONY”
Bước 1: Thiết lập giá trị thanh ghi A = 01000000B (40h)
Bước 2: Chờ cho tín hiệu lên	(Đây là bit mã lệnh đầu tiên)
Bước 3: Chờ tín hiệu đi xuống
Bước 4: Chờ khoảng 900ms
Bước 5: Đo mức tín hiệu
Bước 6: Nếu mức tín hiệu là mức cao thì bit nhận được là bit 0
 - Thiết lập bit nhớ C = 0 (bit mã lệnh thu được)
 - Quay phải có nhớ A, như vậy C sẽ được gửi vào MSB của A, LSB của A gửi vào C.
 - Ban đầu, A = 01000000B thì sau khi quay ta có C = 0 và MSB của A là bit đầu tiên của mã lệnh.
 - Như vậy sau 7 lần quay thì C = 1 và 7 bit bên trái của A sẽ chứa mã lệnh
 - Kiểm tra bit nhớ C, nếu C = 1 nhảy tới bước 8, nếu C = 0 quay lại bước 3
Bước 7: Nếu mức tín hiệu là mức thấp thì bit nhận được là bit 1
- Thiết lập Bit nhớ C = 1 (bit mã lệnh thu được)
 	 - Quay phải có nhớ A
 - Kiểm tra bit nhớ C, nếu C = 1 nhảy tới bước 8, nếu C = 0 quay lại bước 2
Bước 8: Lúc này 7 bit mã lệnh chứa trong 7 bit bên trái của thanh ghi A : 	 A = D6D5D4D3D2D1D00
Quay phải thanh ghi A thu được 7 bit mã lệnh nằm bên phải thanh ghi A 
A = 0D6D5D4D3D2D1D0 
Tạo trễ dài để chống nhiễu (chọn 0.1s) 
Bước 9: Nhận dạng các phím được ấn:
- Nếu phím được ấn là KEY_ON_OFF thì mở chế độ điều chỉnh ngược lại thì nhảy đến bước 10.
- Nếu phím được ấn là KEY_NEXT hoặc KEY_BACK thì tăng hoặc giảm thanh ghi R0 một đơn vị cho mỗi lần ấn. Kế tiếp gọi chương trình để tạo ra hiệu ứng điều chỉnh tương ứng, sau đó nhảy đến bước 10.
- Nếu phím được ấn là các số thì chương trình “xử lý số” được gọi để chuyển các số được ấn vào biến được lựa chọn ở trên, ghi giá trị này vào RTC. Sau đó đọc và hiển thị các giá trị ra ngoài, cuối cùng nhảy đến bước 10.
- Nếu phím được ấn là KEY_ON_BELL / KEY_OFF_BELL thì tương ứng với việc mở/tắt chuông theo từng giờ, sau đó nhãy đến bước 10.
Bước 10: Tạo trể 0.1s và thoát khỏi ngắt
1.3. Giải thuật chương trình con “WRITE_CLOCK”
Gởi điều kiện START đến RTC
Gởi tiếp địa chỉ Slave + W (0D0h)
Gởi địa chỉ thanh ghi đầu tiên được chọn để ghi (00h: địa chỉ thanh ghi SECOND)
Ghi tất cả các byte dữ liệu vào RTC như: giây, phút, giờ, thứ, ngày, tháng, năm, giá trị thanh ghi control và cuối cùng là thời gian báo thức
Gởi điều kiên STOP và thoát.
	Chú ý: Nếu không phải là lần ghi/đọc cuối cùng thì kéo biến LAST xuống mức thấp để gởi bit ACK, ngược lại đưa biến LAST lên cao để gởi bit Not_ACK (NACK).
 1.4. Giải thuật chương trình con “READ_CLOCK”
Gởi điều kiện START đến RTC
Gởi tiếp địa chỉ Slave + W (0D0h).
Gởi địa chỉ thanh ghi đầu tiên được chọn để ghi (00h: địa chỉ thanh ghi SECOND).
Gởi điều kiện STOP.
Gởi lại điều kiện START.
Gởi địa chỉ Slave + R (0D1h).
Bắt đầu đọc lần lượt từng byte dữ liệu từ RTC. Đầu tiên là giây, phút, giờ, thứ, ngày, tháng, năm, giá trị thanh ghi control và cuối cùng là thời gian báo thức
Gởi điều kiện STOP và thoát.
	2. Lưu đồ
2.1. Lưu đồ chương trình chính
BEGIN
Khởi tạo giá trị ban đầu
Đọc thời gian thực từ RTC
END
Hiển thị thời gian ra led 7 đoạn
Thời gian báo thức
Mở/tắt chuông theo từng giờ
Tạo hiệu ứng khi điều chỉnh
2.2. Lưu đồ chương trình ngắt “GIAI_MA_REMOTE_SONY”
Gán giá trị
A = 01000000h
Y
N
Y
N
Đặt cờ nhớ C=0
Quay phải có nhớ A
Đặt cờ nhớ C=1
Quay phải có nhớ A
Quay phải A
Đo mức tín hiệu
Tín hiệu mức thấp
Chờ tín hiệu lên
 mức cao
Tạo trễ 900ms
C = 1
START
TIEP
Chờ tín hiệu xuống
 mức thấp
C = 1
N
N
Y
Y
Y
Y
Y
N
N
N
N
N
TIEP
RETI
A = = KEY_ON_OFFF
Tạo trể 0.1s
A = = KEY_NEXT hoặc
A = = KEY_BACK
A = = KEY_1, KEY_2…..
A = = KEY_0N_BELL 
hoặc KEY_OFF_BELL
Hiệu ứng điều chỉnh
Tắt/mở chuông
Xử lý số
Read clock
Hiển thị_2
Write clock
2.3. Lưu đồ chương trình con 
2.3.1. Lưu đồ chương trình con “WRITE_CLOCK”
BEGIN
RET
Gởi điều kiện STOP
Gởi điều kiện START
Gởi địa chỉ Slave+W (0D0h)
Gởi 1 byte địa chỉ con trở (00h)
Ghi tất cả byte dữ liệu như: giây, phút,....,thời gian báo thức vào RTC
2.3.2. Lưu đồ chương trình con “READ_CLOCK”
BEGIN
RET
Gởi điều kiện STOP
Gởi điều kiện START
Gởi địa chỉ Slave+W (0D0h)
Gởi 1 byte địa chỉ con trở (00h)
Đọc tất cả byte dữ liệu như: giây, phút,....,thời gian báo thức từ RTC
Gởi điều kiện STOP
Gởi điều kiện START
Gởi địa chỉ Slave+R (0D1h)
2.3.3. Lưu đồ chương trình con ghi 1 byte vào DS1307“SEND_BYTE”
N
Y
Y
Y
N
N
BEGIN
RET
Tạo một xung nhip tại chân SCL
Gán giá trị
BITCOUNT = 08
ACC.7 = = 0
SDA = 1
SDA = 0
Quay trái thanh ghi A
LAST = = 0
Gởi bit NACK
Gởi bit ACK
BITCOUNT = = 0
2.3.4. Lưu đồ chương trình con đọc 1 byte từ DS1307“READ_BYTE”
N
Y
Y
N
BEGIN
RET
Đưa dữ liệu từ SDA vào cờ C
Gán giá trị: A = 00
BITCOUNT = 08
Quay trái thanh ghi A có cớ nhớ C
LAST = = 0
Gởi bit NACK
Gởi bit ACK
BITCOUNT = = 0
Tạo một xung nhip tại chân SCL
2.3.5. Lưu đồ chương trình con “ALARM_CLOCK_TEST”
N
N
Y
N
Y
Y
BEGIN
RET
HOUR = = ALK_HOUR
MINUTE = = ALK_MINUTE
Kích hoạt hệ thống 
âm thanh
MINUTE = = ALK_MINUTE
Đọc thời gian thực từ RTC
Hiển thị 
ra led 7 đoạn
Dừng kích hoạt 
hệ thống âm thanh
2.3.6. Lưu đồ chương trình con “TAT_MO_CHUONG”
N
N
N
Y
Y
Y
Y
BEGIN
RET
R3 = = 0FFH
MINUTE = = 0
Kích hoạt hệ thống 
âm thanh
SECOND = = 0
Tạo trễ 
 khoảng 0.5s
Dừng kích hoạt 
hệ thống âm thanh
2.3.7. Lưu đồ chương trình con “HIEU_UNG_CHINH”
Y
Y
Y
Y
Y
N
N
N
N
N
BEGIN
RET
R0 = = 20H
Tạo hiệu ứng chỉnh giờ
R0 = = 21H
Tạo hiệu ứng chỉnh phút
R0 = = 22H
Tạo hiệu ứng chỉnh giây
Tạo hiệu ứng chỉnh giờ báo thức
R0 = = 28H
Tạo hiệu ứng điều phút báo thức
R0 = = 27H
2.3.8. Lưu đồ chương trình con “HIENTHI_2”
BEGIN
RET
Tách số BCD
Đưa nội dung biến HOUR vào thanh ghi A
Xuất ra led 7 đoạn
Tách số BCD
Đưa nội dung biến MINUTE vào thanh ghi A
Xuất ra led 7 đoạn
Tách số BCD
Đưa nội dung biến 
ALK_MINUTE vào thanh ghi A
Xuất ra led 7 đoạn
II. PHẦN MỀM ĐỒNG HỒ THỜI GIAN THỰC VÀ BỘ ĐIỀU KHIỂN TỪ XA DÙNG REMOTE HỒNG NGOẠI (CODE_2)
Phần mềm đồng hồ thời gian thực và bộ điều khiển từ xa dùng remote hồng ngoại (Code_2) cũng được lập trình bằng ngôn ngữ Assembler (ASM), soạn thảo và biên dịch bằng chương trình Keil Version. Nội dung Code_2 nằm ở thư mục phụ lục “trang 80”.
CHƯƠNG IV: KẾT LUẬN VÀ ĐỀ NGHỊ
 I. KẾT LUẬN
	Sau một thời gian nghiên cứu và tìm hiểu về đề tài này. Cùng với sự chỉ dẫn tận tình của các Thầy Lương Vinh Quốc Danh. Đến nay em đã thiết kế thành công “Lịch Vạn Niên Điện Tử” , mạch hoạt động rất ổn định và đáp ứng được yêu cầu của đề tài đặt ra. Do thời gian và năng lực giới hạn nên sản phẩm được thiết kế không thể tránh khỏi một số khuyết điểm: sản phẩm hơi thô, không được đẹp… kính mong quý thầy cô và các bạn thông cảm.
	 Sau đây là một số hình ảnh của “Lịch Vạn Niên Điện Tử”:
Modul hiển thị
Modul hiệu ứng dùng led đơn
Modul xử lý trung tâm
Lịch Vạn Niên Điện Tử
 II. ĐỀ NGHỊ
	Sau khi đã thiết kế thành công đề tài này, em có một số đề nghị để khắc phục những khuyết điểm mà em mắc phải.
	ª Thay đổi IC chốt 74HC374 bằng IC ghi dịch và chốt 74LS595. Bằng cách này sẽ là giảm bớt quá trình phức tạp khi thiết kế phần cứng, góp phần làm cho sản phẩm gọn nhẹ hơn.
	ª Thiết kế thêm bộ chuyển đổi từ ngày dương lịch sang ngày âm lịch.
	ª Thay đổi tiếng chuông báo thức bằng một bài nhạc mà bạn yêu thích.
TÀI LIỆU THAM KHẢO
[1] Giáo trình Vi Điều Khiển _ Tác giả Th.Phạm Hùng Kim Khánh
[2] Tài liệu hướng dẫn Thực Tập Vi Điều Khiển _ Biên soạn Th.Trần Nhật Khải Hoàn, KS.Trần Hữu Danh.
[3] Giáo trình MẠCH XUNG _ Biên soạn Th.Lương Văn Sơn, KS.Nguyễn Khắc Nguyên.
[4] Giáo trình MẠCH SỐ _ Tác giả Th.Nguyễn Trung Lập.	
[5] Giáo trình MẠCH TƯƠNG TỰ _ Tác giả KS. Trương Văn Tám
[6] 
[7] 
[8] 
PHỤ LỤC
1. Phần mềm đo nhiệt độ (CODE_1)
RDL	BIT	P3.0
 WRL	BIT	P3.1
 INT	BIT	P3.3
 LED1	BIT	P2.7
 LED2	BIT	P3.2
 LED3	BIT	P3.4
 LED4	BIT	P3.5
 ORG	0000H
 LJMP	MAIN
 MAIN: 
 MOV	P0,#00H
 	MOV	P2,#00H
	CLR	LED1
	CLR	LED2
	CLR	LED3
	CLR	LED4
	MOV	DPTR,#LED7S
	MOV	R0,#00H
	MOV	R7,#05
 	SETB	RDL
	SETB	WRL
 HERE:
	CALL	TRUY_CAP_ADC
	CALL	HIENTHI
	CALL	HIEU_UNG_1
	CALL	TRUY_CAP_ADC
	CALL	HIENTHI
	CALL	HIEU_UNG_2
 JMP	HERE
;-------------------------------------------------------------------------------------
;--------Truy nhap vao chip ADC0804--------
 TRUY_CAP_ADC: 
 	CLR	WRL
 	SETB	WRL	;Tao xung canh len tai chan WR 	 	;de bat dau qua trinh bien doi
	JB	INT,$	;Cho qua trinh bien doi hoan thanh
	SETB	RDL
 	CLR RDL	;Tao xung canh xuong tai chan 
	;RD de doc du lieu 
 	CALL	DELAY
 	MOV	R0,P1	;Dua du lieu vao thanh ghi R0
	SETB	RDL
 	RET
;------Hien thi nhiet do ra led 7 doan------
 HIENTHI:
 	MOV	A,R0
 	MOV	B,#10
 	DIV	AB	;Chia Gia tri thanh ghi A cho 10,
	;phan nguyen luu trong A, du luu trong B
 	CALL	READ
 	CLR	P3.7
 	SETB	P3.7	;Tao xung canh len de xuat du lieu 
 	CALL 	DELAY_6us
 	MOV	A,B
 	CALL 	READ
 	CLR	P3.6
 	SETB	P3.6
 	CALL	DELAY_6us
 	 RET
;------Hieu ung thu 1 cho led doan------ 
 HIEU_UNG_1:
 LOOP1:
 	SETB	LED1
 	CLR	LED2
 	CLR	LED3
 	SETB	LED4
	MOV	P0,#04H
 	CALL	DELAY
	CALL	DELAY
 	CLR	LED1
 	SETB	LED2
 	CLR	LED3
 	CLR	LED4
	MOV	P0,#09H
 	CALL	DELAY
	CALL	DELAY
	CLR	LED1	
	CLR	LED2
	SETB	LED3	
	CLR	LED4
	MOV	P0,#12H
	CALL	DELAY
	CALL	DELAY
 	DJNZ	R7,LOOP1
	MOV	R7,#10
	MOV	P0,#00H
	CLR	LED3
 	RET
;------Hieu ung thu 2 cho led doan------ 
 HIEU_UNG_2:
 LOOP2:
 	SETB	LED1
 	CALL	DELAY
 	CLR	LED1
 	SETB	LED2
 	CALL	DELAY
 	CLR	LED2
 	SETB	LED3
 	CALL	DELAY
 	CLR	LED3
 	SETB	LED4
 	CALL	DELAY
 	CLR	LED4
 	MOV	P0,#01H
 	CALL	DELAY
 	MOV	P0,#02H
 	CALL	DELAY
 	MOV	P0,#04H
 	CALL	DELAY
 	MOV	P0,#08H
 	CALL	DELAY
 	MOV	P0,#10H
 	CALL	DELAY
	MOV	P0,#00H
	CALL	DELAY
 	DJNZ	R7,LOOP2
	MOV	R7,#05
 RET
;------Doc noi dung o nho DPTR-----
READ:
 	MOVC	A,@A+DPTR
 	MOV	P2,A
 RET
;------Tao tre 6us------
 DELAY_6us:
 	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
 	 RET
;------Tao tre (250*200*2)/10^6 = 0.1s------
 DELAY:
 	MOV	R1,#250
 L1:
 	MOV	R2,#200
 	DJNZ	R2,$
 	DJNZ	R1,L1
 RET
 LED7S: DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H
 END
2. Phần mềm đồng hồ thời gian thực và bộ điều khiển từ xa dùng remote hồng ngoại (CODE_2)
SCL	BIT	P0.0
SDA	BIT	P0.1
SPEAKER	BIT	P3.0
BELL	BIT	P3.1
SIGNAL	BIT	P3.2
DIS3	BIT	P0.2
DIS4	BIT 	P0.3
DIS5	BIT 	P0.4
DIS6	BIT	P0.5	
DIS8	BIT	P0.6	
DIS7	BIT	P0.7
DIS9	BIT	P3.3
DIS15	BIT	P2.0
DIS13	BIT	P2.1	
DIS12	BIT	P2.2
DIS14	BIT	P2.3
DIS10	BIT	P2.4
DIS11	BIT	P2.5
DIS16	BIT	P2.6
DIS17	BIT	P2.7
DIS18	BIT	P3.4
DIS19	BIT	P3.5
DIS21	BIT	P3.6
DIS20	BIT	P3.7
CO	DATA	2DH	
LAST	BIT	CO.7
HOUR	DATA	20H
MINUTE	DATA	21H
SECOND	DATA	22H
DAY	DATA	23H
DATE	DATA	24H
MONTH	DATA	25H
YEAR	DATA	26H
ALK_HOUR	DATA	27H
ALK_MINUTE	DATA	28H
SQW_OUT	DATA	29H
BYTECOUNT	DATA	2AH
BITCOUNT	DATA	2BH
TAM	DATA	2CH
 ORG	0000H
 LJMP	MAIN
 ORG	0003H
 LJMP	GIAI_MA_ROMOTE_SONY
MAIN:
 	MOV	R0,#1FH
 	MOV	R1,#00H
 	MOV	R2,#0FFH
 	MOV	R3,#00H
	MOV	DPTR,#LED7S
	MOV	P0,#0FFH
	MOV	P1,#0FFH
 	MOV	P2,#0FFH
	MOV	P3,#0FFH
 	CLR	LAST
	CLR	SPEAKER
 	CLR	BELL
	 MOV	SECOND,#50H
	 MOV	MINUTE,#59H
	 MOV	HOUR,#00H
	 MOV	DAY,#02H
 	 MOV	DATE,#01H
	 MOV	MONTH,#01H
 	 MOV	YEAR,#10H
 	 MOV	ALK_MINUTE,#30H
	 MOV	ALK_HOUR,#22H
	 MOV	SQW_OUT,#90H
	 MOV	TAM,#00H
	 MOV	IE,#00H
 	 MOV	TMOD,#10H
	 SETB	EA
 	 SETB	EX0
 	 SETB	IT0
 	 MOV	SP,#256-32
 HERE:
 	CALL	READ_CLOCK
	CALL	HIENTHI_2
	CALL	ALARM_TEST
	CALL	TAT_MO_CHUONG
	CALL	HIEU_UNG_CHINH
 JMP	HERE
;------------------------------------------------------------------------------
;----Chuong trinh ngat de giai ma tin hieu hong ngoai----
GIAI_MA_ROMOTE_SONY:
 	MOV	R1,A
 	CALL 	DELAY_900us
 	MOV	A,#40H
 	JB	SIGNAL,EXIT_GIAIMA
 RP1:
 	JNB	SIGNAL,RP1	;Cho tin hieu len muc cao
 RP2:
 	JB	SIGNAL,RP2	;Cho tin hieu xuong muc thap	
 	CALL	DELAY_900us	;Tao tre 900us
 	MOV	C,SIGNAL	;Dua de lieu vao C
 	JC	BIT0	; Neu C=1 du lieu la bit 0
	 ;neu C=0 du lieu la bit 1 
 BIT1:	
 	SETB	C	;Dat C bang 1
 	RRC	A	;Ghi vao A
 	JC	END_SIGNAL
 	JMP	RP1
 BIT0:
 	CLR	C	;Dat C bang 0	
 	RRC	A	;Ghi vao A
 	JC	END_SIGNAL
 	JMP	RP2
 END_SIGNAL:
	CALL	LONG_DELAY	;Tao tre de chong nhieu
 	RR	A	; Quay phai A
 	 JMP	KEY_ON_OFF
;----Phim cho phep mo/tat che do dieu chinh----
KEY_ON_OFF:
 	CJNE	A,#15H,SOSANH
	MOV	A,R2
 	CPL	A
	MOV	R2,A
	MOV	R0,#20H
 	CJNE	R2,#0FFH,EXIT_KEY_ON_OFF
 	MOV	R0,#01FH
 EXIT_KEY_ON_OFF:
	JMP	EXIT_GIAIMA
 SOSANH:
 	CJNE	R2,#0FFH,KEY_NEXT
	JMP	EXIT_GIAIMA
;----Phim lua chon vi tri dieu chinh----
 KEY_NEXT:
 	CJNE	A,#18H,KEY_BACK
 	INC	R0
 	CJNE	R0,#29H,EXIT_KEY_NEXT
 	MOV	R0,#20H
 EXIT_KEY_NEXT:
	CALL	HIEU_UNG_CHINH
 	 JMP	EXIT_GIAIMA
 KEY_BACK:
 	CJNE	A,#19H,KEY_01
 	DEC	R0
 	CJNE	R0,#1FH,EXIT_KEY_NEXT
 	MOV	R0,#28H
 EXIT_KEY_BACK:
	CALL	HIEU_UNG_CHINH
 EXIT_GIAIMA:
 	CALL	LONG_DELAY
	JNB	SIGNAL,EXIT_GIAIMA
 	MOV	A,R1
	CLR	IE0
 	RETI
;-----Cac phim du lieu cai dat------
 KEY_01:
	CJNE	A,#00H,KEY_02
	MOV	TAM,#01H
	CALL	XULY
 	JMP	EXIT_GIAIMA
 KEY_02:
	CJNE	A,#01H,KEY_03
	MOV	TAM,#02H
	CALL	XULY
 	JMP	EXIT_GIAIMA
 KEY_03:
	CJNE	A,#02H,KEY_04
	MOV	TAM,#03H
	CALL	XULY
 	JMP	EXIT_GIAIMA
 KEY_04:
	CJNE	A,#03H,KEY_05
	MOV	TAM,#04H
	CALL	XULY
 	 JMP	EXIT_GIAIMA
 KEY_05:
	CJNE	A,#04H,KEY_06
	MOV	TAM,#05H
	CALL	XULY
 	JMP	EXIT_GIAIMA
 KEY_06:
	CJNE	A,#05H,KEY_07
	MOV	TAM,#06H
	CALL	XULY
 	JMP	EXIT_GIAIMA
 KEY_07:
	CJNE	A,#06H,KEY_08
	MOV	TAM,#07H
	CALL	XULY
 	JMP	EXIT_GIAIMA
 KEY_08:
	CJNE	A,#07H,KEY_09
	MOV	TAM,#08H
	CALL	XULY
 	JMP	EXIT_GIAIMA
 KEY_09:
	CJNE	A,#08H,KEY_10
	MOV	TAM,#09H
	CALL	XULY
 	JMP	EXIT_GIAIMA
 KEY_10:
	CJNE	A,#09H,KEY_MO_CHUONG
	MOV	TAM,#00H
	CALL	XULY
	JMP	EXIT_GIAIMA
 KEY_MO_CHUONG:
 	CJNE	A,#12H,KEY_TAT_CHUONG
	MOV	R3,#0FFH
	SETB	BELL
	JMP	EXIT_GIAIMA
 KEY_TAT_CHUONG:
 	CJNE	A,#13H,EXIT_GIAIMA
	MOV	R3,#00H
	CLR	BELL
	JMP	EXIT_GIAIMA
;----Dua gia tri duoc dieu chinh vao cac o nho du lieu----
 XULY:
	MOV	A,@R0
	SWAP	A
	ANL	A,#0F0H
	ORL	A,TAM
	MOV	@R0,A
	CALL	WRITE_CLOCK
	CALL	READ_CLOCK
	CALL	HIENTHI_2
 RET
;----Tao ra hieu ung khi dieu chinh----
 HIEU_UNG_CHINH:
	CJNE	R0,#20H,TT1
	MOV	P1,#0FFH
 	CLR	DIS3
	SETB	DIS3
	CLR	DIS4
	SETB	DIS4
	CALL	LONG_DELAY
	CALL	LONG_DELAY
	CALL	HIENTHI_2
	CALL	LONG_DELAY
	CALL	LONG_DELAY
	JMP	EXIT_HUC
 TT1:
 	CJNE	R0,#21H,TT2
	MOV	P1,#0FFH
 	CLR	DIS5
	SETB	DIS5
	CLR	DIS6
	SETB	DIS6
	CALL	LONG_DELAY
	CALL	LONG_DELAY
	CALL	HIENTHI_2
	CALL	LONG_DELAY
	CALL	LONG_DELAY
	JMP	EXIT_HUC
 TT2:
 	CJNE	R0,#22H,TT3
	MOV	P1,#0FFH
 	CLR	DIS7
	SETB	DIS7
	CLR	DIS8
	SETB	DIS8
	CALL	LONG_DELAY
	CALL	LONG_DELAY
	CALL	HIENTHI_2
	CALL	LONG_DELAY
	CALL	LONG_DELAY
	JMP	EXIT_HUC
 TT3:
 	CJNE	R0,#23H,TT4
	MOV	P1,#0FFH
 	CLR	DIS9
	SETB	DIS9
	CALL	LONG_DELAY
	CALL	LONG_DELAY
	CALL	HIENTHI_2
	CALL	LONG_DELAY
	CALL	LONG_DELAY
	JMP	EXIT_HUC
 TT4:	
 	CJNE	R0,#24H,TT5
	MOV	P1,#0FFH
 	CLR	DIS10
	SETB	DIS10
	CLR	DIS11
	SETB	DIS11
	CALL	LONG_DELAY
	CALL	LONG_DELAY
	CALL	HIENTHI_2
	CALL	LONG_DELAY
	CALL	LONG_DELAY
	JMP	EXIT_HUC
 TT5:
 	CJNE	R0,#25H,TT6
	MOV	P1,#0FFH
	CLR	DIS12
	SETB	DIS12
	CLR	DIS13
	SETB	DIS13
	CALL	LONG_DELAY
	CALL	LONG_DELAY
	CALL	HIENTHI_2
	CALL	LONG_DELAY
	CALL	LONG_DELAY
	JMP	EXIT_HUC
 TT6:
 	CJNE	R0,#26H,TT7
	MOV	P1,#0FFH
 	CLR	DIS14
	SETB	DIS14
	CLR	DIS15
	SETB	DIS15
	CLR	DIS16
	SETB	DIS16
	CLR	DIS17
	SETB	DIS17
	CALL	LONG_DELAY
	CALL	LONG_DELAY
	CALL	HIENTHI_2
	CALL	LONG_DELAY
	CALL	LONG_DELAY
	JMP	EXIT_HUC
 TT7:
 	CJNE	R0,#27H,TT8
	MOV	P1,#0FFH
 	CLR	DIS18
	SETB	DIS18
	CLR	DIS19
	SETB	DIS19
	CALL	LONG_DELAY
	CALL	LONG_DELAY
	CALL	HIENTHI_2
	CALL	LONG_DELAY
	CALL	LONG_DELAY
	JMP	EXIT_HUC
 TT8:
	CJNE	R0,#28H,EXIT_HUC
	MOV	P1,#0FFH
 	CLR	DIS20
	SETB	DIS20
	CLR	DIS21
	SETB	DIS21
	CALL	LONG_DELAY
	CALL	LONG_DELAY
	CALL	HIENTHI_2
	CALL	LONG_DELAY
	CALL	LONG_DELAY
 EXIT_HUC:
 	 RET
;----Chon che do tat/mo chuong theo tung gio----
 TAT_MO_CHUONG:
 	 CJNE	R3,#0FFH,TT10
	MOV	A,MINUTE
	CJNE	A,#00H,TT10
	MOV	A,SECOND
	CJNE	A,#00H,TT10
	CLR	SPEAKER	;Mo am thanh bao thuc
	CALL	LONG_DELAY
	CALL	LONG_DELAY
	CALL	LONG_DELAY
	CALL	LONG_DELAY
 TT10:
 	SETB	SPEAKER	;Tat am thanh bao thuc
 	RET
;----Gui dieu kien STARRT den DS1307-----
 SEND_START: 
 	SETB	SDA
 	SETB	SCL
	CALL	DELAY6US
 	CLR	SDA
	CALL	DELAY6US
 	CLR	SCL
	CALL	DELAY6US
 	RET
;-----Gui dieu kien STOP den DS1307----
 SEND_STOP:
 	CLR	SDA
 	SETB	SCL
	CALL	DELAY6US
	SETB	SDA
	CALL	DELAY6US
	CLR	SCL
	CALL	DELAY6US
 	 RET
;----Ghi 8 bit du lieu vao DS1307---
 SEND_BYTE:
 	MOV BITCOUNT,#08H
 SEND_BYTE_LOOP:
 	JNB ACC.7,LEVEL_LOW
 	SETB SDA
 	JMP SEND_BITS
 LEVEL_LOW:
 	CLR SDA
 SEND_BITS:
 	 SETB	SCL
 	CALL	DELAY6US
 	CLR 	SCL	;Ket thuc 1 xung nhip
 	RL 	A
 	DJNZ 	BITCOUNT,SEND_BYTE_LOOP
 	JB 	LAST,NOT_ACK1	;Neu lan doc cuoi cung thi 
	;khong gui bit ACK
 ACK1:	;Gui bit ACK
 	CLR 	SDA	
 	SETB	SCL
 	CALL	DELAY6US
 	CLR	SCL
 	CALL	DELAY6US
 	RET
 NOT_ACK1:	;Gui bit Not_ACK (NACK)
 	SETB 	SDA
 	SETB 	SCL
 	CALL	DELAY6US
 	CLR 	SCL 
 	CALL	DELAY6US
 	 RET
;----Doc 8 bit du lieu tu DS1307----
 READ_BYTE:
 	MOV 	BITCOUNT,#08H
 	MOV 	A,#00H
 	SETB 	SDA
 READ_BITS:
	SETB 	SCL
 	MOV 	C,SDA
 	CALL	DELAY6US	
 	RLC 	A	;Dua SDA vao thanh ghi A
 	CLR 	SCL
 	CALL 	DELAY6US
 	DJNZ 	BITCOUNT,READ_BITS
 	JB 	LAST,NOT_ACK2	;Neu lan doc cuoi cung thi 
	;khong gui bit ACK
 	ACK2:	;Gui bit ACK
 	CLR SDA	
 	SETB	SCL
 	CALL	DELAY6US
 	CLR	SCL
 	CALL	DELAY6US
 	RET
 NOT_ACK2:	;Gui bit NACK
 	SETB SDA
 	SETB SCL
 	CALL	DELAY6US
 	CLR SCL 
 	CALL	DELAY6US
 	RET
;----Doc thoi gian thuc tu DS1307----
 READ_CLOCK:
	CALL	SEND_START	
	CLR	LAST	
	MOV	A,#0D0H	
	CALL	SEND_BYTE	
	SETB	LAST	
	MOV	A,#00H	
	CALL	SEND_BYTE	
	CALL	SEND_STOP	
	CALL	SEND_START	
	CLR	LAST	
	MOV	A,#0D1H	
	CALL	SEND_BYTE	
	CALL	READ_BYTE	
	MOV	SECOND,A	
	CALL	READ_BYTE	
	MOV	MINUTE,A	 
	CALL	READ_BYTE	
	MOV	HOUR,A	
	CALL	READ_BYTE	
	MOV	DAY,A	
	CALL	READ_BYTE	
	MOV	DATE,A	
	CALL	READ_BYTE	
	MOV	MONTH,A	
	CALL	READ_BYTE	
	MOV	YEAR,A
	CALL	READ_BYTE
	MOV	SQW_OUT,A
	CALL	READ_BYTE
	MOV	ALK_HOUR,A
	SETB	LAST
	CALL	READ_BYTE
	MOV	ALK_MINUTE,A
	CALL	SEND_STOP
	RET
;----Cai dat thoi gian cho DS1307----
 WRITE_CLOCK:
	CALL	SEND_START	
	CLR	LAST	
	MOV	A,#0D0H	
	CALL	SEND_BYTE	
	MOV	A,#00H	
	CALL	SEND_BYTE
	MOV	A,SECOND	
	CALL	SEND_BYTE
	MOV	A,MINUTE
	CALL	SEND_BYTE	
	MOV	A,HOUR	
	CALL	SEND_BYTE
	MOV	A,DAY
	CJNE	A,#08H,TTD
 	MOV	A,#01H
 TTD:
	CALL	SEND_BYTE
	MOV	A,DATE	
	CALL	SEND_BYTE
	MOV	A,MONTH	
	CALL	SEND_BYTE	
	MOV	A,YEAR	
	CALL	SEND_BYTE	
	MOV	A,#90H	
	CALL	SEND_BYTE
	MOV	A,ALK_HOUR
	CALL	SEND_BYTE
 	SETB	LAST
	MOV	A,ALK_MINUTE
	CALL	SEND_BYTE
	CALL	SEND_STOP
	RET
;----Thoi gian bao thuc----
 ALARM_TEST:
 	MOV	A,MINUTE
 	CJNE	A,ALK_MINUTE,EXIT_ALARM_TEST
 	MOV	A,HOUR
 	CJNE	A,ALK_HOUR,EXIT_ALARM_TEST
 	CLR	SPEAKER
 LOOP_ALK_TEST:
 	MOV	A,MINUTE
 	CJNE	A,ALK_MINUTE,EXIT_ALARM_TEST
 	CALL	HIENTHI_2
 	CALL	READ_CLOCK
 	JMP	LOOP_ALK_TEST
 EXIT_ALARM_TEST:
 	SETB	SPEAKER
 	RET
;----Xuat ket qua ra led 7 doan----
 HIENTHI_2:
 	MOV	A,HOUR
	ANL	A,#0F0H
	SWAP	A
	CALL	READ
 	CLR	DIS3
	SETB	DIS3
 	CALL 	DELAY6US
 	MOV	A,HOUR
	ANL	A,#0FH
 	CALL 	READ
	CLR	DIS4
 	SETB	DIS4
 	CALL	DELAY6US
 	MOV	A,MINUTE
	ANL	A,#0F0H
	SWAP	A
 	CALL	READ
	CLR	DIS5
 	SETB	DIS5
 	CALL 	DELAY6US
 	MOV	A,MINUTE
	ANL	A,#0FH
 	CALL 	READ
	CLR	DIS6
 	SETB	DIS6
 	CALL	DELAY6US
 	MOV	A,SECOND
	ANL	A,#0F0H
	SWAP	A
 	CALL	READ
	CLR	DIS7
 	SETB	DIS7
 	CALL 	DELAY6US
 	MOV	A,SECOND
	ANL	A,#0FH
 	CALL 	READ
	CLR	DIS8
 	SETB	DIS8
 	CALL	DELAY6US
 	MOV	A,DAY
	CJNE	A,#01H,TTDD
 	MOV	A,#08H
 TTDD:
 	CALL	READ
	CLR	DIS9
 	SETB	DIS9	
 	CALL	DELAY6US
 	MOV	A,DATE
	ANL	A,#0F0H
	SWAP	A
 	CALL	READ
	CLR	DIS10
 	SETB	DIS10
 	CALL 	DELAY6US
	MOV	A,DATE
	ANL	A,#0FH
 	CALL 	READ
	CLR	DIS11
 	SETB	DIS11
 	CALL	DELAY6US
 	MOV	A,MONTH
	ANL	A,#0F0H
	SWAP	A
 	CALL	READ
	CLR	DIS12
 	SETB	DIS12
 	CALL 	DELAY6US
 	MOV	A,MONTH
	ANL	A,#0FH
 	CALL 	READ
	CLR	DIS13
 	SETB	DIS13
 	CALL	DELAY6US
	MOV	A,#20
	MOV	B,#10
 	DIV	AB
	CALL	READ
	CLR	DIS14
	SETB	DIS14	
	CALL	DELAY6US
	MOV	A,B
	CALL	READ
	CLR	DIS15
	SETB	DIS15
	CALL	DELAY6US
 	MOV	A,YEAR
	ANL	A,#0F0H
	SWAP	A
 	CALL	READ
	CLR	DIS16
 	SETB	DIS16
 	CALL 	DELAY6US
 	MOV	A,YEAR
	ANL	A,#0FH
 	CALL 	READ
	CLR	DIS17
 	SETB	DIS17
 	CALL	DELAY6US
 	MOV	A,ALK_HOUR
	ANL	A,#0F0H
	SWAP	A
 	CALL	READ
	CLR	DIS18
 	SETB	DIS18
 	CALL 	DELAY6US
 	MOV	A,ALK_HOUR
	ANL	A,#0FH
 	CALL 	READ
	CLR	DIS19
 	SETB	DIS19
 	CALL	DELAY6US
 	MOV	A,ALK_MINUTE
	ANL	A,#0F0H
	SWAP	A
 	CALL	READ
 	CLR	DIS20
 	SETB	DIS20
 	CALL 	DELAY6US
 	MOV	A,ALK_MINUTE
	ANL	A,#0FH
 	CALL 	READ
	CLR	DIS21
 	SETB	DIS21
 	CALL	DELAY6US
 	RET
;----Doc noi dung o nho DPTR----
 READ:
	MOVC	A,@A+DPTR
 	MOV	P1,A
 	RET
;----Tao tre 900us----
 DELAY_900us:
 	MOV	TH1,#HIGH(-900)
 	MOV	TL1,#LOW(-900)
 	SETB	TR1
	JNB	TF1,$
 	CLR	TF1
 	CLR	TR1
 	RET
;----Tao tre 6us----
 DELAY6US: 
	NOP	
	NOP
	NOP
	NOP
	NOP
	NOP
 	RET
;----Tao tre (250*200*2)/10^6 = 0.1s----
 LONG_DELAY:
 	MOV	R7,#250
 L2:
 	MOV	R6,#200
 	DJNZ	R6,$
 	DJNZ	R7,L2
 	RET
LED7S: DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H
 END 	3. Hướng dẫn sử dụng bộ điều khiển dùng Remote SONY
Các bước thực hiện để cài đặt thời gian cho “Lịch Vạn Niên Điện Tử”
Bước 1: Ấn phím POWER lần thứ nhất để mở chế độ cài đặt. Lưu ý nếu như chế độ cài đặt không được mở thì tất cả các phím còn lại đều bị vô hiệu hoá.
Bước 2: Sau khi chế độ cài đặt được mở, sử dụng phím CONTÇ hoặc CONT- để chọn vị trí cài đặt. Phím CONTÇ để next (chuyển) đến vị trí kế tiếp, phím CONT- để back (trở về) vị trí phía sau. 
Sử dụng 2 phím VOLÇ hoặc VOL- để chọn chế độ báo chuông theo từng giờ (6h,7h,8h.….), phím VOLÇ dùng để mở và VOL- dùng để tắt chế độ này.
Bước 3: Nhập vào các giá trị cần cài đặt bằng các số trên remote từ 1 đến 10 (do remote không có số 0 nên số 10 lúc này được xem là số 0), vậy giá trị được nhập giới hạn từ 0 đến 9. Nguyên tắt nhập số cài đặt tương tự như nguyên tắt nhập số trong máy tính bỏ túi.
Bước 4: Ấn phím POWER lần thứ hai để tắt chế độ cài đặt.
4. Code word của remote SONY
 Để có được các code word remote SONY tôi sử dụng các led đơn (mắt ở port 0) để chỉ thị cho mỗi lần ấn phím. Sau đây là một vài code word mà tôi đã giải mã: 
Tín hiệu hiển thị ở Port 0
Phím ấn remote
Mã lệnh khi ấn phím
(hex)
00000000B
1
00H
00000001B
2
01H
00000010B
3
02H
00000011B
4
03H
00000100B
5
04H
00000101B
6
05H
00000110B
7
06H
00000111B
8
07H
00001000B
9
08H
00001001B
10
09H
00010101B
POWER
15H
00011000B
CONTÇ
18H
00011001B
COUNT-
19H
00010010B
VOLÇ
12H
00010011B
VOL-
13H
00100101B
TV/VIDEO
25H
01111000B
MEMD
78H
00001011B
TUNE2
0BH
01110110B
-FINE
76H
01110111B
ÇFINE
77H
01101100B
TUNE1
6CH
01111100B
SELECT
7CH
01100101B
ENTER
65H
01100110B
MENU
66H
00010000B
PROGRÇ
10H
00010001B
PROGR-
11H
            Các file đính kèm theo tài liệu này:
 7562  KILOBOOKS.COM.doc 7562  KILOBOOKS.COM.doc