📄 video_4360.c
字号:
/***********************************************
数字法庭 从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 + -