一、硬件原理图
![](https://img-blog.csdnimg.cn/direct/46860ad88ce94374bd88a30e8554be29.png)
二、功能说明
![](https://img-blog.csdnimg.cn/direct/534601584ea040159a0911e6bd043163.png)
DATA:
- :平时 DATA 脚为低电平
- :每发一个信号前必须要有一个同步头。
- :同步头为 8MS 高和 1MS 低组成。
- :数据 “0” : 0.5MS 高电平和 1.5MS 低电平组成。
- :数据 “1” : 1.5MS 高电平和 0.5MS 低电平组成。
- :先接收数据的最高位BIT7,在接收 N-1 位,最后接收数据的最低位BIT0。
PB0脚:
- :有声音时输出高电平,无声音输出低电平。
![](https://img-blog.csdnimg.cn/direct/a4b6aa3cb7524c6e993195cdf24837cf.png)
![](https://img-blog.csdnimg.cn/direct/56b1a8ee67b048d7861d9627921cd60a.png)
三、代码例程
MAIN.C
Voice_Config(); //语言初始化
VoiceSendData(0x18); //欢迎回家
VOICE.C
#include "voice.h"
#include "delay.h"
/*
PC4 VOICE_BUSY
PC5 VOICE_DATA
*/
void Voice_Config(void)
{
//开启GPIOC的时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
//定义结构体
GPIO_InitTypeDef GPIO_InitStruct;
// 配置连接到语音数据信号的引脚
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStruct.GPIO_Speed = GPIO_Fast_Speed;
GPIO_Init(GPIOC, &GPIO_InitStruct);
}
//同步头的时序
static void Data_Head(void)
{
GPIO_SetBits(GPIOC,GPIO_Pin_5);
Delay_ms(8);
GPIO_ResetBits(GPIOC,GPIO_Pin_5);
Delay_ms(1);
}
//数据0的时钟信号
static void Data_0(void)
{
GPIO_SetBits(GPIOC,GPIO_Pin_5);
Delay_us(500);
GPIO_ResetBits(GPIOC,GPIO_Pin_5);
Delay_us(1500);
}
//数据1的时钟信号
static void Data_1(void)
{
GPIO_SetBits(GPIOC,GPIO_Pin_5);
Delay_us(1500);
GPIO_ResetBits(GPIOC,GPIO_Pin_5);
Delay_us(500);
}
void VoiceSendData(uint8_t data)
{
Delay_ms(500);
Data_Head(); //同步头
for(char i = 0; i < 8; i++)
{
if((data & 0x80) == 0x80)
{
Data_1();
}
else
{
Data_0();
}
data<<=1;
}
GPIO_ResetBits(GPIOC,GPIO_Pin_5);
}
VOICE.H
#ifndef _VOICE_H_
#define _VOICE_H_
#include "stm32f4xx.h"
void Voice_Config(void);
void VoiceSendData(uint8_t data);
#endif