📄 voice.c
字号:
void DelayX100us(unsigned char m)
{
unsigned char i=0,j=0,k=0;
for (i=m;i>0;i--)
{
for (j=1;j>0;j--)
{
for(k=181;k>0;k--);
}
}
}
void DelayXms(unsigned char n)
{
unsigned char i=0,j=0,k=0;
for (i=n;i>0;i--)
{
for (j=10;j>0;j--)
{
for(k=181;k>0;k--);
}
}
}
void SendAddress(unsigned char address)
{
unsigned char i=0;
if (SpeakTimes>0)
{
Reset=0; //每次播放前复位语音芯片防止播放地址出错
DelayXms(2);
Reset=1; //复位完毕
DelayXms(5);
SS=0; //启动片选
DelayXms(2);
for(i=0;i<8;i++)
{
SCK=0;
if (address & 1) SDI=1;
else SDI=0;
address>>=1;
DelayX100us(1);
SCK=1;
DelayX100us(1);
}
SS=1;
SpeakTimes--; //只有SpeakTimes>0才能自减,SpeakTimes=0再自减就等于FF
}
}
void Speak(unsigned char address)
{
if (VoiceStatus)
{
if (!SpeakOverDididi)
{
SendAddress(address);
}
if (!SpeakOverAttention) //"注意"没有说完
{
SendAddress(address);
if (SpeakTimes==0) //达到播放次数
{
SpeakOverAttention=1; //设置"注意"说完标志
}
}
if (!SpeakOverStop) //"停车"没有说完
{
SendAddress(address);
if (SpeakTimes==0) //达到播放次数
{
SpeakOverStop=1; //设置"停车"说完标志
}
}
if (!SpeakOver30cm) //"0.3米"没有说完
{
SendAddress(address);
if (SpeakTimes==0) //达到播放次数
{
SpeakOver30cm=1; //设置"0.3米"说完标志
}
}
if (!SpeakOver40cm) //"0.4米"没有说完
{
SendAddress(address);
if (SpeakTimes==0) //达到播放次数
{
SpeakOver40cm=1; //设置"0.4米"说完标志
}
}
if (!SpeakOver50cm) //"0.5米"没有说完
{
SendAddress(address);
if (SpeakTimes==0) //达到播放次数
{
SpeakOver50cm=1; //设置"0.5米"说完标志
}
}
if (!SpeakOver60cm) //"0.6米"没有说完
{
SendAddress(address);
if (SpeakTimes==0) //达到播放次数
{
SpeakOver60cm=1; //设置"0.6米"说完标志
}
}
if (!SpeakOver80cm) //"0.8米"没有说完
{
SendAddress(address);
if (SpeakTimes==0) //达到播放次数
{
SpeakOver80cm=1; //设置"0.8米"说完标志
}
}
if (!SpeakOver100cm) //"1米"没有说完
{
SendAddress(address);
if (SpeakTimes==0) //达到播放次数
{
SpeakOver100cm=1; //设置"1米"说完标志
}
}
if (!SpeakOver120cm) //"1.2米"没有说完
{
SendAddress(address);
if (SpeakTimes==0) //达到播放次数
{
SpeakOver120cm=1; //设置"1.2米"说完标志
}
}
if (!SpeakOver150cm) //"1.5米"没有说完
{
SendAddress(address);
if (SpeakTimes==0) //达到播放次数
{
SpeakOver150cm=1; //设置"1.5米"说完标志
}
}
if (!SpeakOver200cm) //"2米"没有说完
{
SendAddress(address);
if (SpeakTimes==0) //达到播放次数
{
SpeakOver200cm=1; //设置"2米"说完标志
}
}
if (!SpeakOver250cm) //"2.5米"没有说完
{
SendAddress(address);
if (SpeakTimes==0) //达到播放次数
{
SpeakOver250cm=1; //设置"2.5米"说完标志
}
}
}
}
void Voice(void)
{
AMPSwitch=VoiceStatus;
if (S==0)
{
if (AssignAttentionEnable)
{
SpeakTimes=1;
VoiceAddress=0x0C;
AssignAttentionEnable=0;
SpeakOverAttention=0;
Speak(VoiceAddress);
}
void WatchdogInitial(void)
{/*设置复位时间为1s*/
WDL=0xE0;
WDCON=0xC5;
WFEED1=0xA5;
WFEED2=0x5A;
}
void PoweronDelay(void)
{/*上电后延时300ms等待电源工作稳定*/
unsigned char m,n;
for (m=0;m<=250;m++)
{
for(n=0;n<=250;n++)
{
}
}
}
void CpuInitial(void)
{
PCON=0x80; //SMOD1=1,SMOD0=0串口波特率单倍,确定UART工作模式;
PCONA=0; //电源控制寄存器设置;
DIVM=0; //使用片内RC振荡器,fosc=7.3728MHz;
IEN0=0; //禁止一切中断
IEN1=0; //------------
PSW=0; //bank 0
TMOD=0x11; //设置Timer0、Timer1工作方式1
TCON=0; //关闭定时计数器
TH0=0; //预存数值清零
TL0=0;
TH1=0;
TL1=0;
IP0H=0x12; //中断优先级别 UART > timer0 > timer1 其余默认值
IP0=0x18;
EA=1; //开中断管制
}
void CpuioInitial(void)
{
P0=0;
P1=0xD3;
P3=0;
}
void Feeddog(void)
{/*循环喂狗*/
EA=0;
WFEED1=0xA5;
WFEED2=0x5A;
EA=1;
}
main()
{
WatchdogInitial();
LED=0; //避免通电时闪烁
PoweronDelay();
CpuioInitial();
CpuInitial();
while(1)
{
Voice();
Feeddog();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -