最近在家无聊做东西玩,要用一个模块驱动喇叭放提示音,一开始买的是WT588DM01图的就是自带8M Flash省心,结果TM还要另外买30几块钱的烧写器才能用。
后来又咬咬牙买了个JQ6500语音模块,插USB连电脑就能烧写mp3进去,果然还是深圳厂商洞察需求。
买是买来了,但是厂家配的资料还分3个版本,PCB外观都改了,PDF没更新,只好自己捣鼓,按着参考资料用个51试试手。
这是PDF里面的模块外面图,实际买来的长下面的样子
芯片是24脚,模块16脚。引出来的16个脚没变,就是模块PCB板上面有略微变化,但是不影响对模块引出来的16个脚直接使用。
模块接线原理图,SPK+和SPK-实测可以直接接无源蜂鸣器。
单片机源程序如下:
#include
#include
/*
本模块的第九脚也就是RX脚连接到单片机的P3^1
第十脚也就是TX脚连接到单片机的P3^0(如果你不处理本模块返回的数据可以不连接)
同时本模块和单片机还要共地急GND连接GND
本模块五伏供电也可以直接由单片机上的电源供电
*/
typedef unsigned char uint8;
typedef unsigned int uint16;
sbit KEY1=P3^2;//第一曲键
sbit KEY2=P3^3;//第一曲循环键
sbit KEY3=P3^4;//暂停键
sbit KEY4=P3^5;//进入睡眠键
uint8 First[]={0x7E,0x04,0x03,0x00,0X01,0xEF};//第一曲指令
uint8 Next[]={0x7E,0x03,0x11,0x01,0xEF}; // 第一首循环
uint8 Add[]={0x7E ,0x02, 0x0E, 0xEF}; // 0x0e暂停
uint8 Sub[]={0x7E ,0x02 ,0x0A, 0xEF}; // 0x0a进入睡眠
void delay150ms(void) //误差 -0.000000000047us
{
unsigned char a,b,c;
for(c=6;c>0;c--)
for(b=52;b>0;b--)
for(a=220;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
/*
* UART初始化
* 波特率:9600
*/
void UART_init(void)
{
SCON = 0x50; // 10位uart,允许串行接受
TMOD = 0x20; // 定时器1工作在方式2(自动重装) 0010 0000
TH1 = 0xFD;
TL1 = 0xFD; //设置波特率为9600
TR1 = 1;
}
/*
* UART 发送一字节
入口参数uint8的数据类型 即要发送的数据
*/
void UART_send_byte(uint8 dat)
{
SBUF = dat;
while (TI == 0);
TI = 0;
}
/*
* UART 发送字符串
第一个参数要发送字符串或数据的首地址
第二个参数是要发送的数据或字符串的长度
*/
void UART_send_string(uint8 *buf,uint8 len)
{ uint8 i;
for(i=0;i
UART_send_byte(*buf++);
}
main()
{
UART_init();//串口初始化
while (1) //一个大循环一直在检测按键和发送指令
{ if(KEY1==0)//如果第一个键被按下播放第一段
{ while(!KEY1);//等待按键松开
UART_send_string(First,6);
}
else if(KEY2==0)//如果第二个按键按下循环第一曲
{ while(!KEY2);//等待按键松开
UART_send_string(Next,5);
delay150ms(); //经测试,两个指令之间延时150ms效果最好
UART_send_string(First,6);
}
else if(KEY3==0)//如果第三个按键按下暂停播放
{ while(!KEY3);//等待按键松开
UART_send_string(Add,4);
}
else if(KEY4==0)//如果第四个按键按下进入睡眠状态
{ while(!KEY4);//等待按键松开
UART_send_string(Sub,4);
}
}
}
用到了四个按键,还有一个串口,每检测到一个按键的按下就利用单片机给模块JQ6500发串口指令,两个指令之间不少于150ms(实测),不然会没反应。
关键字:单片机 JQ6500 语音模块『本文转载自网络,版权归原作者所有,如有侵权请联系删除』