警告與免責聲明:
如果您沒有任何基本電子知識,請不要嘗試這篇教學。作者對本教學所導致的任何損害概不負責。嘗試這篇教學風險自負。
底下將使用一顆STC89C52RC單晶片、一個HC-06 UART介面藍牙模組與一個L298N馬達驅動模組來打造一台藍牙遙控玩具車。此遙控車要搭配『Bluetooth Remote Toy』APP才能使用,如此一來,你就可以透過手機藍牙來控制玩具車。底下是遙控車的控制指令:
每個命令都是由一個Byte組成。如果您要停止某個動作,則在該動作指令和停止/關閉指令之間執行OR操作。例如,
- 0x01000100(前進)| 0x00100000(停止)= 0x01100100,將發送到遙控車使它停止前進。
- 0x01001000(大燈) | 0x00100000(關掉) = 0x01101000,將發送到遙控車使它關掉大燈。
紅色、綠色和藍色按鈕保留給那些想要執行額外操作的人。
控制功能 | 指令 |
---|---|
紅色按鈕 | 0x01000001 |
綠色按鈕 | 0x01000010 |
藍色按鈕 | 0x01000011 |
前進 | 0x01000100 |
後退 | 0x01000101 |
右轉 | 0x01000110 |
左轉 | 0x01000111 |
大燈 | 0x01001000 |
尾燈 | 0x01001001 |
停止/關掉 | 0x00100000 |
購買這款玩具車後,我用8051電路替代了原本的RF電路。玩具車前後共兩顆直流馬達,前馬達用於控制方向(左/右),後馬達用於控制前進和後退。HC-06藍牙模組用於接收Android手機端傳來的指令。L298N H-bridge 模組可以讓您控制兩顆直流馬達的速度和方向。STC89C52RC單晶片用於控制整個系統。
L298N H-bridge模組
關於此模塊的更多詳細資訊,請閱讀這裡。我建議您在開始之前先閱讀一下。
接腳說明
- 前直流馬達 "+"
- 前直流馬達 "-"
- 12V跳線 - 對於本教程,請保留這跳線。
- 在這裡連接馬達電源電壓,並使用7 ~ 12V直流電壓驅動本教程的馬達。
- GND - 接地
- 5V輸出 - 如果您使用7 ~ 12V直流電壓驅動馬達,並且保留12V跳線,則該模組還可以為您的8051單晶片提供5V直流電壓。
- ENA - 前直流馬達啟用跳線(Enable Jumper)。對於本教程,請保留這跳線。如果要控制前直流馬達的速度,則必須將MCU的PWM輸出連接到ENA。對於STC89C52RC單晶片是沒有PWM輸出。但是如果需要,您可以使用timer在8051上實現PWM。
- IN1 - 前直流馬達的方向。
- IN2 - 前直流馬達的方向。
- IN3 - 後直流馬達的方向。
- IN4 - 後直流馬達的方向。
- ENB - 後直流馬達啟用跳線(Enable Jumper)。對於本教程,請保留這跳線。如果要控制後直流馬達的速度,則必須將MCU的PWM輸出連接到ENB。對於STC89C52RC單晶片是沒有PWM輸出。但是如果需要,您可以使用timer在8051上實現PWM。
- 後直流馬達 "+"
- 後直流馬達 "-"
前馬達真值表
ENB | IN3 | IN4 | 說明 |
---|---|---|---|
0 | N/A | N/A | Off |
1 | 0 | 0 | 停止 |
1 | 0 | 1 | 反轉 |
1 | 1 | 0 | 正轉 |
1 | 1 | 1 | 剎住 |
後馬達真值表
ENA | IN1 | IN2 | 說明 |
---|---|---|---|
0 | N/A | N/A | Off |
1 | 0 | 0 | 停止 |
1 | 0 | 1 | 反轉 |
1 | 1 | 0 | 正轉 |
1 | 1 | 1 | 剎住 |
為您的電源選擇合適的電壓是很重要,太低會導致性能下降,太高會損壞馬達,請確保電壓不超過馬達額定電壓。對於我的玩具車,我使用兩顆串聯連接的Panasonic NCR18650B 3.6 Volt 18650電池供電約7.2V。對於您的玩具車,請為您的電源選擇合適的電壓,這取決於您的馬達。
電路圖
底下是我完成的成品。
底下是用組合語言寫的,你可用C語言改寫。8051的組合語言沒有很難,語法也沒有很多,剛開始學8051可以考慮用組合語言撰寫,這樣會比較了解8051,但如果程式碼越來越大,又考慮可讀性與移植性,建議用C語言撰寫。至於8051的開發環境,可以參考這裡。
程式碼
STOP BIT 20H TURN BIT 21H R_ON BIT 22H G_ON BIT 23H B_ON BIT 24H B_STP BIT 25H KP_MV BIT 26H ORG 00H AJMP START ORG 23H ;Serial interrupt vector address AJMP SERIAL_ROUTINE ORG 2BH ;Timer2 interrupt vector address AJMP TIMER2_ROUTINE START: ACALL INIT ACALL INIT_SERIAL ACALL INIT_TIMER2 LOOP: ACALL DELAY JNB B_ON, STOP_BLUE_LED JB TURN, TURN_AROUND MOV P2, A RL A CJNE A, #01111111B, SET_TURN_RIGHT SETB TURN AJMP LOOP SET_TURN_RIGHT: AJMP LOOP TURN_AROUND: MOV P2, A RR A CJNE A, #11111110B, SET_TURN_LEFT CLR TURN AJMP LOOP SET_TURN_LEFT: AJMP LOOP STOP_BLUE_LED: JNB B_STP, RESET_DONE CLR B_STP MOV A, #11111110B CLR TURN MOV P2, #255 RESET_DONE: AJMP LOOP ;-------------------- ; Delay ;-------------------- DELAY: MOV R6, #100 DLY1: MOV R7, #255 DLY2: DJNZ R7, DLY2 DJNZ R6, DLY1 RET ;-------------------- ; Initialize variables ;-------------------- INIT: MOV SP, #60H CLR STOP CLR TURN CLR R_ON CLR G_ON CLR B_ON CLR B_STP MOV A, #11111110B MOV P0, #0 MOV P1, #00110000B MOV P2, #255 MOV R5, #15 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 TR1 ;Timer1 runs SETB PS ;High interrupt priority SETB ES ;Enable serial interrupt 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 ; ; 0.5 second = 30720 * 15 ; TH2 = (65536-30720)/256 = 136 = 88H ; TL2 = (65536-30720)%256 = 0 = 00H ; ; 0.25 second = 15360 * 15 ; TH2 = (65536-15360)/256 = 196 = C4H ; TL2 = (65536-15360)%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 flag CLR TCLK ;Disable baud rate generator CLR RCLK ;Disable baud rate generator CLR EXEN2 ;Ignore events on T2EX MOV TH2, #0C4H MOV RCAP2H, #0C4H MOV TL2, #00H MOV RCAP2L, #00H CLR CT2 ;Timer mode CLR CPRL2 ;Reload mode CLR PT2 ;Low interrupt priority SETB ET2 ;Enable timer2 interrupt SETB EA ;Global interrupts enable SETB TR2 ;Timer2 run RET ;----------------------------------- ; Timer2 interrupt service routine ; ; This is very important for the toy ; car to stop all actions when the ; bluetooth signal of your toy car ; is out of range, and no command ; is received after (0.25 * 2) second. ; ;----------------------------------- TIMER2_ROUTINE: PUSH ACC ;Save ACC register on the stack DJNZ R5, CONTINUE ;Continue timer if it is less then 1 second JB KP_MV, NO_CLEAR CLR P1.0 ;Stop forward CLR P1.1 ;Stop backward CLR P1.2 ;Stop right CLR P1.3 ;Stop left NO_CLEAR: CLR KP_MV MOV R5, #15 ;Recount 0.25 second CONTINUE: CLR TF2 ;Reset interrupt flag POP ACC ;Restore ACC RETI ;---------------------------------------- ; Serial port interrupt service routine ;---------------------------------------- SERIAL_ROUTINE: PUSH ACC SETB KP_MV MOV A, SBUF JNB A.5, RED_BUTTON SETB STOP CLR A.5 RED_BUTTON: CJNE A, #01000001B, GREEN_BUTTON JB STOP, STOP_RED_BUTTON SETB R_ON LJMP EXIT STOP_RED_BUTTON: CLR R_ON CLR STOP LJMP EXIT GREEN_BUTTON: CJNE A, #01000010B, BLUE_BUTTON JB STOP, STOP_GREEN_BUTTON SETB G_ON SJMP EXIT STOP_GREEN_BUTTON: CLR G_ON CLR STOP SJMP EXIT BLUE_BUTTON: CJNE A, #01000011B, FORWARD JB STOP, STOP_BLUE_BUTTON SETB B_ON SJMP EXIT STOP_BLUE_BUTTON: CLR B_ON CLR STOP SETB B_STP SJMP EXIT FORWARD: CJNE A, #01000100B, BACKWARD JB STOP, STOP_FORWARD SETB P1.0 SJMP EXIT STOP_FORWARD: CLR P1.0 CLR STOP SJMP EXIT BACKWARD: CJNE A, #01000101B, RIGHT JB STOP, STOP_BACKWARD SETB P1.1 SJMP EXIT STOP_BACKWARD: CLR P1.1 CLR STOP SJMP EXIT RIGHT: CJNE A, #01000110B, LEFT JB STOP, STOP_RIGHT SETB P1.2 SJMP EXIT STOP_RIGHT: CLR P1.2 CLR STOP SJMP EXIT LEFT: CJNE A, #01000111B, CAR_FRONT_LIGHT JB STOP, STOP_LEFT SETB P1.3 SJMP EXIT STOP_LEFT: CLR P1.3 CLR STOP SJMP EXIT CAR_FRONT_LIGHT: CJNE A, #01001000B, CAR_REAR_LIGHT JB STOP, STOP_FRONT_LIGHT CLR P1.4 SJMP EXIT STOP_FRONT_LIGHT: SETB P1.4 CLR STOP SJMP EXIT CAR_REAR_LIGHT: CJNE A, #01001001B, EXIT JB STOP, STOP_REAR_LIGHT CLR P1.5 SJMP EXIT STOP_REAR_LIGHT: SETB P1.5 CLR STOP EXIT: CLR RI POP ACC RETI END
Demo
警告與免責聲明:
如果您沒有任何基本電子知識,請不要嘗試這篇教學。作者對本教學所導致的任何損害概不負責。嘗試這篇教學風險自負。
沒有留言:
不接受新意見。