📄 data_disposal.c
字号:
//char series;//
#define uch unsigned char
#include "STC89C51.h"
sbit DATA=P0^0;
sbit CLOCK=P0^1;
sbit MDATA=P0^2;
sbit MCLOCK=P0^3;
sbit TDATA=P0^4;
sbit TCLOCK=P0^5;
bit series_sign; //串口数据标志
uch power_configure; //功放板配置(1-16)。没用
uch source_configure[3]={0x06,0x02,0x08};
//音源配置第一字节表示内置mp3音源数,
//第二字节表示内部FM音源数
//第三字节表示外部音源数
//约定:对硬件而言内外音源配置都从头开始,中间不许有间隔
uch idata source_repertoire[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//外部音源节目数量,例:电视节目100个台;约定:至于何种音源本机不管。
uch first_volume=16; //第一进程音量
uch second_volume=65; //第二进程音量
uch tone_h=0; //高音音调
uch tone_m=0; //中音音调
uch tone_l=0; //低音音调
uch mode=0;
uch input=0;
uch DDD=0; //3D
uch BB=0; //重低音
uch cyc=0; //循环
uch surround; //环绕声
uch command; //命令字编码
/********************************************/
uch series_m4094_data; //控制八路音响主板4094的串行数据
uch series_p4094_data; //控制功放板4094的串行数据
uch series_p61510_data[3]; //控制功放板61510的串行数据
uch room; //激活的的房间号,由收到的串口数据解析获得,0:表示没有房间信号
uch series_sign_type;
//////////////////////////////////////////////
/* command
1:开电源
2:关电源
3:L通道第一进程音量增
4:L通道第一进程音量减
5:R通道第一进程音量增
6:R通道第一进程音量减
7:L通道第二进程音量增
8:L通道第二进程音量减
9:R通道第二进程音量增
10:R通道第二进程音量减
11:外部音源1
12:外部音源2
13:外部音源3
14:外部音源4
15:外部音源5
16:外部音源6
17:外部音源7
18:外部音源8
19:内部mp3音源
20:内部FM音源
21:音调低音上调
22:音调低音下调
23:音调中音上调
24:音调中音下调
25:音调高音上调
26:音调高音下调
27:音调同步上调
28:音调同步下调
29:重低音
30:3D
31:循环
32:暂停
33:节目上选
34:节目下选
35:指定节目
36:静音
*/
/*音调,音源,音量需要保存每路的值*/
uch command_source; //音源选择命令编码
uch power; //功放板序列号0x00-0x0F
uch add; //音调值
uch z; //音调中间变量
uch idata tone_data[16][3]={
0x00,0x08,0x00,
0x00,0x08,0x00,
0x00,0x08,0x00,
0x00,0x08,0x00,
0x00,0x08,0x00,
0x00,0x08,0x00,
0x00,0x08,0x00,
0x00,0x08,0x00,
0x00,0x08,0x00,
0x00,0x08,0x00,
0x00,0x08,0x00,
0x00,0x08,0x00,
0x00,0x08,0x00,
0x00,0x08,0x00,
0x00,0x08,0x00,
0x00,0x08,0x00
}; //音调控制代码按四位一段,前三段分别表示高中低音调,第四段设定VOCAL开关开
uch idata volume_data_L[16][3]={ //左通道音量
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00
}; //左通道音量控制代码,此处为最低
/*********************************************
16个房间右通道音量,10000100,00011101
即第一进程音量初值为10000即16
第二进程音量初值为1000001即65
*********************************************/
uch idata volume_data_R[16][3]={
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00,
0x84,0x1D,0x00
}; //右通道音量控制代码,此处为最低
uch source_data[3]={0x03,0xB3,0x00}; //音源控制代码 0xx3 0xB3 0x00。source_data[0]高四位是变量
uch power_4094_data; //功放板4094控制代码
uch main_4094_1_data; //主板4094_1即U1控制代码。控制功放电源。
uch main_4094_2_data; //主板4094_2即U2控制代码。控制音源,3D,重低音,循环等
uch power_4094[4]={1,3,2,0}; //5-8路音源按顺序对应的4094前两位编码。此是由于音源电路设计没有规律不得已而为之
/*************状态编码,实际是位操作,不应理解为数*****************/
uch power_state[2]={0x00,0x00}; //功放板电源状态 http://www.icbc.com.cn/
uch song_state; //曲目占用状态
uch source_state[2]={0x00,0x00}; //音源占用状态。source_state[0]内部音源,source_state[1]外部音源
//音源占用状态也作为音源初选控制代码
/////////////////////////////////////////////////////////////
/*
source_old16房间原先选的音源状态
数组下标为房间编号或功放板序列号
数组元素内容:(按数组元素序列号)
0:没有;1-8:外部音源1 ;9-14:内部mp3音源;15-16:内部FM音源
*/
/////////////////////////////////////////////////////////////
uch source_old[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //
uch source_start; //一级音源
uch source_end; //二级音源
uch input_volume; //输入音量
void com_parse(i) //命令字解析
{
// switch(i)
// case 1; ;
}
void report() //状态报告
{
}
void source_entrails_exterior() //内外音源选择
{
}
void source_61510() //61510做最终音源选择
{
}
void hc4094_data()
{
}
uch tone_add(add) //音调增
{
if (add<12)
if (add>=9)
add++;
else if (add==0)
add=9;
else if (add<=4)
if (add>0)
add--;
z=add;
return z;
}
uch tone_dec(add) //音调减
{
if (add>=0)
if (add<4)
add++;
if (add==9)
add=0;
if (add>9)
add--;
z=add;
return z;
}
/* uch series_m4094_send() //主板4094串行数据发送程序
{
}*/
uch series_p4094_send() //功放板4094串行数据发送程序
{
uch d,i;
for (i=0;i<8;i++)
{
d=power_4094_data<<i;
if (d&0x80==0)
DATA=0;
else
DATA=1;
CLOCK=1;
// delay(5);
CLOCK=0;
}
// store(room);
return z;
}
/* uch series_p61510_send() //主板61510串行数据发送程序
{
}*/
//*****************************
/*易犯错误:将case后冒号写成分号*/
//*****************************
//本函数旨在为发送准备格式满足的数据
uch data_disp() //数据处理
{
uch k;
for (k=0;k<100;k++)
{
switch(command)
{
/***************** 电源开操作************************/
case 1:
power_state[0]=power_state[0]|0x01<<(power-1); // 既保持原有状态不变又增添新的路数
series_sign_type=1;
break ;
/***************** 电源关操作************************/
case 2:
power_state[0]=power_state[0]^0x01<<(power-1);
series_sign_type=1;
break;
/*****************L通道第一进程音量增*****************/
case 3: //L通道第一进程音量增
if (first_volume>0)
{
first_volume--;
volume_data_L[room][0]=(first_volume<<3)|(second_volume>>4);
series_sign_type=3;
}
break;
/*****************L通道第一进程音量减******************/
case 4: //L通道第一进程音量减
if (first_volume<16)
{
first_volume++;
volume_data_L[room][0]=(first_volume<<3)|(second_volume>>4);
series_sign_type=3;
}
break;
/*******************R通道第一进程音量增****************/
case 5: //R通道第一进程音量增
if (first_volume>0)
{
first_volume--;
volume_data_R[room][0]=(first_volume<<3)|(second_volume>>4);
series_sign_type=3;
}
break;
/********************R通道第一进程音量减*****************/
case 6: //R通道第一进程音量减
if (first_volume<16)
{
first_volume++;
volume_data_R[room][0]=(first_volume<<3)|(second_volume>>4);
series_sign_type=3;
}
break;
//////////////////////第二进程音量调节//////////////////////////////////
/////音量数据数组中的元素由first_volume与second_volume构成first_volume
/////5位,second_volume7位.为保证数组中每个元素8位,将first_volume左移3位
/////空暇的地方给second_volume的高三位.作为数组的第一成员,数组的第二成员
/////由second_volume的后四位加固定码0x0D组成.
/******************L通道第二进程音量增********************/
case 7: //L通道第二进程音量增
if (second_volume>0)
{
second_volume--;
volume_data_L[room][0]=(first_volume<<3)|(second_volume>>4);
volume_data_L[room][1]=(second_volume>>3)|0x0D;
series_sign_type=3;
}
break;
/********************L通道第二进程音量减*******************/
case 8: //L通道第二进程音量减
if (first_volume<64)
{
second_volume++;
volume_data_L[room][0]=(first_volume<<3)|(second_volume>>4);
volume_data_L[room][1]=(second_volume>>3)|0x0D;
series_sign_type=3;
}
break;
/********************R通道第二进程音量增*****************/
case 9: //R通道第二进程音量增
if (first_volume>0)
{
second_volume--;
volume_data_R[room][0]=(first_volume<<3)|(second_volume>>4);
volume_data_R[room][1]=(second_volume>>3)|0x0D;
series_sign_type=3;
}
break;
/***********************R通道第二进程音量减****************/
case 10: //R通道第二进程音量减
if (first_volume<64)
{
second_volume++;
volume_data_R[room][0]=(first_volume<<3)|(second_volume>>4);
volume_data_R[room][1]=(second_volume>>3)|0x0D;
series_sign_type=3;
}
break;
////////本系统有8路音源,每路又可进行内部(前六路mp3或后两路fm)或外部选择。
////////M61510有5个音源输入,第5
////////假设音源选择采用搜索,先搜内部音源
// uch power_configure; //功放板配置(1-16)
// uch source_configure[3]={0x06,0x02,0x08};
//音源配置第一字节表示内置mp3音源数,
//第二字节表示内部FM音源数
//第三字节表示外部音源数
//约定:对硬件而言内外音源配置都从头开始,中间不许有间隔
//source_repertoire[8]音源节目选择表
//外部音源节目数量,例:电视节目100个台;约定:至于何种音源本机不管。
//音源选择分两种情况。1:外部音源最多8类,每类最多占8个通道,最大组合为8
//例:第一类DVD占两个通道,其他占3个,空闲3个
//2:内部音源按顺序选择
/*
音源处理程序包含两个参数。
1.source_old,表示房间适用的音源号
2.source_state,表示音源占用情况
*/
//source_state[2]={0x00,0x00}; //音源占用状态。source_state[0]内部音源,source_state[1]外部音源
/**************************外部音源1********************/
case 11: //外部音源1
{
if (source_old[0]!=0)
{
source_state[1]=(source_state[1]&(~(0x01<<(source_old[0]-1))));//清除原先占用状态记录
} //
if ((source_state[1]|0x01)-source_state[1]>0) //若音源占用状态表明没被占用&-与,|-或,^-异或,~-求反
{
source_state[1]=(source_state[1]|0x01); //改写音源占用状态
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -