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

📄 venb.c

📁 H.261图像压缩芯片控制软件
💻 C
📖 第 1 页 / 共 4 页
字号:
/***************************************************************************/
/*                                                                         */
/*                          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 + -