Đề tài Điều khiển và giám sát toà nhà bằng vi xử lý 89c51

Khi nút Reset được nhấn thì chương trình sẽ nhảy đến địa chỉ 0000h. Khởi động các thanh ghi điều khiển và các ô nhớ cần thiết. Trong chương trình chính gồm có:

• Kích khởi ADC 0809 chuyển đổi.

• Delay chờ ADC đổi xong.

• Đọc dữ liệu từ ADC về, xử lí và hiển thị lên LED 7 đoạn.

• Kiểm tra tiếp trạng thái các thiết bị.

• Kiểm tra các nút nhấn có được nhấn hay không. Khi đã thực hiện xong chu trình trên thì vi xử lí sẽ quay trở lai kích khởi ADC đổi lần tiếp theo.

• Kiểm tra xem nhiệt độ trong phòng đang nằm trong tầm nào để gọi các chương trình con phục vụ tương ứng:

• 500C£nhiệt độ £ 800C: gọi chương trình con CHUONG1.

• 800C £nhiệt độ £ 1000C: gọi chương trình con CHUONG2.

• Nhiệt độ ³ 1000C: gọi chương trình con CHUONG3.

• Cấm ngắt truyền, chỉ cho phép vi xử lí nhận, chỉ được phép truyền khi PC yêu cầu

 

doc110 trang | Chia sẻ: oanh_nt | Ngày: 08/07/2013 | Lượt xem: 1367 | Lượt tải: 6download
Bạn đang xem nội dung tài liệu Đề tài Điều khiển và giám sát toà nhà bằng vi xử lý 89c51, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
nhấn thì chương trình sẽ nhảy đến địa chỉ 0000h. Khởi động các thanh ghi điều khiển và các ô nhớ cần thiết. Trong chương trình chính gồm có: · Kích khởi ADC 0809 chuyển đổi. · Delay chờ ADC đổi xong. · Đọc dữ liệu từ ADC về, xử lí và hiển thị lên LED 7 đoạn. · Kiểm tra tiếp trạng thái các thiết bị. · Kiểm tra các nút nhấn có được nhấn hay không. Khi đã thực hiện xong chu trình trên thì vi xử lí sẽ quay trở lai kích khởi ADC đổi lần tiếp theo. · Kiểm tra xem nhiệt độ trong phòng đang nằm trong tầm nào để gọi các chương trình con phục vụ tương ứng: 500C£nhiệt độ £ 800C: gọi chương trình con CHUONG1. 800C £nhiệt độ £ 1000C: gọi chương trình con CHUONG2. Nhiệt độ ³ 1000C: gọi chương trình con CHUONG3. · Cấm ngắt truyền, chỉ cho phép vi xử lí nhận, chỉ được phép truyền khi PC yêu cầu MAIN Cho phép đổi AD Đọc giátrị từ AD Hiển thị nhiệt độ So sánh với các nhiệt độ chuẩn Có yêu cầu Bật tắt các thiết bị Có trộm Người vào ra Người vào Người ra Số người=1 Số người =0 Chuông kêu Bật tắt các thiết bị 2 1 3 Giao tiếp Đúng địa chỉ Bật tắt các thiết bị 1 2 3 Nhận lệnh Truyền dữ liệu Bật tắt các thiết bị MAIN Lưu đồ giải thuật chương trình chính Gọi Chuong3 Tắt nguồn So sánh Cất dữ liệu từ ADC 0809 vào thanh ghi A A³ 100 80 <A <100 50< A<80 Gọi Chuong2 Gọi Chuong1 Ret Y Y Y N N N Lưu đồ giải thuật chương trình con So Sánh. Kiểm tra nút nhấn P2.7=0 P1.7=0 Gọi chương trình con Request Ret Y N Lưu đồ giải thuật chương trình con kiểm tra nút nhấn. Chương trình này dùng để cho phép người dùng có thể yêu cầu tắt mở các thiết bị theo ý muốn. Giải thích: P2.7 =0: nghĩa là nút yêu cầu tắt quạt được nhấn. Lúc này vi xử lí sẽ kiểm tra tín hiệu hồi tiếp từ quạt về- chân P1.3 của Port1. P1.3=1: quạt đang ở trạng thái đóng, yêu cầu vi xử lí thực hiện việc kích ngắt quạt. P1.3=0: quạt đang ở trạng thái ngắt, yêu cầu vi xử lí thực hiện việc kích ngắt quạt. P1.7=0 : nghĩa là nút yêu cầu tắt mở đèn được nhấn. Lúc này vi xử lí kiểm tra tín hiệu hồi tiếp về từ đèn- chân P3.5 của Port3. P3.5=1: đèn đang đóng, yêu cầu vi xử lí tắt đèn P3.5=0: đèn đang tắt, yêu cầu vi xử lí kích đóng đèn. Request P2.7=0 P1.7=0 P3.5=0 P3.5=0 Lặp=0 P1.3=0 P2.7=00 Lặp=50 Giảm lặp Set cờ yêu cầu Tắt quạt Mở quạt Lặp =50 Giảm lặp Lặp=0 Set cờ yêu cầu Tắt đèn Mở đèn Ret Y N Y Y Y Y N N N N N Ret Lưu đồ giải thuật chương trình con Request Chương trình phần mềm sẽ mặc định số người trong phòng khi reset chương trình là 1 người. Ta cũng dễ dàng thay đổi số người mặc định bằng cách thay đổi chương trình phần mềm. Chính vì mặc định là số người trong phòng lớn hơn 1, nên khi reset thì vi xử lí sẽ kích đóng các thiết bị ngay . Vi xử lí sẽ hoạt đông theo chương trình một cách hoàn hảo khi ta không tác động yêu cầu từ bên ngoài. Có thể giải thích rõ ràng hơn điều này như sau: Đầu tiên chương trình sẽ thực hiên việc đóng các thiết bị trong chu kỳ chạy đầu tiên. Giả sử người trong phòng muốn tắt đèn, thì người ta sẽ nhấn nút yêu cầu tắt đèn, khi đó vi xử lí sẽ ra lệnh kích ngắt đèn. Tín hiệu hồi tiếp về từ đèn là mức thấp, vi xử lí sẽ hiểu là đèn đang ở trạng thái ngắt. Đến chu trình quét tiếp theo, vi xử lí sẽ lại kiểm tra ô nhớ 30H- ô nhớ lưu số người trong phòng- và nhận thấy số ngươi trong phòng lớn hơn 1 nhưng đèn lại tắt, nó lại ra lệnh kích đóng đèn trở lại. Điều này sẽ dẫn đến việc ta không thể có thể thiệp đóng ngắt các thiết bị theo ý muốn. Để tránh được điều này, ta dùng một ô nhớ trong vùng RAM của 8951 làm cờ yêu cầu. Khi có nút yêu cầu đóng ngắt thiết bị nào được nhấn thì cờ yêu cầu này sẽ được set để đánh dấu cho vi xử lí biết là đến chu trình chạy kế tiếp nó sẽ không cần kích đóng các thiết bị trong phòng mặc dù thiết bị đang ngắt cũng như trong phòng đang có người. Giải thuật chương trình phát hiện người vào ra phòng: Để thực hiện chức năng này ta dùng ngắt ngoài 1 của vi xử lý. Khi có người đi qua thì cảm biến quang sẽ tác động, gây ra một ngắt trong chương trình vi xử lý . Dựa vào cảm biến quang nào tác động trước thì ta sẽ biết người vào hay ra. Đây là chương trình con mô phỏng cảm biến quang dùng để đếm số người trong phòng và dựa theo số người hiện tại trong phòng là bao nhiêu người mà vi xử lí sẽ gọi chương trình con phục vụ tương ứng. Chương trình này dùng 3 cờ để nhận biết trạng thái cảm biến quang nào tác động trước, cảm biến nào tác sau. LED phát LED thu Đi vào P1.0 Cảm biến quang 1 LED phát LED thu Đi ra Cảm biến quang 2 P1.1 Sơ đồ khối trên cho thấy cách hoạt động của hai cảm biến quang đếm người. Tín hiệu ra từ hai cảm biến quang này được đưa vào chân P1.0 và P1.1 của vi xử lí 89C51. khi một trong hai cảm biến quang này tác động thì nó sẽ gây ra một ngắt ngoài. Lí do để dùng ngắt ngoài là giúp cho vi xử lí hoạt động một cách chính xác khi có người vào hay ra. Ta đưa hai tín hiệu ở ngõ ra của hai cảm biến quang này đi qua một mạch logic AND. Chỉ cần một cảm biến tác động thì tín hiệu ra của mạch AND sẽ ở mức 0. Khi ngắt ngoài một1 xảy ra thì ta không thể biết được cảm biến quang nào tác động trước, cảm biến quang naào tác động sau. Thứ tự tác của hai cảm biến trên sẽ cho ta biết là người đó đi ra hay đi vào. Cảm biến quang 1 Cảm biến quang 2 Trạng thái vi xử lí hiểu Trước Sau Người vào Sau Trước Người ra Trước Không tác động Giữ nguyên số đếm Không tác động Trước Giữ nguyên số đếm Bảng mô tả hoạt động của hai cảm biến quang phát hiện người. Ta cần dùng đến 3 cờ để xác định thứ tự tác động của các cảm biến quang. Các cờ này được đặt tên như sau: Cờ 1: địa chỉ ô nhớ là 2BH Cờ 2: địa chỉ ô nhớ là 2CH Cờ 3: địa chỉ ô nhớ là 2DH Cả 3 cờ này dùng để đánh dấu chân nào của vi xử lí được quét trước, chân nào chưa được quét. Nguyên nhân, do ta cần kiểm tra một lúc cả hai chân của vi xử lí –P1.0 và P1.1 để phát hiện chân nào xuống mức 0 trước, mà vi xử lí thì chỉ có thể kiểm tra từ trên xuống. Khi vi xử lí nhảy đến chương trình phục vụ ngắt này nó sẽ kiểm tra chân P1.0 đầu tiên, nếu chân này ở mức 1 nghĩa là cảm biến quang thứ 2 tác động trước. Sau đó vi xử lí sẽ nhảy xuống kiêm tra chân P1.1 và lại nhạy lên kiểm tra chân P0.0 lần nữa. Các cờ này còn được dùng để tránh cho các cảm biến quang tác động sai do nhiễu. Giả sử xảy ra trường hợp chỉ có một trong hai cảm biến quang tác động thì chương trình sẽ dựa vào trạng thái các cờ này mà thoát khỏi chương trình phục vụ ngắt để quay về chương trình chính. Đếm người P1.0=0 P1.1=0 Cờ 1=1 Cờ 3=1 P1.0=0 Lặp=0 Lặp 50 Giảm lặp Xóa cờ 2 Lặp=50 Set cờ 2 Người ra Thoát N Y Y Y Y Y Y N N N N N N 1 2 N Giảm lặp 1 Lặp=0 P1.1=0 Cờ 2=1 Cờ 3=1 Set cờ 3 Thoát Người vào 2 Y Y Y Y N N N Lưu đồ giải thuật chương trình con phục vụ ngắt ngoài 1 Do dùng mạch logic AND, nên khi ngắt ngoài xảy ra thì chắc chắn phải có người vào hay ra , nhưng khi kiểm tra cả 2 chân P1.0 và P1.1 thì phát hiện ra chỉ có một chân tác động: vi xử lí sẽ vẫn giữ nguyên số đếm và thoát khỏi chương trình phục vụ ngắt. Chương trình con Người ra, Người vào: Chương trình con Người vào: sẽ tăng số người trong ô nhớ. Dựa vào trạng thái của cờ yêu cầu trong chương trình con Request mà chương trình sẽ thi hành hnư sau: Khi cờ yêu cầu được set: dù cho số người trong phòng có tăng lên nhưng cũng không gọi chương trình con đóng ngắt thiết bị. Nghĩa là sẽ là dành phần đóng ngắt thiết bị là do người dùng điều khiển theo ý muốn. Chỉ khi nào reset thì cờ yêu cầu mới được xóa, lúc đó nếu số người trong phòng lớn hơn 1 thì vi xử lí sẽ gọi chương trình con đóng các thiết bị. Khi cờ yêu cầu =0: lúc này nếu có người vào và số người trong phòng lớn hơn 0 thì vi xử lí sẽ gọi chương trình con đóng thiết bị ( chỉ gọi chương trình con đóng thiết bị khi thiết bị đang ngắt, thiết bị đang đóng thì không làm gì cả) Chương trình con Người ra : giảm số người trong phòng. Tùy theo số người trong phòng là bao nhiêu và trạng thái của cờ yêu cầu mà vi xử lí có gọi chương trình con Tắt thiết bị hay không. Số người trong phòng bé hơn 1 ( hay bằng 0 ): thì dù cho cờ yêu cầu có được set hay không thì cũng gọi chương trình con tắt thiết bị. Số người trong phòng lớn hơn hay bằng 1 nó sẽ vẫn để nguyên trạng thái thiết bị không phụ thuộc vào trạng thái của cờ yêu cầu. Lưu đồ giải thuật chi tiết như sau: Mở quạt Mở đèn Người vào Xóa cờ 1, cờ 2, cờ 3 Tăng biến đếm Biến đếm =1 P3.5=1 P1.3=1 Cất biến đếm vào ô nhớ 30h Ret Y N Y Y N N Tắt quạt Tắt đèn Người ra Xóa cờ 1, cờ 2, cờ 3 Giảm biến đếm Biến đếm <1 P3.5=0 P1.3=0 Cất biến đếm vào ô nhớ 30h Ret Y N Y Y N N Lưu đồ giải thuật chương trình con Người ra 4 . Chương trình con phát hiện người vào không qua cửa chính: Cảm biến quang chống trộm Dùng ô nhớ 31h để lưu trữ trạng thái của cảm biến quang này. Nếu ở trạng thái bình thường thì tín hiệu ra của nó sẽ ở mức 1(+5v) , khi tín hiệu ra của nó là mức 0 thì chương trình con này sẽ được gọi. Nhiệm vụ của chương trình con này là tạo tín hiệu cảnh báo bằng chuông, đặt ô nhớ 31h =1. Dữ liệu trong ô nhớ này được gởi về máy tính, tùy theo giá trị trong ô nhớ này mà máy tính sẽ phát tín hiệu cảnh báo lên màn hình. 31h=0: bình thường, không có gì xảy ra cho cảm biến quang này. 31h=1: có vật che chắn ngang vùng được bảo vệ, cần có biện pháp ngăn chặn. Chuông 3: gọi chương trình con cho phép chuông kêu 3 hồi, mỗi hồi kéo dài trong 3 giây và giữa 2 lần liên tiếp cách nhau 1 giây. Ngắt ngoài 0 31h¬1 Chuong 3 31h¬0 Ret Lưu đồ giải thuật chương trình con ngắt ngoài 0 Giá trị trong ô nhớ 31h sẽ được đặt trở về 0 sau khi đã được gởi về máy tính. 5. Các chương trình con Chuong 1, Chuong 2,Chuong 3: Chuong 1 được gọi khi nhiệt độ đo được nằm trong tầm từ 500C đến 800C. Chuong 2 được gọi khi nhiệt độ đo được nằm trong tầm từ 800C đến 1000C. Chuong 3 được gọi khi nhiệt độ đo được lớn hơn 1000C. Chuong 1 Set bit P1.6 R05 DELAY1S Giảm R0 Xóa P1.6 R0=0 Ret Y N Lưu đồ giải thuật chương trình con Chuong 1 Chuong 2 Chuong 1 Delay 1s Chuong 1 Ret Lưu đồ giải thuật chương trình con Chuong 2 Chuong 3 R0 3 Chuong 1 Delay 1s Giảm R0 R0=0 Ret Y N Lưu đồ giải thuật chương trình con Chuong 3 Khi đang thực hiện gọi các chương trình con Chuong1 ( chuông 1) Chuong 2( chuông 2), Chuong 3 ( chuông 3) thì chương trình không thể thực hiện các phần tiếp theo của chương trình. Cũng như không thể truyền dữ liệu về máy tính vì vi xử lí còn đang thực hiện chương trình gọi chuông. Để tránh tình trạng này ta dùng các ngắt Timer để thực hiện việc delay để vi xử lí vừa thực hiện chương trình con delay1s vừa thực hiện đồng thời các chương trình khác. 6. Chương trình con ngắt Serial Port: Như đã trình bày ở phần trên, khi ta có nhiều Slave cùng dùng chung một đường truyền thì để tránh xung đột trên đường truyền, ta dùng phương pháp định địa chỉ riêng cho từng Slave. Nếu máy tính truyền dữ liệu xuống thì tất cả các vi xử lý cùng nhận, sau đó chúng sẽ so sánh byte đầu tiên nhận được với địa chỉ của riêng chúng đã được định nghĩa sẳn, nếu đúng địa chỉ thì nó sẽ tiếp tục phần giao tiếp. Xung đột trên đường truyền sẽ xảy ra khi có 2 Slave cùng truyền cùng lúc hay khi máy tính đang truyền dữ liệu xuống mà có một vi xử lý đang phát dữ liệu ngược lên, điều này sẽ gây ra ảnh hưởng đến phần cứng cũng như ự an toàn trong hoạt động của mạng truyền thông. Dùng mang 5 RS_485 thì ta phải dùng các IC 75176 có nhiệm vụ chuyển đổi từ mức áp TTl sang RS_485 và ngược lại. Như vậy ta cần có một IC 75176 trên một card chuyển đổi gắn vào cổng Com của máy tính. Đặc tính tổng quát của IC này là có 3 trạng thái, tùy thuộc vào trạng thái của chân điều khiển (DE, RE) mà 75176 sẽ nằm ở trạng thái nào. Như thế vấn đề trong điều khiển mạng RS-485 là việc điều khiển trạng thái các chân điều khiển của các IC 75176 như thế nào để được đông bộ trong quá trìng truyền và nhận. Vi xử lý chỉ được phép truyền khi nào nó nhận được lệnh yêu cầu gởi dữ liệu từ máy tính. Nghĩa là các kit vi xử lý sẽ được đặt ở trạng thái thu. Khi cần truyền dữ liệu thì chân điều khiển thu phát sẽ được đưa lên mức cao. Sau khi kết thúc quá trình truyền dữ liệu thì chận điều khiển thu phát lại được đặt về mức thấp. Trong mạch phần cứng thiết kế em đã dùng chân P3.4 để điều khiển trạng thái thu hay phát IC 75176 trên card gắn vào cổng Com của máy tính thì ta dùng chân RTS để điều khiển. Phần giao tiếp giữa máy tính với vi xử lý gồm có 2 nội dung: _ Truyền dữ liệu từ các kit vi xử lý về máy tính. _ Điều khiển các thiết bị theo yêu cầu của lệnh nhận được từ máy tính. Dữ liệu truyền tứ máy tính xuống vi xử lý sẽ gồm 2 byte: byte đầu tiên xác định địa chỉ của kit vi xử lý cần giao tiếp, byte thứ 2 xác định nội dung cần giao tiếp. Byte đầu tiên Kit giao tiếp A Kit 1 (phòng P01) B Kit 2 (phòng P02) Byte thứ 2 Nội dung giao tiếp E Truyền dữ liệu về máy tính C Điều khiển trạng thái đèn D Điều khiển trạng thái quạt Dữ liệu truyền từ vi xử lý lên máy tính gồm 4 byte: _ Byte đầu tiên xác định địa chỉ của kit đang truyền dữ liệu. _ Byte thứ 2 chứa nhiệt độ đo được. _ Byte thứ 3 chứa số người hiện tại trong phòng. _ Byte thứ 4 cho biết trang thái của đèn, quạt vaà tình trạng an ninh trong phòng. Tùy theo trạng thái của đèn, quạt cũng như tình trạng an ninh trong phòng ta sẽ có một byte tương ứng với trạng thái đó. Byte thứ 4 Đèn Quạt An ninh O Tắt Tắt An toàn P Tắt Tắt Không an toàn Q Tắt Bật An toàn R Tắt Bật Không an toàn S Bật Tắt An toàn T Bật Tắt Không an toàn U Bật Bật An toàn X Bật Bật Không an toàn Bảng mô tả trạng thái của các thiết bị thông qua nội dung trong byte giao tiếp. Ta thấy rằng chỉ khi nào vi xử lý nhận được ký tự “E” thì nó mới đặt chân P3.4 lên mức 1 cho phép truyền, sau khi truyền xong 4 byte thì chân P3.4 được đặt về mức 0 chờ nhận yêu cầu từ máy tính. Tốc độ Baud em thiết kế cho mạng RS-485 trong đề tài là 9600. Mặc dù vi xử lý hoàn toàn có thể hồ trợ khi ta nậng tốc độ Baud lên đến 19200, nhưng trong mạng truyền thông để quản lý tòa nhà như em đanh nghiên cứu thi công thì cũng không cần đạt tốc độ cao trong truyền dữ liệu, nên em chọn tốc độ Baud là 9600. Với tốc độ baud như trên thì để truyền 1 byte vi xử lý cần một khoảng thời gian xấp xỉ 1ms. Nếu ta dùng 2 hàm chuẩn của vi xử lý trong truyền, nhận dữ liệu thì ta sẽ mất đi 1ms không làm gì cả. Hàm nhân dữ liệu: Receive: Wait: jnb ri,wait Clr ri Mov a,sbuf ret Hàm truyền dữ liệu: Transmit: Wait: jnb ti,wait Clr ti Mov sbf,a ret Để tận dụng tốt thời gian cho chương trình vi xử lý, ta đưa phần truyền và nhận dữ liệu vào trong phần ngắt Serial Port. Chương trình con phục vụ ngắt Serial Port này sẽ được gọi khi xảy ra một ngắt trong truyền dữ liệu nối tiếp. Ngắt truyền thông nối tiếp xảy ra khi một trong các cờ TI, RI được set lên mức 1. Cờ TI: ngắt phát, cờ RI: ngắt thu. Các cờ này sẽ được xóa bằng phần mềm. Cờ TI được set lên 1 khi bộ đệm truyền trống, có nghĩa là ta có thể tiếp tục việc truyền byte dữ liệu tiếp theo. Cờ RI được set khi có 1 kí tự đang đợi được đọc trong bộ đệm nhận. Ta dùng các ô nhớ trung gian sau để phục vụ cho việc truyền dữ liệu: _ 3fh: chứa địa chỉ kit truyền dữ liệu. _ 40h: chứa nhiệt đô đo. _ 41h: chứa số người trong phòng. _ 42h: trang thái các thiết bị trong phòng. Dùng các cờ sau như sau( các ô nhớ trong vùng RAM nội) _ 09h: báo đã truyền xong 4 byte để đặt chân P3.4 về mức thấp. _ 0ah: báo byte đầu tiên chính là địa chỉ của kit. Start Cất giữ nội dung các thanh ghi và các cờ Đúng địa chỉ Truyền dữ liệu delay Đưa các ô nhớ ra Buffer Buffer lên PC Y N Y N Điều khiển đèn Đèn đang bật Bật đèn Tắt đèn Điều khiển quạt Quạt đang bật Bật quạt Tắt quạt Reti N N N Y N Y Y Y Lưu đồ giải thuật chương trình truyền nhân dữ liệu Ngắt Serial Port RI=1 Cờ 2=1 Cờ 3=1 A=#’A’ R0=43h A=#’E’ A=#’C’ A=#’D’ A ¬sbuf Xóa P3.4 Set P3.4 Sbuf ¬@R0 Tăng R0 Set cờ 2 R0¬#3fh Truyền dữ liệu về máy tính Điều khiển đèn Điều khiển quat5 Y N set P3.4 Xóa cờ 2 Xóa cờ 3 Xóa cờ 3 Reti Reti Y Y Y Y Y Y N N N N N N N Y Chương trình giao tiếp với máy tính C. Chương trình vi xử lý: MCS-51 MACRO ASSEMBLER LVTN 01/12/:2 PAGE 1 DOS 5.0 (038-N) MCS-51 MACRO ASSEMBLER, V2.2 OBJECT MODULE PLACED IN LVTN.OBJ ASSEMBLER INVOKED BY: D:\MCS51\ASM51.EXE LVTN.ASM CO1 EQU 2BH CO0 EQU 2CH CO2 EQU 09H CO3 EQU 0AH COYEUCAU EQU 2AH ORG 0000H LJMP MAIN ORG 0003H LJMP EXT0ISR ORG 000BH LJMP T0ISR ORG 0013H LJMP EXT1ISR ORG 0023H LJMP SPISR ORG 0030H MAIN: MOV SCON,#01010010B SETB IE.4 ; Cho phép ngắt Serial Port MOV IE,#82H ; Cho phép ngắt timer 0 SETB IE.0 ; Cho phép ngắt ngoài 1 SETB IE.2 ; Cho phép ngắt ngoài 0 MOV TMOD,#21H ; Timer 0 mode 1, timer 1 mode 2 SETB IT0 ; Ngắt ngoài 0 tác động cạnh xuống SETB IT1 ; Ngắt ngoài 1 tác động cạnh xuống MOV 50H,#0 ; Các ô nhớ trung gian dùng hiển thị LED MOV 51H,#0 MOV 52H,#0 MOV 53H,#0 MOV A,87H ; Lấy giá trị từ thanh ghi PCON SETB ACC.7 ; Set bit 7 của thanh ghi PCON MOV 87H,A MOV TH1,#-6 MOV TL1,#-6 ; 9600 BAUD SETB TR1 ; Cho phép timer 1 MOV R0,#3FH MOV 3FH,#'A' ;Ô nhớ dùng để lưu địa chỉ của vi xử lý MOV R1,#50H MOV R3,#5 MOV R2,#100 MOV 30H,#2 MOV 31H,#0 MOV 32H,#0 MOV 33H,#0 CLR CO1 ; cờ được dùng để nhận biết người vào CLR CO0 ; cờ được dùng để nhận biết người ra CLR CO2 ; cờ được dùng để nhận biết đã truyền xong 4 byte CLR CO3 ; cờ được dùng để xác định vi xử lý đã nhận đúng địa chỉ CLR P3.4 ; cho phép nhận tín hiệu điều khiển từ máy tính SETB P1.2 ;tắt quạt SETB P1.4 ; tắt đèn SETB P1.5 ;bật nguồn SETB P1.6 ; cấm chuông kêu SETB 08H ; cờ cho phép AD đổi CLR 04H ; cờ gọi chuong1 CLR 05H ; cờ gọi chuong2 CLR 06H ; cờ gọi chuong3 SETB 07H ; cờ cho biết đã delay 500ms SETB TF0 ; ép ngắt timer 0 SJMP $ T0ISR: CLR TR0 ; ngừng timer CLR TF0 ; xóa cờ ngắt JB 08H,START ; nếu cờ 08h được set thì cho phép đổi AD LCALL OUT ;hiển thị LED LCAL L REQUEST ;kiểm tra có yêu cầu bật , tắt thiết bị DJNZ R2,EXIT ;tạo delay 500ms MOV R2,#100 DJNZ R3,EXIT MOV R3,#5 SETB 08H CPL 07H SJMP EXIT WAIT_RETURN: SJMP EXIT START: LCALL READAD ; cho phép AD đổi LCALL REQUEST ;kiểm tra có yêu cầu bật , tắt thiết bị LCALL CHECKFLAG ; tùy theo trạng thái của các thiết bị mà đưa vào ô nhớ 42h ; giá trị tương ứng LCALL COMPARE ; so sánh nhiệt độ đo với nhiệt độ chuẩn CLR 08H ; cấm AD đổi đến 500ms sau SJMP EXIT EXIT: JB 06H,SKIP5 ; kiểm tra có goi chuong1 không? JB 05H,SKIP6 ; kiểm tra có goi chuong2 không? JB 04H,SKIP7 ; kiểm tra có goi chuong3 không? SJMP RETURN SKIP5: CLR P1.6 ; cho phép chuông kêu LCALL CHUONG3 ; gọi chuong3 SJMP RETURN SKIP6: CLR P1.6 LCALL CHUONG2 ; gọi chuong 2 SJMP RETURN SKIP7: CLR P1.6 LCALL CHUONG1 ; gọi chuong1 SJMP RETURN RETURN: MOV TH0,#HIGH(-1000) ; timer 0 tràn sau 1ms MOV TL0,#LOW(-1000) SETB TR0 ; cho phép timer 0 chạy RETI READAD: CLR P3.6 ; tạo xung Start cho AD đổi SETB P3.6 CLR P3.6 PUSH 00H MOV R0,#60 ; tạo delay 120us DJNZ R0,$ POP 00H PUSH ACC MOV A,P0 ;đọc giá trị đổi từ AD MOV 40H,P0 ; cất giá trị nhiệt độ vào 40h MOV B,#5 ; nhân giá trị nhiệt độ với 5 để hiển thị lên LED 1 số thập ;phân MUL AB MOV R6,A MOV R7,B LCALL BINTOBCD ; chuyển từ nhị phân sang mã BCD POP ACC PUSH ACC MOV A,R7 ANL A,#0FH ; hiển thị LED hàng nghìn ORL A,#0E0H ; chọn LED hàng nghìn MOV 52H,A MOV A,R7 SWAP A ;hiển thị LED hàng trăm ANL A,#0FH ORL A,#0F0H ; chọn LED hàng trăm MOV 53H,A MOV A,R6 ANL A,#0FH ; hiển thị LED hàng chục ORL A,#0C0H ; chọn LED hàng chục MOV 50H,A MOV A,R6 SWAP A ANL A,#0FH ; hiển thị LED hàng đơn vị ORL A,#0D0H ; chọn LED hàng đơn vị MOV 51H,A POP ACC RET ;****************************************************************************** ; CHƯƠNG TRÌNH CON CHUYỂN TỪ SỐ NHỊ PHÂN SANG SỐ BCD ; Giá trị nhi phân cần đổi cất trong R7:R6 ; Giá trị BCD sau khi đổi xong cất trong 2 thanh ghi R7:R6 ; R7 chứa số hàng trăm và số hàng ngàn ; R6 chứa số hàng chục và số hàng đơn vị ;***************************************************************************** BINTOBCD: PUSH ACC PUSH B MOV B,#10 LCALL DIV_16_8 PUSH B MOV B,#10 LCALL DIV_16_8 PUSH B MOV B,#10 MOV A,R6 DIV AB PUSH B SWAP A POP B ORL A,B MOV R7,A POP B MOV A,B SWAP A POP B ORL A,B MOV R6,A POP B POP ACC RET DIV_16_8: PUSH 02H PUSH ACC MOV R2,#16 CLR A DIVIDE: XCH A,R6 CLR C RLC A XCH A,R6 XCH A,R7 RLC A XCH A,R7 RLC A CJNE A,B,NOTEQUAL SJMP AGREATEREQB NOTEQUAL: JC BELOW AGREATEREQB: SUBB A,B XCH A,R6 ORL A,#1 XCH A,R6 BELOW: DJNZ R2,DIVIDE XCH A,B POP ACC POP 02H RET ;******************************************************************************* ; CHƯƠNG TRÌNH CON HIỂN THỊ GIÁ TRỊ TRONG CÁC Ô NHỚ TRUNG GIAN RA ; LED ;******************************************************************************* OUT: PUSH ACC MOV A,@R1 MOV P2,A POP ACC INC R1 CJNE R1,#54H,EXITOUT MOV R1,#50H EXITOUT: RET ;******************************************************************************* ; CHƯƠNG TRÌNH CON SO SÁNH NHIỆT ĐỘ ĐO VỚI NHIỆT ĐỘ CHUẨN ; Tạo tín hiệu chuông báo động khi nhiệt độ lớn hơn mức cho phép ;****************************************************************************** COMPARE: PUSH ACC MOV A,40H CJNE A,#100,$+3 JC LESSTHAN100 ; nhiệt độ lớn hơn 1000C thì cho chuông kêu 3 lần CLR P1.5 SETB 06H ; set cờ để gọi chuông CLR P1.6 ; kích chuông kêu SJMP EXITCOMPARE LESSTHAN100: MOV A,40H CJNE A,#80,$+3 ; nếu lớn hơn 800C thì gọi chuông 2 JC LESSTHAN80 CLR P1.6 ; kích chuông kêu SETB 05H ; set cờ để gọi chuông SJMP EXITCOMPARE LESSTHAN80: MOV A,40H CJNE A,#50,$+3 JC EXITCOMPARE CLR P1.6 SETB 04H SJMP EXITCOMPARE EXITCOMPARE: POP ACC RET ; ;******************************************************************************* ; CHƯƠNG TRÌNH CON CHUONG3 ; Chuông kêu 3 lần, mỗi lần 5s và khoảng cách giữa hai lần là 1s ;****************************************************************************** ; CHUONG3: JNB 07H,EXITCHUONG3 PUSH ACC MOV A,30H INC A CPL P1.6 MOV 30H,A CJNE A,#5,$+3 MOV 30H,A POP ACC JC EXITCHUONG3 CLR 06H MOV 30H,#0 SETB P1.6 EXITCHUONG3: RET ; ; ; ; ;******************************************************************************* ; CHƯƠNG TRÌNH CON CHUONG2 ; Gọi khi nhiệt độ lớn hơn 800C ;****************************************************************************** ; CHUONG2: JNB 07H,EXITCHUONG2 INC 31H CPL P1.6 PUSH ACC MOV A,31H MOV 31H,A CJNE A,#2,$+3 POP ACC JC EXITCHUONG2 CLR 05H SETB P1.6 MOV 31H,#0 EXITCHUONG2: RET ;****************************************************************************** ; CHƯƠNG TRÌNH CON CHUONG1 ;***************************************************************************** ; CHUONG1: JNB 07H,EXITCHUONG1 SETB P1.6 CLR 04H EXITCHUONG1: RET ;******************************************************************************* ; CHƯƠNG TRÌNH CON PHỤC VỤ NGẮT SERIAL PORT ; Dùng cờ 2 để xác định là đã truyền xong 4 byte dữ liệu ; Cờ 3 dùng để xác định đã nhận đúng địa chỉ ;****************************************************************************** SPISR: PUSH ACC JB RI,SPISR1 JB CO2,SPISR2 LCALL TRANSMIT SPISR2: CLR CO2 CLR P3.4 LJMP EXITSPISR SPISR1: CLR RI MOV A,SBUF JB CO3,SPISR4 CJNE A,#'A',SPISR5 ; đúng địa chỉ thì set cờ 3 SETB CO3 LJMP EXITSPISR SPISR5: CLR CO3 LJMP EXITSPISR SPISR4: CJNE A,#'E',SPISR6 ; có yêu cầu truyền dữ liệu không? MOV R0,#3FH LCALL TRANSMIT CLR CO3 LJMP EXITSPISR SPISR6: CJNE A,#'C',SPISR7 ; yêu cầu điều khiển đèn CPL P1.4 CLR CO3 LJMP EXITSPISR SPISR7: CJNE A,#'D',EXITSPISR ; yêu cầu điều khiển quạt CPL P1.2 CLR CO3 LJMP EXITSPISR EXITSPISR: POP ACC RETI ;**************************************************************************** ; ; CHƯƠNG TRÌNH CON TRUYỀN DỮ LIỆU TỪ VI XỬ LÝ VỀ MÁY TÍNH ; ;************************************************************************* ; TRANSMIT: SETB P3.4 CLR TI MOV A,@R0 MOV SBUF,A INC R0 CJNE A,#43H,EXITTRANSMIT MOV R0,#3FH SETB CO2 LJMP EXITTRANSMIT EXITTRANSMIT: RET ;******************************************************************************* ; CHƯƠNG TRÌNH CON ĐẾM NGƯỜI VÀO RA ; chương trình này dùng để giúp cho vi xử lý nhận biết khi ; nào trong phòng có người cũng như không có người để tự bật tắt đèn, quạt ;****************************************************************************** ; EXT1ISR: PUSH 07H JB CO0,LOVE1 MOV R7,#50 DJNZ R7,$ JB P1.0,LOVE2 SETB CO0 JNB CO1,EXITE1 ACALL RA CLR CO1 CLR C

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

  • docĐiều khiển và giám sát toà nhà bằng vi xử lý 89c51.doc
Tài liệu liên quan