JQ8900语音模块组合播放

实现按下按键4播报当前时间实验

本次作业实践性较强,代码其实比较简单,在JQ8900压缩包中也有相应实例 ,重点在于理解串口发送的相关知识
下面展示一些 关键函数的代码。这些代码直接使用即可,关键在于理解函数之间调用的返回结果。

/************************************************************************
功能描述:播放处理函数
入口参数: 无
返 回 值: none
其他说明: 注意数组buffer大小,别指针溢出
**************************************************************************/
void PlayHandle(void)
{
	char str1;
	uint8_t buffer[20] = {0};
	uint8_t DatLen = 0,Pcount = 0;
	uint8_t *p_temp;

		
		buffer[0] = 11;		//语音:当前时间
		DatLen = 1;
		p_temp = &buffer[1];		//指针始终指向下一位
		
		Pcount = NumMakeUp(p_temp,mint);		//当前分
		p_temp += Pcount;				//地址递增
		DatLen += Pcount;				//数据长度
		*p_temp++ = 12;		//语音:分
		DatLen++;
		
		Pcount = NumMakeUp(p_temp,secd);		//当前秒
		p_temp += Pcount;				//地址递增
		DatLen += Pcount;
		*p_temp++ = 13;		//语音:秒
		DatLen++;
		
		
		JQ8x00_ZuHeBoFang(buffer,DatLen);			//送入语音模块播放
		
}
/************************************************************************
功能描述:组合播报函数
入口参数: 	*DAT:字符串指针,Len字符串长度
返 回 值: none
其他说明: 将需要播报的文件名放入数组中作为形参即可
**************************************************************************/
void  JQ8x00_ZuHeBoFang(uint8_t *DATA,uint8_t Len)
{
	uint8_t CRC_data=0,i = 3;
	uint8_t Buffer[ZH_MAX] ={0xaa,0x1b};
	Buffer[2] = Len*2;			//计算长度
	CRC_data = CRC_data + 0xaa + 0x1b + Buffer[2];
	while(Len--)
	{
		Buffer[i] = *DATA/10+0x30;			//取出十位
		CRC_data = CRC_data + Buffer[i];
		i++;
		Buffer[i] = *DATA%10+0x30;			//取出个位
		CRC_data = CRC_data + Buffer[i];
		i++;
		DATA++;
	}
	Buffer[i] = CRC_data;
	i++;
	#if JQ8x00_BusyCheck
	while(JQ8x00_BUSY_Read);				//忙检测
	#endif
	
	JQ8x00_UART(Buffer,i);
}
/************************************************************************
功能描述:数字组合
入口参数: 无
返 回 值: none
其他说明: *p为换成数组,dat为要组合的数据
**************************************************************************/
uint8_t NumMakeUp(uint8_t *p,uint8_t dat)
{
	uint8_t count = 0;
	
	if(dat == 0)
	{
		*p++ = 14;			//语音:0
		count = 1;
	}
	if(dat <= 9)		//时
	{
		*p++ = dat;
		count = 1;
	}
	else if(dat <= 19)
	{
		if(dat%10 == 0)			//如果是10的倍数
		{
			*p++ = dat/10;
			*p++ = 10;					//语音:十
		}
		else
		{
			*p++ = 10;					//语音:十
			*p++ = dat%10;		
		}
		count = 2;		
	}
	else if(dat <= 99)
	{
		if(dat%10 == 0)			//如果是10的倍数
		{
			*p++ = dat/10;
			*p++ = 10;					//语音:十
			count = 2;
		}
		else
		{
			*p++ = dat/10;
			*p++ = 10;					//语音:十
			*p++ = dat%10;
			count = 3;		
		}				
	}
	return count;	
}


至于调用只需要在主函数中识别按键当按下按键4的时候调用处理的函数即可

if(keyValue==4){
			PORTF=0;
			PlayHandle();
		}

在实验中有可能会遇到很多问题,如果遇到问题也可以通过发送一个你指定的内容,进行判断是哪部分出现了问题。
例如在语音播放模块里的事例中给出的组合播放01,02号文件可通过写指定的串口指令再直接传入所需要判断对错的函数进行检查。

uint8_t Buffer[ZH_MAX]={0xAA,0x1B,0x04,0x30,0x31,0x30,0x32,0x8C};
JQ8x00_UART(Buffer,8);
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值