Trong cuộc sống hàng ngày của chúng ta hiện nay , vi xử lí được ứng dụng rất rộng rãi , nó càng trở nên cần thiết và không thể thiếu trong mỗi gia đình . Đó chính là ứng dụng về Điều Khiển Từ Xa , một ứng dụng rất thú vị và tiện ích trong cuộc sống hàng ngày . Thay vì phải đứng dậy để bật hay tắt những dụng cụ như : quạt , tivi , bóng đèn , …. chúng ta chỉ việc ngồi tại chỗ với chiếc điều khiển từ xa trong tay , ta có thể tắt mở những cụ theo ý muốn . Hệ thống điều khiển từ xa gồm có : 1 con mắt hồng ngoại , 1 điều khiển TV Sony trong đó mỗi nút bấm là một mã riêng để điều khiển mỗi thiết bị , việc giãi mã được lập trình trên vi xử lí 8051 .

I) GIẢI QUYẾT VẤN ĐỀ :
1) Giải Mã REMOTE :
Trước tiên ta tìm hiểu về mã của Remote TV , ta xem hình vẽ




Trên hình vẽ cho ta thấy : bit đầu tiên là bit LSB ta đặt tên cho nó là bit B0 , bít cuối cùng sẽ là bit B11 . Trong đó từ :
B0 – B6 : là 7 bit mã lệnh 
B7 _ B11: là 5 bit địa chỉ 
Trong đó , mã lệnh là 16H, mã địa chỉ là 08H . Khi sử dụng mắt hồng ngoại thì tất cả các dạng sóng trên sẽ bị đảo lại như sau :




Để thu và giải mã tín hiệu từ Remote TV ta chỉ cần thu 7 bit command (7 bit mã lệnh ) và có thể bỏ qua 5 bit address ( 5 bit dữ liệu ) bởi vì các nút bấm đều phát ra các mã địa chỉ là như nhau chỉ khác nhau về mã lệnh .
Để thu được 7 bit mã lệnh ta làm như sau :
a) thiết lập thanh ghi A = 01000000 B
b) khởi đầu bằng cách chờ tín hiệu xuống 
c) chờ cho tín hiệu lên 
d) chờ cho tín hiệu xuống 
e) tạo trễ khoảng 900us
f) đo mức tín hiệu :
+ nếu mức tín hiệu là mức cao thì bit nhận được là bit 0 :
thiết lập cờ C = 0 , quay phải có cờ nhớ A , như vậy C sẽ được gởi vào MSB của A , LSB của A sẽ được gởi vào C . Như vậy sau 7 lần quay thì C = 1 và 7 bit trái của A sẽ chứa mã lệnh . khi C = 0 quay lại bước d .
+ nếu mức tín hiệu là mức thấp thì bit nhận được là bit 1 :
thiết lập cờ C = 1, quay phải có cờ nhớ A . Khi C = 0 quay lại bước c . 

Nếu C = 1, giá trị trong thanh ghi A = D6D5D4D3D2D1D00 , sau khi quay phải A thu được A = 0D6D5D4D3D2D1D0 . 
Xuất nội dung thanh ghi A ra port 1 hiển thị bằng các led( đây chính là mã lệnh từ remote mà 8051 giải mã được).

2 ) Lưu Đồ Giải Thuật :





II) SƠ ĐỒ NGUYÊN LÍ:



1) Cấu Tạo :
+ Thiết bị phát là Remote TV , với mỗi nút bấm phát ra một mã hồng ngoại khác nhau .
+ Thiết bị thu sử dụng mắt hồng ngoại 3 chân , được dùng rộng rãi trong TV 



+ Mắt nhận hồng ngoại nhận tín hiệu từ điều khiển từ xa phát ra từ giải điều chế và đua tín hiệu đảo ra chân OUT . Tín hiệu từ chân OUT được đưa đến chân P3.3 của vi xử lí để giải mã , mã lệnh 7 bit được hiển thị trên cổng P1.Tín hiệu điều khiển được đưa ra cổng P2 . Khi bấm phím 1 đưa tín hiệu điều khiển ra chân P2.0, bấm phím 2 ra chân
P2.1…..bấm phím 8 ra chân P2.7.


2) Nguyên Lí Hoạt Động :
Dòng DC khoảng 5v-7v đưa qua 7805 để ổn định áp 5v cung cấp cho vxli 8051 . chân OUT của mắt nhận hồng ngoại đưa vào chân P3.3, tín hiệu tới chân P3.3 được lập trình và giải mã . Mã lệnh hiện thị trên cổng P1 , tín hiệu điều khiển đưa ra chân P2.
Trong mạch chỉ sử dụng 3 chân P2.0 , P2.1 , P2.2 để điều khiển 3 thiết bị thông qua 3 rơle (5v) có tác dụng đóng mở cho dòng điện xoay chiều 220v đi qua các thiết bị điện .Khi P2.0 , P2.1 , P2.2 ở mức cao (+5v) thì không có dòng qua Rơle , Rơle đóng . Khi P2.0 , P2.1 , P2.2 ở mức thấp (0v) thì có dòng qua Rơle , Rơle mở nên có dòng 220v qua các thiết bị điện , các thiết bị hoạt động . Đối với gia đình có nhiều thiết bị điện thí ta tiếp tục nối các chân còn lại của port 2 qua Rơle , như vậy ta có thể dùng cho thiết bị tuỳ thích

III)CODE CHƯƠNG TRÌNH :

ORG 00
MOV P1,#0
MOV P2,#00000111B
LCALL LONG_DELAY ; cho tín hiệu đầu tiên nhận được nhận được ko bị sai
MAIN:
SETB P3.3 ; P3.3 làm đầu vào nhận tín hiệu
MOV A,#01000000B ; sau 7 lần quay phải A thì C=1 để kiểm tra
RP1: JB P3.3, RP1 ; chờ cho tín hiệu đi xuống
RP2: JNB P3.3, RP2 ; chờ cho tín hiệu đi lên
RP3: JB P3.3, RP3 ; chờ cho tín hiệu đi xuống
LCALL DELAY ; tạo trễ 900 us
MOV C,P3.3 ; Ghi tín hiệu thu được vào C để đo
JC BIT0 ; nếu tín hiệu là bit cao thì bit nhận được là bit 0
SETB C ; tín hiệu mức thấp , bit nhận dược là bit 1
RRC A ; ghi từng bit mã lệnh vào trong A
JC END_SIGNAL ; nếu C =1 thì nhận đủ 7 bit mã lệnh , kết thúc
; nhận
; kết thúc quá trình nhận tín hiệu
SJMP RP2 ; nếu C=0 thì quay lại nhãn RP2
BIT0:
CLR C ; tín hiệu mức cao bit nhận được là bit 0
RRC A
JC END_SIGNAL ; nếu C =1 thì nhận đủ 7 bit mã lệnh , kết thúc

; kết thúc quá trình nhận tín hiệu
SJMP RP3 ; nếu C=0 thì quay lại nhãn RP3
BIT0:
END_SIGNAL: ; kết thúc quá trình nhận tín hiệu
LCALL LONG_DELAY ; tạo trễ để chống nhiễu
; 7 bit trái của A đang chứa mã lệnh , bit LSB = 0
RR A ; 7 bit phải của A đang chứa mã lệnh, bit MSB = 0
MOV P1, A ; hiển thị mã lệnh ra cổng P1

KEY_1:
CJNE A,#00000000B,KEY_2 ; bấm phím 1
;---KEY = 1---
CPL P2.0 ; đảo bit sau đó
SJMP MAIN ; quay lại từ đầu
;-------------
KEY_2: CJNE A,#1,KEY_3 ; bấm phím 2
;-------------
;---KEY = 2---
CPL P2.1
SJMP MAIN
;-------------
KEY_3:
CJNE A,#2,KEY_4 ; bấm phím 3
;-------------
;---KEY = 3---
CPL P2.2
SJMP MAIN
;-------------
KEY_4:
CJNE A,#3,KEY_5 ; bấm phím 4
;-------------
;---KEY = 4---
CPL P2.3
SJMP MAIN
;-------------
KEY_5:
CJNE A,#4,KEY_6 ; bấm phím 5
;-------------
;---KEY = 2---
CPL P2.4
LJMP MAIN
;-------------
KEY_6:
CJNE A,#5,KEY_7 ; bấm phím 6
;-------------
;---KEY = 6---
CPL P2.5
LJMP MAIN
;-------------
KEY_7:
CJNE A,#6,KEY_8 ; bấm phím 7
;-------------
;---KEY = 7---
CPL P2.6
LJMP MAIN
;-------------
KEY_8:
CJNE A,#7,OTHER_KEY ; bấm phím 8
;-------------
;---KEY = 8---
CPL P2.7
LJMP MAIN
;-----------------------------------
OTHER_KEY: ; bấm các phím khác thì không làm gì
LJMP MAIN
;-----------------------------------
; tạo trễ
;-----------------------------------
DELAY: ; tạo trễ 900 ms
MOV R5,#165 ; Thời gian tạo trễ 165 x 5 x 1.085 ms = 900 ms
AGAIN: NOP
NOP
NOP
DJNZ R5,AGAIN
RET
;-----------------------------------
LONG_DELAY: ; tạo trễ dài để chống nhiễu
MOV R5,#50
REPEAT:
MOV R6,#255
HERE:
DJNZ R6,HERE
DJNZ R5,REPEAT
RET
END