如何利用單片機的串口(RS485)控制音樂模塊播放(求助貼)
初學單片機,單片機是天祥TC-1C(STC89C52),本人用USB轉串口,連接音樂模塊(DMK01FS)的RS485通訊口,按照MODBUS通訊協議,發送01 06 00 03 00 01,可以正常播放(指定曲目播放)。
01:是下位機地址,就是音樂模塊的地址
06:功能碼,表示寫指令
0x03(00 03):是指定曲目播放暫存器,往這兒寫曲目代號即可
0001:表示1#曲目(同理2#、3#......)
如圖所示


好接下來,我用TX-1C的 RS232串口,通過 RS232轉RS485口連接音樂模塊,如圖所示:

在單片機中下載一段程式,內容是當S2按下,向串口發送一串字符(01 06 00 03 00 01)或者(01 06 00 03 00 01 B8 0A)B0 0A是模擬MODBUS除錯助手發送01 06 00 03 00 01指令時,自己添加的校驗。
通電,按動S2,在串口除錯助手上顯示如圖:

上圖接收區指令表明,和MODBUS除錯助手收到的字串一樣,音樂模塊沒反應。謝謝高手指教!!!!
C程式(天祥電子提供):
/**********************************************************
“天祥電子” 傾情奉獻
www.txmcu.com
www.txmcu.cn
**********************************************************
函式功能:往串口發送一位元組資料(可通過超級終端或者串口除錯助手顯示出來,
超級終端波特率選為9600)。
超級終端設定好后,每按下一次S2鍵,松開后均會在超級終端
上顯示一串字母"abcdefg哈哈"。
入口引數:d: 要發送的位元組資料。
**********************************************************/
#include <reg52.h>
#define jingzhen 11059200UL /*使用22.1184M晶體*/
#define botelv 9600UL /*波特率定義為9600*/
unsigned char zifuchuan[]="01 06 00 03 00 01 B8 0A"; //待顯示字符。
volatile unsigned char sending;
sbit s2=P3^4;
void delay(unsigned char i)
{
unsigned char j,k;
for(j=i;j>0;j--)
for(k=90;k>0;k--);
}
void init(void) //串口初始化
{
EA=0; //暫時關閉中斷
TMOD&=0x0F; //定時器1模式控制在高4位
TMOD|=0x20; //定時器1作業在模式2,自動重裝模式
SCON=0x50; //串口作業在模式1
TH1=256-jingzhen/(botelv*12*16); //計算定時器重裝值
TL1=256-jingzhen/(botelv*12*16);
PCON|=0x80; //串口波特率加倍
ES=1; //串行中斷允許
TR1=1; //啟動定時器1
REN=1; //允許接收
EA=1; //允許中斷
}
void send(unsigned char d) //發送一個位元組的資料,形參d即為待發送資料。
{
SBUF=d; //將資料寫入到串口緩沖
sending=1; //設定發送標志
while(sending); //等待發送完畢
}
void sendc(unsigned char * pd)
{
while((*pd)!='\0') //發送字串,直到遇到0才結束
{
send(*pd); //發送一個字符
pd++; //移動到下一個字符
}
}
void main()
{
init();
while(1)
{
if(s2==0)
{
delay(20);
if(!s2)
{
while(!s2);
sendc(zifuchuan);
}
}
}
}
void uart(void) interrupt 4 //串口發送中斷
{
if(RI) //收到資料
{
RI=0; //清中斷請求
}
else //發送完一位元組資料
{
TI=0;
sending=0; //清正在發送標志
}
}
uj5u.com熱心網友回復:
你把USB485也并上,在電腦上收一下資料看看單片機發出來的資料對不對,很多自動切換收發的232轉485并不好用uj5u.com熱心網友回復:
謝謝樓上兄弟,感覺您的思路正確,馬上動手,為了更準確,這次我沒有接音樂模塊,單片機學習板-RS232串口 接“網購232轉485”用雙絞線接“RS485轉USB”回傳電腦USB。單片機送電,打開串口除錯助手,按下單片機上S2(觸發),串口除錯助手的接識訓沖區有“01 06 00 03 00 01 B8 0A ”資料,說明單片機正確發出了指令,問題還有可能在哪兒呢?再次感謝樓上的回復!!
uj5u.com熱心網友回復:
謝謝樓上的回復,我再問一下,我的方法(思路)是正確的吧,就是說,我只要單片機經RS485介面,向音樂模塊發送“01 06 00 03 00 01”字串,音樂模塊就應該播放?uj5u.com熱心網友回復:
unsigned char zifuchuan[]={0x01,0x06,0x00,0x03,0x00,0x01,0xB8,0x0A}; //待顯示字符。才看到,你發出的是字串。你需要直接發這8個位元組資料。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/230477.html
標籤:新手樂園
下一篇:洗掉數字
