8051 - REMOTE CHỤP ẢNH TỪ XA KẾT NỐI BLUETOOTH

Chào tất cả mọi người, nay nghỉ hè nên mình lại mang cái kit 8051 ra vọc. Học vi xử lí xong rồi lại không biết làm gì, cứ để một xó. Nay mình sẽ hướng dẫn các bạn làm chiếc remote chụp ảnh điện thoại từ xa nhé :))

Đầu tiên cần chuẩn bị những gì?
  • MCU 8051 chắc chắn phải có rồi, dòng 8051 này có 2 loại phổ biến là 89C89S, mình khuyên các bạn nên dùng 89S và cụ thể là 89S52 và kèm theo mạch nạp USB ISP, đơn giản vì nó rẻ, các bạn sẽ nạp qua cổng nối tiếp. Còn không các bạn sẽ phải mua mạch nạp giá khá cao.
  • Module bluetooth HC-05 hoặc HC-06, cả hai loại này đều chỉ cần dùng 4 chân VCC, GND, TX và RX.
  • Nút bấm, thạch anh và led, nếu các bạn sử dụng với mục đích học tập các bạn có thể mua luôn kit 8051 v2, kit được trang bị đầy đủ cho các bạn và các bạn không tốn công hàn linh kiện.
  • Mạch nạp như mình đã nói ở trên và một cái laptop.

Đã chuẩn bị xong, các bạn kết nối theo sơ đồ sau:


Phần trong khung đen là những gì đã có sẵn trong kit, nếu các bạn đã mua kit thì chỉ cần kết nối module bluetooth là được.

Sau khi kết nối xong, các bạn tiến hành viết code trong Keil C và xuất file .hex!

Khi đã có file .hex, các bạn dùng phần mềm progisp để đẩy code assembly vào MCU 8051 (chỉ dùng với mạch nạp IPS USB)

Sau đây là chương trình assembly:

COUNT   EQU     30H
SNAP    BIT     20H
        ORG     00H
        AJMP    START
        ORG     03H             ;Int0 địa chỉ ngắt 0
        AJMP    INT0_ROUTINE
        ORG     13H             ;Int1 địa chỉ ngắt 1
        AJMP    INT1_ROUTINE
        ORG     23H             ;địa chỉ Serial
        AJMP    SERIAL_ROUTINE
        ORG     2BH             ;Timer2 địa chỉ ngắt timer 2
        AJMP    TIMER2_ROUTINE
START:
        ACALL   INIT
        ACALL   INIT_INT0
        ACALL   INIT_INT1
        ACALL   INIT_SERIAL
        ACALL   INIT_TIMER2
LOOP:
        ACALL   DELAY
        JNB     SNAP, NO_FLASH
        JNB     P1.0, LED_OFF
        CLR     P1.0
        AJMP    LOOP
LED_OFF:
        SETB    P1.0
NO_FLASH:
        AJMP    LOOP
 
;--------------------
; Delay
;--------------------
DELAY:  MOV     R6, #255
DLY1:   MOV     R7, #255
DLY2:   DJNZ    R7, DLY2
        DJNZ    R6, DLY1
        RET
 
;--------------------
; Initialize variables
;--------------------
INIT:
        MOV     SP, #60H
        MOV     P1, #11111110B
        MOV     R5, #15
        MOV     COUNT, #0
        CLR     SNAP
        RET
 
;--------------------
; Initialize int0
;--------------------
INIT_INT0:
        SETB    IT0             ;edge triggered
        SETB    EX0             ;Enable int0 interrupt
        SETB    PX0             ;High interrupt priority
        RET
 
;--------------------
; Initialize int1
;--------------------
INIT_INT1:
        SETB    IT1             ;kích cạnh
        SETB    EX1             ;cho phép ngắt 1
        SETB    PX1             ;ưu tiên ngắt
        RET
 
;--------------------
; Initialize serial
;
; TCON Register:
;  7   6   5   4   3   2   1   0
; TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
;
; TMOD Register:
;   7     6    5   4    3     2    1   0
; GATE1 C/T1# M11 M01 GATE0 C/T0# M10 M00
;
; SCON Register:
;  7   6   5   4   3   2  1  0
; SM0 SM1 SM2 REN TB8 RB8 TI RI
;--------------------
INIT_SERIAL:
        MOV     SCON, #50H      ;Mode 1: 8-bit UART
        MOV     TMOD, #20H      ;Timer and reload mode
        MOV     TH1, #0FDH      ;Baud rate 9600bps
        MOV     TL0, #0FDH      ;Baud rate 9600bps
        SETB    PS              ;ưu tiên ngắt
        SETB    ES              ;cho phép ngắt Serial
        SETB    TR1             ;Timer1 kích hoạt
        RET
 
;---------------------------------------------------
; Initialize timer2
;
; T2CON Register:
;  7   6    5    4     3    2   1     0
; TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2 CP/RL2
;
; 1 second = 11.0592MHZ / 12 = 921600 = 61440 * 15
; TH2 = (65536-61440)/256 = 16 = 10H
; TL2 = (65536-61440)%256 = 0 = 00H
;
; IE Register:
; 7  6  5  4   3    2   1   0
; EA - ET2 ES ET1  EX1 ET0 EX0
;---------------------------------------------------
INIT_TIMER2:
        CLR     EXF2            ;Reset cờ
        CLR     TCLK            ;Disable baud rate generator
        CLR     RCLK            ;Disable baud rate generator
        CLR     EXEN2           ;Ignore events on T2EX
        MOV     TH2, #10H
        MOV     RCAP2H, #10H
        MOV     TL2, #00H
        MOV     RCAP2L, #00H
        CLR     CT2             ;Timer mode
        CLR     CPRL2           ;Auto-reload mode
        CLR     PT2             ;ưu tiên ngắt mức thấp
        SETB    ET2             ;cho phép ngắt timer 2
        SETB    EA              ;cho phép mọi ngắt
        SETB    TR2             ;Timer2 kích hoạt
        RET
 
;---------------------------------
; Snap timeout
;---------------------------------
START_SNAP_TIMEOUT:
        JNB     SNAP, NO_COUNT
        MOV     A, COUNT
        INC     A               ;10 giây từ khi chụp
        MOV     COUNT, A
        CJNE    A, #10, NO_COUNT
        CLR     SNAP
        MOV     COUNT, #0
        CLR     P1.0
NO_COUNT:
        RET
 
;---------------------------------
; Int0 interrupt service routine
;---------------------------------
INT0_ROUTINE:
        JB      SNAP, IGNORE_SNAP
        SETB    SNAP           
        MOV     COUNT, #0
        MOV     SBUF, #84       
        JNB     TI, $          
IGNORE_SNAP:
        RETI
 
;---------------------------------
; Int1 interrupt service routine
;---------------------------------
INT1_ROUTINE:
        MOV     SBUF, #77       
        JNB     TI, $           
        RETI
 
;-----------------------------------
; Timer2 interrupt service routine
;-----------------------------------
TIMER2_ROUTINE:
        PUSH    ACC            
        DJNZ    R5, CONTINUE    
        ACALL   START_SNAP_TIMEOUT
        MOV     R5, #15         
CONTINUE:
        CLR     TF2             
        POP     ACC            
        RETI
 
;----------------------------------------
; Serial port interrupt service routine
;----------------------------------------
SERIAL_ROUTINE:
        PUSH    ACC
        JB      TI, IGNORE
        MOV     A, SBUF
        CJNE    A, #68, ID_CHK 
        CLR     SNAP
        MOV     COUNT, #0
        CLR     P1.0
ID_CHK:
        CJNE    A, #87, IGNORE  
        MOV     SBUF, #73       
        JNB     TI, $         
        JMP     NO_CLEAR_TI
IGNORE:
        CLR     TI
NO_CLEAR_TI:
        CLR     RI
        POP     ACC
        RETI
        END
  
 
 
Sau khi nạp code xong, các bạn cần một phần mềm chụp ảnh qua bluetooth. Các bạn tải tại:

https://apkpure.com/vn/bluetooth-remote-toy/tw.blogspot.reneeciou.bluetooth.remote.toy

Các bạn mở phần mềm, chọn shutter, kết nối với module bluetooth và trải nghiệm nhé. Đừng quên chia sẻ bài viết cho mình, chúc các bạn thành công


Tham khảo bài viết từ renee's blog:

http://reneeciou.blogspot.com/2017/05/8051-bluetooth-remote-shutter.html