赞
踩
2019 宏晶杯单片机比赛 光源追踪器
2019 传感器原理与应用课程大作业 转盘测速仪
voice.h
:
#ifndef __VOICE_H #define __VOICE_H #include "15W4KxxS4.H" #include "delay.h" #include "uart.h" #define Voice_UART4 1 //编译开关 使用串口通信 #define Voice_OneLine 0 //编译开关 使用OneLine通信 sbit Voice_Busy = P0^4; //语音模块忙碌 extern unsigned char Voice_Volume; #if(Voice_UART4) //管脚定义 //相关宏定义 //函数声明 void Voice_Uart4_Init(); void Voice_Uart4_Play_Single(unsigned int index); void Voice_Uart4_Play_Comb(unsigned char *Str); void VOICE_UART4_playSpeed(unsigned char *Str); #endif #if(Voice_OneLine) // 管脚定义 sbit VOICE_ONELINE = P0^0; // 相关宏定义 #define VOICE_ONELINE_Set() VOICE_ONELINE = 1 #define VOICE_ONELINE_Clear() VOICE_ONELINE = 0 // 函数声明 void Oneline_Send_Byte(unsigned char send_byte); void Voice_Play_Audio(unsigned char audio_index); void Voice_Play_Single(); #endif #endif
voice.c
:
// 文 件 名 : voice.c // 说明: // ---------------------------------------------------------------- // 注意ONELINE发送数据时,先发送低位 // ---------------------------------------------------------------- #include "voice.h" unsigned char Voice_Volume = 20; #if(Voice_UART4) void Voice_Uart4_Init() { UART4_Init(2, 9600); INT_CLKO |= 0x30; //xx11 xxxx 允许外部中断3,下降沿触发 允许外部中断2,下降沿触发 // 音量设为20级 UART4_PutChar(0xAA); //指令码 UART4_PutChar(0x13); //指令类型 UART4_PutChar(0x01); UART4_PutChar(0x14); UART4_PutChar(0xD2); } void Voice_Uart4_Play_Single(unsigned int index) { UART4_PutChar(0xAA); //指令码 UART4_PutChar(0x07); //指令类型 UART4_PutChar(0x02); //指令中数据部分字节数 UART4_PutChar((unsigned char)(index>>8)); //所播曲目索引的高八位 UART4_PutChar((unsigned char)index); //所播曲目索引的低八位 UART4_PutChar((unsigned char)(0xAA+0x07+0x02+(index>>8)+index));//之前所有字节的和校验 } /*组合播放-转速*/ void VOICE_UART4_playSpeed(unsigned char *Str){ unsigned char sum = 0x00; UART4_PutChar(0xAA);//指令码 UART4_PutChar(0x1B);//指令类型 UART4_PutChar(0x10); sum = 0xAA+0x1B+0x10+'S'+'D'+'2'+'1'+'0'+'D'+'D'+'0'+'0'+'R'+'P'; UART4_PutChar('S');UART4_PutChar('D'); UART4_PutChar('2'); sum += *Str;UART4_PutChar(*Str++); UART4_PutChar('1'); sum += *Str;UART4_PutChar(*Str++); UART4_PutChar('0'); sum += *Str;UART4_PutChar(*Str++); UART4_PutChar('D'); UART4_PutChar('D'); UART4_PutChar('0'); sum += *Str;UART4_PutChar(*Str++); UART4_PutChar('0'); sum += *Str;UART4_PutChar(*Str++); UART4_PutChar('R'); UART4_PutChar('P'); UART4_PutChar(sum); } void Voice_Uart4_Play_Comb(unsigned char *Str){ unsigned char *p = Str; unsigned char sum = 0x00; UART4_PutChar(0xAA);//指令码 UART4_PutChar(0x1B);//指令类型 UART4_PutChar(0x1E);//AX;xx;xx;xx;DU;AY;xx;xx;xx;DU;JL;xx;xx;xx;CM 共30个字节 sum = 0xAA+0x1B+0x1E +'A'+'X'+'2'+'1'+'0'+'D'+'U'+'A'+'Y'+'2'+'1'+'0'+'D'+'U'+'J'+'L'+'2'+'1'+'0'+'C'+'M'; UART4_PutChar('A'); UART4_PutChar('X'); UART4_PutChar('2'); sum += *Str; UART4_PutChar(*Str++); UART4_PutChar('1'); sum += *Str; UART4_PutChar(*Str++); UART4_PutChar('0'); sum += *Str; UART4_PutChar(*Str++); UART4_PutChar('D'); UART4_PutChar('U'); UART4_PutChar('A'); UART4_PutChar('Y'); UART4_PutChar('2'); sum += *Str; UART4_PutChar(*Str++); UART4_PutChar('1'); sum += *Str; UART4_PutChar(*Str++); UART4_PutChar('0'); sum += *Str; UART4_PutChar(*Str++); UART4_PutChar('D'); UART4_PutChar('U'); UART4_PutChar('J'); UART4_PutChar('L'); UART4_PutChar('2'); sum += *Str; UART4_PutChar(*Str++); UART4_PutChar('1'); sum += *Str; UART4_PutChar(*Str++); UART4_PutChar('0'); sum += *Str; UART4_PutChar(*Str++); UART4_PutChar('C'); UART4_PutChar('M'); UART4_PutChar(sum); } void Volume_Increase_Int() interrupt 11 {//音量增 使用~INT3 UART4_PutChar(0xAA); //指令码 UART4_PutChar(0x14); //指令类型 UART4_PutChar(0x00); UART4_PutChar(0xBE); if(Voice_Volume < 30) { Voice_Volume++; } } void Volume_Reduce_Int() interrupt 10 {//音量减 使用~INT2 UART4_PutChar(0xAA); //指令码 UART4_PutChar(0x15); //指令类型 UART4_PutChar(0x00); UART4_PutChar(0xBF); if (Voice_Volume > 0) { Voice_Volume--; } } #endif #if(Voice_OneLine) void Oneline_Send_0() { VOICE_ONELINE_Set(); delay_10us(40); VOICE_ONELINE_Clear(); delay_10us(120); } void Oneline_Send_1() { VOICE_ONELINE_Set(); delay_10us(120); VOICE_ONELINE_Clear(); delay_10us(40); } void Oneline_Send_Byte(unsigned char send_byte) { unsigned char i; VOICE_ONELINE_Set(); delay_1ms(10); VOICE_ONELINE_Clear(); delay_1ms(2); for (i = 0; i < 8; i++) { if ((send_byte & 0x01) == 0x01) { Oneline_Send_1(); } else { Oneline_Send_0(); } send_byte = send_byte >> 1; } VOICE_ONELINE_Set(); } void Voice_Volume_Increase() { } void Voice_Volume_Reduce() { } void Voice_Play_Audio(unsigned char audio_index) { unsigned char num_bit_arr[3] = {0}; char num_bit_count = 2; unsigned char num; bit flag = 0; // 非零最高位捕获标识 num = audio_index; num_bit_arr[2] = num / 100; num %= 100; num_bit_arr[1] = num / 10; num %= 10; num_bit_arr[0] = num; Oneline_Send_Byte(0x0A); for (num_bit_count = 2; num_bit_count >= 0; num_bit_count--) { if (num_bit_arr[num_bit_count] != 0) { flag = 1; Oneline_Send_Byte(num_bit_arr[num_bit_count]); } else if (flag == 1) { Oneline_Send_Byte(num_bit_arr[num_bit_count]); } else { ; } } Oneline_Send_Byte(0x0B); } void Voice_Play_Start() { Oneline_Send_Byte(0x11); } #endif
voice.h
:
#ifndef __VOICE_H #define __VOICE_H #include "15W4KxxS4.H" #include "delay.h" #include "uart.h" #define VOICE_UART4 1 //编译开关 使用串口通信 #define VOICE_OneLine 0 //编译开关 使用OneLine通信 sbit VOICE_Busy = P0^4; //语音模块忙碌 extern unsigned char VOICE_Var_Volume; /*串口模式*/ #if(VOICE_UART4) void VOICE_UART4_init(); void VOICE_UART4_playSingle(unsigned int index); void VOICE_UART4_playComb(unsigned char *Str); void VOICE_UART4_playSpeed(unsigned char *Str); void VOICE_UART4_playAngle(unsigned char *Str, unsigned char flag); void VOICE_UART4_playAll(unsigned char *Str); #endif /*one_line模式*/ #if(VOICE_OneLine) sbit VOICE_ONELINE = P0^0; #define VOICE_ONELINE_Set() VOICE_ONELINE = 1 #define VOICE_ONELINE_Clear() VOICE_ONELINE = 0 void Oneline_Send_Byte(unsigned char send_byte); void VOICE_Play_Audio(unsigned char audio_index); void VOICE_Play_Single(); #endif #endif
voice.c
:
// 文 件 名 : VOICE.c // 说明: // ---------------------------------------------------------------- // 注意ONELINE发送数据时,先发送低位 // ---------------------------------------------------------------- #include "voice.h" unsigned char VOICE_Volume = 20; #if(VOICE_UART4) /*语音模块初始化,使用串口4,波特率9600*/ void VOICE_UART4_init() { UART4_Init(2, 9600); INT_CLKO |= 0x30; //xx11 xxxx 允许外部中断3,下降沿触发 允许外部中断2,下降沿触发 // 音量设为31级 UART4_PutChar(0xAA); //指令码 UART4_PutChar(0x13); //指令类型 UART4_PutChar(0x01); UART4_PutChar(0x1D); UART4_PutChar(0xAA+0x13+0x01+0x1D); } /*播放单曲*/ void VOICE_UART4_playSingle(unsigned int index) { UART4_PutChar(0xAA); //指令码 UART4_PutChar(0x07); //指令类型 UART4_PutChar(0x02); //指令中数据部分字节数 UART4_PutChar((unsigned char)(index>>8)); //所播曲目索引的高八位 UART4_PutChar((unsigned char)index); //所播曲目索引的低八位 UART4_PutChar((unsigned char)(0xAA+0x07+0x02+(index>>8)+index));//之前所有字节的和校验 } // 语音模块命名,得用小写字母,但是串口索引时需要大写字母 /*组合播放-旋转方向及速度*/ void VOICE_UART4_playSpeed(unsigned char *Str){ unsigned char sum = 0x00, temp; UART4_PutChar(0xAA);//指令码 UART4_PutChar(0x1B);//指令类型 UART4_PutChar(0x14);//20个字符 sum = 0xAA+0x1B+0x14+'F'+'X'+'3'+'S'+'D'+'2'+'1'+'0'+'D'+'D'+'0'+'0'+'R'+'P'; // 方向 UART4_PutChar('F'); UART4_PutChar('X'); // 3S:'顺时针' 3N:'逆时针' temp = *Str++; temp = temp=='+'?'S':'N'; UART4_PutChar('3'); sum += temp;UART4_PutChar(temp); // 转速 UART4_PutChar('S');UART4_PutChar('D'); UART4_PutChar('2'); sum += *Str;UART4_PutChar(*Str++); UART4_PutChar('1'); sum += *Str;UART4_PutChar(*Str++); UART4_PutChar('0'); sum += *Str;UART4_PutChar(*Str++); UART4_PutChar('D'); UART4_PutChar('D'); UART4_PutChar('0'); sum += *Str;UART4_PutChar(*Str++); UART4_PutChar('0'); sum += *Str;UART4_PutChar(*Str++); UART4_PutChar('R'); UART4_PutChar('P'); UART4_PutChar(sum); } void VOICE_UART4_playAngle(unsigned char *Str, unsigned char flag) { unsigned char sum = 0x00, temp; UART4_PutChar(0xAA);//指令码 UART4_PutChar(0x1B);//指令类型 UART4_PutChar(0x12);//18个字符 if(flag == 'x') { sum = 0xAA+0x1B+0x12+'H'+'X'+'4'+'2'+'1'+'0'+'D'+'D'+'0'+'0'+'D'+'U'; // 航向角 UART4_PutChar('H');UART4_PutChar('X'); } else if(flag == 'y') { sum = 0xAA+0x1B+0x12+'F'+'Y'+'4'+'2'+'1'+'0'+'D'+'D'+'0'+'0'+'D'+'U'; // 俯仰角 UART4_PutChar('F');UART4_PutChar('Y'); } else if(flag == 'z') { sum = 0xAA+0x1B+0x12+'H'+'G'+'4'+'2'+'1'+'0'+'D'+'D'+'0'+'0'+'D'+'U'; // 横滚角 UART4_PutChar('H');UART4_PutChar('G'); } // 4Z:'正' 4F:'负' temp = *Str++; temp = temp=='+'?'Z':'F'; UART4_PutChar('4'); sum += temp;UART4_PutChar(temp); UART4_PutChar('2'); sum += *Str;UART4_PutChar(*Str++); UART4_PutChar('1'); sum += *Str;UART4_PutChar(*Str++); UART4_PutChar('0'); sum += *Str;UART4_PutChar(*Str++); UART4_PutChar('D'); UART4_PutChar('D'); UART4_PutChar('0'); sum += *Str;UART4_PutChar(*Str++); UART4_PutChar('0'); sum += *Str;UART4_PutChar(*Str++); UART4_PutChar('D'); UART4_PutChar('U'); UART4_PutChar(sum); } // 语音模块命名,得用小写字母,但是串口索引时需要大写字母 /*组合播放-旋转方向,速度,航向角,俯仰角及横滚角*/ //void VOICE_UART4_playAll(unsigned char *Str){ // unsigned char sum = 0x00, temp, i, num; // num = 26; // UART4_PutChar(0xAA);//指令码 // UART4_PutChar(0x1B);//指令类型 // UART4_PutChar(num*2);//20个字符 // sum = 0xAA+0x1B+num*2+num*'F'+num*'X'; // for(i=0; i<num; i++) { // UART4_PutChar('F'); UART4_PutChar('X'); // } // UART4_PutChar(sum); //} void VOICE_UART4_playAll(unsigned char *Str){ unsigned char sum = 0x00, temp; UART4_PutChar(0xAA);//指令码 UART4_PutChar(0x1B);//指令类型 UART4_PutChar(0x30);// 8*2*3 = 48字节 sum = 0xAA+0x1B+0x30; sum += 'S'+'D'+'3'+'2'+'1'+'0'+'D'+'D'+'0'+'R'+'P'; //8个音频 sum += 'H'+'G'+'4'+'2'+'1'+'0'+'D'+'D'+'0'+'D'+'U'; //12+6 ? sum += 'F'+'Y'+'4'+'2'+'1'+'0'+'D'+'D'+'0'+'D'+'U'; // // 转速 UART4_PutChar('S');UART4_PutChar('D'); // 3S:'顺时针' 3N:'逆时针' temp = *Str++; temp = temp=='+'?'S':'N'; UART4_PutChar('3'); sum += temp;UART4_PutChar(temp); UART4_PutChar('2'); sum += *Str;UART4_PutChar(*Str++); UART4_PutChar('1'); sum += *Str;UART4_PutChar(*Str++); UART4_PutChar('0'); sum += *Str;UART4_PutChar(*Str++); UART4_PutChar('D'); UART4_PutChar('D'); UART4_PutChar('0'); sum += *Str;UART4_PutChar(*Str++); Str++; // 漏播一个小数,一个参数有8个音频组合 UART4_PutChar('R'); UART4_PutChar('P'); //横滚角 UART4_PutChar('H');UART4_PutChar('G'); temp = *Str++; temp = temp=='+'?'Z':'F'; UART4_PutChar('4'); sum += temp;UART4_PutChar(temp); UART4_PutChar('2'); sum += *Str;UART4_PutChar(*Str++); UART4_PutChar('1'); sum += *Str;UART4_PutChar(*Str++); UART4_PutChar('0'); sum += *Str;UART4_PutChar(*Str++); UART4_PutChar('D'); UART4_PutChar('D'); UART4_PutChar('0'); sum += *Str;UART4_PutChar(*Str++); Str++; // 漏播一个小数,一个参数有8个音频组合 UART4_PutChar('D'); UART4_PutChar('U'); //俯仰角 UART4_PutChar('F');UART4_PutChar('Y'); temp = *Str++; temp = temp=='+'?'Z':'F'; UART4_PutChar('4'); sum += temp;UART4_PutChar(temp); UART4_PutChar('2'); sum += *Str;UART4_PutChar(*Str++); UART4_PutChar('1'); sum += *Str;UART4_PutChar(*Str++); UART4_PutChar('0'); sum += *Str;UART4_PutChar(*Str++); UART4_PutChar('D'); UART4_PutChar('D'); UART4_PutChar('0'); sum += *Str;UART4_PutChar(*Str++); Str++; // 漏播一个小数,一个参数有8个音频组合 UART4_PutChar('D'); UART4_PutChar('U'); UART4_PutChar(sum); } void Volume_Increase_Int() interrupt 11 {//音量增 使用~INT3 UART4_PutChar(0xAA); //指令码 UART4_PutChar(0x14); //指令类型 UART4_PutChar(0x00); UART4_PutChar(0xBE); if(VOICE_Volume < 31) { VOICE_Volume++; } } void Volume_Reduce_Int() interrupt 10 {//音量减 使用~INT2 UART4_PutChar(0xAA); //指令码 UART4_PutChar(0x15); //指令类型 UART4_PutChar(0x00); UART4_PutChar(0xBF); if (VOICE_Volume > 0) { VOICE_Volume--; } } #endif #if(VOICE_OneLine) void Oneline_Send_0() { VOICE_ONELINE_Set(); delay_10us(40); VOICE_ONELINE_Clear(); delay_10us(120); } void Oneline_Send_1() { VOICE_ONELINE_Set(); delay_10us(120); VOICE_ONELINE_Clear(); delay_10us(40); } void Oneline_Send_Byte(unsigned char send_byte) { unsigned char i; VOICE_ONELINE_Set(); delay_1ms(10); VOICE_ONELINE_Clear(); delay_1ms(2); for (i = 0; i < 8; i++) { if ((send_byte & 0x01) == 0x01) { Oneline_Send_1(); } else { Oneline_Send_0(); } send_byte = send_byte >> 1; } VOICE_ONELINE_Set(); } void VOICE_Volume_Increase() { } void VOICE_Volume_Reduce() { } void VOICE_Play_Audio(unsigned char audio_index) { unsigned char num_bit_arr[3] = {0}; char num_bit_count = 2; unsigned char num; bit flag = 0; // 非零最高位捕获标识 num = audio_index; num_bit_arr[2] = num / 100; num %= 100; num_bit_arr[1] = num / 10; num %= 10; num_bit_arr[0] = num; Oneline_Send_Byte(0x0A); for (num_bit_count = 2; num_bit_count >= 0; num_bit_count--) { if (num_bit_arr[num_bit_count] != 0) { flag = 1; Oneline_Send_Byte(num_bit_arr[num_bit_count]); } else if (flag == 1) { Oneline_Send_Byte(num_bit_arr[num_bit_count]); } else { ; } } Oneline_Send_Byte(0x0B); } void VOICE_Play_Start() { Oneline_Send_Byte(0x11); } #endif
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。