久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5755|回復: 9
打印 上一主題 下一主題
收起左側

制作一個藍牙模塊設置器 附單片機代碼

  [復制鏈接]
跳轉到指定樓層
樓主
從開始學單片機到現在,我買了整十種藍牙模塊來試,開始的HC-05算是入門,其設置非常麻煩,配對要很多過程,而且傳送距離很短,后來還買了JDY-08,配對是比較簡單了,但發現配對后發出的數據若含有“AT”會被吃掉,顯然是藍牙內部軟件有蟲,接著還買了很多其他款來試,才發現有些只有從機,沒有主機,而其他型號的主機不能與之配對,折騰了好久這才找到一款小公司生產的,從機和主機是分開的,而且能一鍵配對,非常滿意,價錢稍貴無所謂,但擔心有一天他們忽然說不賣了,那麻煩就大了,得找個后備輪胎,找呀找就意外找到了一款很普通的JDY-18,是主從一體機,在其說明書里有說能一鍵配對,但必須先設定參數,買回來后經過手工設定還行,但每次要設定一個模塊都要再翻看說明書,很麻煩花時間,于是就想用單片制作一個設定器,把設置命令都寫在里面,把模塊插上主板后一開電,就自動設置好了。

剛好我的有十來片廢棄不用的STC12LE5A60S2板子,有UART1和UART2的插座,非常合用,于是這事就搞成了:



軟件是從已有的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




評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:328014 發表于 2020-11-5 17:14 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

板凳
ID:283954 發表于 2020-11-13 01:02 | 只看該作者
除了藍牙模塊之外,我也買過2.4G的無線模塊來玩,2.4G的模塊的老祖宗是一塊叫NRF24L01的晶片,原廠家是挪威公司,價錢很高,后來被仿制,價錢掉了10倍,也因此獲得普及,其內部原理之一是收到信號后會回應ACK,若CRC有錯會要求重發,重發的次數還可以設定,這就保證了信號的可靠性,但其收發流程非常復雜,非一般初學者能掌握,兩三年前才有國內公司配上一個MCU把這一過程簡化成串口界面的模塊,用起來很簡單,銷售量很不錯,我也買了50片支持一下,再后來又出現了內部集成了NRF24L01和MCU的單個晶片,價錢掉到5人民幣,代表模塊是LC-12S,我也買了50片來儲存,并做過測試,用來傳送MIDI信號,相當可靠。最近上網一看,已經有很多公司在售賣類似LC-12S的模塊,一款叫JDY-40的才賣3人民幣,不能再低了!效果如何得測試一下,我因為已經有了藍牙模塊設置器,稍微更改軟件就很容易用來設定LC-12S和JDY-40.

LC-12S的設定是發一組18字節的碼,一次過設定所有參數:
主機發送:AA5A22331122000000040064000000120006 ;RF發射功率:12dbm;串口速率:9600bps;RF信道:100;模塊ID:0x2233;和校驗字節:06

如果參數有效,校驗字節也對,模塊就會回應:

返回數據:AA5B22331122000000040064000000120007
說真的,這樣的設定方式不好用,但用單片機程序來設定還是可行。

JDY-40的設定是AT式的,AT其實是ATTENTION的意思,就是注意啦!命令有:
AT+BAUD,AT+CLSS,AT+RFC等等,都寫了副程式,LCALL一下都能響應,不過每個命令之間要DELAY一下,讓模塊有時間回應。
說明書有注明BAUD波特率有1-7,BAUD6是19200BPS,但BAUD7沒有注明,推測應該是38400,因為LC-12S有38400,這模塊也應該有,于是就向模塊發出AT+BAUD7,看看有什么回應,哈!無回應,再發出其他AT命令,啞巴了!關電再試也無反應。很不甘心,焊多一片再試,所有命令都正常回應,直到發出AT+BAUD7, 模塊就一命嗚呼了。還好我有第三片JDY-40,不然我的編程工作就停止了。





2.4G模塊便宜,但選用前要小心測試哈。







回復

使用道具 舉報

地板
ID:283954 發表于 2020-11-16 03:20 | 只看該作者
前文說有兩片JDY-40已經陣亡了,后來想起過去玩過一些模塊的經驗,有的模塊設定新的波特率后,設定的串口必須即刻轉去新的波特率,否則就失聯了,可能這JDY-40也是如此。經過試驗,果然如此。問題在于說明書沒有提到這點。而LC-12S就清楚說,設定時波特率一定是9600。

這兩個模式是那一種好呢?顯然是LC-12S固定的波特率好,就如這次經驗,JDY-40會失聯,那么JDY-40有沒有38400的波特率呢?沒有,最高是19200,同樣的芯片為何LC-12S能做到38400呢?顯然是原創者的功力略勝一籌。

接下來是進行傳輸試驗。LC-12S在38400下隔著兩道墻還能可靠傳輸,顯然是物有所值。

2.4G模塊與藍牙相比,好處是傳輸延時很短,在1-2MS之間,而藍牙的延時是30MS上下,用來傳輸MIDI信號,從彈奏到聽到聲音的時間延遲,比較優秀的演奏者都能聽出來。但藍牙的配對功能是很出色的,有沒有可能讓2.4G的模塊也能自動配對呢?現在很通用的無線老鼠和鍵盤也是2.4G,一旦接收器丟了,就全部不能用了。

看看LC-12S的發射到接收的延遲圖:





回復

使用道具 舉報

5#
ID:219315 發表于 2020-11-16 12:21 | 只看該作者
現在還有人在用匯編編程,真是稀有啊!
回復

使用道具 舉報

6#
ID:311846 發表于 2020-11-16 13:54 | 只看該作者
匯編大佬上線,很少遇到了
回復

使用道具 舉報

7#
ID:283954 發表于 2020-12-4 02:53 | 只看該作者



這是我從許多藍牙模塊中,選到最適合我用的型號,模塊分為主模塊與從模塊,外形一模一樣,要是搞混了就無法知道是主是從了,主模塊無需AT指令設定波特率,而是用接腳接地來選擇,從模塊則使用AT設定,由于沒有針孔,必須自己設計轉接板將需要的接腳引出,自己焊接后10片有1片會失敗,但無所謂,主從配對非常容易,在主模塊按下鈕馬上連上,所以是我最喜歡的模塊,但每次設定總就是無法記得命令的格式,也需要制作一個專門的藍牙設置器。

AT指令說明:
AT指令必須在藍牙模塊未連接的狀態下才有用,在未連接狀態下,帶有AT開頭的數據包會被默認為AT指令并被解析,返回處理結果;連接上之后,只會做數據轉發,不解析數據。

1、測試命令命令格式:
AT\r返回值:OK\r內容:發送AT測試指令,返回值OK表示模塊AT指令測試成功。

3、串口通訊波特率操作命令命令格式:
AT+BAUD=19200\r返回值:OK\rERROR\r內容:重新修改模塊通訊的串口波特率為19200bps,返回OK提示已經修改成功,返回ERROR則表示新串口波特率修改失敗,原因可能是設定值格式不對或者不支持該波特率。命令格式:AT+BAUD?\r返回值:19200\r內容:查詢當前模塊的串口通訊波特率,模塊返回當前設置的波特率19200bps。

注:模塊默認串口波特率為9600bps。每次設定新波特率后必須跟著改變串口的波特率,否則失聯。從模塊的S接腳使用時必須接高電位,空置偶爾會失效。

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

8#
ID:853787 發表于 2020-12-4 10:18 | 只看該作者
我要學習匯編
回復

使用道具 舉報

9#
ID:200118 發表于 2021-2-14 23:46 | 只看該作者
匯編語言也不錯。。。
回復

使用道具 舉報

10#
ID:611078 發表于 2021-2-15 18:28 | 只看該作者
本人剛學單片機,也是從匯編開始的,后來學了C以后,再看匯編,就變成看天書了。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天操天天舔 | 国产日韩精品在线 | 国产精品国产精品国产专区不片 | 久久久91精品国产一区二区精品 | 欧美一区日韩一区 | 婷婷桃色网 | 偷拍亚洲色图 | 国产精品美女久久久 | 国产精品一区二区不卡 | 国产精品亚洲精品日韩已方 | 久久精品91 | 国产午夜精品一区二区三区嫩草 | 欧美午夜影院 | 久久成人综合 | 欧美啊v在线观看 | 天天操天天射天天舔 | 中文字幕 欧美 日韩 | 亚洲第一免费播放区 | 91精品国产一区二区在线观看 | 91精品国产乱码久久久久久久久 | 91精品国产91久久久久久三级 | 2018天天干天天操 | 午夜视频一区 | jⅰzz亚洲 | 欧美一区二区三区一在线观看 | 午夜精品视频一区 | 免费视频一区 | av在线一区二区 | 男女午夜激情视频 | 免费黄色录像视频 | 久久国产精彩视频 | 中文字幕一区二区在线观看 | 国产精品久久亚洲 | 国产精品久久久久久久久久久免费看 | 国产精品久久久久久久久久久免费看 | 99riav国产一区二区三区 | 免费一区| 不卡一区二区三区四区 | 亚洲国产成人精 | 久久久久国产精品一区三寸 | 精品国产一二三区 |