最近在家无聊做东西玩,要用一个模块驱动喇叭放提示音,一开始买的是WT588DM01图的就是自带8M Flash省心,结果TM还要另外买30几块钱的烧写器才能用。
后来又咬咬牙买了个JQ6500语音模块,插USB连电脑就能烧写mp3进去,果然还是深圳厂商洞察需求。
买是买来了,但是厂家配的资料还分3个版本,PCB外观都改了,PDF没更新,只好自己捣鼓,按着参考资料用个51试试手。
这是PDF里面的模块外面图,实际买来的长下面的样子
芯片是24脚,模块16脚。引出来的16个脚没变,就是模块PCB板上面有略微变化,但是不影响对模块引出来的16个脚直接使用。
模块接线原理图,SPK+和SPK-实测可以直接接无源蜂鸣器。
单片机源程序如下:
- #include <reg51.h>//头文件
- #include <intrins.h>
- /*
- 本模块的第九脚也就是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<len;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(实测),不然会没反应。
顺手画了AD 的原理图库和PCB库
JQ6500原理图库和PCB库.zip
(544.78 KB, 下载次数: 66)
|