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

📄 sound.c

📁 在89C55CPU下开发的语音芯片驱动程序
💻 C
字号:
#include "C89c55.h"
void Delay(unsigned int time);
//void SendData(uchar address,uchar type,uchar length);
void Init();
void FeedDog();
void Speak();

unsigned int  Clock;				// 定时计数值
unsigned char SerialFlag;			// 串行通讯标志
unsigned char SerialData=0;			// 串行通讯数据
unsigned char SendFlag;
unsigned char ComTime;
unsigned char SoundHigh;
unsigned char SoundLow;
unsigned char crc;
unsigned char length;
unsigned char number;
unsigned char *DataAdd;
unsigned char DataLength;

unsigned char idata ReceData[32];
unsigned char idata SoundData[30];
unsigned char idata NUM=0;
unsigned char idata RecPoint=0;
unsigned char idata SouPoint=0;

main()
{
	Init();
	while(1)
	{
		Speak();
		FeedDog();
	}
}

/******************************************************************************
  函数名称:	              //  Init()
  功能描述:               // 主要功能各芯片和定时器、串口的初始化
  被本函数调用的函数清单:
  调用本函数的函数清单:   //   main()
  输入输出参数说明:       
  其它说明:               // 
*****************************************************************************/
void Init()
{
	
//各芯片工作初始设置
	P1_1 = 0;
	INT0 = 0;				//485置接收方式
//定时器0初始化设置
  	TR0 = 0;			    //停止定时器中断0
    TMOD = 0x21;			
  	TL0 = 0x66; 			//1毫秒定时
  	TH0 = 0xfc; 			//
    ET0 = 1;			    //设定时器0开始计数
	TR0 = 1;
	EA =1;
//串口初始化设置
	SCON = 0x50;     
	PCON = 0x00;
	TL1 = 0xFD;              //9600 波特率
	TH1 = 0xFD;
	TR1 = 1;
	ES = 1;
}
/******************************************************************************
  函数名称:	              //Delay()
  功能描述:               //用于延时
  被本函数调用的函数清单: //
  调用本函数的函数清单:   //main();singlestate();
  输入输出参数说明:       //time为定时的时间,以1ms为一个单位
  其它说明:               // 
*****************************************************************************/

void Delay (unsigned int time)
{

	Clock = time;      //延时计数值赋值
	while (Clock)      //延时等待 
		FeedDog();
}
/******************************************************************************
  函数名称:		          //Speak()
  功能描述: 	          //用于播放语音
  被本函数调用的函数清单: //
  调用本函数的函数清单:   //main();
  输入输出参数说明:       //
  其它说明:               //放音过程:PD=0,给地址,/CE=0,放音,/CE=1,
						  //放完音,PD=1;	平时状态PD=1,/CE=1。
*****************************************************************************/

void Speak()
{
//	P1_1 = 0;
	if(NUM != 0)
	{
		P0 = SoundData[SouPoint++];
		P2 = SoundData[SouPoint++];
		P1_0 = 0;
	   	P1_0 = 1;
		if(SoundData[SouPoint] == 0xA1)
		{
			Delay(1600);
			P0 = 0xA7;
			P2 = 0x01;
			P1_0 = 0;
	   		P1_0 = 1;
		}
		if(SoundData[SouPoint] == 0x51)
		{
			Delay(1600);
			P0 = 0x9d;
			P2 = 0x01;
			P1_0 = 0;
	   		P1_0 = 1;
		}
		SouPoint++;
		if(SouPoint>=30)
			SouPoint=0;
		NUM--;
		Delay(1500);
	}
//	P1_1 = 1;
}
/******************************************************************************
  函数名称:	              // SendData()
  功能描述:               // 设置发送帧的内容
  被本函数调用的函数清单: //
  调用本函数的函数清单:   // main()
  输入输出参数说明:       // 
  其它说明:               // 
*****************************************************************************/
/*
void SendData(uchar address,uchar type,uchar length)
{
	unsigned char i;

	ReceData[0] = 0xeb;
	ReceData[1] = 0x90;
	ReceData[2] = 0xeb;
	ReceData[3] = 0x90;
	ReceData[4] = address;
	ReceData[5] = type;
	ReceData[6] = length;
	ReceData[length+7] = 0;
	for(i=0; i<length+7; i++)
		ReceData[length+7] += ReceData[i];
	DataAdd = ReceData;
	DataLength = length + 8;
	INT0 = 1;
	SendFlag = 1;
}
*/
/******************************************************************************
  函数名称:	              // timer_int()
  功能描述:               // 主要功能定时器中断处理,查询按键,计时,计数
  被本函数调用的函数清单: 
  调用本函数的函数清单:   
  输入输出参数说明:       // timer0_tick延时计数值加1输出
  其它说明:               // 
*****************************************************************************/
void TimeInt() interrupt 1
{
	TR0 = 0;				//关闭定时器0
    TL0 = 0x66;             //定时器0赋初值
    TH0 = 0xfc;
	if(SendFlag)
	{
		if(DataLength == 0)
		{
			INT0 = 0;
			SendFlag = 0;
		}
		else
		{
			SBUF = *DataAdd;					
			DataLength--;
			DataAdd++;
		}
	}
	ComTime--;
	if(!ComTime)
		number = 0;
	Clock--;
	TR0 = 1;
}
/******************************************************************************
  函数名称:	              //SCON_int();
  功能描述:               // 主要功能用于串行接收
  被本函数调用的函数清单: // 
  调用本函数的函数清单:   /
  输入输出参数说明:       //SerialData串口接收到的数据,SerialFlag串口接收数据成功标志
  其它说明:               // 
*****************************************************************************/
void SerialInt() interrupt 4
{
	if(RI != 0)
	{
		RI = 0;
		ComTime = 20;
		SerialData = SBUF;
		switch(number)
		{
			case 0:
			case 2:
				if(SerialData != 0xeb)
				{
					number = 0;
					crc = 0;
				}
				else
				{ 
					ReceData[number] = SerialData;
					crc += ReceData[number];
					number++;
				}
				break;
			case 1:
			case 3:
				if(SerialData != 0x90)
				{
					number = 0;
					crc = 0;
					if(SerialData == 0xeb)
					{
						ReceData[number] = SerialData;
						crc += ReceData[number];
						number++;
					}
				}
				else
				{
					ReceData[number] = SerialData;
					crc += ReceData[number];
					number++;
				}
				break;
			case 4:
				ReceData[number] = SerialData; 
				crc += ReceData[number];
				number++;
				if(SerialData != 0x60)
				{
					number = 0;
					crc = 0;
				}
				break;
			case 5:
				ReceData[number] = SerialData; 
				crc += ReceData[number];
				number++;
				break;
			case 6:
				length = SerialData; 
				ReceData[number] = SerialData;
				crc += ReceData[number];
				number++;
				break;
			default:
				if(number == (length + 7))
				{
					if(crc != SerialData)
					{
						SerialFlag = 0xaa;
					}
					else 
					{
						SerialFlag = 0x55;
						SoundData[RecPoint++] = ReceData[8];//低字节
						SoundData[RecPoint++] = ReceData[7];//高字节
						SoundData[RecPoint++] = ReceData[5];//语音类别
						if(RecPoint>=30)
							RecPoint=0;
						NUM++;
					}
					number = 0;
					crc = 0;
					length = 0;
				}
				else
				{
					ReceData[number] = SerialData;
					number++;
					crc += SerialData;
					if(number > 12)
					{
						number = 0;
						crc = 0;
						length = 0;
					}
				}
				break;
		}
	}
	if(TI == 1)
		TI = 0;
}

/******************************************************************************
  函数名称:	              //FeedDog();
  功能描述:               // 用于喂狗,在程序混乱时可使CPU复位
  被本函数调用的函数清单: // 
  调用本函数的函数清单:   // 
  其它说明:               // 
*****************************************************************************/
void FeedDog()
{
	INT1 = 0;
	INT1 = 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -