📄 venb.c
字号:
/***************************************************************************/
/* */
/* ZXM10--VENB Ver2.00 */
/* programmed by Xud */
/* 2000,04,20 */
/* */
/***************************************************************************/
//#pragma nodebug nocode small optimize(5) objectextend
#include <reg51.h>
#include "venb.h"
/*****************************************************************************
* 函数名称:void main(void) *
* 简要描述:主程序 *
* *
* 时 间:2000年1月 *
*****************************************************************************/
void main(void)
{
//初始化89C51
P1=0xff;
P2=0xff;
TMOD=0x21; //设置定时器1为模式2,定时器0为模式1
TH1=0xfd; //设定串口波特率为9600bps
TL1=0xfd;
TR1=1;
SCON=0x50; //设置串行口为模式1,允许接收
ES=1; //允许串行口中断
//SP=0x60;
//初始化全局变量
m_nRate=26; //缺省传输速率26B
m_nHue=20;
m_nBright=80;
m_nContrast=70;
m_nSaturation=70;
m_nCurrentVideo=1; //缺省为视频1
m_nBufferCount=0;
m_nSendBuffer[0]=SOI; //串行通讯用到的全局变量
m_nSendBuffer[1]=0x00; //StationID
m_nSendBuffer[2]=VTBE; //DestDevice
m_nSendBuffer[3]=VENB; //SrcDevice
m_nSendBuffer[4]=0x0b; //CmdType/Rtn
m_nSendBuffer[5]=0x00; //Para1
m_nSendBuffer[6]=0x00; //Para2
m_nSendBuffer[7]=0x00; //ChkSum(LSB)
m_nSendBuffer[8]=0x00; //ChkSum(MSB)
m_nSendBuffer[9]=EOI;
m_nSendCount=0x00;
m_nReceiveBuffer1[0]=SOI; //接收缓冲区1初始化
m_nReceiveBuffer1[9]=EOI;
m_nReceiveBuffer2[0]=SOI; //接收缓冲区2初始化
m_nReceiveBuffer2[9]=EOI;
m_nReceiveCount=0x00;
m_bBeginFlag=FALSE; //帧头识别标志位变量,未收到帧头
m_bEndFlag=FALSE; //初始化帧尾标志位变量,未收到帧尾
m_bSwitchFlag=FALSE; //初始化缓冲区切换标志位变量,选择缓冲区0
m_bChangeVideo=FALSE; //初始化视频切换标志位变量,不切换
m_nButtonDown=0x0f; //视频源选择按钮状态
m_nButtonCount=0; //相同状态计数
m_bButtonFlag=FALSE; //按钮有效标志
m_nScanPeriod=0; //扫描周期,缺省为不扫描
m_nScanChannel=0; //扫描控制字
m_nScanCount=0; //扫描时间计数
//复位图象芯片
ResetBoard();
//设定本板图象参数
FetchConfig(); //从编码端VTB板获取配置信息
//初始化图象套片
InitAdg406(m_nCurrentVideo);
InitSaa7111();
InitVp520enc();
InitVp2611();
InitVp2612();
//显示正确的视频源
P1=0xff;
InitLed(m_nCurrentVideo);
EA=1; //开中断
Delay();
//主循环
for (;;)
{
ScanChannel(); //视频扫描
BufferControl(); //运行编码算法
CheckStatus(); //检测并处理单板工作状态
ParseCommand(); //解析监控中心下发命令
}
}
/*****************************************************************************
* 函数名称:void ResetBoard(void) *
* 简要描述:编码板复位 *
* *
* 时 间:2000年1月 *
*****************************************************************************/
void ResetBoard(void)
{
byte data i;
byte data j;
byte data k;
STATUS_LED=0; //指示复位过程结束
for(k=0;k<3;k++)
{
for(j=0;j<250;j++)
{
for(i=0;i<250;i++)
{
P2=0x87;
}
}
STATUS_LED=1;
for(j=0;j<250;j++)
{
for(i=0;i<250;i++)
{
P2=0xff;
}
}
STATUS_LED=0;
WATCHD=!WATCHD;
}
STATUS_LED=0; //指示复位过程结束
return;
}
/*****************************************************************************
* 函数名称:void FetchConfig(void) *
* 简要描述:与VTB板通讯以获取配置信息 *
* *
* 时 间:2000年1月 *
*****************************************************************************/
void FetchConfig(void)
{
//定义串口发送时用到的变量
byte data temp1;
byte data temp2;
byte data temp3;
byte data temp4;
byte data temp5;
byte data temp6;
byte data i;
WATCHD=!WATCHD;
//设定缺省传输速率控制字
temp3=0;
//向编码端VTB板发送第1条命令:获取时隙配置信息
temp1=SBUF; //清空接收缓冲区
EA=1; //开中断
SendToSP();
//延时等待以便接收VTB送来的配置信息,如超时则使用缺省值
for (i=0;i<250;i++) //延时
{
Delay();
WATCHD=!WATCHD;
if(m_bEndFlag==TRUE) //一帧命令完整接收到
{
if(m_bSwitchFlag==1) //需处理缓冲区1
{
temp1=m_nReceiveBuffer1[2];
temp2=m_nReceiveBuffer1[4];
temp3=m_nReceiveBuffer1[6];
}
else //配置保存在缓冲区2中
{
temp1=m_nReceiveBuffer2[2];
temp2=m_nReceiveBuffer2[4];
temp3=m_nReceiveBuffer2[6];
}
m_bEndFlag=FALSE;
if((temp1==VENB)&&(temp2==0x0b))//有效应答才取数据
{
if(temp3>3) temp3=2; //控制字缺省为2,对应26B
STATUS_LED=!STATUS_LED; //指示灯表示接收到配置
}
break;
}
}
SetRate(temp3); //设定图象传输速率 //temp3
WATCHD=!WATCHD;
//向编码端VTB板发送第2条命令:获取当前视频源配置信息
m_nSendBuffer[4]=0x0c; //CmdType/Rtn
m_nSendBuffer[5]=0x01; //Para1
m_nSendBuffer[6]=0x00; //Para2
SendToSP();
//延时等待以便接收VTB送来的配置信息,如超时则使用缺省值
for (i=0;i<250;i++) //延时
{
Delay();
WATCHD=!WATCHD;
if(m_bEndFlag==TRUE) //一帧命令完整接收到
{
if(m_bSwitchFlag==1) //需处理缓冲区1
{
temp1=m_nReceiveBuffer1[2];
temp2=m_nReceiveBuffer1[4];
temp4=m_nReceiveBuffer1[6];
}
else //配置保存在缓冲区2中
{
temp1=m_nReceiveBuffer2[2];
temp2=m_nReceiveBuffer2[4];
temp4=m_nReceiveBuffer2[6];
}
m_bEndFlag=FALSE;
if((temp1==VENB)&&(temp2==0x0c))//有效应答才取数据
{
if((temp4<13)&&(temp4>0)) m_nCurrentVideo=temp4;
STATUS_LED=!STATUS_LED; //指示灯表示接收到配置
}
break;
}
}
WATCHD=!WATCHD;
//向编码端VTB板发送第3条命令:获取当前视频源图象参数配置信息
m_nSendBuffer[4]=0x13; //CmdType/Rtn
m_nSendBuffer[5]=0x00; //Para1
m_nSendBuffer[6]=0x00; //Para2
SendToSP();
//延时等待以便接收VTB送来的配置信息,如超时则使用缺省值
for (i=0;i<250;i++) //延时
{
Delay();
WATCHD=!WATCHD;
if(m_bEndFlag==TRUE) //一帧命令完整接收到
{
if(m_bSwitchFlag==1) //需处理缓冲区1
{
temp1=m_nReceiveBuffer1[2];
temp2=m_nReceiveBuffer1[4];
temp3=m_nReceiveBuffer1[5];
temp4=m_nReceiveBuffer1[6];
temp5=m_nReceiveBuffer1[7];
temp6=m_nReceiveBuffer1[8];
}
else //配置保存在缓冲区2中
{
temp1=m_nReceiveBuffer2[2];
temp2=m_nReceiveBuffer2[4];
temp3=m_nReceiveBuffer2[5];
temp4=m_nReceiveBuffer2[6];
temp5=m_nReceiveBuffer2[7];
temp6=m_nReceiveBuffer2[8];
}
m_bEndFlag=FALSE;
if((temp1==VENB)&&(temp2==0x13))//有效应答才取数据
{
if((temp3>0)&&(temp3<0xff)) m_nBright=temp3;
if((temp4>0)&&(temp4<0x80)) m_nContrast=temp4;
if((temp5>0)&&(temp5<0x80)) m_nSaturation=temp5;
if((temp6>0)&&(temp6<0x80)) m_nHue=temp6;
STATUS_LED=!STATUS_LED; //指示灯表示接收到配置
}
break;
}
}
EA=0; //关中断
return;
}
/*****************************************************************************
* 函数名称:void SetRate(byte nRate) *
* 简要描述:设置视频传输数率 *
* 输 入:传输数率 *
* 时 间:2000年1月 *
*****************************************************************************/
void SetRate(byte nRate)
{
byte data temp;
WATCHD=!WATCHD;
RATE_CS=0; //设定片选信号有效
BUTTON_CS=1;
WR=1;
switch(nRate)
{
case 0:
temp=2;
m_nRate=3; //3B
m_nBufferSize=4800; //1600
break;
case 1:
temp=1;
m_nRate=6;
m_nBufferSize=9600; //9600
break;
case 2:
default:
temp=0; //缺省为26B速率
m_nRate=26; //图象参数对应的变量
m_nBufferSize=41600;
break;
}
P0=temp; //对任意地址写速率控制字,低2位有效
WR=0; //负脉冲为有效的写操作
WR=1;
RATE_CS=1; //设定片选信号无效
BUTTON_CS=1;
return;
}
/*****************************************************************************
* 函数名称:void InitLed(byte nLed) *
* 简要描述:初始化指示灯 *
* *
* 时 间:2000年1月 *
*****************************************************************************/
void InitLed(byte nLed)
{
switch(nLed)
{
case 1:
VIDEO1_LED=1;
VIDEO2_LED=1;
VIDEO3_LED=1;
VIDEO4_LED=0;
break;
case 2:
VIDEO1_LED=1;
VIDEO2_LED=1;
VIDEO3_LED=0;
VIDEO4_LED=1;
break;
case 3:
VIDEO1_LED=1;
VIDEO2_LED=1;
VIDEO3_LED=0;
VIDEO4_LED=0;
break;
case 4:
VIDEO1_LED=1;
VIDEO2_LED=0;
VIDEO3_LED=1;
VIDEO4_LED=1;
break;
case 5:
VIDEO1_LED=1;
VIDEO2_LED=0;
VIDEO3_LED=1;
VIDEO4_LED=0;
break;
case 6:
VIDEO1_LED=1;
VIDEO2_LED=0;
VIDEO3_LED=0;
VIDEO4_LED=1;
break;
case 7:
VIDEO1_LED=1;
VIDEO2_LED=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -