📄 sound.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 + -