Thiết kế mạch quang báo giao tiếp trên máy tính

NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN: Ngày tháng năm Giáo viên hướng dẫn NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN: Ngày tháng năm Giáo viên phản biện  LỜI CẢM ƠN Trong thời gian làm luận văn em gặp rất nhiều khó khăn cũng như thuận lợi, nhưng với sự hướng dẫn tận tình của thầy Hồ Văn Cừu em đã hoàn thành những nội dung mà đề tài đưa ra. Em xin chân thành cảm ơn thầy Hồ Văn Cừu đã tận tình hướng dẫn em. Và em cũng xin cảm ơn đến quý thầy cô đã giảng dạy cho em trong 4 năm qua. TP.Hồ Chi Minh

doc103 trang | Chia sẻ: huyen82 | Lượt xem: 2388 | Lượt tải: 1download
Tóm tắt tài liệu Thiết kế mạch quang báo giao tiếp trên máy tính, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Ngày 10 tháng 1 năm 2008 MỤC LỤC  LỜI GIỚI THIỆU Ngày nay với sự phát triển của xã hội cùng với sự phát triển của khoa học kỹ thuật cho nên nhu cầu về thông tin trở nên hết sức cần thiết trong cuộc sống cũng như trong họat động sản xuất kinh doanh. Để đáp ứng nhu cầu đó quang báo là một lựa chọn đầu tiên, vì nó rất dễ bắt mắt chung ta với nhiều màu sắc. Quang báo có thể hiển thị đuợc cả văn bản lẫn hình ảnh, vì vậy nó rất tiện lợi cho quảng cáo và thông báo những thông tin ngắn gọn. Giới thiệu tổng quan. Giới thiệu chung. Khoa học kỹ thuật (KHKT) là một phần của văn minh con người. Sự phát triển của KHKT đã đưa con người tiến lên một thời kì mới. Thời kì của lao động trí óc thay cho lao động chân tay. Ngày nay KHKT phát triển như vũ bão, mà đặc biệt là ngành điện tử. Tuy ra đời sau nhưng hiện nay điện tử là ngành phát triển mạnh nhất của KHKT. Việc phát hiện ra các chất bán dẫn đã góp phần rất lớn vào việc thu nhỏ kích thước của linh kiện rất nhiều. Cộng với sự ra đời của IC đã giúp cho các sản phẩm điện tử trở nên nhỏ gọn hơn. Nói đến điện tử ta không thể không nhắc đến vi điều khiển (VĐK). Đúng vậy, ngày nay dù bất cứ nơi đâu ở trong nhà hay ngoài đường ta đều có thể bắt gặp các sản phẩm ứng dụng VĐK rất nhiều. Từ đơn giản như cái remote điều khiển ti vi, máy lạnh, đầu hát đĩa,…đến cái phức tạp hơn như điều khiển các tín hiệu đèn giao thông, các bảng đèn thông báo có những dòng chữ, hình ảnh chạy qua, rơi từ trên xuống, hay trồi từ dưới lên. Và phức tạp hơn nữa là điều khiển các dây chuyền sản xuất qua hệ thống máy tính. Giới thiệu đề tài. Xã hội phát triển dẫn theo đó là nhu cầu về trao đổi thông tin. Thông tin rất cần thiết với con người trong cuộc sống cũng như trong sản xuất kinh doanh. Để đáp ứng nhu cầu trên, quang báo là hình thức cung cấp thông tin hữu ích không thể thiếu trong cuộc sống hàng ngày. Ở nước ngoài việc dùng quang báo để quảng cáo hay hiện những thông báo, tin tức đã có rất lâu. Thế nhưng tại Việt Nam thì nó mới phổ biến rộng rãi trong nhưng năm gần đây. Quang báo gồm nhiều ma trận LED có thể là:5x7, 5x8, 8x8, 8x12 hoặc 8x14 để ghép lại với nhau, một ma trận hoặc hai ma trận cùng biểu diễn một kí tự. Bên cạnh đó, sự ra đời của máy vi tính, chúng có những tính năng ưu việt như khả năng xử lý dữ liệu nhanh chóng, độ tin cậy cao, lưu trữ thông tin lớn và quan trọng hơn cả là máy tính có thể kết hợp với nhiều thiết bị ngoại vi tùy theo mục đích ứng dụng cụ thể. Việc trao đổi và điều khiển trở nên đơn giản hơn nhờ vào phầm mềm điều khiển. Nhờ tính năng đa dạng và mềm dẻo đó mà việc thiết kế quang báo giao tiếp máy tính trở nên ít phức tạp hơn. Để thực hiện một bảng quang báo lớn thì phải cần nhiều thời gian. Nhưng ở đây do thời gian ngắn và kiến thức còn hạn chế nên em chỉ thực hiện một modun nhỏ để hiểu hơn về quang báo. Từ những kiến thức cơ bản đó ta có thể mở rộng ra với modul lớn hơn, kinh tế hơn. Có nhiều cách để làm một mạch quang báo như: dùng IC rời, dùng vi xử lý, dùng VĐK,…ở đây em chọn cách dùng VĐK có giao tiếp máy tính qua cổng nối tiếp để điều khiển. Tổng quan về giao tiếp máy tính và vi mạch 89C51. Tổng quan về giao tiếp máy tính. Phần cứng. Giao tiếp giữa máy tính và thiết bị ngoại vi có thể dùng : Cổng máy in LPT_cổng song song. Cổng COM_cổng nối tiếp. Cổng USB_Univeral Serial Bus. Cổng nối tiếp. Cổng nối tiếp RS-232C là giao diện phổ biến rộng rãi nhất. Người dùng máy tính PC còn gọi các cổng này là COM1, COM2. Giống như cổng máy in, cổng nối tiếp RS-232C cũng được sử dụng một cách rất thuận tiện cho mục đích đo lường và điều khiển. Cổng RS-232C sử dụng điện áp -12V là mức logic [1] và +12V làm mức logic [0]. DB- 25 1 13 1 5 6 9 DB-9 14 25 Hình 2.1: Cổng COM 1, COM 2 Theo chuẩn RS-232C, đầu nối phần cứng có 25 chân, có hình chữ “D” nên gọi là chân cắm D-shell hay DB-25. Nhưng không phải tất cả đều sử dụng đầu nối DB-25 mà còn có DB-9 chân. Đầu nối Chức năng Tên Hướng DB-25 DB-9 1 Đất GND 2 3 Truyền dữ liệu TxD Xuất 3 2 Nhận dữ liệu RxD Nhập 4 7 Yêu cầu gởi RTS Xuất 5 8 Xóa việc gởi CTS Nhập 6 6 Dữ liệu sẵn sàng DSR Nhập 7 5 Nối đất vỏ máy GND 8 1 Dò sóng mang DCD 20 4 Terminal sẵn sàng DTR Xuất 22 9 Bộ chỉ thị vòng RI Nhập Bảng 2.1 Cổng USB. Chuẩn USB bắt đầu từ những năm 90 của thế kỹ trước khi ngành công nghiệp máy tính hợp sức phát triển một công nghệ mới, nhanh và đơn giản hơn để kết nối thiết bị ngoại vi với máy tính. Kỹ thuật USB đã mở đường cho sự ra đời những thế hệ thiết bị ngoại vi mới, có thể kết nối với máy tính hiệu quả hơn. Hiện nay công nghệ USB cũng đã nhanh chóng xâm nhập vào lĩnh vực lưu trữ di động với bộ nhớ hàng Gigabyte. 4 3 2 1 4 3 1 2 (a) (b) Hình 2.2: Cổng USB (a). dạng B, (b). dạng A Chân 1: Vcc (màu đỏ). Chân 2: D- (màu trắng). Chân 3: D+ (màu xanh lục). Chân 4: GND (màu đen). Cổng LPT. Cổng máy in LPT có 17 đường dẫn (12 ra, 5 vào), các đường dữ liệu D0-D7 là những đường dẫn một chiều ra. Các đường tín hiệu vào ra có chốt. Chân 1: Strobe, khi máy tính đưa tín hiệu này ra thì báo cho máy in đọc dữ liệu vào để in. Chân 2-9:data. Chân 10: ACK, báo cho máy in biết là dữ liệu đã nhận được và yêu cầu máy gởi dữ liệu tiếp theo. Chân 11: Busy, báo cho máy tính biết máy in bận, tác động mức 1. Chân 12: PE, báo hết giấy. Chân 13: AF, tác động mức 0, máy tự động dịch một dòng sau khi in. Chân 15: Error, tác động mức 0, báo lỗi. Chân 16:INIT, tác động mức 0, đặt lại máy in. Chân 17: SLCTIN, tác động mức 0, báo máy in đưa dữ liệu vào. Chân 18-25: GND. Phần mềm. Giao tiếp dùng dòng điện vòng 20 mA. Dòng điện vòng đầu tiên được dùng để truyền tín hiệu nhị phân bất đồng bộ giữa máy tính và máy viễn ấn (teleprinter, TTY). Trong cách truyền này, mức 1 được biểu thị bởi dòng Hình 2.3 điện vòng 20 mA và mức 0 bởi dòng điện 0 mA. Như vậy thông tin được truyền đi chính là sự tắt mở của dòng điện. Hệ thống là một vòng kín gồm một nguồn dòng tạo ra dòng điện không đổi 20 mA, bộ phận đóng ngắt (current switch) được đặt ở máy phát và bộ phận dò ra dòng điện này (current detect) ở máy thu. Khi hệ thống không có tín hiệu để truyền, người ta giám sát sự liên tục của hệ thống nhờ sự hiện hữu của dòng điện 20 mA này. Đây chính là lý do tại sao trong các hệ thống sau này người ta đưa bit 1 lên đường truyền khi hệ thống nghỉ. Hình 2.3 là một hệ thống dùng dòng điện vòng với đóng ngắt là các relay. Ở phần phát, giả sử dữ liệu đến từ ngã TxD của UART là bit 1, transistor dẫn làm đóng relay phát, dòng điện 20 mA chạy qua phần thu và đóng relay thu, đưa ngã ra lên cao (sau khi qua cổng đảo), tín hiệu này được truyền đến UART trên đường RxD. Nếu tín hiệu phát là bit 0 trên đường TxD, do không có dòng điện chạy qua, các relay phát và thu đều hở , ta được bit 0 trên đường RxD. Điều kiện hoạt động hữu hiệu của hệ thống dùng dòng điện vòng là phải có một sự cách ly tốt giữa dòng điện vòng và mạch thu. Ngoài ra để bảo đảm giá trị của nguồn dòng không bị ảnh hưởng bởi đường dây, trở kháng ra của máy phát phải rất lớn so với trở kháng đường dây. Do đó ghép nối quang là một phương tiện cách ly rất tốt. Sự tắt mở của dòng điện được biến thành sự tắt mở của chùm tia sáng được dò ra bởi transistor quang. Hình 2.4 mô tả một hệ thống dùng dòng điện vòng ghép nối quang. Hình 2.4 Ở phần phát, giả sử dữ liệu đến từ ngã TxD của UART là bit 1, các transistor dẫn, dòng điện 20 mA chạy qua phần thu làm led phát sáng, transistor ghép quang dẫn đưa ngã ra lên cao (sau khi qua cổng đảo), tín hiệu này được truyền đến UART trên đường RxD. Nếu tín hiệu phát là bit 0 trên đường TxD, do không có dòng điện chạy qua, led không phát sáng, transistor ghép quang ngưng ta được bit 0 trên đường RxD. Hệ thống dùng dòng điện vòng chỉ sử dụng cho khoảng cách nhỏ hơn 500m. Để truyền khoảng cách xa hơn 500m, người ta dùng modem. Chuẩn RS-232. Chuẩn giao tiếp RS-232 của EIA được phát hành lần đầu tiên vào năm 1962, đến năm 1969 ra đời thế hệ thứ 3 là chuẩn RS-232C, hiện thời cũng còn được dùng rộng rãi và năm 1987 RS-232D xuất hiện. RS-232D có thể xem là cải tiến của RS-232C. Chuẩn RS-232C dùng với tốc độ truyền dữ liệu là 20 Kbps với khoảng cách truyền lớn nhất gần 15 m. Đây là một dạng giao tiếp dạng TTL và bộ kích đường dây không cân bằng. Việc truyền dữ liệu qua cổng RS-232C được tiến hành theo cách nối tiếp, nghĩa là các bit dữ liệu được gởi đi nối tiếp nhau trên một đường dẫn. Chuẩn RS-232C sử dụng điện áp -12V là mức logic [1] và +12V làm mức logic [0]. Các khái niệm về chuẩn RS-232: Chu kỳ truyền dữ liệu: tốc độ truyền dữ liệu được tính bằng bit/giây, nhưng để phân biệt với cách truyền đồng bộ, người ta sử dụng đơn vị baud (tương ứng với bit/giây). Trạng thái đánh dấu: là khỏang thời gian không có dữ liệu truyền, trong suốt thời gian này thiết bị phát sẽ giữ đường truyền ở mức cao. Bit bắt đầu: một bit thấp cho biết việc truyền dữ liệu sẽ bắt đầu. Các bit ký tự: gồm 5,6,7 hay 8 bit mã hóa ký tự được truyền. Bit chẵn lẻ: là một bit tùy chọn (có thể có hay không) được phát đi sau các bit ký tự dùng để kiểm tra các lỗi truyền dữ liệu. Trong chế độ kiểm tra bit chẵn , thiết bị phát sẽ bật lên 1 hoặc xóa về 0, bit chẵn để tính tổng các bit 1 của ký tự đựơc truyền và bit chẵn lẻ là một số chẵn, còn trong chế độ kiểm tra lẻ bit kiểm tra phải là một số lẻ. Bit kết thúc:một hay nhiều bit cao được chèn vào đường truyền để báo việc kết thúc một ký tự. Chuẩn USB. Khi một máy chủ được cấp nguồn, nó truy vấn tất cả thiết bị được kết nối vào đường truyền và gán mỗi thiết bị một địa chỉ. Quá trình này được gọi là liệt kê những thiết bị được kết nối vào đường truyền. Máy chủ cũng tìm ra từ mỗi thiết bị cách truyền dữ liệu nào mà nó cần để hoạt động: Ngắt - Một thiết bị như chuột hoặc bàn phím, gửi một lượng nhỏ dữ liệu, sẽ chọn chế độ ngắt. Hàng loạt - Một thiết bị như một chiếc máy in, nhận dữ liệu trong một gói lớn, sử dụng chế độ truyền hàng loạt. Một khối dữ liệu được gửi đến máy in (một khối 64 byte) và được kiểm tra để chắc chắn nó chính xác. Đẳng thời - Một thiết bị truyền dữ liệu theo chuỗi (lấy ví dụ như loa) sử dụng chế độ đẳng thời. Những dòng dữ liệu giữa thiết bị và máy trong thời gian thực, và không có sự sửa lỗi ở đây. Máy chủ có thể gửi lệnh hay truy vấn tham số với điều khiển những gói tin. Khi những thiết bị được liệt kê, máy chủ sẽ giữ sự kiểm tra đối với tổng băng thông mà tất cả những thiết bị đẳng thời và ngắt yêu cầu. Chúng có thể tiêu hao tới 90 phần trăm của 480 Mbps băng thông cho phép. Sau khi 90 phần trăm được sử dụng, máy chủ sẽ từ chối mọi truy cập của những thiết bị đẳng thời và ngắt khác. Điều khiển gói tin và gói tin cho truyền tải hàng loạt sử dụng mọi băng thông còn lại (ít nhất 10 phần trăm). USB chia băng thông cho phép thành những khung, và máy chủ điều khiển những khung đó. Khung chứa 1.500 byte, và một khung mới bắt đầu mỗi mili giây. Thông qua một khung, những thiết bị đẳng thời và ngắt có được một vị trí do đó chúng được đảm bảo băng thông mà chúng cần. Truyền tải hàng loạt và điều khiển truyền tải sử dụng phần còn lại. USB có những đặc trưng sau đây: Máy tính hoạt động như một host. Có tới 127 thiết bị có thể kết nối vào máy tính, hoặc là trực tiếp hoặc bằng những hub USB. Những sợi cáp USB riêng lẻ có thể dài tới 5 mét; với những hub, có thể kéo dài tới 30 mét (6 sợi cáp) tính từ máy chủ. Với USB 2.0, đường truyền đạt tối đa lượng dữ liệu 480 Mbps. Cáp USB gồm hai sợi nguồn (+5V và nối đất) và một cặp gồm hai sợi dây xoắn để mang dữ liệu. Trên sợi nguồn, máy tính có thể cấp nguồn lên tới 500mA với 5V. Những thiết bị nguồn thấp (như chuột) có thể lấy nguồn trực tiếp từ đường truyền. Những thiết bị nguồn cao (như máy in) có nguồn riêng và dùng rất ít nguồn từ đường truyền. Hub có thể có nguồn cấp điện riêng để cấp điện cho những thiết bị kết nối vào hub. Những thiết bị USB thì chuyển đổi nóng, nghĩa là bạn có thể cắm chúng vào đường truyền và tháo chúng ra mọi lúc. USB 2.0 Chuẩn USB phiên bản 2.0 được đưa ra vào tháng tư năm 2000 và xem như bản nâng cấp cho USB 1.1. USB 2.0 (USB tốc độ cao) mở rộng băng thông cho ứng dụng đa truyền thông và lưu trữ với tốc độ nhanh hơn 40 lần so với USB 1.1. USB 2.0 có đầy đủ khả năng tương thích lùi với những thiết bị USB ban đầu và cũng hoạt động tốt với những sợi cáp và cổng kết nối dành cho cổng USB ban đầu. Hỗ trợ ba chế độ tốc độ (1.5, 1.2 và 480 mega bit trên giây), USB 2.0 hỗ trợ những thiết bị băng thông nhỏ như bàn phím và chuột, cũng như thiết bị băng thông lớn như Webcam với độ phân giải cao, máy quét, máy in và những hệ thống lưu trữ lớn. Tốc độ truyền tải của USB2.0 cũng tạo điều kiện cho sự phát triển của thế hệ PC kế tiếp và những ứng dụng. USB 2.0 còn làm tăng năng suất của ứng dụng và cho phép người dùng có thể thực thi nhiều ứng dụng PC trong một lúc hay nhiều thiết bị ngoại vi đồng thời. Vi mạch 89C51. Hiện nay có rất nhiều họ VĐK trên thị trường với nhiều ứng dụng khác nhau như MCS-51, AVR, PIC,… trong đó họ VĐK MCS-51 được sử dụng rất rộng rãi trên thế giới và ở Việt nam. MCS-51là họ VĐK do Intel sản xuất các IC tiêu biểu cho họ là: 8031, 8051, 8951, … Những đặc điểm chính và nguyên tắc họat động của các bộ VĐK này khác nhau không nhiều. Khi đã sử dụng thành thạo một loại thì ta có thể nhanh chóng sử dụng những loại còn lại. Vì vậy để có thể sử dụng thành thạo chúng, ta cần nắm vững về cấu tạo cũng như nguyên lý họat động của chúng. Đại diện tiêu biểu nhất cho họ MSC-51, có thể kể đến 89C51. Các đặc điểm chung của vi mạch 89C51 là: Có 4 Kbyte bộ nhớ FLASH ROM bên trong để lưu chương trình. Nhờ vậy vi mạch có khả năng nạp xoá chương trình bằng điện đến 10000 lần. 128 byte RAM nội bên.4 port I/O (xuất/nhập) 8 bit. Có khả năng giao tiếp truyền dữ liệu nối tiếp. Có thể mở rộng không gian nhớ chương trình ngoài 64KB (bộ nhớ ROM ngoại): khi chương trình do người lập trình viết ra có dung lượng lớn hơn dung lượng bộ nhớ ROM nội, để lưu được chương trình này cần bộ nhớ ROM lớn hơn, cách giải quyết là kết nối 98C51 với bộ nhớ ROM từ bên ngoài  (hay còn gọi là ROM ngoại). Dung lượng bộ nhớ ROM ngoại lớn nhất mà VĐK có thể kết nối là 64KB. Có thể mở rộng không gian nhớ dữ liệu ngoài 64KB (bộ nhớ RAM ngoại). Bộ xử lý bit ( thao tác trên các bit riêng rẽ) 210 bit có thể truy xuất đến từng bit. Cấu trúc vi mạch 89C51 và chức năng của các chân. Hình 2.5: sơ đồ chân họ VĐK 89C51. RxD TxD P0 P1 P2 P3 Địa chỉ/Dữ liệu Port 1 driver Port 3 driver Port 0 driver Port 2 driver Latch port 1 Latch port 1 Latch port 1 Latch port 1 Thanh ghi địa chỉ chương trình Bộ đệm PC INCREMENTER Bộ đếm chương trình Con trỏ dữ liệu Con trỏ ngăn xếp Thanh ghi B RAM FLASH ACC TMP 1 TMP 2 PSW Ngắt, port nối tiếp, bộ timer Bộ giao động Thanh ghi định địa chỉ Bộ ghi lệnh Tính toán và điều khiển ALU P3.0÷P3.7 P2.0÷P2.7 P0.0÷P0.7 P1.0÷P1.7 PSEN ALE/PROG EA/Vpp RST = = Hình 2.6 : sơ đồ khối bên trong 89C51 Vcc GND Ta có thể tóm tắt chức năng họat động từng chân của vi mạch 89C51 như sau: Port 0 (P0.0,P0.1,P0.2,…,P0.7) từ chân 32 đến chân 39 được dùng với 2 chức năng: vừa làm byte thấp cho bus địa chỉ, vừa làm bus dữ liệu khi dùng bộ nhớ ngoài và port I/O khi không dùng bộ nhớ ngoài. Port 1 (P1.0,P1.1,…,P1.7) từ chân 1 đến chân 8 dùng làm port I/O để giao tiếp bên ngoài. Port 2 (P2.0,P2.1,…,P2.7) từ chân 21 đến chân 28 vừa được dùng làm byte cao của bus địa chỉ, vừa làm port I/O. Port 3 (P3.0,P3.1,…,P3.7) từ chân 10 đến chân 17 được dùng với 2 mục đích, có thể làm port I/O và cũng có thể dùng với chức năng riêng của từng chân: P3.0 (RxD) :ngõ vào nhận dữ liệu từ port nối tiếp. P3.1 (TxD) :ngõ ra phát dữ liệu từ port nối tiếp. P3.2 (INT0) :ngõ vào ngắt ngoài 0. P3.3 (INT1) :ngõ vào ngắt ngoài 1. P3.4 (T0) :ngõ vào timer/counter 0. P3.5 (T1) :ngõ vào timer/counter 1. P3.6 (WR) :ngõ điều khiển ghi dữ liệu lên bộ nhớ ngoài. P3.7 (RD) :ngõ điều khiển đọc dữ liệu từ bộ nhớ ngoài. Hình 2.7: Sơ đồ chân port bên trong 89C51 Chân 9 (RST): là chân để Reset cho 89C51. Bình thường chân này ở mức thấp khi ta đưa lên mức cao (tối thiểu 2 chu kỳ máy) thì những thanh ghi nội của 89C51 được LOAD những giá trị thích hợp để khởi động lại hệ thống. Chân 18, 19 (XTAL1, XTAL2): được nối với bộ dao động thạch anh từ 0 đến nhỏ hơn 32MHz để tạo dao động cho chip. Hình 2.8: cách tạo bộ dao động cho 89C51. Chân 20: nối đất. Chân 29 (PSEN): là tín hiệu điều khiển cho phép chọn bộ nhớ chương trình mở rộng và được nối chung với chân OE (Output Enable) của EPROM ngoài để cho phép đọc các byte mã lệnh. PSEN ở mức thấp trong thời gian lấy lệnh. Các mã nhị phân của chương trình được đọc từ EPROM qua bus dữ liệu và được chốt vào thanh ghi lệnh của 89C51 để giải mã lệnh. Nếu thi hành lệnh trong ROM nội thì PSEN ở mức cao. Chân 30 (ALE): tín hiệu ra ALE trên chân 30 tương hợp với các thiết bị làm việc của các vi xử lí 8085, 8086, 8088. 89C51 dùng ALE để giải kênh các bus địa chỉ và dữ liệu khi P0 được dùng trong chế độ chuyển đổi vừa là bus dữ liệu vừa là byte thấp của bus địa chỉ. ALE là tín hiệu để chốt byte thấp địa chỉ vào thanh ghi bên ngoài trong nửa đầu chu kỳ bộ nhớ, sau đó P0 sẽ xuất dũ liệu trong nửa sau của chu kỳ. Các xung ALE có tốc độ bằng 1/6 lần tần số dao động trên chip. Có thể làm phần xung nhịp cho các phần khác của hệ thống. Nếu xung nhịp trên 89C51 là 12MHz thì ALE có tần số 2MHz. 89C51 sử dụng chân này làm ngõ vào xung lập trình cho EPROM trong chip. Chân 31 (EA):Chân EA dùng để xác định chương trình thực hiện được lấy từ ROM nội hay ROM ngoại. Khi EA nối với logic [1] (+5V) thì 89C51 thực hiện chương trình lấy từ bộ nhớ nội, khi EA nối với logic [0] (0V) thì 89C51 thực hiện chương trình lấy từ bộ nhớ ngoại. Chân 40 (Vcc):là chân nguồn (+5V). Cấu trúc bus. Cấu trúc bus địa chỉ của vi mạch 89C51 gồm 16 đường tín hiệu(thường gọi là bus địa chỉ 16 bit). Với số lượng bit như trên không gian nhớ của chip được mở rộng tối đa là 216 = 65536, tương đương 64KB. Bus dữ liệu của vi mạch 89C51 gồm 8 đường tín hiệu (thường gọi là bus dữ liệu 8 bit). Với độ rộng của bus dữ liệu như vậy, các chip 89C51 có thể xử lý các tóan hạng 8 bit trong một chu kỳ lệnh. Bộ nhớ chương trình – Bộ nhớ ROM. Bộ nhớ ROM dùng để lưu chương trình do người viết chương trình viết ra. Chương trình là tập hợp các câu lệnh thể hiện các thuật toán để giải quyết các công việc cụ thể, chương trình do người thiết kế viết trên máy vi tính, sau đó được đưa vào lưu trong ROM của vi mạch, khi hoạt động, 89C51 truy xuất từng câu lệnh trong ROM để thực hiện chương trình. ROM còn dùng để chứa số liệu các bảng, các tham số hệ thống, các số liệu cố định của hệ thống. Trong quá trình hoạt động nội dung ROM là cố định, không thể thay đổi, nội dung ROM chỉ thay đổi khi ROM ở chế độ xóa hoặc nạp chương trình (do các mạch điện riêng biệt thực hiện). Bộ nhớ ROM được định địa chỉ theo từng byte, các byte được đánh địa chỉ theo số hex-số thập lục phân, bắt đầu từ địa chỉ 0000H. Khi viết chương trình cần chú ý đến địa chỉ lớn nhất trên ROM, chương trình được lưu sẽ bị mất khi địa chỉ lưu vượt qua vùng này. Ví dụ: AT89C51 có 4KB bộ nhớ ROM nội, địa chỉ lớn nhất là 0FFFH, nếu chương trình viết ra có dung lượng lớn hơn 4KB các byte trong các địa chỉ lớn hơn 0FFFH sẽ bị mất.  Ngoài ra vi mạch còn có khả năng mở rộng bộ nhớ ROM với việc giao tiếp với bộ nhớ ROM bên ngoài lên đến 64KB (địa chỉ từ 0000H đến FFFFH). Bộ nhớ dữ liệu-Bộ nhớ RAM. Bộ nhớ RAM dùng làm môi trường xử lý thông tin, lưu trữ các kết quả trung gian và kết quả cuối cùng của các phép toán, xử lí thông tin. Nó cũng dùng để tổ chức các vùng đệm dữ liệu, trong các thao tác thu phát, chuyển đổi dữ liệu.      RAM nội trong vi mach 89C51 được tổ chức như sau (bảng 2.2): Các vị trí trên RAM được định địa chỉ theo từng Byte bằng các số thập lục phân (số Hex) . Các bank thanh ghi có địa chỉ 00H÷1FH. 210 vị trí được định địa chỉ bit. Các vị trí RAM bình thường. Các thanh ghi có chức năng đặc biệt có địa chỉ từ 80H÷0FFH. Đia chỉ byte Địa chỉ bit Địa chỉ bit Đia chỉ byte 7F RAM đa dụng FF F0 F7 F6 F5 F4 F3 F2 F1 F0 B E0 E7 E6 E5 E4 E3 E2 E1 E0 ACC D0 D7 D6 D5 D4 D3 D2 D1 D0 PSW 30 B8 - - - BC BB BA B9 B8 IP 2F 7F 7E 7D 7C 7B 7A 79 78 2E 77 76 75 74 73 72 71 70 B0 B7 B6 B5 B4 B3 B2 B1 B0 P.3 2D 6F 6E 6D 6C 6B 6A 69 68 2C 67 66 65 64 63 62 61 60 A8 AF AC AB AA A9 A8 IE 2B 5F 5E 5D 5C 5B 5A 59 58 2A 57 56 55 54 53 52 51 50 A0 A7 A6 A5 A4 A3 A2 A1 A0 P2 29 4F 4E 4D 4C 4B 4A 49 48 28 47 46 45 44 43 42 41 40 99 Không được địa chỉ hóa bit SBUF 27 3F 3E 3D 3C 3B 3A 39 38 98 9F 9E 9D 9C 9B 9A 99 98 SCON 26 37 36 35 34 33 32 31 30 25 2F 2E 2D 2C 2B 2A 29 28 90 97 96 95 94 93 92 91 90 P1 24 27 26 25 24 23 22 21 20 23 1F 1E 1D 1C 1B 1A 19 18 8D Không được địa chỉ hóa bit TH1 22 17 16 15 14 13 12 11 10 8C Không được địa chỉ hóa bit TH0 21 0F 0E 0D 0C 0B 0A 09 08 8B Không được địa chỉ hóa bit TL1 20 07 06 05 04 03 02 01 00 8A Không được địa chỉ hóa bit TL0 1F Bank 3 89 Không được địa chỉ hóa bit TMOD 18 88 8F 8E 8D 8C 8B 8A 89 88 TCON 17 Bank 2 87 Không được địa chỉ hóa bit PCON 10 0F Bank 1 83 Không được địa chỉ hóa bit DPH 08 82 Không được địa chỉ hóa bit DPL 07 Bank thanh ghi 0 81 Không được địa chỉ hóa bit SP 00 (mặc định cho R0 –R7) 80 87 86 85 84 83 82 81 80 P0 80 byte Địa chỉ bit Địa chỉ bit Đia chỉ byte Các thanh ghi chức năng đặc biệt RAM Bảng 2.2: Cấu trúc RAM bên trong 89C51 RAM Ram đa dụng. Mặc dù trên bảng cho thấy vùng RAM đa dụng chiếm vị trí từ 30H÷7FH, nhưng 32 byte dưới 00H÷1FH cũng có thể dùng với mục đích tương tự. Mọi địa chỉ trong vùng RAM đa dụng đều có thể truy xuất một cách tự do, dùng kiểu địa chỉ trực tiếp hay gián tiếp. RAM có thể truy xuất từng bit. 89C51 chứa 210 bit được địa chỉ hóa, trong đó 128 bit có chứa các byte có chứa địa chỉ từ 20H÷2FH và các bit còn lại chứa trong nhóm thanh ghi có chức năng đặc biệt. Khả năng truy xuất từng bit bằng phần mềm là các đặc tính mạnh của vi mạch 89C51 xử lí chung. Các bit có thể được đặt, xóa, AND, OR,…với một lệnh đơn. 89C51 xử lý đòi hỏi một chuỗi lệnh đọc-sửa-ghi để đạt được mục đích tương tự. Ngoài ra các port cũng có thể truy xuất từng bit. 128 bit truy xuất từng bit này cũng có thể truy xuất như các byte hay như các bit tùy theo lệnh được dùng. Các bank thanh ghi. 32 byte thấp của bộ nhớ nội được dành cho các bank thanh ghi. Bộ lệnh 89C51 hổ trợ 8 thanh ghi là R0,R1,…,R7 và theo mặc định sau khi reset hệ thống, các thanh ghi này có địa chỉ từ 00H÷07H. Các lệnh dùng cho thanh ghi sẽ ngắn hơn và nhanh hơn các lệnh có chức năng tương ứng dùng kiểu địa chỉ trực tiếp. Các dữ liệu dùng thường xuyên nên dùng các thanh ghi này. Do có 4 bank thanh ghi nên tại một thời điểm chỉ có một thanh ghi được truy xuất, để chuyển đổi việc truy xuất giữa các bank thanh ghi ta phải thay đổi các bit chọn trong bank thanh ghi trạng thái. Các thanh ghi chức năng đặc biệt (SFR). Thanh ghi trạng thái chương trình (PSW-Program status Word). Bit Ký hiệu Địa chỉ Mô tả bit PSW.7 CY D7H Cờ nhớ PSW.6 AC D6H Cờ nhớ phụ PSW.5 F0 D5H Cờ 0 PSW.4 RS1 D4H Chọn dãy thanh ghi (bit 1) PSW.3 RS0 D3H Chọn dãy thanh ghi (bit 0) 00 = bank 0 : địa chỉ từ 00H đến 07H 01 = bank 1 : địa chỉ từ 08H đến 0FH 10 = bank 2 : địa chỉ từ 10H đến 17H 11 = bank 3 : địa chỉ từ 18H đến 1FH PSW.2 OV D2H Cờ tràn PSW.1 - D1H Dự trữ PSW.0 P D0H Cờ kiểm tra chẵn lẻ Bảng 2.3: Thanh ghi PSW Cờ nhớ CY ( carry flag ) có hai công dụng: công dụng truyền thống trong các phép toán số học là được set bằng 1 nếu có số nhớ từ phép cộng bit 7 hoặc có số mượn mang đến bit 7. Ví dụ thanh chứa A có nội dung là FFH, lệnh: ADD A,#1 Sẽ làm cho thanh chứa A có nội dung là 00H còn cờ CY trong thanh ghi PSW được set bằng 1. Cờ nhớ CY còn là thanh chứa logic được dùng như một thanh ghi 1 bit đối với các lệnh logic thao tác trên các bit. Lấy thí dụ lệnh sau đây sẽ AND bit 25H với cờ nhớ CY và đặt kết quả trở về cờ nhớ: ANL C,25H ;AND bit ở địa chỉ 25H với cờ nhớ Cờ nhớ phụ: khi cộng các giá trị BCD, cờ nhớ phụ AC (auxiliary carry flag) được set bằng 1 nếu có một số nhớ được tạo ra từ bit 3 chuyển sang bit 4 hoặc kết quả trong đề_cát thấp nằm trong tầm từ 0AH ÷0FH. Nếu các giá trị được cộng là giá trị BCD, lệnh cộng phải được tiếp theo bởi lệnh DA A (hiệu chỉnh thập phân thanh chứa A) để đưa các kết quả lớn hơn 9 về giá trị đúng. Cờ 0: đây là cờ có nhiều mục đích dành cho các ứng dụng của người lập trình. Các bit chọn bank thanh ghi: các bit chọn dãy thanh ghi RS0, RS1 dùng để xác định dãy thanh ghi tích cự. Các bit này được xóa sau khi có thao tác reset hệ thống và đổi mức logic bởi phần mềm khi cần. Thí dụ sau cho phép dãy thanh ghi 3 (bank 3) tích cực, sau đó di chuyển nội dung R7 (địa chỉ byte 1FH) vào thanh chứa A: SETB RS1 SETB RS0 MOV A,R7 Khi đoạn chương trình trên được dịch, các địa chỉ bit sẽ thay thế cho các ký hiệu RS0 và RS1, vậy thì lệnh SETB RS1 tương đương với lệnh SETB 0D4H Cờ tràn: OV (overflow flag) được set bằng 1 sau phép toán cộng hoặc trừ nếu có xuất hiện một tràn số học. Khi các số có dấu được cộng hoặc được trừ, phần mềm có thể kiểm tra bit tràn OV để xác định xem kết quả có nằm trong tầm hay không. Với phép cộng các số không dấu, cờ tràn OV bỏ qua. Kết quả lớn hơn +128 hoặc nhỏ hơn -127 sẽ set cờ OV bằng 1. Thí dụ sau sẽ gây ra 1 tràn và set cờ OV trong PSW: Số hex : 0F số thập phân: 15 +7F +127 8E 142 8EH biểu diễn số âm -116, như vậy không đúng với kết quả mong muốn là 142 nên cờ OV được set bằng 1. Cờ chẵn lẻ: bit chẵn lẻ P tự động được set bằng 1 hay xóa bằng 0 ở mỗi chu kỳ máy để thiết lập kiểm tra chẵn cho thanh chứa A. Số các bit 1 trong thanh chứa cộng với bit P luôn luôn là số chẵn. Thí dụ thanh chứa có nội dung 10101101B, bit P sẽ là 1 để có số bit 1là 6. Bit chẵn lẻ được sử dụng nhiều để kết hợp với các chương trình xuất/nhập nối tiếp trước khi truyền dữ liệu hoặc để kiểm tra chẵn lẻ sau khi nhận dữ liệu. Thanh ghi B. Thanh ghi B: ở địa chỉ F0H được dùng chung với thanh chứa A trong các phép toán nhân, chia. Lệnh MUL AB nhân hai số 8 bit không dấu chứa trong A và B và chứa kết quả 16 bit vào cặp thanh ghi B:A (thanh chứa A cất byte thấp và thanh chứa B cất byte cao). Lệnh chia DIV AB chia A bởi B, thương số cất trong thanh chứa A và dư số cất trong thanh ghi B. Thanh ghi B còn được xử lý như một thanh ghi nháp. Các bit đựơc định địa chỉ của thanh ghi B có địa chỉ từ F0H÷F7H. Con trỏ stack. Con trỏ ngăm xếp SP (stack pointer) là một thanh ghi 8 bit, địa chỉ 81H. SP chứa địa chỉ của dữ liệu hiện đang ở đỉnh của stack. Các lệnh liên quan đến stack bao gồm lệnh cất dữ liệu vào stack và lệnh lấy dữ liệu ra khỏi stack. Việc cất váo stack làm tăng SP trước khi ghi dữ liệu và việc lấy dữ liệu ra khỏi stack sẽ giảm SP. Vùng stack của 89C51 được giữ trong RAM nội và được giới hạn đến các địa chỉ truy xuất được bởi kiểu định địa chỉ gián tiếp. Vùng RAM nội có 128 byte ; nếu ta khởi động SP để bắt đầu vùng stack ở địa chỉ 60H bằng lệnh: MOV SP,#5FH Vùng stack được giới hạn là 32 byte và địa chỉ cao nhất của RAM trên chip là 7FH. Giá trị 5FH được dùng ở đây vì SP tăng lên 60H trước khi thao tác cất vào stack đầu tiên được thực thi. Các lệnh PUSH và POP sẽ cất dữ liệu vào stack và lấy dữ liệu ra từ stack các lệnh gọi chương trình con (ACALL va LCALL) và lệnh trở về (RET, RETI) cũng cất và phục hồi nội dung của bộ đếm chương trình PC (program counter). Con trỏ dữ liệu DPTR. Con trỏ dữ liệu DPTR (data pointer) được dùng để truy xuất bộ nhớ chương trình ngoài hoặc bộ nhớ dữ liệu ngoài. DPTR là một thanh ghi 16 bit có địa chỉ là 82H (DPL, byte thấp) và 83H (DPH, byte cao). Ba lệnh sau đây ghi 55H vào RAM ngoài ở địa chỉ 1000H: MOV A,#55H MOV DPTR,#1000H MOV @DPTR,A Lệnh đầu tiên sử dụng kiểu định địa chỉ tức thời để nạp hằng dữ liệu 55H vào thanh chứa A. Lệnh thứ hai cũng sử dụng kiểu định địa chỉ tức thời, lần này nạp bằng địa chỉ 16 bit 1000H cho con trỏ dữ liệu DPTR. Lệnh thứ ba sử dụng kiểu định địa chỉ gián tiếp di chuyển giá trị 55H chứa trong thanh chứa A đến RAM ngoài tại địa chỉ chứa trong DPTR (1000H). Các thanh ghi port. Các port xuất nhập của 89C51 bao gồm port 0 tại địa chỉ 80H, port 1 tại địa chỉ 90H, port 2 tại địa chỉ 0A0H, port 3 tại địa chỉ 0B0H. Các port 0, 2 và 3 không được dùng để xuất nhập nếu ta sử dụng thêm bộ nhớ ngoài hoặc nếu có một số đặc tính đặc biệt 89C51 được sử dụng ( như là ngắt, port nối tiếp,…). P1.2 đến P1.7 ngược lại luôn luôn là các đường xuất/nhập đa mục đích hợp lệ. Tất cả port đều được định địa chỉ từng bit nhằm cung cấp các khả năng giao tiếp mạnh. Thí dụ ta có một động cơ nối qua một cuộn dây và một mạch kích dùng transistor nối tới bit 7 của port 1, động cơ có thể ngưng hay chạy chỉ nhờ vào một lệnh đơn của 89C51: SETB P1.7 ;làm động cơ chạy CLR P1.7 ;làm động cơ ngừng Các lệnh trên sử dụng toán tử .(dot) để định địa chỉ 1 bit trong 1 byte, cho phép định địa chỉ từng bit. Trình dịch hợp ngữ thực hiện biến đổi dạng kí hiệu thành địa chỉ thực tế, nghĩa là hai lệnh sau tương đương: CLR P1.7 CLR 97H Các thanh ghi định thời. 89c51 có hai bộ đếm/định thời ( timer/counter) 16 bit để định các khỏang thời gian hoặc để đếm các sự kiện. Bộ định thời 0 có địa chỉ 8AH (TL0, byte thấp), 8CH (TH0, byte cao); bộ định thời 1 có địa chỉ 8BH (TL1, byte thấp), 8DH (TH1, byte cao). Họat động của bộ định thời được thiết lập bởi thanh ghi chế độ định thời TMOD ( timer mode register) ở địa chỉ 89H và thanh ghi điều khiểu định thời TCON (timer control register) ở địa chỉ 88H. Chỉ có TCON được định địa chỉ từng bit. Các thanh ghi của port nối tiếp. Bên trong 89C51 có port nối tiếp để truyền thông với các thiết bị bên ngoài như các thiết bị đầu cuối hay modem, họăc để giao tiếp với các IC khác có mạch giao tiếp nối tiếp (như các thanh ghi dịch chẳng hạn). Một thanh ghi được._. gọi là bộ đệm dữ liệu nối tiếp SBUF (serial data buffer) ở địa chỉ 99H lưu giữ dữ liệu truyền đi và dữ liệu nhận về. Việc ghi lên SBUF sẽ nạp dữ liệu để truyền và việc đọc SBUF sẽ lấy dữ liệu đã nhận được. Các chế độ họat động khác nhau được lập trình thông qua thanh ghi điều khiển port nối tiếp SCON (serial port control register) ở địa chỉ 98H, thanh ghi này được định địa chỉ từng bit. Các thanh ghi ngắt. 89C51 có một cấu trúc ngắt với 2 mức ưu tiên và 5 nguyên nhân ngắt. Các ngắt bị vô hiệu hóa khi reset hệ thống và sau đó được cho phép bằng cách ghi vào thanh ghi cho phép ngắt IE (interrup enable register) ở địa chỉ A8H. Mức ưu tiên ngắt được thiết lập qua thanh ghi ưu tiên ngắt IP (interrupt priority register) ở địa chỉ B8H. cả hai thanh ghi này đều được định địa chỉ từng bit. Thanh ghi điều khiển nguồn. Thanh ghi điều khiển nguồn PCON (power control register) có địa chỉ 87H chứa các bit điều khiển được tóm tắt trong bảng 2.4: Bit Ký hiệu Mô tả 7 SMOD Bit tăng gấp đôi tốc độ baud, bit này khi set làm cho tốc độ baud tăng 2 ở các chế độ 1, 2 và 3 của port nối tiếp. 6 - Không định nghĩa. 5 - Không định nghĩa. 4 - Không định nghĩa. 3 GF1 Bit cờ đa mục đích 1. 2 GF0 Bit cờ đa mục đích 2. 1 PD Nguồn giảm; thiết lập để tích cực chế độ nguồn giảm, chỉ ra khỏi chế độ bằng reset. 0 IDL Chế độ nghỉ; thiết lập để tích cực chế độ nghỉ, chỉ ra khỏi chế độ bằng một ngắt hoặc reset hệ thống. Bảng 2.4: Thanh ghi điều khiển nguồn PCON. bit SMOD tăng gấp đôi tốc độ baud của port nối tiếp khi port này hoạt động ở chế độ 1, 2 hoặc 3. Các bit 4, 5 và 6 của PCON không được định nghĩa. Các bit 2 và 3 là các bit cờ đa mục đích dành cho các ứng dụng của người sử dụng. Chế độ nguồn giảm: Lệnh thiết lập bit PD bằng 1 sẽ làm lệnh sau cùng được thực thi trước khi vào chế độ nguồn giảm. Ở chế độ nguồn giảm: Mạch dao động trên chip ngừng hoạt động. Mọi chức năng ngừng hoạt động. Nội dung của RAM trên chip được duy trì. Các chân port duy trì mức logic của chúng. ALE và PSEN được giữ ở mức thấp. Chỉ ra khỏi chế độ này bằng cách reset hệ thống. Trong suốt thời gian ở chế độ nguồn giảm, Vcc có điện áp là 2V. Cần phải giữ cho Vcc không thấp hơn sau khi đạt được chế độ nguồn giảm và cần phục hồi Vcc=5V tối thiểu 10 chu kỳ dao động trước khi chân RST đạt mức thấp lần nữa. Chế độ nghỉ: Lệnh thiết lập bit IDL bằng 1 sẽ làm lệnh sau cùng được thực thi trước khi đi vào chế độ nghỉ. Ở chế độ nghỉ, tín hiệu clock nội được khóa không cho đến CPU nhưng không khóa đối với các chức năng ngắt, định thời và port nối tiếp. Trạng thái của CPU được duy trì và nội dung của tất cả các thanh ghi cũng được giữ không dổi. Các chân port cũng được duy trì các mức logic của chúng. ALE và PSEN được giữ ở mức cao. Chế độ nghỉ kết thúc bằng cách cho phép ngắt hoặc bằng cách reset hệ thống. Cả hai cách vừa nêu đều xóa bit IDL. Bộ nhớ ngoài (external memory). 89C51 có khả năng mở rộng không gian bộ nhớ chương trình lên đến 64K và không gian bộ nhớ dữ liệu đến 64K ROM và RAM ngoài được thêm vào khi cần. Khi dụng bộ nhớ ngoài port 0 không còn chức năng xuất/nhập nữa; port này trở thành bus địa chỉ (A0÷A7) và bus dữ liệu (D0÷D7) đa hợp. Ngõ ra ALE chốt byte thấp của địa chỉ ở thời điểm bắt đầu mỗi chu kỳ bộ nhớ ngoài. Port 2 thường được dùng làm byte cao của bus địa chỉ. Truy xuất bộ nhớ chương trình ngoài. Bộ nhớ chương trình ngoài là bộ nhớ chỉ đọc, được cho phép bởi tín hiệu PSEN. Kết nối bộ nhớ ngoài EPROM được thực hiện như sau: Port 0 ALE Port 2 PSEN EA D0-D7 A0-A7 A8-A15 OE EPROM D Q G 74HC573 89C51 Hình 2.9: Truy xuất bộ nhớ chương trình ngoài. Trong một chu kì máy tiêu biểu, tín hiệu ALE tích cực 2 lần, lần thứ nhất cho phép 74HC573 mở cổng chốt địa chỉ byte thấp, khi ALE xuống 0 thì byte thấp và byte cao của bộ đệm chương trình đều có nhưng EPROM chưa xuất vì PSEN chưa tích cực, khi tín hiệu lên 1 trở lại thì port 0 đã có dữ liệu là Opcode. ALE tích cực lần thứ 2 được giải thích tương tự và byte được đọc từ bộ nhớ chương trình. Nếu lệnh đang hiện hành là lệnh 1 byte thì CPU chỉ đọc Opcode còn byte thứ hai bỏ đi. Truy xuất bộ nhớ dữ liệu ngoài. Bộ nhớ dữ liệu ngoài là bộ nhớ đọc/ghi được cho phép bởi các tín hiệu RD và WR ở các chân P3.7 và P3.6. Lệnh dùng để truy xuất bộ nhớ ngoài là MOVX, sử dụng hoặc con trỏ dữ liệu 16 bit DPTR hoặc R0, R1 làm thanh ghi chứa địa chỉ. RAM có thể giao tiếp với 89C51 theo cùng cách như EPROM ngoại trừ đường RD nối đường cho phép xuất (OE) của RAM và WR nối với đường ghi (W) của RAM. Các kết nối với bus dữ liệu và bus địa chỉ giống như EPROM. Bằng cách sử dụng các port 0 và port 2 như ở phần trên ta có 1 dung lượng RAM ngoài lên đến 64K được kết nối với 89C51. Port 0 89C51 EA ALE P2.0 P2.1 RD WR PSEN D Q G D0-D7 A0-A7 RAM (1K) A8 A9 OE W CS NC 74HC573 Hình 2.10:Truy xuất bộ nhớ dữ liệu ngoài. Giải mã địa chỉ. Nếu có nhiều EPROM hoặc nhiều RAM hoặc cả hai giao tiếp với 89C51 ta cần phải giải mã địa chỉ . Thí dụ nếu có các RAM và ROM 8KB được sử dụng, địa chỉ phải được giải mã để chọn các IC nhớ này trên các giới hạn 8K: 0000H÷FFFH, 2000H÷3FFFH,… Một IC giải mã điển hình là 74HC138 được dùng với các ngõ ra được nối với ngõ vào chọn chip CS của các IC nhớ như được mô tả ở hình cho một bộ nhớ có nhiều EPROM 2764 (8K) và RAM 6264 (8K). Cần lưu ý là do các đường cho phép riêng rẽ (PSEN cho bộ nhớ chương trình, RD và WR cho bộ nhớ dữ liệu), 89C51 có thể quản lý không gian bộ nhớ đến 64K cho bộ nhớ EPROM và 64K cho bộ nhớ RAM. RD OE WR W PSEN OE D0-D7 2764 EPROM ( 8K bytes) A0-A12 CS CS CS D0-D7 6264 RAM ( 8K bytes) A0-A12 CS CS CS C 0 B 1 A 2 3 4 E 5 E 6 E 7 A0-A12 74HC138 Select orther EPROM/RAM A15 A14 A13 Hình2.11: Giải mã địa chỉ. Sự đè lên bộ nhớ chương trình ngoài. Vì bộ nhớ chương trình là ROM, nên nẩy sinh một vấn đề bất tiện khi phát triển phần mềm cho vi mạch. Một nhược điểm của 89C51 là các vùng nhớ dữ liệu ngoài nằm đè lên nhau, vì tín hiệu PSEN được dùng để đọc bộ nhớ mã ngoài và tín hiệu RD được dùng để đọc bộ nhớ dữ liệu, nên bộ nhớ RAM có thể chứa cả chương trình và dữ liệu bằng cách nối đường OE của RAM đến ngõ ra cổng AND có các ngõ vào là PSEN và RD. Sơ đồ sau cho phép bộ nhớ RAM có hai chức năng vừa là bộ nhớ chương trình vừa là bộ nhớ dữ liệu: RD PSEN RAM W OE WR Hình 2.12: Gối 2 không gian nhớ chương trình và dữ liệu Hoạt động RESET. Reset Vcc Vcc RST RST R1 R2 C R C (a) Reset bằng tay (b) Reset khi cấp nguồn 89C51 được reset bằng cách giữ chân RST ở mức cao tối thiểu hai chu kỳ máy và sau đó chuyển về mức thấp. RST có thể tác động bằng tay hoặc được tác động khi cấp nguồn bằng cách dùng một mạch RC như hình . Trạng thái của tất cả các thanh ghi sau khi reset hệ thống được tóm tắt trong bảng 2.5. Hình 2.13: Mạch reset cho 89C51. Quan trọng nhất trong các thanh ghi này có lẽ là thanh ghi PC ( bộ đếm chương trình), được nạp 0000H. khi RST trở lại mức thấp, việc thực thi chương trình luôn luôn bắt dầu ở vị trí đầu tiên trong bộ nhớ chương trình: địa chỉ 0000H. Nội dung của RAM trên chip không bị ảnh hưởng bởi họat động reset. Thanh ghi Nội dung Bộ đếm chương trình 0000H Thanh chứa A 00H Thanh ghi B 00H PSW 00H SP 07H DPTR 0000H Port 0 ÷ 3 FFH IP xxx00000B IE 0xx00000B Các thanh ghi định thời 00H SCON 00H SBUF 00H PCON (HMOS) 0xxxxxxxB PCON (CMOS) 0xxx0000B Bảng 2.5: Giá trị các thanh ghi sau khi reset hệ thống. Họat động định thời. 89C51 có hai bộ định thời 16 bit, mỗi bộ có bốn chế độ hoạt động. Các bộ định thời được dùng để: Định thời trong một khoảng thời gian. Đếm sự kiện. Tạo tốc độ baud cho port nối tiếp. Các bộ định thời của 89C51 được truy xuất bằng cách sử dụng 6 thanh ghi chức năng đặc biệt. SFR của bộ định thời Mục đích Địa chỉ Định địa chỉ bit TCON Điều khiển 88H Có TMOD Chọn chế độ 89H Không TL0 Byte thấp cảu bộ định thời 0 8AH Không TL1 Byte thấp của bộ định thời 1 8BH Không TH0 Byte cao của bộ định thời 0 8CH Không TH1 Byte cao của bộ định thời 1 8DH Không Bảng 2.6: Các thanh ghi đặc biệt của bộ định thời. Thanh ghi chế độ định thời (TMOD). GTAE M0 M1 C/T GATE M0 M1 C/T Timer 0 Timer 1 Bit Tên Bô định thời Mô tả 7 GATE 1 Bit điều khiển. khi được set lên 1, bộ định thời chỉ họat động trong khi INT1 ở mức cao 6 C/T 1 Bit chọn chức năng đếm hoặc định thời: 1= đếm sự kiện 0= định thời trong một khoảng thời gian 5 M1 1 Bit chọn chế độ thứ nhất 4 M0 1 Bit chọn chế độ thứ hai 3 GATE 0 Bit điều khiển cổng cho bộ định thời 0 2 C/T 0 Bit chọn chức năng đếm hoặc định thời cho bộ định thời 0 1 M1 0 Bit chọn chế độ thứ nhất 0 M0 0 Bit chọn chế độ thứ hai Bảng 2.7:Thanh ghi chọn chế độ định thời Thanh ghi TMOD (timer mode register) chứa hai nhóm 4 bit dùng để thiết lập chế độ hoạt động cho bộ định thời 0 và bộ định thời 1. TMOD không được định địa chỉ từng bit. Thanh ghi điều khiển TCON. Thanh ghi TCON chứa các bit điều khiển và trạng thái của bộ định thời 0 và bộ định thời 1. Bốn bit cao TCON.4÷TCON.7 được dùng để điều khiển các bộ định thời họat động hoặc ngưng (TR0, TR1) hoặc để báo các bộ định thời tràn (TF0, TF1). Bốn bit thấp TCON.0÷TCON.3 dùng để phát hiện và khởi động các ngắt ngoài. Bit Ký hiệu Địa chỉ bit Mô tả TCON.7 TF1 8FH Cờ tràn của bộ định thời 1. Cờ này được set bởi phần cứng khi có tràn, được xóa bởi phần mềm, hoặc bởi phần cứng khi bộ vi xử lý trỏ đến trình phục vụ ngắt. TCON.6 TR1 8EH Bit điều khiển họat động của bộ định thời 1.Bit này được set hoặc được xóa bởi phần mềm để điều khiển bộ định thời họat động hay ngưng họat động. TCON.5 TF0 8DH Cờ tràn của bộ định thời 0. TCON.4 TR0 8CH Bit điều khiển họat động của bộ định thời 0. TCON.3 IE1 8BH Cờ ngắt bên ngoài 1 (kích khởi cạnh). Cờ này được set bởi phần cứng có cạnh âm (xuống) xuất hiện trên chân INT1, được xóa bởi phần mềm, hoặc phần cứng khi CPU trỏ đến trình phục vụ ngắt. TCON.2 IT1 8AH Cờ ngắt bên ngoài 1(kích khởi cạnh hoặc mức). Cờ này được set hoặc xóa bởi phần mềm khi xảy ra cạnh âm (xuống) hoặc mức thấp tại chân ngắt ngoài. TCON.1 IE0 89H Cờ ngắt bên ngoài 0 (kích khởi cạnh). TCON.0 IT0 88H Cờ ngắt bên ngoài 0 (kích khởi cạnh hoặc mức). Bảng 2.8:Thanh ghi điều khiển TCON Các chế độ định thời và cờ tràn. Chế độ định thời 13 bit (chế độ 0): Chế độ 0 là chế độ định thời 13 bit. Byte cao của bộ định thời THx được ghép nối tiếp với 5 bit thấp của bộ định thời TLx để tạo thành một bộ định thời 13 bit, ba bit cao của TLx không sử dụng . Chế độ định thời 16 bit (chế độ 1): Chế độ 1 là chế độ định thời 16 bit và cấu hình giống chế độ định thời 13 bit. Khi có xung clock đến, bộ định thời đếm lên: 000H, 0001H, 0002H,… một tràn sẽ xuất hiện khi có sự chuyển số đếm từ FFFFH xuống 0000H, và set cờ tràn TFx trong thanh ghi điều khiển TCON bằng 1 bởi phần mềm, bộ định thời tiếp tục đếm. Chế độ tự nạp lại 8 bit (chế độ 2): Chế độ 2 tự nạp lại 8 bit. Byte thấp của bộ định thời (TLx) họat động định thời 8 bit trong khi byte cao của bộ định thời lưu giữ giá trị nạp lại. Khi số đếm tràn từ FFh xuống 00H, không chỉ cờ tràn của bộ định thời được set lên 1 mà giá trị trong THx còn được nạp vào TLx; việc đếm sẽ tiếp tục từ giá trị này cho đếm khi xảy ra 1 tràn (FFH÷00H) kế tiếp. Chế độ định thời chia sẻ (chế độ 3): Chế độ 3 là chế độ định thời chia sẻ và có hoạt động khác nhau cho từng bộ định thời. Bộ định thới 0 ở chế độ 3 được chia thành 2 bộ định thời 8 bit họat động riêng rẽ TL0 và TH0, mỗi bộ định thời sẽ set các cờ TF0 và TF1 khi xảy ra tràn. Bộ định thời 1 không họat động ở chế độ 3 nhưng có thể được khởi động bằng cách chuyển bộ định thời này vào một trong các chế độ khác như được sử dụng cho port nối tiếp (tạo xung clock tốc độ baud) hoặc sử dụng theo một cách nào đó nhưng không yêu cầu ngắt (vì bộ định thời lúc này không còn nối với TF1). Cờ tràn TF1 của bộ định thời 1 không bị ảnh hưởng bởi bộ định thời 1 khi bộ này xảy ra tràn vì TF1 được nối với bộ định thời 8 bit TH0. Khởi động, dừng và điều khiển các bộ định thời. Cách đơn giản để khởi động và dừng các bộ định thời là sử dụng bit điều khiển họat động TRx trong thanh ghi TCON. TRx được xóa khi thiết lập hệ thống. Do thanh ghi TCON là thanh ghi được định địa chỉ bit , ta dễ dàng khởi động và dừng các bộ định thời bằng chương trình. Thí dụ bộ định thời 0 được khởi động bằng lệnh: SETB TR0 và điều khiển bằng lệnh: CLR TR0 ÷ 12 C/T TRI Gate TLx THx TFx 0 = up 1 = down (16 bit) 0 = up 1 = down Mạch dao động trong chip Tx INTx 12MHz 8051 Một phương pháp khác để điều khiển các bộ định thời là sử dụng bit GATE trong thanh ghi TMOD và ngõ vào INTx, bằng cách set bit GATE lên 1 ta cho phép bộ định thời được điều khiển bởi INTx. Hình 2.14: Họat động của bộ định thời;x = 0,1 Khởi động và truy xuất các thanh ghi định thời. Các bộ định thời thường được khởi động một lần ở thời điểm bắt đầu chương trình để thiết lập chế độ họat động theo yêu cầu. Các bộ định thời được điều khiển họat động, dừng, kiểm tra các bit cờ và xóa, các thanh ghi định thời đựơc đọc hoặc câp nhật,… tùy theo yêu cầu của ứng dụng. TMOD là thanh ghi được khởi động trước tiên vì đây là thanh ghi thiết lập chế độ họat động. Thí dụ khởi động bộ định thời 1 họat động ở chế độ 16 bit (chế độ 1): MOV TMOD,#00010000B Kết quả của lệnh này là thiết lập M1=0, M0=1 để ấn định chế độ 1, C/T=0 và GATE=0 để sử dụng xung clock trên chip. Họat động ngắt. Chương trình xử lý ngắt được gọi là trình phục vụ ngắt ISR (interrupt setvice routine) hay quản lý ngắt (interrupt handler). Khi một ngắt xuất hiện chương trình chính tạm thời bị dừng và CPU thực thi việc rẽ nhánh đến trình phục vụ ngắt ISR. CPU thực thi ISR để thực hiện một công việc và kết thúc việc thực thi này khi gặp lệnh “quay về từ một trình phục vụ ngắt”; chương trình chính được tiếp tục tại nơi bị tạm dừng. Tổ chức ngắt của 89C51. Có 5 nguyên nhân tạo ra ngắt (gọi là nguyên nhân ngắt) đối với 89C51 hai ngắt do bên ngoài, hai ngắt do bộ định thời và một ngắt do port nối tiếp. Khi reset hệ thống các ngắt bị vô hiệu hóa và chỉ cho phép ngắt bằng phần mềm. Cho phép và không cho phép ngắt: Cho phép hoặc không cho phép ngắt thông qua thanh ghi chức năng đặc biệt IE (interrupt enable) có địa chỉ byte là A8H. Mỗi một bit của thanh ghi này cho phép hoặc không cho phép từng nguyên nhân ngắt riêng rẽ. Bit Ký hiệu Địa chỉ bit Mô tả (0: không cho phép; 1: cho phép) IE.7 EA AFH Cho phép/không cho phép toàn cục. IE.6 - AEH Không sử dụng. IE.5 ET2 ADH Cho phép ngắt do bộ định thời 2. IE.4 ES ACH Cho phép ngắt do port nối tiếp. IE.3 ET1 ABH Cho phép ngắt do bộ định thời 1. IE.2 EX1 AAH Cho phép ngắt từ bên ngoài (ngắt ngoài 1). IE.1 EX0 A9H Cho phép ngắt từ bên ngoài ( ngắt ngoài 0). IE.0 ET0 A8H Cho phép ngắt do bộ định thời 0. Bảng 2.9:Thanh ghi cho phép ngắt IE. Ưu tiên ngắt: mỗi một nguyên nhân ngắt được lập trình riêng rẽ để có một trong hai mức ưu tiên thông qua chức năng đặc biệt (IP-inetrrup priority) được định địa chỉ bit, có địa chỉ byte là B8H. Bit Ký hiệu Địa chỉ bit Mô tả (0: không cho phép; 1: cho phép) IP.7 - - Không sử dụng. IP.6 - - Không sử dụng. IP.5 PT2 0BDH Ưu tiên cho ngắt do bộ định thời 2. IP.4 PS 0BCH Ưu tiên cho ngắt do port nối tiếp. IP.3 PT1 0BBH Ưu tiên cho ngắt do bộ định thời 1. IP.2 PX1 0BAH Ưu tiên cho ngắt do bên ngoài (ngắt ngoài 1). IP.1 PT0 0B9H Ưu tiên cho ngắt do bộ định thời 0. IP.0 PX0 0B8H Ưu tiên cho ngắt do bên ngoài (ngắt ngoài 0). Bảng 2.10: Thanh ghi ưu tiên ngắt IP Khi hệ thống được thiết lập lại trạng thái ban đầu, thanh ghi IP sẽ mặc định đặt tất cả các ngắt ở mức ưu tiên thấp. Trình phục vụ ngắt tạm dừng bởi một ngắt khác nếu ngắt này có mức ưu tiên cao hơn. Chuổi vòng: nếu có hai ngắt có cùng mức ưu tiên xuất hiện đồng thời, chuỗi vòng cố định sẽ xác định ngắt nào được phục vụ trước. Chuổi vòng này sẽ là: ngắt ngoài 0, ngắt do bộ định thời 0, ngắt ngoài 1, ngắt do bộ định thời 1, ngắt do port nối tiếp. Ngắt do port nối tiếp là kết quả OR của cờ ngắt thu RI với cờ ngắt phát TI. Ngắt Cờ Thanh ghi SFR và vị trí bit Do bên ngoài (ngắt ngoài 0) IE0 TCON.1 Do bên ngoài (ngắt ngoài 1) IE1 TCON.3 Do bộ định thời 1 TF1 TCON.7 Do bộ định thời 0 TF0 TCON.5 Do port nối tiếp TI SCON.1 Do port nối tiếp RI SCON.0 Bảng 2.11: Các cờ ngắt. Việc thực thi ISR kết thúc khi gặp lệnh RETI. Lệnh này lấy lại giá tri cũ của bộ đếm chương trình PC từ stack và phục hồi trạng thái của ngắt cũ, chương trình chính được tiếp tục tại nơi bị tạm ngưng. Xử lý ngắt. Các vector ngắt: khi một ngắt được chấp nhận, giá trị được nạp cho bộ đếm chương trình PC gọi là vector ngắt. Khi một trình phục vụ ngắt được trỏ tới, cờ gây ra ngắt sẽ tự động bị xóa về 0 bởi phần cứng, ngoại trừ TI, RI. Ngắt do Cờ Địa chỉ vector Reset hệ thống RST 0000H Ngắt ngoài 0 IE0 0003H Bộ định thời 0 TF0 000BH Ngắt ngoài 1 IE1 0013H Bộ định thời 1 TF1 001BH Port nối tiếp RI hoặc TI 0023H Bảng 2.12 : Các vector ngắt. Các ngắt do port nối tiếp. Các ngắt do port nối tiếp xuất hiện khi cờ ngắt phát TI hoặc cờ ngắt thu RI được set bằng 1. Ngắt phát xuất hiện khi việc phát một ký tự đã ghi vào SBUF hoàn tất (SBUF rỗng). Ngắt thu xuất hiện khi một ký tự được nhận đầy đủ và đang ở trong SBUF để chờ được đọc (SBUF đầy). Ngắt do port nối tiếp khác ngắt do bộ định thời. Cờ gây ra ngắt ở port nối tiếp không được xóa bởi phần cứng khi CPU trỏ tới trình phục vụ ngắt. Còn các ngắt do bộ định thời, cờ tạo ra ngắt được xóa bởi phần cứng khi CPU trở tới trình phục vụ ngắt. Các ngắt ngoài. Ngắt ngoài xảy ra khi có mức thấp hoặc cạnh âm trên chân INT0 (P3.2) hoặc INT1 (P3.3) của 89C51. Việc chọn các ngắt loại tác động cạnh hay tác động mức được lập trình thông qua các bit IT0 và IT1 của thanh ghi TCON. Thí dụ IT1=0, ngắt ngoài 1 được kích khởi bởi việc phát hiện mức thấp ở chân INT1, nếu IT1=1, ngắt ngoài 1 được kích khởi cạnh. Các chân ngắt ngoài được lấy mẫu một lần ở mỗi chu kỳ máy, và phải duy trì tối thiểu 12 chu kỳ dao động để đảm bảo yêu cầu. Nếu ngắt ngoài thuộc loại tác động cạnh, nguyên nhân ngắt phải được duy trì tại chân yêu cầu ở mức cao tối thiểu một chu kỳ sau đó ở mức thấp tối thiểu một chu kỳ nửa. IE0 và IE1 tự động được xóa khi CPU trỏ tới trình phục vụ ngắt tương ứng. Nếu ngắt ngoài thuộc loại tác động mức, nguyên nhân ngắt phải được duy trì trạng thái tích cực cho đến khi ngắt theo yêu cầu thực sự được tạo ra. Sau đó ở trạng thái thụ động trước khi trình phục ngắt được thực thi xong hoặc trước khi có một ngắt khác được tạo ra. Họat động port nối tiếp. 89C51 có port nối tiếp trong chip có thể họat động ở nhiều chế độ trên một dãy tần số rộng. Chức năng chủ yếu là chuyển đổi từ dữ liệu song song sang nối tiếp đối với dữ liệu xuất và chuyển đổi từ nới tiếp sang song song đối với dữ liệu nhập. Port nối tiếp hoạt động song công (full duplex) nghĩa là có khả năng thu và phát đồng thời và đệm thu cho phép một ký tự sẽ được thu và giữ trong khi ký tự thứ 2 nhận được. Khi CPU đọc ký tự thứ 1 trước khi ký tự thứ 2 được nhận đầy đủ thì dữ liệu sẽ không bị mất. Hai thanh ghi chức năng đặc biệt SBUF và SCON để truy xuất port nối tiếp. Bộ đệm port nối tiếp SBUF có địa chỉ byte là 99H. việc ghi lên SBUF sẽ nạp dữ liệu để phát và việc đọc SBUF sẽ truy xuất dữ liệu nhận được. Thanh ghi điều khiển port nối tiếp SCON có địa chỉ là 98H, chứa các bit trạng thái và bit điều khiển. Các bit điều khiển sẽ thiết lập chế độ hoạt động cho port nối tiếp còn các bit trạng thái chỉ ra sự kết thúc việc thu hoặc phát một ký tự. Các bit trạng thái được kiểm tra bởi phần mềm hoặc được lập trình để tạo ra ngắt. Thanh ghi điều khiển. Chế độ họat động của port nối tiếp được thiết lập bằng cách ghi từ điều khiển lên thanh ghi chọn chế độ SCON. Các chế độ họat động. Port nối tiếp có 4 chế độ họat động, các chế độ được chọn nhờ vào hai bit SM0 và SM1 trong thanh ghi SCON. Bit Ký hiệu Địa chỉ Mô tả SCON.7 SM0 9FH Bit 0 chọn chế độ của port nối tiếp. SCON.6 SM1 9EH Bit 1 chọn chế độ của port nối tiếp. SCON.5 SM2 9DH Bit 2 chọn chế độ của port nối tiếp. Bit này cho phép truyền thông đa xử lý ở các chế độ 2 và 3; bit RI sẽ không được tích cực nếu bit thứ 9 nhận được là 0. SCON.4 REN 9CH Cho phép thu. Bit này phải được set để nhận các ký tự. SCON.3 TB8 9BH Bit phat 8.Bit thứ 9 được phát ở các chế độ 2 va 3; được set và xóa bởi phần mềm. SCON.2 RB8 9AH Bit thu 8; bit thứ 9 nhận được. SCON.1 TI 99H Cờ ngắt phát. Cờ này được set ngay khi kết thúc việc phát một ký tự; được xóa bởi phần mềm. SCON.0 RI 98H Cờ ngắt thu. Cờ này được set ngay sau khi kết thúc việc thu một ký tự; được xóa bởi phần mềm. Bảng 2.13: Thanh ghi SCON Các chế độ được mô tả như sau: SM0 SM1 Chế độ Mô tả Tốc độ baud 0 0 0 Thanh ghi dịch Cố định (tần số dao động /12 ) 0 1 1 UART 8 bit Thay đổi ( thiết lập bởi bộ định thời ) 1 0 2 UART 9 bit Cố định (tần số dao động /12 hoặc /64 ) 1 1 3 UART 9 bit Thay đổi ( thiết lập bởi bộ định thời ) Bảng 2.14: Các chế độ của port nối tiếp. Thanh ghi dịch 8 bit (chế độ 0). Chế độ 0 được chọn bằng cách ghi giá trị 0 vào các bit SM0 và SM1 trong thanh ghi SCON. Đưa port nối tiếp vào chế độ thanh ghi dịch 8 bit . Dữ liệu nối tiếp được thu và phát thông qua chân RxD, chân TxD xuất xung clock dịch bit. Tốc độ baud cố định bằng 1/12 tần số của mạch dao động trên chip. Chân RxD được sử dụng cho cả thu và phát dữ liệu còn chân RxD được dùng làm chân xuất xung clock dịch bit. Việc phát dữ liệu được khởi động bằng một lệnh ghi dữ liệu vào SBUF. Dữ liệu được dịch ra ngoài qua chân RxD (P3.0) với các xung clock dịch bit được gởi ra trên chân TxD (P3.1). Mỗi một bit hợp lệ được truyền đi trên đường RxD trong một chu kỳ máy. Trong mỗi chu kỳ máy, xung clock dịch bit đổi thành mức thấp ở S3P1 và trở lại mức cao ở S6P1.(hình 2.16) Việc thu dữ liệu được khởi động khi bit cho phép thu REN ở logic 1 và cờ ngắt thu RI ở mức logic 0. Qui tắt tổng quát là ta phải set bit REN bằng 1 ở thời điểm bắt đầu chương trình để khởi động port nối tiếp và sau đó xóa bit RI để bắt đầu công việc thu dữ liệu. Khi bit RI được xóa, các xung clock dịch bit được xuất ra trên chân TxD, ta bắt đầu chu kỳ máy tiếp theo và dữ liệu được dịch vào chân RxD bởi xung clock.(hình 2.15) Dữ liệu xuất RxD Xung clock dịch bit ALE một chu kỳ máy D0 D1 D2 D3 D4 D5 D6 D7 Hình 2.15: Giản đồ thời gian thu dữ liệu ở chế độ 0 Data out RxD P1 P2 P1 P2 P1 P2 P1 P2 P1 P2 P1 P2 S1 S2 S3 S4 S5 S6 D0 D1 D2 D3 D4 D5 D6 D7 Xung clock dịch bit ALE ALE Xung clock Dữ liệu xuất Phóng đại Hình 2.16: Giản đồ thời gian phát dữ liệu ở chế độ 0 Một ứng dụng khả thi của chế độ 0 (chế độ thanh ghi dịch bit) là mở rộng thêm các ngõ ra cho 89C51. Một vi mạch thanh ghi dịch nối tiếp song song có thể được nối với các chân TxD và RxD của 89C51 để cung cấp thêm 8 đường xuất (xem hình 2.2.8) các thanh ghi dịch bit khác có thể ghép cascade với thanh ghi dịch bit đầu tiên để mở rộng thêm nữa. TxD (P3.1) RxD (P3.0) CLOCK Data Thanh ghi dịch bit 8051 8 ngõ ra mở rộng Hình 2.17: Chế độ thanh ghi dịch của port nối tiếp UART 8 bit có tốc độ baud thay đổi (chế độ 1): Trong chế độ 1 port nối tiếp của 89C51 họat động như một bộ thu phát không đồng bộ (Universal asynchrouos receiver transmitter). UART là một bộ thu phát dữ liệu nối tiếp với mỗi ký tự dữ liệu được ứng trước bởi một bit start (logic 0) và đứng sau bởi một bit stop (logic 1). Đôi khi có một bit chẵn lẻ được chèn giữa bit dữ liệu sau cùng và bit stop. Hoạt động chủ yếu của UART là biến đổi dữ liệu phát từ song song sang nối tiếp và biến đổi dữ liệu từ nối tiếp thành song song. Như vậy ở chế độ 1 ta có 10 bit thu được trên chân RxD và 10 bit được phát đi trên chân TxD cho mỗi ký tự. Khi hoạt động thu, bit stop đưa dến bit RB8 của SCON. Với 89C51, tốc dộ baud được thiết lập bởi tốc độ tràn của bộ định thời 1. Việc cấp xung clock dịch bit và đồng bộ các thanh ghi dịch bit của port nối tiếp ở chế độ 1, 2 và 3 được thiết lập bởi bộ đếm 16, ngõ ra của bộ đếm là xung clock tốc độ baud. Ngõ vào của bộ đếm được chọn bằng phần mềm.(hình 2.18) Việc phát được khởi động bằng cách ghi vào SBUF nhưng nó chưa bắt đầu cho đến lần tràn kế của bộ đếm 16. Dữ liệu xuất ra trên đường TxD bắt đầu bằng bit start, tiếp theo là 8 bit dữ liệu rồi đến bit stop. Cờ ngắt TI được set bằng 1 ngay khi bit stop xuất hiện trên TxD (xem hình 2.19): Xung clock tốc độ buad Thanh ghi dịch của port nối tiếp ÷ 12 16 x tốc độ baud Hình 2.18: Cấp xung clock cho port nối tiếp D0 D1 D2 D3 D4 D5 D6 D7 tốc độ baud 1 Start bit Stop bit ngắt phát TxD TI (SCON.1) Hình 2.19: Set cờ TI của port nối tiếp Việc nhận được khởi động khi chuyển trạng thái từ 1 xuống 0 trên RxD (bắt đầu bit start). Bộ đếm 16 ngay lập tức được xóa để gán các số đếm cho dòng bit đến chân RxD. UART 9 bit có tốc độ baud cố định (chế độ 2): Khi SM1=1 và SM0=0, port nối tiếp họat động chế độ 2, chế độ này có tốc độ baud cố định. 11 bit được thu hoặc phát cho việc thu phát một ký tự dữ liệu: bit start, 8 bit dữ liệu, bit stop. Khi phát bit thứ 9 là bit bất kì được đặt vào bit TB8 trong thanh ghi SCON (có thể là bit chẵn lẻ). khi thu bit thứ 9 hận được sẽ đặt váo RB8. Tốc độ baud ở chế độ 2 bằng 1/32 hoặc 1/64 tần số của mạch dao động trên chip. UART 9 bit có tốc độ baud thay đổi (chế độ 3): Chế độ 3,UART 9 bit thay đổi tương tự như chế độ 2 ngoại trừ tốc độ baud được lập trình và cung cấp bởi bộ định thời. Khởi động và truy xuất các thanh ghi. Cho phép thu(Recive enable): bit cho phép thu REN trong thanh ghi SCO phải được set bằng 1 bởi phần mềm để cho phép nhận ký tự. Điều này thường được thực hiện ở đầu chương trình khi port nối tiếp, bộ timer, …được khởi động. Ta có thể dùng 2 cách sau: SETB REN hoặc MOV SCON,#xxx1xxxxB Bit dữ liệu thứ 9: được phát ở chế độ 2 và 3 phải được nạp cho bit TB8 bằng phần mềm. Bit dữ liệu thứ 9 phải được đặt vào bit RB8 của SCON. Phần mềm có thể yêu cầu hoặc không yêu cầu bit này, tùy vào đặc tính của thiết bị nối tiếp. Thêm vào bit chẵn lẻ:bit P trong từng trạng thái chương trình PSW được SET hoặc CLR ở mỗi chu kỳ máy để thiết lập kiểm tra chẵn cho 8 bit chứa trong thanh chứa A. Thí dụ việc truyền thông yêu cầu 8 bit dữ liệu cộng với một bit kiểm tra chẵn, các lệnh sau được dùng để phát đi 8 bit trong thanh chứa với bit kiểm tra chẵn được đưa vào bit thứ 9: MOV C,P ;đưa bit kiểm tra chẵn vào TB8 MOV TB8,C ;bit này trở thành bit thứ 9 MOV SBUF,A ;di chuyển 8 bit dữ liệu từ ACC đến SBUF Nếu kiểm tra lẻ thì: MOV C,P ;đưa bit kiểm tra chẵn vào TB8 CPL C MOV TB8,C ;bit này trở thành bit thứ 9 MOV SBUF,A ;di chuyển 8 bit dữ liệu từ ACC đến SBUF Việc dùng bit chẵn lẻ không bị giới hạn trong chế độ 2 và 3. Trong chế độ 1, 8 bit dữ liệu phát đi bao gồm 7 bit dữ liệu và 1 bit chẵn lẻ. Để phát đi một mã ASCII 7 bit cùng với bit kiểm tra chẵn, ta có thể sử dụng các lệnh sau: CLR ACC.7 ;xóa bit MSB MOV C,P ;sao chép bit P vào C MOV ACC.7,C ;đặt bit kiểm tra vào bit MSB MOV SBUF,A ;phát ký tự Cờ ngắt: cờ ngắt thu RI và cờ ngắt phát TI đóng vai trò quan trọng trong việc truyền dữ liệu nối tiếp, cả hai bit điều được set bằng 1 và được xóa bằng phầnh mềm. Nếu muốn nhận một ký tự từ thiết bị nối với port nối tiếp ta có thể dùng các lệnh sau: NHAN: JNB RI,NHAN ;kiểm tra RI cho đến khi bằng 1 CLR RI ;xóa RI MOV A,SBUF ;đọc ký tự Cờ TI set bằng 1 khi kết thúc việc phát một ký tự và chỉ ra rằng bộ nhớ đệm rỗng. Các lệnh sau phát một ký tự chứa trong thanh chứa: PHAT: JNB TI,NHAN ;kiểm tra TI cho đến khi bằng 1 CLR TI ;xóa TI MOV SBUF,A ;phát ký tự Truyền thông đa xử lý: Các chế độ 2 và 3 là các chế độ dự phòng cho việc truỵền thông đa xử lý. Trong các chế độ náy 9 bit dữ liệu được thu và bit thứ 9 được đưa đến RB8. Port có thể được lập trình sao cho khi bit stop được nhận, ngắt do port nối tiếp được tích cực chỉ khi RB8=1. đặc trưng này có được bằng cách set bit SM2 trong thanh ghi SCON bằng 1. Ứng dụng cho mạng sử dụng nhiều 89C51 theo mô hình chủ/tớ (master/slave): Master 89C51 TxD P0 P1 P2 P3 89C51 Slave #1 RxD 32 đường I/O P0 P1 P2 P3 89C51 Slave #2 RxD 32 đường I/O Hình 2.20 : Truyền thông đa xử lý. Khi bộ xử lý muốn phát một khối dữ liệu đến bộ xử lý con riêng lẻ, trước tiên nó gởi ra một byte để địa chỉ để nhận diện bộ xử lý con mong muốn. Byte địa chỉ được phân biệt với byte dữ liệu ở bit thứ 9: bit thứ 9 bằng 1 trong byte địa chỉ và bằng 0 trong byte dữ liệu. Tuy nhiên byte địa chỉ sẽ ngắt toàn bộ xử lý con, do đó có thể khảo sát byte đã thu để kiểm tra có dạng định địa chỉ. Bộ xử lý con đã được định địa chỉ sẽ xóa bit MS2 của nó và chuẩn bị thu các byte dữ liệu theo sau đó. Những bộ xử lý con không được định địa chỉ có các bit SM2 của nó được set bằng 1 và thực thi các công việc riêng của chúng. SM2 không ảnh hưởng đến chế độ 0, và trong chế độ 1 bit này có thể đựơc dùng để kiểm tra sự hợp lệ của bit stop. Ở chế 1 thu nếu SM2=1 ngắt thu sẽ không được tích cực trừ khi bit stop thu được là hợp lệ. Tốc độ baud của port nối tiếp. Tốc độ baud sẽ cố định trong các chế độ 0 và 2. trong chế độ 0 tốc độ baud luôn bằng tần số của mạch dao động trong chip chia cho 12. Thông thường nguời ta sử dụng một thạch anh bên ngoài chip. ÷ 12 Bộ dao động trong chip Bộ dao động trong chip Tràn bộ định thời 1 Xung clock tốc độ baud Xung clock tốc độ baud Xung clock tốc độ baud ÷ 32 ÷ 64 SMOD=0 SMOD=1 ÷ 32 ÷ 16 SMOD=0 SMOD=1 (a) Mode 0 (b) Mode 2 (c) Mode 1, 3 Hình 2.21: Nguồn xung clock cho port nối tiếp. (a)chế độ 0, (b) chế độ 2, (c) chế độ 1, 3 Sau khi hệ thống reset, tốc độ baud của chế độ 2 bằng tần số của mạch dao động chia cho 64. Tốc độ baud cũng bị ảnh hưởng bởi một bit trong thanh ghi điều khiển nguồn PCON. Bit 7 của PCON là bit SMOD và việc set bit này bằng 1 sẽ làm tăng tốc độ baud của các chế độ 1, 2 và 3 lên gấp đôi. Ở chế độ 2, tốc độ baud có thể được nhân hai từ giá trị mặc định là 1/64 tần số của mạch dao động ( SM._.E_SIGN LJMP EXIT_CHECK_VOCAL CHECK_o: CJNE A,#'o',CHECK_o7 MOV DPTR,#TABLE_o MOV DPL_T,DPL MOV DPH_T,DPH LCALL CHECK_BYTE_SIGN LJMP EXIT_CHECK_VOCAL CHECK_o7: CJNE A,#0F4H,CHECK_u MOV DPTR,#TABLE_o7 MOV DPL_T,DPL MOV DPH_T,DPH LCALL CHECK_BYTE_SIGN LJMP EXIT_CHECK_VOCAL CHECK_u: CJNE A,#'u',CHECK_u7 MOV DPTR,#TABLE_u MOV DPL_T,DPL MOV DPH_T,DPH LCALL CHECK_BYTE_SIGN LJMP EXIT_CHECK_VOCAL CHECK_u7: CJNE A,#0F6H,CHECK_y MOV DPTR,#TABLE_u7 MOV DPL_T,DPL MOV DPH_T,DPH LCALL CHECK_BYTE_SIGN LJMP EXIT_CHECK_VOCAL CHECK_y: CJNE A,#'y',EXIT_CHECK_VOCAL MOV DPTR,#TABLE_y MOV DPL_T,DPL MOV DPH_T,DPH LCALL CHECK_BYTE_SIGN EXIT_CHECK_VOCAL: RET ;------------------------------------------------------------------***--------------------------------------------------------------------- CHECK_BYTE_SIGN: MOV DPL,DPL_N MOV DPH,DPH_N INC DPTR MOVX A,@DPTR PUSH ACC MOV B,#0E0H DIV AB CJNE A,#00H,CONT_CHECK_BYTE_SIGN POP ACC MOV A,INCHAR LJMP EXIT_CHECK_BYTE_SIGN CONT_CHECK_BYTE_SIGN: POP ACC CLR C SUBB A,#0E0H MOV DPL,DPL_T MOV DPH,DPH_T MOVC A,@A+DPTR MOV INCHAR,A MOV DPL,DPL_N MOV DPH,DPH_N INC DPTR MOV DPL_N,DPL MOV DPH_N,DPH EXIT_CHECK_BYTE_SIGN: RET ;-------------------------------------------------------------------***-------------------------------------------------------------------- LOAD_SPACE: MOV R0,#12 ;LOAD 120 BYTE TRONG DE KHI HIEN THI BAN DAU LOOP_LOAD_SPACE: MOV DPTR,#FONT_SPACE MOV DPL_F,DPL MOV DPH_F,DPH LCALL LOAD_FONT DJNZ R0,LOOP_LOAD_SPACE RET ;------------------------------------------------------------------***--------------------------------------------------------------------- LOAD_FONT: MOV DPL,DPL_F MOV DPH,DPH_F INC DPTR MOV DPL_F,DPL MOV DPH_F,DPH MOV A,#00H MOVC A,@A+DPTR CJNE A,#0AAH,CONT_LOAD_FONT LJMP EXIT_LOAD_FONT CONT_LOAD_FONT: MOV DPL,DPL_SF MOV DPH,DPH_SF INC DPTR MOV DPL_SF,DPL MOV DPH_SF,DPH MOVX @DPTR,A ;GHI VAO RAM LJMP LOAD_FONT EXIT_LOAD_FONT: RET ;------------------------------------------------------------------***--------------------------------------------------------------------- DELAY5uS: MOV TL0,#0FBH MOV TH0,#0FBH SETB TR0 JNB TF0,$ CLR TR0 CLR TF0 RET DELAY4mS: MOV TL0,#060H MOV TH0,#0F0H SETB TR0 JNB TF0,$ CLR TR0 CLR TF0 RET DELAY20mS: MOV TL0,#0F0H MOV TH0,#0D8H SETB TR0 JNB TF0,$ CLR TR0 CLR TF0 RET DELAY1S: MOV R7,#250 LOOP_DELAY1S: LCALL DELAY4mS DJNZ R7,LOOP_DELAY1S RET ;------------------------------------------------------------------***--------------------------------------------------------------------- TABLE_NUMBER: DB '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' TABLE_a: DB 87H,86H,85H,89H,8AH,88H,00H,00H,8DH,8CH,8BH,90H,00H,00H,00H,84H DB 00H,00H,00H,00H,00H,83H,00H,00H,81H,80H,8EH,82H,8FH,00H,00H,00H TABLE_e: DB 98H,97H,96H,9AH,9BH,99H,00H,00H,00H,00H,00H,00H,00H,00H,00H,95H DB 00H,00H,00H,00H,00H,94H,00H,00H,92H,91H,00H,93H,00H,00H,00H,00H TABLE_o: DB 0A3H,0A2H,0A1H,0A5H,0A6H,0A4H,00H,00H,00H,00H,00H,00H,00H,00H,00H,0A0H DB 00H,00H,00H,00H,00H,9FH,00H,00H,9DH,9CH,00H,9EH,00H,00H,00H,00H TABLE_o7: DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,0ABH DB 00H,00H,00H,00H,00H,0AAH,00H,00H,0A8H,0A7H,00H,0A9H,00H,00H,00H,00H TABLE_u: DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,0B0H DB 00H,00H,00H,00H,00H,0AFH,00H,00H,0ADH,0ACH,00H,0AEH,00H,00H,00H,00H TABLE_u7: DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,0B5H DB 00H,00H,00H,00H,00H,0B4H,00H,00H,0B2H,0B1H,00H,0B3H,00H,00H,00H,00H TABLE_y: DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,0B9H,00H,00H,0B7H,0B6H,00H,0B8H,00H,00H,00H,00H FONT_As:DB '?',20H,00H, 30H,30H, 3CH,18H, 27H,0CH, 03H,0C6H, 02H,73H, 02H,1BH, 02H,78H, 03H,0E0H, 2FH,80H, 3EH,00H, 30H,00H, 20H,00H,0AAH FONT_A: DB 'A',20H,00H,30H,00H,38H,00H,27H,00H,03H,0C0H,02H,30H,02H,1EH,02H,7CH,03H,0E0H,2FH,80H,3EH,00H,30H,00H,20H,00H,00H,00H,0AAH FONT_B: DB 'B',20H,02H,20H,02H,3FH,0FEH,3FH,0FEH,20H,82H,20H,82H,20H,82H,20H,0C6H,31H,7CH,1FH,38H,0EH,00H,00H,00H,0AAH FONT_C: DB 'C',03H,0E0H,0FH,0F8H,1CH,1CH,30H,04H,20H,02H,20H,02H,20H,02H,20H,02H,20H,06H,10H,0CH,08H,1EH,00H,00H,0AAH FONT_D: DB 'D',20H,02H,20H,02H,3FH,0FEH,3FH,0FEH,20H,02H,20H,02H,20H,02H,20H,02H,30H,06H,10H,0CH,1CH,1CH,0FH,0F8H,03H,0E0H,00H,00H,0AAH FONT_D9: DB 0D9H,20H,02H,20H,82H,3FH,0FEH,3FH,0FEH,20H,82H,20H,82H,20H,82H,20H,82H,30H,06H,10H,0CH,1CH,1CH,0FH,0F8H,03H,0E0H,00H,00H,0AAH FONT_E: DB 'E',20H,00H,20H,02H,3FH,0FEH,3FH,0FEH,20H,82H,20H,82H,20H,82H,20H,82H,21H,0C2H,20H,06H,30H,00H,00H,00H,0AAH FONT_F: DB 'F',20H,00H,20H,02H,3FH,0FEH,3FH,0FEH,20H,82H,20H,82H,00H,82H,00H,82H,03H,0E2H,00H,06H,00H,00H,0AAH FONT_G: DB 'G',03H,0E0H,0FH,0F8H,1CH,1CH,10H,04H,30H,06H,20H,02H,20H,02H,20H,02H,20H,82H,20H,84H,1FH,8CH,1FH,80H,00H,80H,00H,00H,0AAH FONT_H: DB 'H',20H,02H,20H,02H,3FH,0FEH,3FH,0FEH,20H,82H,20H,82H,00H,80H,20H,82H,20H,82H,3FH,0FEH,3FH,0FEH,20H,02H,20H,02H,00H,00H,0AAH FONT_I: DB 'I',20H,02H,20H,02H,3FH,0FEH,3FH,0FEH,20H,02H,20H,02H,00H,00H,0AAH FONT_J: DB 'J',30H,00H,30H,02H,20H,02H,3FH,0FEH,1FH,0FEH,00H,02H,00H,02H,00H,00H,0AAH FONT_K: DB 'K',20H,02H,20H,02H,3FH,0FEH,3FH,0FEH,20H,82H,23H,0C2H,03H,20H,06H,10H,2CH,0AH,38H,06H,30H,02H,20H,02H,20H,00H,00H,00H,0AAH FONT_L: DB 'L',20H,02H,20H,02H,3FH,0FEH,3FH,0FEH,20H,02H,20H,02H,20H,00H,20H,00H,30H,00H,10H,00H,08H,00H,00H,00H,0AAH FONT_M: DB 'M',20H,00H,20H,02H,3FH,0FEH,20H,1EH,00H,7CH,01H,0F0H,0FH,80H,3EH,00H,0CH,00H,03H DB 00H,00H,0C0H,00H,30H,20H,0CH,3FH,0FEH,3FH,0FEH,20H,02H,20H,02H,00H,00H,0AAH FONT_N: DB 'N',20H,02H,20H,06H,3FH,0FEH,20H,0EH,00H,1CH,00H,30H,00H,0E0H,01H,0C0H,03H,00H,0EH,02H,3FH,0FEH,00H,02H,00H,00H,0AAH FONT_O: DB 'O',03H,0E0H,0FH,0F8H,1CH,1CH,10H,04H,20H,02H,20H,02H,20H,02H,20H,02H,10H,04H,1CH,1CH,0FH,0F8H,03H,0E0H,00H,00H,0AAH FONT_P: DB 'P',20H,00H,20H,02H,3FH,0FEH,3FH,0FEH,21H,02H,21H,02H,01H,02H,00H,86H,00H,0FCH,00H,78H,00H,00H,0AAH FONT_Q: DB 'Q',03H,0E0H,0FH,0F8H,1CH,1CH,10H,04H,20H,02H,20H,02H,60H,02H,78H,02H,70H,04H,7CH,1CH,4FH,0F8H,43H,0E0H,40H,00H,00H,00H,0AAH FONT_R: DB 'R',20H,00H,20H,02H,3FH,0FEH,3FH,0FEH,20H,82H,21H,82H,03H,82H,0EH,0C6H,1CH,7CH,38H,38H,20H,00H,20H,00H,00H,00H,0AAH FONT_S: DB 'S',1CH,00H,10H,3CH,30H,7EH,20H,62H,20H,0C2H,21H,82H,33H,84H,1FH,0EH,0EH,00H,00H,00H,0AAH FONT_T: DB 'T',00H,0EH,00H,02H,20H,02H,20H,02H,3FH,0FEH,3FH,0FEH,20H,02H,20H,02H,00H,02H,00H,02H,00H,0EH,00H,00H,0AAH FONT_U: DB 'U',00H,02H,00H,02H,0FH,0FEH,1FH,0FEH,30H,02H,20H,02H,20H,00H,20H,00H,20H,02H,10H,02H,0FH,0FEH,00H,02H,00H,00H,0AAH FONT_V: DB 'V',00H,02H,00H,02H,00H,0EH,00H,3EH,01H,0F2H,07H,0C0H,1FH,00H,3FH,00H,07H,0C0H,01H,0FAH,00H,3AH,00H,0EH,00H,02H,00H,00H,0AAH FONT_W: DB 'W',00H,02H,00H,06H,00H,3EH,00H,0FAH,07H,0C2H,3FH,00H,0CH,02H,03H,86H,00H,7EH,00H,0FAH,03H DB 0E2H,1FH,00H,3CH,00H,03H,80H,00H,0E2H,00H,1EH,00H,02H,00H,02H,00H,00H,0AAH FONT_X: DB 'X',20H,02H,20H,02H,30H,06H,28H,1EH,06H,3EH,03H,72H,01H,0C0H,23H,0C0H,2FH,30H,3CH,1AH,38H,0EH,30H,02H,20H,02H,00H,00H,0AAH FONT_Y: DB 'Y',00H,02H,00H,06H,00H,0EH,00H,3EH,20H,7AH,21H,0E2H,3FH,0C0H,3FH,80H,20H,60H,20H,12H,00H,0EH,00H,06H,00H,02H,00H,00H,0AAH FONT_Z: DB 'Z',20H,00H,30H,06H,3CH,02H,2EH,02H,27H,02H,23H,0C2H,20H,0E2H,20H,7AH,20H,1EH,20H,0EH,30H,06H,00H,00H,0AAH FONT_SPACE: DB ' ',00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,0AAH FONT_a0: DB 'a',18H,0C0H,3CH,0E0H,22H,20H,22H,20H,3FH,0E0H,3FH,0C0H,20H,00H,00H,00H,0AAH FONT_a1: DB 128,18H,0C0H,3CH,0E0H,22H,20H,22H,28H,3FH,0E4H,3FH,0C6H,20H,02H,00H,00H,0AAH FONT_a2: DB 129,18H,0C0H,3CH,0E0H,22H,22H,22H,26H,3FH,0E4H,3FH,0C8H,20H,00H,00H,00H,0AAH FONT_a3: DB 130,18H,0C0H,3CH,0E0H,22H,23H,22H,2BH,3FH,0E7H,3FH,0C3H,20H,00H,00H,00H,0AAH FONT_a4: DB 131,18H,0C0H,3CH,0ECH,22H,22H,22H,26H,3FH,0ECH,3FH,0C8H,20H,04H,00H,00H,0AAH FONT_a5: DB 132,18H,0C0H,3CH,0E0H,0A2H,20H,0A2H,20H,3FH,0E0H,3FH,0C0H,20H,00H,00H,00H,0AAH FONT_a6: DB 133,18H,0C8H,3CH,0E4H,22H,26H,22H,22H,3FH,0E4H,3FH,0C8H,20H,00H,00H,00H,0AAH FONT_a61: DB 134,18H,0C8H,3CH,0E4H,22H,26H,22H,22H,3FH,0E4H,3FH,0C8H,20H,04H,00H,02H,00H,01H,00H,00H,0AAH FONT_a62: DB 135,18H,0C8H,3CH,0E4H,22H,26H,22H,22H,3FH,0E4H,3FH,0C9H,20H,02H,00H,04H,00H,00H,0AAH FONT_a63: DB 136,18H,0C8H,3CH,0E4H,22H,26H,22H,22H,3FH,0E4H,3FH,0C8H,20H,03H,00H,09H,00H,07H,00H,02H,00H,00H,0AAH FONT_a64: DB 137,18H,0C8H,3CH,0E4H,22H,26H,22H,22H,3FH,0E4H,3FH,0C8H,20H,02H,00H,01H,00H,01H,00H,02H,00H,02H,00H,01H,00H,00H,0AAH FONT_a65: DB 138,18H,0C8H,3CH,0E4H,0A2H,26H,0A2H,22H,3FH,0E4H,3FH,0C8H,20H,00H,00H,00H,0AAH FONT_a8: DB 139,18H,0C2H,3CH,0E4H,22H,2CH,22H,28H,3FH,0E4H,3FH,0C2H,20H,00H,00H,00H,0AAH FONT_a81: DB 140,18H,0C2H,3CH,0E4H,22H,2CH,22H,28H,3FH,0E4H,3FH,0C2H,20H,00H,00H,04H,00H,02H,00H,01H,00H,00H,0AAH FONT_a82: DB 141,00H,01H,00H,02H,00H,04H,18H,0C2H,3CH,0E4H,22H,2CH,22H,28H,3FH,0E4H,3FH,0C2H,20H,00H,00H,00H,0AAH FONT_a83: DB 142,18H,0C2H,3CH,0E4H,22H,2CH,22H,28H,3FH,0E4H,3FH,0C2H,20H,00H,00H,03H,00H,09H,00H,07H,00H,02H,00H,00H,0AAH FONT_a84: DB 143,18H,0C2H,3CH,0E4H,22H,2CH,22H,28H,3FH,0E4H,3FH,0C2H,20H,01H,00H,01H,00H,02H,00H,02H,00H,01H,00H,00H,0AAH FONT_a85: DB 144,18H,0C2H,3CH,0E4H,0A2H,2CH,0A2H,28H,3FH,0E4H,3FH,0C2H,20H,00H,00H,00H,0AAH FONT_b0: DB 'b',1FH,0FEH,3FH,0FEH,20H,40H,20H,20H,20H,20H,10H,60H,1FH,0C0H,07H,80H,00H,00H,0AAH FONT_c0: DB 'c',0FH,80H,1FH,0C0H,30H,60H,20H,20H,20H,20H,10H,0E0H,08H,00H,00H,00H,0AAH FONT_d0: DB 'd',0FH,80H,1FH,0C0H,30H,60H,20H,20H,20H,20H,20H,40H,3FH,0FCH,3FH,0FEH,00H,00H,0AAH FONT_d09: DB 241,0FH,80H,1FH,0C0H,30H,60H,20H,20H,20H,20H,20H,48H,3FH,0FCH,3FH,0FEH,00H,08H,00H,00H,0AAH FONT_e0: DB 'e',0FH,80H,1FH,0C0H,31H,60H,21H,20H,21H,20H,21H,60H,11H,0C0H,09H,80H,00H,00H,0AAH FONT_e1: DB 145,0FH,80H,1FH,0C0H,31H,60H,21H,28H,21H,24H,21H,66H,11H,0C2H,09H,80H,00H,00H,0AAH FONT_e2: DB 146,0FH,80H,1FH,0C0H,31H,60H,21H,22H,21H,26H,21H,64H,11H,0C8H,09H,80H,00H,00H,0AAH FONT_e3: DB 147,0FH,80H,1FH,0C0H,31H,60H,21H,20H,21H,23H,21H,6BH,11H,0C7H,09H,83H,00H,00H,0AAH FONT_e4: DB 148,0FH,80H,1FH,0C0H,31H,6CH,21H,22H,21H,26H,21H,6CH,11H,0C8H,09H,84H,00H,00H,0AAH FONT_e5: DB 149,0FH,80H,1FH,0C0H,31H,60H,0A1H,20H,0A1H,20H,21H,60H,11H,0C0H,09H,80H,00H,00H,0AAH FONT_e6: DB 150,0FH,80H,1FH,0C8H,31H,64H,21H,26H,21H,22H,21H,64H,11H,0C8H,09H,80H,00H,00H,0AAH FONT_e61: DB 151,0FH,80H,1FH,0C8H,31H,64H,21H,26H,21H,22H,21H,64H,11H,0C8H,09H,84H,00H,02H,00H,01H,00H,00H,0AAH FONT_e62: DB 152,0FH,80H,1FH,0C8H,31H,64H,21H,26H,21H,22H,21H,64H,11H,0C9H,09H,82H,00H,04H,00H,00H,0AAH FONT_e63: DB 153,0FH,80H,1FH,0C8H,31H,64H,21H,26H,21H,22H,21H,64H,11H,0C8H,09H,83H,00H,09H,00H,07H,00H,02H,00H,00H,0AAH FONT_e64: DB 154,0FH,80H,1FH,0C8H,31H,64H,21H,26H,21H,22H,21H,64H,11H,0C8H,09H,82H,00H,01H,00H,01H,00H,02H,00H,02H,00H,01H,00H,00H,0AAH FONT_e65: DB 155,0FH,80H,1FH,0C8H,31H,64H,0A1H,26H,0A1H,22H,21H,64H,11H,0C8H,09H,80H,00H,00H,0AAH FONT_f0: DB 'f',20H,20H,20H,20H,3FH,0FCH,3FH,0FEH,20H,22H,20H,22H,00H,06H,00H,00H,0AAH FONT_g0: DB 'g',60H,00H,0FEH,0F0H,99H,0F8H,8AH,08H,8AH,18H,8BH,0F8H,48H,0F8H,30H,08H,00H,00H,0AAH FONT_h0: DB 'h',3FH,0FEH,3FH,0FEH,20H,40H,00H,20H,20H,20H,3FH,0E0H,3FH,0C0H,20H,00H,00H,00H,0AAH FONT_i0: DB 'i',20H,00H,20H,40H,3FH,0C6H,3FH,0E6H,20H,00H,00H,00H,0AAH FONT_i1: DB 237,20H,00H,20H,40H,3FH,0C8H,3FH,0E4H,20H,06H,00H,00H,0AAH FONT_i2: DB 236,00H,06H,20H,04H,20H,48H,3FH,0C0H,3FH,0F0H,20H,00H,00H,00H,0AAH FONT_i3: DB 230,20H,00H,20H,43H,3FH,0D3H,3FH,0EBH,20H,06H,00H,00H,0AAH FONT_i4: DB 243,20H,00H,20H,4CH,3FH,0C2H,3FH,0E6H,20H,0CH,00H,08H,00H,04H,00H,00H,0AAH FONT_i5: DB 242,20H,00H,20H,40H,0BFH,0C6H,0BFH,0E6H,20H,00H,00H,00H,0AAH FONT_j0: DB 'j',0C0H,00H,0C0H,00H,80H,10H,0FFH,0F3H,3FH,0FBH,00H,00H,0AAH FONT_k0: DB 'k',3FH,0FEH,3FH,0FEH,23H,00H,07H,80H,3EH,0A0H,3CH,60H,30H,20H,20H,20H,00H,00H,0AAH FONT_l0: DB 'l',20H,00H,3FH,0FEH,3FH,0FEH,20H,00H,00H,00H,0AAH FONT_m0: DB 'm',20H,00H,3FH,0E0H,3FH,0C0H,20H,40H,00H,20H,20H,20H,3FH,0E0H,3FH,0C0H,20H,40H,00H,20H,20H,20H,3FH,0E0H,3FH,0C0H,20H,00H,00H,00H,0AAH FONT_n0: DB 'n',20H,00H,3FH,0E0H,3FH,0E0H,20H,40H,00H,20H,20H,20H,3FH,0E0H,3FH,0C0H,20H,00H,00H,00H,0AAH FONT_o0: DB 'o',0FH,80H,1FH,0C0H,30H,60H,20H,20H,20H,20H,30H,60H,1FH,0C0H,0FH,80H,00H,00H,0AAH FONT_o1: DB 156,0FH,80H,1FH,0C0H,30H,60H,20H,20H,20H,28H,30H,64H,1FH,0C6H,0FH,82H,00H,00H,0AAH FONT_o2: DB 157,0FH,80H,1FH,0C0H,30H,60H,20H,22H,20H,26H,30H,64H,1FH,0C8H,0FH,80H,00H,00H,0AAH FONT_o3: DB 158,0FH,80H,1FH,0C0H,30H,63H,20H,2BH,20H,27H,30H,63H,1FH,0C0H,0FH,80H,00H,00H,0AAH FONT_o4: DB 159,0FH,80H,1FH,0C0H,30H,6CH,20H,22H,20H,26H,30H,6CH,1FH,0C8H,0FH,84H,00H,00H,0AAH FONT_o5: DB 160,0FH,80H,1FH,0C0H,30H,60H,0A0H,20H,0A0H,20H,30H,60H,1FH,0C0H,0FH,80H,00H,00H,0AAH FONT_o6: DB 161,0FH,80H,1FH,0C8H,30H,64H,20H,26H,20H,22H,30H,64H,1FH,0C8H,0FH,80H,00H,00H,0AAH FONT_o61: DB 162,0FH,80H,1FH,0C8H,30H,64H,20H,26H,20H,22H,30H,64H,1FH,0C8H,0FH,84H,00H,02H,00H,01H,00H,00H,0AAH FONT_o62: DB 163,0FH,80H,1FH,0C8H,30H,64H,20H,26H,20H,22H,30H,64H,1FH,0C9H,0FH,82H,00H,04H,00H,00H,0AAH FONT_o63: DB 164,0FH,80H,1FH,0C8H,30H,64H,20H,26H,20H,22H,30H,64H,1FH,0C8H,0FH,83H,00H,09H,00H,07H,00H,02H,00H,00H,0AAH FONT_o64: DB 165,0FH,80H,1FH,0C8H,30H,64H,20H,26H,20H,22H,30H,64H,1FH,0C8H,0FH,82H,00H,01H,00H,01H,00H,02H,00H,02H,00H,01H,00H,00H,0AAH FONT_o65: DB 166,0FH,80H,1FH,0C8H,30H,64H,0A0H,26H,0A0H,22H,30H,64H,1FH,0C8H,0FH,80H,00H,00H,0AAH FONT_o7: DB 31,0FH,80H,1FH,0C0H,30H,60H,20H,20H,20H,20H,30H,60H,1FH,0D8H,0FH,0B8H,00H,18H,00H,00H,0AAH FONT_o71: DB 167,0FH,80H,1FH,0C0H,30H,60H,20H,24H,20H,22H,30H,63H,1FH,0D9H,0FH,0B8H,00H,18H,00H,00H,0AAH FONT_o72: DB 168,0FH,80H,1FH,0C1H,30H,63H,20H,22H,20H,24H,30H,60H,1FH,0D8H,0FH,0B8H,00H,18H,00H,00H,0AAH FONT_o73: DB 169,0FH,80H,1FH,0C0H,30H,63H,20H,2BH,20H,27H,30H,63H,1FH,0D8H,0FH,0B8H,00H,18H,00H,00H,0AAH FONT_o74: DB 170,0FH,86H,1FH,0C1H,30H,63H,20H,26H,20H,20H,30H,62H,1FH,0D8H,0FH,0B8H,00H,18H,00H,00H,0AAH FONT_o75: DB 171,0FH,80H,1FH,0C0H,30H,60H,0A0H,20H,0A0H,20H,30H,60H,1FH,0D8H,0FH,0B8H,00H,18H,00H,00H,0AAH FONT_p0: DB 'p',80H,10H,0FFH,0F0H,0FFH,0F8H,88H,10H,88H,08H,08H,08H,0CH,18H,07H,0F0H,03H,0E0H,00H,00H,0AAH FONT_q0: DB 'q',07H,0C0H,0FH,0F0H,1CH,18H,18H,08H,88H,08H,88H,08H,0FFH,0F0H,0FFH,0F8H,00H,00H,0AAH FONT_r0: DB 'r',00H,40H,3FH,0C0H,3FH,0E0H,20H,40H,20H,20H,00H,60H,00H,00H,0AAH FONT_s0: DB 's',31H,0C0H,21H,0E0H,23H,20H,26H,20H,3CH,60H,1CH,00H,00H,00H,0AAH FONT_t0: DB 't',00H,20H,1FH,0E0H,3FH,0F8H,20H,20H,20H,20H,00H,00H,0AAH FONT_u0: DB 117,00H,20H,1FH,0E0H,3FH,0E0H,20H,00H,20H,00H,20H,00H,3FH,0E0H,3FH,0E0H,00H,00H,0AAH FONT_u1: DB 172,00H,20H,1FH,0E0H,3FH,0E0H,20H,00H,20H,08H,20H,04H,3FH,0E6H,3FH,0E2H,00H,00H,0AAH FONT_u2: DB 173,00H,20H,1FH,0E0H,3FH,0E0H,20H,02H,20H,06H,20H,04H,3FH,0E8H,3FH,0E0H,00H,00H,0AAH FONT_u3: DB 174,00H,20H,1FH,0E0H,3FH,0E0H,20H,00H,20H,03H,20H,0BH,3FH,0E7H,3FH,0E3H,00H,00H,0AAH FONT_u4: DB 175,00H,20H,1FH,0E0H,3FH,0ECH,20H,02H,20H,06H,20H,0cH,3FH,0E8H,3FH,0E4H,00H,00H,0AAH FONT_u5: DB 176,00H,20H,1FH,0E0H,3FH,0E0H,20H,00H,0A0H,00H,0A0H,00H,3FH,0E0H,3FH,0E0H,00H,00H,0AAH FONT_u7: DB 246,00H,20H,1FH,0E0H,3FH,0E0H,20H,00H,20H,00H,20H,00H,3FH,0E0H,3FH,0E0H,00H,78H,00H,38H,00H,00H,0AAH FONT_u71: DB 177,00H,20H,1FH,0E0H,3FH,0E0H,20H,00H,20H,08H,20H,04H,3FH,0E6H,3FH,0E2H,00H,78H,00H,38H,00H,00H,0AAH FONT_u72: DB 178,00H,20H,1FH,0E0H,3FH,0E0H,20H,02H,20H,06H,20H,04H,3FH,0E8H,3FH,0E0H,00H,78H,00H,38H,00H,00H,0AAH FONT_u73: DB 179,00H,20H,1FH,0E0H,3FH,0E0H,20H,00H,20H,03H,20H,0BH,3FH,0E7H,3FH,0E3H,00H,78H,00H,38H,00H,00H,0AAH FONT_u74: DB 180,00H,20H,1FH,0E0H,3FH,0ECH,20H,02H,20H,06H,20H,0CH,3FH,0E8H,3FH,0E4H,00H,78H,00H,38H,00H,00H,0AAH FONT_u75: DB 181,00H,20H,1FH,0E0H,3FH,0E0H,20H,00H,0A0H,00H,0A0H,00H,3FH,0E0H,3FH,0E0H,00H,78H,00H,38H,00H,00H,0AAH FONT_v0: DB 118,00H,20H,00H,60H,03H,0E0H,0FH,20H,38H,00H,0CH,00H,03H,80H,00H,60H,00H,00H,0AAH FONT_w0: DB 119,00H,20H,00H,0E0H,07H,0E0H,1FH,00H,3CH,20H,06H,60H,01H,0E0H,07H,0A0H,3FH,00H,1CH,00H,07H,00H,00H,0E0H,00H,20H,00H,00H,0AAH FONT_x0: DB 120,20H,20H,20H,60H,18H,0E0H,07H,0E0H,0FH,0A0H,1CH,80H,38H,60H,20H,20H,20H,00H,00H,00H,0AAH FONT_y0: DB 121,40H,10H,0C0H,30H,81H,0F0H,47H,0D0H,3FH,10H,0EH,00H,01H,0C0H,00H,70H,00H,10H,00H,00H,0AAH FONT_y1: DB 182,40H,10H,0C0H,30H,81H,0F0H,47H,0D0H,3FH,14H,0EH,02H,01H,0C3H,00H,71H,00H,10H,00H,00H,0AAH FONT_y2: DB 183,40H,10H,0C0H,30H,81H,0F0H,47H,0D1H,3FH,13H,0EH,02H,01H,0C4H,00H,70H,00H,10H,00H,00H,0AAH FONT_y3: DB 184,40H,10H,0C0H,30H,81H,0F0H,47H,0D0H,3FH,10H,0EH,03H,01H,0CBH,00H,77H,00H,13H,00H,00H,0AAH FONT_y4: DB 185,40H,10H,0C0H,30H,81H,0F0H,47H,0D6H,3FH,11H,0EH,03H,01H,0C6H,00H,74H,00H,12H,00H,00H,0AAH FONT_y5: DB 238,40H,10H,0C0H,30H,81H,0F0H,47H,0D0H,3FH,10H,8EH,00H,81H,0C0H,00H,70H,00H,10H,00H,00H,0AAH FONT_z0: DB 122,30H,00H,38H,20H,3CH,20H,2FH,20H,23H,0A0H,21H,0E0H,20H,60H,38H,20H,00H,00H,0AAH FONT_0: DB '0',07H,0E0H,1FH,0F8H,30H,0CH,20H,04H,20H,04H,30H,0CH,1FH,0F8H,07H,0E0H,00H,00H,0AAH FONT_1: DB '1',20H,10H,20H,08H,3FH,0F8H,3FH,0FCH,20H,00H,20H,00H,00H,00H,0AAH FONT_2: DB '2',20H,00H,30H,10H,38H,08H,24H,0CH,23H,1CH,21H,0FCH,20H,78H,10H,00H,00H,00H,0AAH FONT_3: DB '3',18H,10H,38H,08H,30H,04H,20H,0C4H,20H,0FCH,11H,0FCH,1FH,0B8H,07H,00H,00H,00H,0AAH FONT_4: DB '4',0EH,00H,0DH,00H,0CH,0C0H,0CH,60H,0CH,18H,3FH,0FCH,3FH,0FCH,0CH,00H,00H,00H,0AAH FONT_5: DB '5',10H,00H,38H,0F0H,30H,0ECH,20H,0ECH,21H,0ECH,23H,0CCH,1FH,0CCH,0FH,84H,00H,00H,0AAH FONT_6: DB '6',0FH,0C0H,1FH,0E0H,31H,70H,20H,98H,20H,88H,21H,84H,1FH,04H,0EH,04H,00H,00H,0AAH FONT_7: DB '7',00H,10H,00H,0CH,20H,0CH,3CH,0CH,1FH,8CH,03H,0FCH,00H,7CH,00H,0CH,00H,00H,0AAH FONT_8: DB '8',1CH,00H,1EH,78H,23H,0FCH,21H,0C4H,23H,84H,3FH,0FCH,1FH,38H,0EH,00H,00H,00H,0AAH FONT_9: DB '9',00H,70H,20H,0F8H,21H,84H,11H,04H,19H,04H,0DH,0CH,07H,0F8H,03H,0F0H,00H,00H,0AAH FONT_CHAM_THAN: DB '!',39H,0FCH,38H,7CH,00H,00H,0AAH FONT_VA: DB '&',1EH,00H,3FH,00H,38H,0B8H,30H,0FCH,21H,0C4H,27H,0C4H,2FH,4CH,1EH,3CH,3CH,18H,36H,00H,21H,80H,20H,00H,00H,00H,0AAH FONT_PHAN_TRAM: DB 37,00H,0F0H,01H,0F8H,01H,1CH,61H,04H,18H,0C4H,06H,78H,01H,88H,1CH,68H,3EH,18H,27H,04H,21H,00H,11H,00H,0EH,00H,00H,00H,0AAH FONT_MO_NGOAC_TRON: DB '(',03H,0F0H,0FH,0FCH,30H,06H,40H,01H,00H,00H,0AAH FONT_DONG_NGOAC_TRON: DB ')',40H,00H,40H,01H,30H,06H,0FH,0FCH,03H,0F0H,00H,00H,0AAH FONT_TRU: DB '-',06H,00H,06H,00H,06H,00H,06H,00H,00H,00H,0AAH FONT_CONG: DB '+',06H,00H,06H,00H,06H,00H,06H,00H,3FH,0C0H,3FH,0C0H,06H,00H,06H,00H,06H,00H,06H,00H,00H,00H,0AAH FONT_CHIA: DB '/',20H,00H,3CH,00H,1FH,80H,01H,0F0H,00H,3CH,00H,00H,0AAH FONT_DAU_CHAM: DB '.',30H,00H,30H,00H,00H,00H,0AAH FONT_DAU_PHAY: DB ',',0B8H,00H,78H,00H,78H,00H,00H,00H,0AAH FONT_DAU_HOI: DB '?',00H,38H,00H,3CH,38H,04H,3BH,04H,38H,8CH,00H,0FCH,00H,78H,00H,00H,0AAH FONT_DAU_HAI_CHAM: DB ':',39H,0C0H,39H,0C0H,00H,00H,0AAH FONT_DAU_CHAM_PHAY: DB ';',9CH,0E0H,7CH,0E0H,3CH,00H,00H,00H,0AAH FONT_MO_NGOAC_NHON: DB '{',00H,80H,00H,80H,3FH,7EH,7FH,7FH,40H,01H,00H,00H,0AAH FONT_DONG_NGOAC_NHON: DB '}',40H,01H,7FH,7FH,3FH,7EH,00H,80H,00H,80H,00H,00H,0AAH FONT_MO_NGOAC_VUONG: DB '[',7FH,0FFH,7FH,0FFH,40H,01H,40H,01H,00H,00H,0AAH FONT_DONG_NGOAC_VUONG: DB ']',40H,01H,40H,01H,7FH,0FFH,7FH,0FFH,00H,00H,0AAH FONT_NHAN: DB '*',0DH,00H,0DH,00H,06H,00H,1FH,0C0H,06H,00H,0FH,00H,09H,00H,00H,00H,0AAH END Phần mềm của Slave: S_DATA EQU 20H ROW EQU 2FH ;THANH GHI CHUA DU LIEU CHON HANG KHI QUET COLOUR EQU 2EH ;CHUA GIA TRI MAU HIEN THI ADD_X EQU 2DH ;DIA CHI HIEN THI CUA MAU XANH ADD_D EQU 2CH ;DIA CHI HIEN THI CUA MAU DO E_LOAD BIT 09H ;BIT CHO PHEP LOAD DATA BITC BIT 0AH ;LUU GIA TRI CUA CO NHO CARRY ORG 0000H LJMP PROGRAM ORG 000BH LJMP T0ISR ORG 0023H LJMP SERIAL ;NGAT NOI TIEP ORG 0030H ;------------------------------------------------------------------***--------------------------------------------------------------------- PROGRAM: MOV R0,#30H ;NAP GIA TRI BAN DAU DE HIEN THI MOV R1,#40 LOOP_NAP: MOV @R0,#55H INC R0 MOV @R0,#0AAH INC R0 DJNZ R1,LOOP_NAP MOV TMOD,#21H ;T0 CHE DO 16,T1 AUTORELOAD MOV A,87H SETB ACC.7 MOV 87H,A ;TANG TOC DO BAUD GAP DOI MOV TH1,#-6 MOV TL1,#-6 SETB TR1 ;TAO TOC DO BAUD 9600 MOV SCON,#60H SETB REN MOV IE,#90H ;CHO NGAT NOI TIEP HOAT DONG SETB PS ;UU TIEN NGAT CHO PORT NOI TIEP MOV P1,#0FFH ;TAT TOAN BO LED MOV P2,#00H CLR P3.4 CLR P3.5 ;KHONG CHO CHOT CAC COT SETB E_LOAD ;KHONG DICH COT MOV COLOUR,#'X' ;BAN DAU HIEN THI MAU XANH MOV ADD_X,#30H ;DIA CHI BAT DAU CUA MAU XANH MOV ADD_D,#58H ;DIA CHI BAT DAU CUA MAU DO MOV ROW,#7FH ;CHON HANG DAU TIEN MOV R6,#50 MOV R5,#0 ;BAO CHUA THU DUOC DU LIEU NAO SETB ET0 SETB TF0 ;TAO NGAT DAU TIEN WAIT: JB E_LOAD,WAIT ;NHAY NEU KHONG CO LOAD DATA LCALL LOAD_DATA ;NEU CHO PHEP THI LOAD DATA SETB E_LOAD ;CHI LOAD MOT LAN LJMP WAIT ;-----------------------------***CHUONG TRINH CON LOAD DU LIEU KHI NHAN TU MAIN***--------------------- LOAD_DATA: PUSH ACC ;CAT TAM ACC PUSH 00H MOV R0,#7FH ;LUU DIA CHI BYTE CUOI CUNG VAO R0 MOV R3,#1 ;DEM 5 LAN DE NAP GIA TRI 0 SETB BITC ;XOA CO C LOOP_DATA: MOV A,@R0 ;LUU DIA CHI TRO BOI R0 VAO A DJNZ R3,BIT_0 ;SAU 5 LAN NAP GIA TRI 0 MOV R3,#5 ;NAP TRO LAI SETB BITC ;XOA BIT C BIT_0: MOV C,BITC ;DUA GIA TRI BIT NHO TAM VAO CARRY RRC A ;QUAY PHAI VOI CO CARRY MOV BITC,C ;LUU LAI GIA TRI CO C MOV @R0,A ;LUU TRO LAI VAO BO NHO DEC R0 ;GIAM R0 TRO DEN DIA CHI KE TIEP CJNE R0,#2FH,LOOP_DATA ;NEU CHUA PHAI LA CUOI CUNG THI TIEP TUC MOV A,COLOUR ;DUA BYTE MAU VAO A DE KIEM TRA CHECK_GREEN: CJNE A,#'X',EXIT_CHECK_GREEN ;NEU KHONG LA XANH THI NHAY LJMP CONT_CHECK_GREEN EXIT_CHECK_GREEN: LJMP CHECK_RED CONT_CHECK_GREEN: MOV A,34H ;NAP BYTE CUOI CUA MAU XANH VAO A MOV C,07H ;LAY BIT MAU 7 MOV ACC.7,C ;LUU TRO LAI BO NHO MOV 34H,A ;------------------------------------------------------------------***--------------------------------------------------------------------- MOV A,39H ;NAP BYTE CUOI CUA MAU XANH VAO A MOV C,06H ;LAY BIT MAU 6 MOV ACC.7,C ;LUU TRO LAI BO NHO MOV 39H,A ;----------------------------- MOV A,3EH ;NAP BYTE CUOI CUA MAU XANH VAO A MOV C,05H ;LAY BIT MAU 5 MOV ACC.7,C ;LUU TRO LAI BO NHO MOV 3EH,A ;----------------------------- MOV A,43H ;NAP BYTE CUOI CUA MAU XANH VAO A MOV C,04H ;LAY BIT MAU 4 MOV ACC.7,C ;LUU TRO LAI BO NHO MOV 43H,A ;----------------------------- MOV A,48H ;NAP BYTE CUOI CUA MAU XANH VAO A MOV C,03H ;LAY BIT MAU 3 MOV ACC.7,C ;LUU TRO LAI BO NHO MOV 48H,A ;----------------------------- MOV A,4DH ;NAP BYTE CUOI CUA MAU XANH VAO A MOV C,02H ;LAY BIT MAU 2 MOV ACC.7,C ;LUU TRO LAI BO NHO MOV 4DH,A ;----------------------------- MOV A,52H ;NAP BYTE CUOI CUA MAU XANH VAO A MOV C,01H ;LAY BIT MAU 1 MOV ACC.7,C ;LUU TRO LAI BO NHO MOV 52H,A ;----------------------------- MOV A,57H ;NAP BYTE CUOI CUA MAU XANH VAO A MOV C,00H ;LAY BIT MAU 0 MOV ACC.7,C ;LUU TRO LAI BO NHO MOV 57H,A ;----------------------------- MOV A,5CH ;NAP BYTE CUOI CUA MAU XANH VAO A ORL A,#80H ;BO BIT CUOI MOV 5CH,A ;----------------------------- MOV A,61H ;NAP BYTE CUOI CUA MAU XANH VAO A ORL A,#80H ;BO BIT CUOI MOV 61H,A ;----------------------------- MOV A,66H ;NAP BYTE CUOI CUA MAU XANH VAO A ORL A,#80H ;BO BIT CUOI MOV 66H,A ;----------------------------- MOV A,6BH ;NAP BYTE CUOI CUA MAU XANH VAO A ORL A,#80H ;BO BIT CUOI MOV 6BH,A ;----------------------------- MOV A,70H ;NAP BYTE CUOI CUA MAU XANH VAO A ORL A,#80H ;BO BIT CUOI MOV 70H,A ;----------------------------- MOV A,75H ;NAP BYTE CUOI CUA MAU XANH VAO A ORL A,#80H ;BO BIT CUOI MOV 75H,A ;----------------------------- MOV A,7AH ;NAP BYTE CUOI CUA MAU XANH VAO A ORL A,#80H ;BO BIT CUOI MOV 7AH,A ;----------------------------- MOV A,7FH ;NAP BYTE CUOI CUA MAU XANH VAO A ORL A,#80H ;BO BIT CUOI MOV 7FH,A LJMP EXIT_CHECK_DATA ;------------------------------------------------------------------***--------------------------------------------------------------------- CHECK_RED: CJNE A,#'D',EXIT_CHECK_RED ;NEU KHONG LA DO THI NHAY LJMP CONT_CHECK_RED EXIT_CHECK_RED: LJMP CHECK_YELLOW CONT_CHECK_RED: MOV A,34H ;NAP BYTE CUOI CUA MAU DO VAO A ORL A,#80H MOV 34H,A ;----------------------------- MOV A,39H ORL A,#80H MOV 39H,A ;----------------------------- MOV A,3EH ORL A,#80H MOV 3EH,A ;----------------------------- MOV A,43H ORL A,#80H MOV 43H,A ;----------------------------- MOV A,48H ORL A,#80H MOV 48H,A ;----------------------------- MOV A,4DH ORL A,#80H MOV 4DH,A ;----------------------------- MOV A,52H ORL A,#80H MOV 52H,A ;----------------------------- MOV A,57H ORL A,#80H MOV 57H,A ;----------------------------- MOV A,5CH ;NAP BYTE CUOI CUA MAU DO VAO A MOV C,07H ;LAY BIT MAU 7 MOV ACC.7,C ;LUU TRO LAI BO NHO MOV 5CH,A ;----------------------------- MOV A,61H MOV C,06H MOV ACC.7,C ;LUU TRO LAI BO NHO MOV 61H,A ;----------------------------- MOV A,66H MOV C,05H MOV ACC.7,C MOV 66H,A ;----------------------------- MOV A,6BH MOV C,04H MOV ACC.7,C MOV 6BH,A ;----------------------------- MOV A,70H MOV C,03H MOV ACC.7,C MOV 70H,A ;----------------------------- MOV A,75H MOV C,02H MOV ACC.7,C MOV 75H,A ;----------------------------- MOV A,7AH MOV C,01H MOV ACC.7,C MOV 7AH,A ;----------------------------- MOV A,7FH MOV C,00H MOV ACC.7,C MOV 7FH,A LJMP EXIT_CHECK_DATA ;------------------------------------------------------------------***--------------------------------------------------------------------- CHECK_YELLOW: CJNE A,#'V',EXIT_CHECK_YELLOW ;NEU KHONG LA VANG THI NHAY LJMP CONT_CHECK_YELLOW EXIT_CHECK_YELLOW: LJMP EXIT_CHECK_DATA CONT_CHECK_YELLOW: MOV A,34H MOV C,07H MOV ACC.7,C MOV 34H,A ;----------------------------- MOV A,39H MOV C,06H MOV ACC.7,C MOV 39H,A ;----------------------------- MOV A,3EH MOV C,05H MOV ACC.7,C MOV 3EH,A ;----------------------------- MOV A,43H MOV C,04H MOV ACC.7,C MOV 43H,A ;----------------------------- MOV A,48H MOV C,03H MOV ACC.7,C MOV 48H,A ;----------------------------- MOV A,4DH MOV C,02H MOV ACC.7,C MOV 4DH,A ;----------------------------- MOV A,52H MOV C,01H MOV ACC.7,C MOV 52H,A ;----------------------------- MOV A,57H MOV C,00H MOV ACC.7,C MOV 57H,A ;----------------------------- MOV A,5CH MOV C,07H MOV ACC.7,C MOV 5CH,A ;----------------------------- MOV A,61H MOV C,06H MOV ACC.7,C MOV 61H,A ;----------------------------- MOV A,66H MOV C,05H MOV ACC.7,C MOV 66H,A ;----------------------------- MOV A,6BH MOV C,04H MOV ACC.7,C MOV 6BH,A ;----------------------------- MOV A,70H MOV C,03H MOV ACC.7,C MOV 70H,A ;----------------------------- MOV A,75H MOV C,02H MOV ACC.7,C MOV 75H,A ;----------------------------- MOV A,7AH MOV C,01H MOV ACC.7,C MOV 7AH,A ;----------------------------- MOV A,7FH MOV C,00H MOV ACC.7,C MOV 7FH,A EXIT_CHECK_DATA: POP 00H POP ACC RET ;------------------------------------------------------------------***--------------------------------------------------------------------- T0ISR: PUSH ACC CLR TR0 MOV TL0,#0CH ;CHUONG TRINH NGAT T0 LAM NHIEM VU HIEN THI DATA MOV TH0,#0FEH ; -500 THOI GIAN DELAY CHUYEN HANG SETB TR0 ;CHO TR0 TIEP TUC CHAY LCALL DISPLAY ;GOI CHUONG TRINH HIEN THI POP ACC RETI ;------------------------------------------------------------------***--------------------------------------------------------------------- DISPLAY: MOV P1,#0FFH ;TAT TAT CA MOV R1,ADD_X ;NAP DIA CHI MAU XANH MOV P0,#0FFH MOV A,@R1 ;DUA GIA TRI BYTE 1 CUA HANG RA PORT CPL A MOV P0,A SETB P2.0 ;CHOT LAI DU LIEU CLR P2.0 ;KHONG CHO CHOT NUA INC R1 MOV P0,#0FFH MOV A,@R1 ;DUA GIA TRI BYTE 2 CUA HANG RA PORT CPL A MOV P0,A SETB P2.1 CLR P2.1 ;KHONG CHO CHOT NUA INC R1 MOV P0,#0FFH MOV A,@R1 ;DUA GIA TRI BYTE 3 CUA HANG RA PORT CPL A MOV P0,A SETB P2.2 CLR P2.2 ;KHONG CHO CHOT NUA INC R1 MOV P0,#0FFH MOV A,@R1 ;DUA GIA TRI BYTE 4 CUA HANG RA PORT CPL A MOV P0,A SETB P2.3 CLR P2.3 ;KHONG CHO CHOT NUA INC R1 MOV P0,#0FFH MOV A,@R1 ;DUA GIA TRI BYTE 5 CUA HANG RA PORT CPL A MOV P0,A SETB P2.4 CLR P2.4 ;KHONG CHO CHOT NUA INC R1 MOV ADD_X,R1 ;LUU CHO LAN SAU MOV R1,ADD_D ;LAY DIA CHI CUA MAU DO MOV P0,#0FFH MOV A,@R1 ;DUA GIA TRI BYTE 1 CUA HANG RA PORT CPL A MOV P0,A SETB P2.5 CLR P2.5 INC R1 MOV P0,#0FFH MOV A,@R1 ;DUA GIA TRI BYTE 2 CUA HANG RA PORT CPL A MOV P0,A SETB P2.6 CLR P2.6 INC R1 MOV P0,#0FFH MOV A,@R1 ;DUA GIA TRI BYTE 3 CUA HANG RA PORT CPL A MOV P0,A SETB P2.7 CLR P2.7 INC R1 MOV P0,#0FFH MOV A,@R1 ;DUA GIA TRI BYTE 4 CUA HANG RA PORT CPL A MOV P0,A SETB P3.4 CLR P3.4 INC R1 MOV P0,#0FFH MOV A,@R1 ;DUA GIA TRI BYTE 5 CUA HANG RA PORT CPL A MOV P0,A SETB P3.5 CLR P3.5 INC R1 MOV ADD_D,R1 ;LUU DIA CHI MAU DO TRO LAI MOV P1,ROW ;CHO HIEN THI TRO LAI MOV A,ROW ;DUA CHON COT VAO A RR A ;QUAY TRAI A MOV ROW,A ;LUU TRO LAI CHON COT JB ACC.7,RESET_DIS MOV ADD_X,#30H ;DIA CHI BAT DAU CUA MAU XANH MOV ADD_D,#58H ;DIA CHI BAT DAU CUA MAU DO RESET_DIS: RET ;------------------------------------------------------------------***--------------------------------------------------------------------- SERIAL: PUSH ACC ;CAT TAM ACC CLR RI ;XOA CO THU CJNE R5,#0,CHECK_COLOUR ;NEU KHONG PHAI LA R5 = 0 THI KIEM TRA MAU MOV A,SBUF ;DOC DU LIEU THU DUOC CJNE A,#1DH,EXIT_SERIAL ;NEU KHAC THI THOAT MOV R5,#1 ;NAP R5 = 1 LJMP EXIT_SERIAL ;THOAT CHECK_COLOUR: CJNE R5,#1,CHECK_DATA ;KIEM TRA XEM R5 = 1 KHONG MOV COLOUR,SBUF ;NAP MAU HIEN THI MOV R5,#2 ;BAO THU DU LIEU LJMP EXIT_SERIAL ;THOAT CHECK_DATA: CJNE R5,#2,SHIFT_DATA MOV S_DATA,SBUF MOV R5,#3 ;CHO PHEP DICH DATA LJMP EXIT_SERIAL SHIFT_DATA: CJNE R5,#3,SHIFT_DATA MOV A,SBUF CJNE A,#5FH,EXIT_SERIAL CLR E_LOAD ;CHO PHEP LOAD DATA MOV R5,#0 ;RESET TRANG THAI EXIT_SERIAL: POP ACC RETI END ._.

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

  • docQUANG BAO GIAO TIEP MAY TINH.doc
  • docSO DO MACH.doc