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

📄 video_4360.#3

📁 4360音频切换
💻 #3
📖 第 1 页 / 共 2 页
字号:
/***********************************************
数字法庭 从MCU(前面板) 的源程序。

一、功能:
1. 监视MID[7..0],每根线在没声音输入时为高,在有声音时为低;
   法官的输入为高优先级,可以随时打断他人的发言,其他人只
   有在没人发言时才能发言。
2. 发言者的改变用I2C传给主MCU(F015/tw2824)。从MCU(231/221,
   模拟I2C)为I2C的主机,发起时钟,控制数据通信。
3. 发言的停止判断是靠1秒内没有发声来判断。系统判定那路发言,
   把视频输入切入到那路,没有人发言时,切到全景。

二、检测算法:
	检测管脚是否为低,为低在其记数器上加1;开一个硬件定时器
	time0,每隔一次定时器溢出,检查记数器的数字是否达到预定
	的标准,到了则认为有效。

三、晶振:
	用片内的,8MHz。

四、修改:
	改用新的音视频分开的板子,SPI改成I2C,
************************************************/

#include <C8051F200.H>
//#include <intrins.h>

#define uchar unsigned char
#define uint  unsigned int

#define FG_OUT       500	//持续无声时间换成溢出的次数	
#define SOUND_COUNT  5
#define CHECK_TIME   10		//定时器0溢出一次的时间,12分频.单位毫秒。
#define FOSC		 1900  	//时钟频率,以KHz为单位。

#define I2C_COUNTSUM  7		//定时器溢出的次数,满足后,I2C主接收操作


//=========================video================
sbit  LOAD = P1^5;
sbit   VWR = P1^6;
sbit LATCH = P1^7;
sbit   VA0 = P2^4;
sbit   VA1 = P2^5;

//===============================================

sbit MID1=P1^0; //JA1_2  	法官1   高优先级
sbit MID2=P1^1; //JA3_4  	法官2   高优先级
sbit MID3=P1^2; //JA5_6 	原告
sbit MID4=P1^3; //JA7_8  	被告
sbit MID5=P1^4; //JA9  		嫌疑人
sbit MID6=P1^5; //JA10  	证人
sbit MID7=P1^6; //JA11  	取证
//sbit MID8=P1^7; //JA12  	书记员  没有对应视频,不参与视频切换。

//=========================I2C================
sbit i2c_sda=P0^2;
sbit i2c_scl=P0^3;

uchar count_i2c = 0;
uchar data_i2c = 0;
uchar data_i2c_bak = 0;
uchar data_i2c_test = 0;
bit	OK_i2cflag=0;//i2C操作成功标志 ,1,成功;0,失败

//=========================audio================
uchar count_mid1,count_mid2,count_mid3,count_mid4;
uchar count_mid5,count_mid6,count_mid7;

uint count_fg,count_bg;
uchar input_state;
//****************************函数原型说明
void delay( uint num ); //延时程序

//****************audio
//void send_state(void);

//**************I2C操作子程序
void i2c_start(void);	//发送起始位
void i2c_stop(void);	//发送停止位
uchar i2c_sack(void);	//应答位检查,正常返回0,不正常返回1

//bit i2c_sack1(void);
uchar IICReceiveByte(void);

void IICNoAck(void);
void IICSendByte(uchar sendbyte);




//***************4460 控制子程序
void init_4460(void);
void cmd_4460(uchar dat);
void test_4460(void);
void test_4460(void);
void set_4460_A(uchar inch);//A1A0=00, inch= 0-6
void set_4460_B(uchar inch);//A1A0=01, inch= 0-6




//**************I2C-4460控制程序

void I2C_handle_read(void);
void I2C_cmd_4460(void);
void I2C_data_handle(void);
void I2C_handle(void);



///////////////////////////////////////////
void delay( uint num )
{
	while( num-- );
}
//////////////////////////////////////////////

/*****************以下是对IIC总线的操作子程序***/

/*****************启动总线**********************/
void i2c_start(void)	//发送起始位
{
	i2c_sda=1;
	i2c_scl=1;
	delay(5);
	i2c_sda=0;
	delay(5);
	i2c_scl=0;
	delay(5);	
}

void i2c_stop(void)	//发送停止位
{
	i2c_sda=0;
	i2c_scl=1;
	delay(5);
	i2c_sda=1;
	delay(5);
	i2c_scl=0;
	delay(5);	
}

uchar i2c_sack(void)	//应答位检查,正常返回0,不正常返回1
{
	uchar i;	
	i2c_sda=1;
	i2c_scl=1;
	delay(5);

	if(i2c_sda)	i=1;	
	else		i=0;
		
	i2c_scl=0;
	return(i);		
}


/*
// **************检查应答位*******************
bit i2c_sack1(void)
{
i2c_scl=0;
i2c_sda=1;
i2c_scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
CY=i2c_sda;                 //因为返回值总是放在CY中的
i2c_scl=0;
return(CY);
}
*/

// *****************不对IIC总线产生应答***************
void IICNoAck(void)
{
	i2c_sda=1;
	i2c_scl=1;
	delay(5);
	i2c_scl=0;
}


/*
void send_state(void)
{ //用IO模拟一个I2C口,主模式。把input_state发给C8051F021
	EA = 0;
	loop1:  i2c_start();
    i2c_write_byte(0x40);		
    if( i2c_sack() )goto loop1;
    i2c_write_byte(input_state);		
    if( i2c_sack() )goto loop1;
    i2c_stop();     			
	EA = 1;
}
*/

/*******************向IIC总线写数据*********************/
void IICSendByte(uchar sendbyte)
{
uchar data j=8;
for(;j>0;j--)
   {
   i2c_scl=0;
   sendbyte<<=1;        //无论C51怎样实现这个操作,始终会使CY=sendbyte^7;
   i2c_sda=CY;
   i2c_scl=1;
   }
i2c_scl=0;
}

/**********************从IIC总线上读数据子程序**********/
uchar IICReceiveByte(void)
{
	uchar i=8;
	uchar dat=0;
	i2c_scl=0;
	while(i--)
   	{
   		i2c_scl=1;
  		dat=(dat<<1)|i2c_sda;
   		i2c_scl=0;
  	}
	
	return (dat);
}

void init_4460(void)
{
	VWR=0;
	LATCH=0;
	LOAD=1;
	cmd_4460(0xd0); //全关


}
//==================4460 视频矩阵切换控制程序

void cmd_4460(uchar dat)
{
VWR=0;
//===================vin1 to vout1-4
P0=dat;
delay(10);
VWR=1;
delay(10);

}

//视频矩阵切换芯片4460 初始化





void set_4460_A(uchar inch)
{
	uchar dat = 0;
	dat=(inch<<4)&0x70; 
	VA0=1;
	VA1=0;	
	cmd_4460(0xd0); //全关
	
	cmd_4460(dat); //连接Vin0

//cmd_4460(0x40); //连接Vin5
	cmd_4460(0xC0); //打开A0,A1对应输出

}


void set_4460_B(uchar inch)
{
	uchar dat = 0;
	dat=(inch<<4)&0x70; 
	VA0=0;
	VA1=0;
	cmd_4460(0xd0); //全关

cmd_4460(dat); //连接Vin5
cmd_4460(0xC0); //打开A0,A1对应输出

}

/*
void test_4460(void)
{
VA0=0;
VA1=0;//定址00
cmd_4460(0xd0); //全关
//cmd_4460(0xe0);   //全开
cmd_4460(0x40); //连接Vin5
cmd_4460(0xC0); //打开A0,A1对应输出
delay(0);
cmd_4460(0xB0); //关闭A0,A1对应输出

VA0=1;

VA1=0;
cmd_4460(0xd0); //全关
cmd_4460(0x00);
cmd_4460(0xC0);
cmd_4460(0xB0); //关闭A0,A1对应输出
}
*/


bit fg_flag,bg_flag;

void ISR_time0(void) interrupt 1 
{
TH0=-(CHECK_TIME*FOSC/12)/256;
TL0=-(CHECK_TIME*FOSC/12)%256;

if( (count_mid1>SOUND_COUNT)||(count_mid2>SOUND_COUNT) )
    {
    switch(input_state)
    	{
        case 1:
    		{
            if(count_mid1>SOUND_COUNT)
        		{
                count_fg=FG_OUT;	
        		}
        	else
        		{
                count_fg--;
                if(count_fg==0)
        			{
                    input_state=0;
                    //send_state();	
        			}		
            	}							
    		}
        case 2:	
    		{
            if(count_mid2>SOUND_COUNT)
        		{
                count_fg=FG_OUT;	
        		}
        	else
        		{
                count_fg--;
                if(count_fg==0)
        			{
                    input_state=0;
                    //send_state();	
        			}		
            	}					
    		}
        default:
    		{
            if(count_mid1>SOUND_COUNT)
        		{
                count_fg=FG_OUT;
                input_state=1;
                //send_state();	
        		}
        	else
        		{
                count_fg=FG_OUT;
                input_state=2;
                //send_state();			
        		}		
            }						
    	}	

    }
else
    {
    if( (input_state==1)||(input_state==2) )
        {//从法官处切换出来
        count_fg--;
        if(count_fg==0)
    		{
            input_state=0;
            //send_state();	
            }						
    	}
    else    //法官没发言或不处在发言状态
    	{
        switch(input_state)	
    		{
            case 0: //全部沉默
        		{
                if(count_mid3>SOUND_COUNT)		//原告
        			{
                    input_state=3;
                    count_bg=FG_OUT;					
                    //send_state();

⌨️ 快捷键说明

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