⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 voice.c

📁 VOICE 语音芯片SPI口送地址数据确认后播放语音。模拟SPI口。
💻 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 + -