TỔNG QUAN VỀ ĐỀ TÀI ĐIỀU KHIỂN VÀ GIÁM SÁT TOÀ NHÀ BẰNG VI XỬ LÝ 89C51
I. Yêu cầu của đề tài:
Trong cuộc sống hiện tại, khoa học kỹ thuật phát triển rất nhanh, những công cụ ra đời sẽ giúp giải phóng sự lao động trí óc: nghiên cứu, cải tiến, sáng tạo. Chỉ tiêu của khoa học kỹ thuật là làm sao nâng cao được chất lượng và hiệu suất công việc, hầu như công nghệ tự động ra đời là đáp ứng nhu cầu đó. Cho nên, em đã nghiên cứu về đề tài “ Điều khiển giám sát nhà cao tầng dùng vi xử lý 89C51 qua mạng RS-485. Các kít vi xử lý này có thể hoạt động hoàn toàn độc lập theo một chương trình lập sẵn. Bên cạnh đó, chúng còn có thể được giám sát và điều khiển các thiết bị trong từng phòng thông qua gởi lệnh đến đúng kít vi xử lý cần điều khiển để thi hành lệnh đó. Ngoài việc điều khiển các thiết bị dùng điện trong phòng, ta còn có thể đảm bảo an ninh cho từng phòng bằng hệ thống phát hiện cháy, phát hiện trộm bằng cảm biến quang.
Một chuyên gia về công nghệ nhà thông minh ( Home Automation ) – Kenne P.Wacks – đã viết một bài báo giới thiệu về ngôi nhà thông minh như sau:
“ Hơn 6 năm qua, một công nghệ mới gọi là công nghệ nhà thông minh đã được nghiên cứu và phát triển. Công nghệ này sẽ tạo nên một thế hệ mới của các thiết bị cung cấp cho người dùng chúng. Những công nghệ trước đó cùng với khái niệm ngôi nhà thông minh sau này sẽ tạo nên những sản phẩm và loại hình dịch vụ mới mẻ trong tương lai. Một số ít các công ty đang giới thiệu về ngôi nhà tự động. Một vài công ty lớn và các viện nghiện cứu đang thăm dò công nghệ mới nhưng đầy tiềm năng này.
Mạng truyền thông trong nhà sẽ cung cấp những cơ sở hạ tầng để liên kết các thiết bị cảm biến, bộ điều khiển và bảng điều khiển trong nhà. Điều này sẽ trở nên khả thi bằng cách tạo ra sự phát triển công nghệ truyền thông trong những ngôi nhà tự động.
Trong ngôi nhà thông minh từ “thiết bị” không chỉ đề cập đến các dụng cụ trong nhà bếp, thiết bị video/audio, các hệ thống có thể dịch chuyển , các thiết bị chiếu sáng, thiết bị sưởi ấm, làm lạnh, hệ thống an ninh. Công nghệ này sẽ bật đèn xanh cho các công ty nghiên cứu cho ra đời những sản phẩm và hình thức dịch vụ mới. Các sản phẩm này sẽ có chung điểm tương đồng nào đó hay là những thuộc tính tương tự nhau. Các thuộc tính đó là:
Vai trò của các thiết bị trong nhà thông minh: hầu hết các thiết bị trong nhà đều có vỏ bằng nhựa hay kim loại. Một vài thiết bị vận hành độc lập với các thiết bị khác. Tuy nhiên cũng có những dụng cụ cần có một thiết bị khác điều khiển nó. Các thiết bị trong ngôi nhà thông minh đều có thể truyền dữ liệu. Ta sẽ nhóm các thiết bị này lại chung một nhóm. Ví dụ: hệ thống an ninh, hệ thống Audio/Video. Trong tương lai các hệ thống này có thể cho phép máy giặt hay máy rửa chén yêu cầu bộ phận nung nóng nước, chuẩn bị nước nóng khi chúng cần đến.
Sự hợp nhất các chuẩn truyền thông: các thiết bị trong tương lai đều có một chuẩn truyền thông chung, có cùng dây nối đặc biệt. Tiêu chuẩn của ngôi nhà thông minh là sẽ làm nhẹ bớt đi công việc của các nhà sản xuất về việc phải sáng chế ra giao thức truyền thông và cung cấp các đường dây dẫn dữ liệu.
Yêu cầu của đề tài mà em được giao:
- Thiết kế phần cứng mạch báo cháy tự động.
- Mạch động lực điều khiển thiết bị dùng điện bằng vi xử lý.
- Mạch phát hiện trộm bằng cảm biến: dùng LED hồng ngoại.
- Mạch giao tiếp máy tính của từng vi xử lý.
- Lập trình giao tiếp bằng ngôn ngữ visual basic.
98 trang |
Chia sẻ: lethao | Lượt xem: 3093 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Đồ án Điều khiển và giám sát nhà cao tầng dùng vi xử lý 89C51, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ấ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 CO0
Các file đính kèm theo tài liệu này:
- Điều khiển và giám sát nhà cao tầng dùng vi xử lý 89C51.doc