stm32通过 一线串口通信控制JQ8900-16P语音模块

本文介绍了如何使用STM32F10x单片机与JQ8900-16P语音模块进行一线串口通信,包括GPIO配置、数据发送函数SendData以及使用自定义延时函数delay_us来确保正确时序。
摘要由CSDN通过智能技术生成

今天玩玩语音模块,用到了所谓的一线串口通信(就是用一个IO口发脉冲)不说了,上代码

JQ8900-16P语音模块资料自取:链接:https://pan.baidu.com/s/1O3P1Ro4Rc4cVMACuJVdqaA   提取码:1u4p 

接线:

      模块——————————单片机

ONE LINE—————————PB11

DC-5V———————————5V

GND———————————GND
————————————————

OneUart.c文件
 
 
#include "OneUart.h"
#include "delay.h"
#include "stm32f10x.h"
 
///
//函	  OnUart_GPIO(void)
//功	  能:语音模块一线串口IO口
//输入参数: void
//输出参数: void
//说	  明:
//
void OnUart_GPIO(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
 
		RCC->APB2ENR|=1<<3;   //GPIOB
		
		//GPIOB.11
		GPIOB->CRH&=0xFFFF0FFF;     //清零 
		GPIOB->CRH|=0x00003000;     //推挽输出	50MHZ
		GPIOB->ODR=~(1<<11);        //B.11低	
 
	
}
///
//函	  数:SendData(u8 addr)
//功	  能:语音模块一线串口
//输入参数: addr要发送的0x数
//输出参数: void
//说	  明:
//
void SendData ( u8 addr )//发送函数。
{
    u8 i;
 
     /*发送时关掉中断,防止中断影响时序  */
    SDA = 1; /*开始拉高*/
    delay_us ( 1000 );
    SDA = 0; /*开始引导码*/
    delay_us ( 3200 );/*此处延时最少要大于2ms*/
    for ( i = 0; i < 8; i++ ) /*总共8位数据  */
    {
        SDA = 1;
        if ( addr & 0x01 ) /*3:1表示数据位1,每个位用两个脉冲表示  */
        {
            delay_us ( 600 );
            SDA = 0;
            delay_us ( 200 );
        }
        else              /*1:3表示数据位0 ,每个位用两个脉冲表示  */
        {
            delay_us ( 200 );
            SDA = 0;
            delay_us ( 600 );
        }
        addr >>= 1;
    }
    SDA = 1;
    
		//恢复中断
}
.h文件
 
#ifndef __ONEUART_H
#define __ONEUART_H
 
#include "sys.h"
 
#define SDA PBout(11)
 
void SendData ( u8 addr );    //发送函数。
void OnUart_GPIO(void);       //GPIO
 
#endif
 
 
main文件
 
 
#include "stm32f10x.h"
#include "delay.h"
#include "OneUart.h"
 
 
 
 
int main(void)
{
	OnUart_GPIO();
	delay_init();
  while(1)
	{
		//发送0x013
		SendData(0x0a);    //清空数字
		SendData(0x01);    //曲目号
		SendData(0x03);
		SendData(0x0b);    //选曲播放
		delay_ms(2000);    //延时
		
		//发送0x01
		SendData(0x0a);
		SendData(0x01);
		SendData(0x0b);
		delay_ms(2000);
		
		//发送0x07
		SendData(0x0a);
		SendData(0x07);
		SendData(0x0b);
		delay_ms(2000);
		
		//发送0x03
		SendData(0x0a);
		SendData(0x03);
		SendData(0x0b);
		delay_ms(2000);
 
	}
		
 
}

 在网上找了很多的延时函数,终于找到了一个达到要求的

delay_us延时函数
 
 
///
//函	  数:delay_us(u6)
//功	  能:us延时函数
//输入参数:u16 nTimer(延时时间)
//输出参数:void
//说    明:__NOP()【用__NOP()函数延时 72次】
//
void delay_us(u32 nTimer)
{
	u32 i=0;
	for(i=0;i<nTimer;i++){
		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
		__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
	}
}

  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值