实现按下按键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);