從開始學單片機到現在,我買了整十種藍牙模塊來試,開始的HC-05算是入門,其設置非常麻煩,配對要很多過程,而且傳送距離很短,后來還買了JDY-08,配對是比較簡單了,但發現配對后發出的數據若含有“AT”會被吃掉,顯然是藍牙內部軟件有蟲,接著還買了很多其他款來試,才發現有些只有從機,沒有主機,而其他型號的主機不能與之配對,折騰了好久這才找到一款小公司生產的,從機和主機是分開的,而且能一鍵配對,非常滿意,價錢稍貴無所謂,但擔心有一天他們忽然說不賣了,那麻煩就大了,得找個后備輪胎,找呀找就意外找到了一款很普通的JDY-18,是主從一體機,在其說明書里有說能一鍵配對,但必須先設定參數,買回來后經過手工設定還行,但每次要設定一個模塊都要再翻看說明書,很麻煩花時間,于是就想用單片制作一個設定器,把設置命令都寫在里面,把模塊插上主板后一開電,就自動設置好了。
剛好我的有十來片廢棄不用的STC12LE5A60S2板子,有UART1和UART2的插座,非常合用,于是這事就搞成了:
bt.jpg (43.6 KB, 下載次數: 43)
下載附件
2020-11-4 23:17 上傳
軟件是從已有的MIDI發送軟件簡化而來,把所有沒用到的程序全部刪除,沒有用到的寄存器全部刪除,向量表只留下需要用的,這下軟件變得干凈,力求做到上面沒有一條命令是多余的。
接著是添加新的代碼,通過串口2向藍牙模塊發生命令后,模塊會有響應的字符,必須把字符放在緩沖區再發送到串口1,用STC ISP觀看,這事花了不少時間,因為以前未曾做過。開發過程中發現必須關閉串口1的接收功能,否則向串口2發送字符后也能讓串口1產生接收中斷,在同樣的緩沖區留下字符,但只在每一次發送第一串字符后,接下來就不會了,原因不明,也沒時間去追究,能用就好。
JDY-18這個一鍵配對并綁定是能用的,但設置完畢后并不能即刻配對,必須拔進拔出幾次開機等好幾秒才能與從機配對,而且接通后會產生一堆提示的字符,你的應用軟件必須能夠不受這些字符的干擾,那款較貴的,一按配對鈕,不到一秒就通了,而且完全靜默,真是一分錢一分貨呀,但作為備用輪胎還是行的。
單片機匯編語言代碼:
;JDY-18一鍵綁定連接最近的從機藍牙
;起始串口波特率9600 測試模塊: AT+RESET,響應:OK
;第一步配置主機:AT+ROLE1 響應:+ROLE=1 OK
;第二步配置類型:AT+CLSSF0 響應:+CLSS=F0 OK
;第三步設波特率:AT+BAUD6 響應:+BAUD=6 OK(1-1200 2=2400 3=4800 4=9600 5=19200 6=38400 7=57600 8=115200 9=230400)
;第三步模塊重啟:AT+RESET 響應:OK
;將JDY-18第18腳IO3連接MCU引腳上(P1.4),給一個下降沿信號,模塊將主動搜索附近最近從機BLE藍牙,
;并自動綁定連接信號最強的BLE設備,下次重新上電,模塊會自動與之前已經連接的從自動連接,
;如需要重新連接新的BLE從機,通過重復以上步驟即可
HEADBUFFER EQU 80H
LASTBUFFER EQU 0FFH
BRT EQU 09CH
S2CON EQU 9AH ;S2SM0, S2SM1, S2SM2, S2REN, S2TB8, S2RB8, S2TI, S2RI
IE2 EQU 0AFH ;X, X, X, X, X, X, ESPI, ES2
IP2 EQU 0B5H ;X,X,X,X,X,X,PSPS,PS2 PSPI=PARITY OF SPI
S2BUF EQU 9BH
P4 EQU 0C0H
P5 EQU 0C8H
AUXR EQU 8EH
AUXR2 EQU 0A2H
ORG 0000H ;中斷向量表
LJMP MAIN
ORG 0023H
LJMP UART1 ;UART1 RECEIVED INTERRUPT
ORG 0043H
LJMP UART2 ;UART2 RECEIVED INTERRUPT
ORG 0100H
MAIN:
MOV AUXR, #11111100B ;T0X12,T1X12,UART_M0X6,BRTRUN,S2SMOD,BRTX12,EXTRAM,S1BRS(IF 0 USE T1. 1=USE BRT)
MOV TMOD, #00100010B ;TIMER0, TIMER1 AS MOD2(8 BYTE AUTO RELOAD TIMER)
;GATE, C/T,M1,M0(T1) GATE, C/T,M1,MO(T0
MOV PCON, #10000000B ;THIS DOUBLE THE BRT AND T0 T1 RATE
LCALL INITIAL_UART1 ;USE T1 AS SERIAL BAUD GENERATE FOR UART1
LCALL INITIAL_UART2 ;USE BRT AS SERIAL BAUD GENERATE FOR UART2
SETB EA
TEST:
MOV R0, #HEADBUFFER
MOV R1, #HEADBUFFER
TEST1:
LCALL DELAY2 ;DELAY FOR JDY INIT
LCALL DELAY2
LCALL DELAY2
LCALL DELAY2
CLR P2.5 ;LED ON
LCALL RESET
LCALL DELAY2
LCALL VERSION
LCALL DELAY2
LCALL STAT
LCALL DELAY2
LCALL ROLE1
LCALL DELAY2
LCALL CLSSF0
LCALL DELAY2
LCALL BAUD6
LCALL DELAY2
LCALL INITIAL_UART2_38400
LCALL DELAY2
LCALL RESET
LCALL DELAY2
LCALL PAIR
LCALL DELAY2
LED:
MOV A, R0
XRL A, R1
JZ LED2
LEDDO: ; START DOING JOB HERE
MOVX A, @R0
LCALL SENTONEBYTE1
CJNE R0, #LASTBUFFER, NEXTSENT1
MOV R0, #HEADBUFFER
JMP NEXTSENT2
NEXTSENT1:
INC R0 ;POINT TO NEXT BUFFER
NEXTSENT2:
JMP LED
LED2:
;LCALL MARKZZ
LED3:
LCALL DELAY2
JMP LED3
INITIAL_UART1:
MOV SCON, #01000000B ;SET AS BAUD VERIABLE, NO ODD/EVEN CHECK SM0,SM1,SM2,REN,TB8,RB8,TI,RI
MOV TL1, #136 ;219(18M= 2usx16=32US) 226=38400 196=19200 136=9600
MOV TH1, #136
SETB TR1 ;RUN TIMER_1
;SETB PS ;SERIAL PORT PRORITY HIGH
SETB ES ;ENABLE UART1 INTERRUPT
RET
INITIAL_UART2:
MOV S2CON, #01010000B ;SET AS BAUD VERIABLE, NO ODD/EVEN CHECK S2SM0,S2SM1,S2SM2,S2REN,S2TB8,S2RB8,S2TI,S2RI
MOV BRT, #136 ;226=38400 136=9600
;MOV IP2, #01H ;UART INTERUUPT PARITY HIGH
MOV IE2, #01H ;ENABLE UART2 INTERRUPT
RET
INITIAL_UART2_38400:
MOV S2CON, #01010000B ;SET AS BAUD VERIABLE, NO ODD/EVEN CHECK S2SM0,S2SM1,S2SM2,S2REN,S2TB8,S2RB8,S2TI,S2RI
MOV BRT, #226 ;226=38400 136=9600
;MOV IP2, #01H ;UART INTERUUPT PARITY HIGH
MOV IE2, #01H ;ENABLE UART2 INTERRUPT
RET
SENTONEBYTE1:
PUSH ACC
PUSH PSW
CHECKBUSY1:
JB 40H, CHECKBUSY1
SETB 40H ;MARK BUSY BIT
MOV SBUF, A
POP PSW
POP ACC
RET
SENTONEBYTE2:
PUSH ACC
PUSH PSW
CHECKBUSY2:
JB 41H, CHECKBUSY2
SETB 41H ;MARK BUSY BIT
MOV S2BUF, A
POP PSW
POP ACC
RET
UART1:
;/*----------------------------
;UART1 INTERRUPT SERVICE ROUTINE
;----------------------------*/
PUSH ACC
PUSH PSW
JNB RI, UART1CHECKTI
MOV A, SBUF ;READ THE CHARACTER FROM THE SERIAL PORT
MOVX @R1, A
CJNE R1, #LASTBUFFER, NEXTB1
MOV R1, #HEADBUFFER
JMP NEXTB1A
NEXTB1:
INC R1
NEXTB1A:
CLR RI ;CLEAR RI BIT
JMP UART1EXIT
UART1CHECKTI:
CLR TI ;CLEAR TI BIT
CLR 40H ;CLEAR BUSY BIT
UART1EXIT:
POP PSW
POP ACC
RETI
UART2:
;/*----------------------------
;UART2 INTERRUPT SERVICE ROUTINE
;----------------------------*/
PUSH ACC
PUSH PSW
MOV A, S2CON ;READ UART2 CONTROL REGISTER
ANL A, #00000001B ;ANL, IF S2RI=0 THEN 0
JZ UART2CHECKTI
MOV A, S2BUF
MOVX @R1, A
CJNE R1, #LASTBUFFER, NEXTB2
MOV R1, #HEADBUFFER
JMP NEXTB2A
NEXTB2:
INC R1
NEXTB2A:
ANL S2CON, #11111110B ;CLEAR S2RI BIT
JMP UART2EXIT
UART2CHECKTI:
ANL S2CON, #11111101B ;CLEAR S2TI BIT
CLR 41H ;CLEAR BUSY BIT
UART2EXIT:
POP PSW
POP ACC
RETI
DELAY2:
MOV 72H, #255 ;
SLOWDOWN0:
MOV 71H, #255
SLOWDOWN:
MOV 73H, #11 ;
SLOWDOWN2:
DJNZ 73H, SLOWDOWN2
DJNZ 71H, SLOWDOWN
DJNZ 72H, SLOWDOWN0
RET
RESET:
MOV A ,#"A"
LCALL SENTONEBYTE2
MOV A ,#"T"
LCALL SENTONEBYTE2
MOV A ,#"+"
LCALL SENTONEBYTE2
MOV A ,#"R"
LCALL SENTONEBYTE2
MOV A ,#"E"
LCALL SENTONEBYTE2
MOV A ,#"S"
LCALL SENTONEBYTE2
MOV A ,#"E"
LCALL SENTONEBYTE2
MOV A ,#"T"
LCALL SENTONEBYTE2
MOV A ,#13
LCALL SENTONEBYTE2
MOV A ,#10
LCALL SENTONEBYTE2
RET
ROLE1:
MOV A ,#"A"
LCALL SENTONEBYTE2
MOV A ,#"T"
LCALL SENTONEBYTE2
MOV A ,#"+"
LCALL SENTONEBYTE2
MOV A ,#"R"
LCALL SENTONEBYTE2
MOV A ,#"O"
LCALL SENTONEBYTE2
MOV A ,#"L"
LCALL SENTONEBYTE2
MOV A ,#"E"
LCALL SENTONEBYTE2
MOV A ,#"1"
LCALL SENTONEBYTE2
MOV A ,#13
LCALL SENTONEBYTE2
MOV A ,#10
LCALL SENTONEBYTE2
RET
CLSSF0:
MOV A ,#"A"
LCALL SENTONEBYTE2
MOV A ,#"T"
LCALL SENTONEBYTE2
MOV A ,#"+"
LCALL SENTONEBYTE2
MOV A ,#"C"
LCALL SENTONEBYTE2
MOV A ,#"L"
LCALL SENTONEBYTE2
MOV A ,#"S"
LCALL SENTONEBYTE2
MOV A ,#"S"
LCALL SENTONEBYTE2
MOV A ,#"F"
LCALL SENTONEBYTE2
MOV A ,#"0"
LCALL SENTONEBYTE2
MOV A ,#13
LCALL SENTONEBYTE2
MOV A ,#10
LCALL SENTONEBYTE2
RET
BAUD6:
MOV A ,#"A"
LCALL SENTONEBYTE2
MOV A ,#"T"
LCALL SENTONEBYTE2
MOV A ,#"+"
LCALL SENTONEBYTE2
MOV A ,#"B"
LCALL SENTONEBYTE2
MOV A ,#"A"
LCALL SENTONEBYTE2
MOV A ,#"U"
LCALL SENTONEBYTE2
MOV A ,#"D"
LCALL SENTONEBYTE2
MOV A ,#"6"
LCALL SENTONEBYTE2
MOV A ,#13
LCALL SENTONEBYTE2
MOV A ,#10
LCALL SENTONEBYTE2
RET
CONN1:
MOV A ,#"A"
LCALL SENTONEBYTE2
MOV A ,#"T"
LCALL SENTONEBYTE2
MOV A ,#"+"
LCALL SENTONEBYTE2
MOV A ,#"C"
LCALL SENTONEBYTE2
MOV A ,#"0"
LCALL SENTONEBYTE2
MOV A ,#"N"
LCALL SENTONEBYTE2
MOV A ,#"N"
LCALL SENTONEBYTE2
MOV A ,#"1"
LCALL SENTONEBYTE2
MOV A ,#13
LCALL SENTONEBYTE2
MOV A ,#10
LCALL SENTONEBYTE2
RET
STAT:
MOV A ,#"A"
LCALL SENTONEBYTE2
MOV A ,#"T"
LCALL SENTONEBYTE2
MOV A ,#"+"
LCALL SENTONEBYTE2
MOV A ,#"S"
LCALL SENTONEBYTE2
MOV A ,#"T"
LCALL SENTONEBYTE2
MOV A ,#"A"
LCALL SENTONEBYTE2
MOV A ,#"T"
LCALL SENTONEBYTE2
MOV A ,#13
LCALL SENTONEBYTE2
MOV A ,#10
LCALL SENTONEBYTE2
RET
VERSION:
MOV A ,#"A"
LCALL SENTONEBYTE2
MOV A ,#"T"
LCALL SENTONEBYTE2
MOV A ,#"+"
LCALL SENTONEBYTE2
MOV A ,#"V"
LCALL SENTONEBYTE2
MOV A ,#"E"
LCALL SENTONEBYTE2
MOV A ,#"R"
LCALL SENTONEBYTE2
MOV A ,#"S"
LCALL SENTONEBYTE2
MOV A ,#"I"
LCALL SENTONEBYTE2
MOV A ,#"O"
LCALL SENTONEBYTE2
MOV A ,#"N"
LCALL SENTONEBYTE2
MOV A ,#13
LCALL SENTONEBYTE2
MOV A ,#10
LCALL SENTONEBYTE2
RET
PAIR:
CLR P1.4
LCALL DELAY2
LCALL DELAY2
LCALL DELAY2
LCALL DELAY2
LCALL DELAY2
LCALL DELAY2
LCALL DELAY2
LCALL DELAY2
SETB P1.4
LCALL DELAY2
RET
END
|