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

📄 zhubo.c

📁 驻波模块的监控数据处理
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
      * Copyright (c) 2004,
      * All rights reserved.
      * 
      * 文件名称:m_power.c
      * 文件标识:见配置管理计划书
      * 摘    要:驻波模块的监控数据处理
      * 
      * 当前版本:1.1
     
*/

#include"zhubo.h"
void main()
{
	init();	
	do
	{
	 sign_collect();
		dog();
	 serial_data();
	}while(1);
}
void init()
{
	init_mcu();	
	init_menu();
	init_serial();
	init_eeprom();
}
void init_mcu()
/********************************************************************
 初始化项目:
	1、WDT
 	2、ADC
 	3、SSP(只初始化端口方向,其他的在具体使用的时候初始化)
 	4、TMR1
 	5、USART
 	6、中断资源
 	7、端口方向
********************************************************************/
{
		TRISA  = 0x0f; //initialize the direction of the ports
		TRISB  = 0xc0;
		TRISC  = 0x80;
		TRISD  = 0x00;
		TRISE  = 0x00;//没用上PORTE
		porta_wbuf = 0x00;
		portb_wbuf = 0x00;
		portc_wbuf = 0x00;
		portd_wbuf = 0x00;
		porte_wbuf = 0x00;//没用上PORTE
		
	//	TMR1L  = 0x00; //initialize TMR1,65.6ms
	//	TMR1H  = 0x00;
	//	T1CON  = 0x00;
		
		SPBRG  = 0x19; //initialize USART baud = 9600 error = 0.16%
		TXSTA  = 0x06;//高速波特率使能,TRMT=1(发送移位寄存器TSR"空"标志位)
		RCSTA  = 0x90;//SPEN=1(串行口使能),CREN=1(使能连续接收)
		OPTION = 0x8f;//PORTB弱上拉禁止,PSA(预分频器分配位)用于WDT,PS2:PS0=1:128
		INTCON = 0xc0;//GIE=1(全局中断使能),PEIE=1(外围接口中断使能)
		PIE1   = 0x20;//RCIE=1(串行通信接口USART接收中断使能),TMR1IE=1(TMR1溢出中断使能)
		PIR1   = 0x00;
		PIE2   = 0x00;
		PIR2   = 0x00;
		PCON   = 0x03;//未发生上电复位,未发生掉电复位

		TMR1L  = 0x00; //initialize TMR1,65.5ms
		TMR1H  = 0x00;
		T1CON  = 0x31;//使能定时器工作,TMR1ON=1;8分频65.5*8=524ms;
}
///************初始化参数********/
void init_menu()
{
	auto uchar i;
	dog_soft = 0;
	for(i = 0;i < 2 ; i ++)
	{
   		pof_buf1[i] = 0;
	//	pof_buf2[i] = 0;
		por_buf1[i] = 0;
	//	por_buf2[i] = 0;
	//	tmp_buf[i] = 0;
	}
	Prmter1.POFFSET1=rrom(poff1add);
	Prmter1.POFFSET2=rrom(poff2add);
//	tmp_cnt = 0;
	pof_cnt = 0;
	por_cnt = 0;
	tran_flag=0x00;//转义标志,=0为没有转义,=1为转义过了
	Prmter1.ADDR = 	rrom(mod_add_add+2);//mod_add_add为模块地址参数的地址
	//Prmter1.PROTL_ETN = 0x02;
}
/**********************************************************
** 功能说明:  串口初始化函数
** 输入参数:  无	 
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
*********************************************************/
void init_serial()
{
	auto uchar i;
	
	for(i = 0;i < BUF_LENGTH;i++)
	{
		receive_buf[i] = 0;
	}
	for(i = 0; i < 2 ;i ++)
	{
		pChecksum[i] = 0;
	}
	receive_time_on = 0;
	receive_time_count = 0;
	receive_over = 0;
	receive_cnt = 0;
	
	portd_wbuf = portd_wbuf & 0x7f;
	PORTD = portd_wbuf;		
}
/**********************************************************
** 功能说明:  初始化eeprom函数
** 输入参数:  
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
***********************************************************/
void init_eeprom(void)
{
	int i;
    uchar j;
	TRISC0 = 0;
	TRISC1 = 0;
	err_eeprom=0;
	j = rrom(0x07ff); 
	if(j!=0xaa)
	{
		for(i=0;i<0x01ff;i++)
		{
			wrom(i,0x00);	
		}
		wrom(0x07ff,0xaa);
		
		wrom(mod_idadd,0x00);//写入模块ID号地址低字节
		wrom(mod_idadd+1,0xf0);//写入模块ID号地址高字节
		
		wrom(mod_add_add,0x02);//写入模块地址的地址低字节
		wrom(mod_add_add+1,0xf0);//写入模块地址的地址高字节
		
		wrom(product_add,0x19);//写入生产序列号参数地址低字节
		wrom(product_add+1,0xf0);//写入生产序列号参数地址高字节
	}
}

void dog()
{
	asm("CLRWDT");
	OPTION = 0x8f;	
}
void delay_Tad(uchar j)  
{
	auto uchar i;
	for(i=0;i<j;i++)
	{
		asm("nop");
		asm("nop");
		asm("nop");
	}	
}
/**********************************************************
** 功能说明:  延时函数
** 输入参数:  
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
***********************************************************/
void delay_unit(uint buf)
{
	auto uint i;
	for(i = 0;i < buf ;i++)
	{
		asm("nop");
	}
}
/**********************************************************
** 功能说明:  模块检测函数
** 输入参数:  无	 
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
*********************************************************/
void sign_collect()
{
	//CHECK_TEMP();//温度检测
	CHECK_POFDN();//下行正向输出功率检测
	CHECK_PORDN();//下行反向输出功率检测
	//CHECK_SWR();//驻波系数检测
}
/**********************************************************
** 功能说明:  adc数据的采集输出
** 输入参数:  无
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
***********************************************************/
uchar adc_read(uchar buf)
{
	uchar adcbuf;
	ADCON1 = 0x00;
	buf = buf & 0x07;
	buf = buf << 3;
	ADCON0 = buf | 0x41;
	delay_Tad(5);
	ADGO = 0x01;
	while(ADGO)
	{
		;
	}
	#if defined(_16F77)
		adcbuf = ADRES;
	#endif
	#if defined(_16F877A)
		adcbuf = ADRESH;
	#endif
	ADON = 0x00;
	ADIF = 0x00;
	return adcbuf;
} 
/**********************************************************
** 功能说明:  温度检测函数
** 输入参数:  无	 
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
*********************************************************/
//void CHECK_TEMP()
//{

    //   	Prmter1.TEMPL=adc_read(2);
    //   	Prmter1.TEMPH=0; 		 						
     //   wrom(tempadd,Prmter1.TEMPL);
//}
/**********************************************************
** 功能说明:  下行正向输出功率检测函数
** 输入参数:  无	 
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
*********************************************************/
void CHECK_POFDN()
{
	uchar POF_adc;
	uchar buf;
	POF_adc=adc_read(0);//下行功率检测和处理
	pof_buf1[1]=POF_adc;
        pof_cnt++;
    if(pof_buf1[0]<pof_buf1[1])
   	{
   	 pof_buf1[0]=pof_buf1[1];
   	}
      if(pof_cnt>=POF_CNT)
       {
        	Prmter1.POFU = pof_buf1[0]; 
			pof_cnt = 0x00;      
			pof_buf1[0] = 0x00;	
			buf = Prmter1.POFU*11/51+Prmter1.POFFSET1-3 ;
			if(buf<0x80)
			{
				Prmter1.POF=buf;
			}
			else
			{
				Prmter1.POF=0;
			}
       //	Prmter1.POFdn = adc_read(1); 
       //	Prmter1.POFdn=PTable[A]+2;	
       }    
}
/**********************************************************
** 功能说明:  下行反向输出功率检测函数
** 输入参数:  无	 
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
*********************************************************/
void CHECK_PORDN()
{
	uchar POR_adc;
	uchar buf;
	POR_adc=adc_read(3);//下行功率检测和处理
	por_buf1[1]=POR_adc;
        por_cnt++;
    if(por_buf1[0]<por_buf1[1])
   	{
   	 por_buf1[0]=por_buf1[1];
   	}
      if(por_cnt>=POR_CNT)
      {
        Prmter1.PORU = por_buf1[0]; 
		por_cnt = 0x00;	
		por_buf1[0] = 0x00;
		buf = Prmter1.PORU*11/51+Prmter1.POFFSET2-8 ;
			if(buf<0x80)
			{
				Prmter1.POR=buf;
			}
			else
			{
				Prmter1.POR=0;
			}
       }    
       //Prmter1.PORdn = adc_read(0); 
       //Prmter1.PORdn =FPTable[B]-8;					
}
/*********************************************************
** 功能说明:  驻波系数检测函数
** 输入参数:  无	 
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
*********************************************************/
//void CHECK_SWR()
//{ 
	//uchar PZ,PF,SR;
	//PZ=adc_read(1);
	//PF=adc_read(0);
	//PZ=(sqrt(PZ))*10;
	//PF=(sqrt(PF))*10;
	//SR=(PZ+PF)/(PZ-PF);
 	//Prmter1.SWR = SR; 					
       // wrom(SWR_dnadd,Prmter1.SWR);
//}
/**********************************************************
** 功能说明:  对sda端口进行赋值
** 输入参数:  buf			  类型:uchar   :0或1
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
***********************************************************/
void sda(uchar buf)
{
	 if(buf)
	 {
	 	portc_wbuf = portc_wbuf | 0x02; 
	 	PORTC = portc_wbuf;
	 }
	 else
	 {
	 	portc_wbuf = portc_wbuf & 0xfd;
	 	PORTC = portc_wbuf;
	}
}
/**********************************************************
** 功能说明:  对scl端口进行赋值
** 输入参数:  buf			  类型:uchar   :0或1
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
***********************************************************/
void scl(uchar buf)
{
	 if(buf)
	 {
	 	portc_wbuf = portc_wbuf | 0x01; 
	 	PORTC = portc_wbuf;
	 }
	 else
	 {
	 	portc_wbuf = portc_wbuf & 0xfe;
	 	PORTC = portc_wbuf;
	}	
}
/**********************************************************
** 功能说明:  读eeprom的值
** 输入参数:  addr		  类型:uint  :读数的地址
** 输出参数:  buf          类型:uchar :读出的数据
** 返 回 值:  无
** 引用函数: 
***********************************************************/
uchar rrom(uint addr)
{
	uchar buf;
	union buf_union comm;
	comm.buf1 = addr;
	_nop();
	iic_stop();
	iic_star();
	iic_send((comm.buf2[1] <<1)| 0xa0);
	iic_ack();

	iic_send(comm.buf2[0]);
	iic_ack();

	iic_star();
	iic_send((comm.buf2[1] <<1)|0xa1);
   	iic_ack();
	
	buf = iic_get();
	iic_stop();
    return buf;
}
/**********************************************************
** 功能说明:  写eeprom
** 输入参数:  addr		  类型:uchar :写数据的地址
		 	 buf          类型:uchar :读出的数据
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
***********************************************************/
uchar wrom(uint addr,uchar buf)
{
	uchar ubuf;
	uchar  wcount;
    union buf_union comm;
    wcount = 0;
	comm.buf1 = addr;
iic_write_re:
	if( wcount > 4 )
	{
		iic_stop();
		_nop();
		wcount = 0;
		err_eeprom = 1;
		return 0;
	}
	_nop();
	iic_star();
	iic_send((comm.buf2[1]<<1) | 0xa0);
	ubuf = iic_ack();
	if(ubuf)
	{
		wcount++;
		_nop();
		goto iic_write_re;
	}
	iic_send(comm.buf2[0]);
	ubuf = iic_ack();
	if(ubuf)
	{
		wcount++;
		_nop();
		goto iic_write_re;
	}
	iic_send(buf);
	ubuf = iic_ack();
	if(ubuf)
	{
		wcount++;
		_nop();
		goto iic_write_re;
	}	
	iic_stop();
	return 1;
}
/**********************************************************
** 功能说明:  延时函数
** 输入参数:
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
***********************************************************/
void iic_delay()
{
	uchar  a;
	for(a = 0; a < IIC_DELAY ; a++ )
	{
		asm("NOP");
	}
}
/**********************************************************
** 功能说明:  操作eeprom时发起始命令
** 输入参数:  
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
***********************************************************/
void iic_star()
{
	TRISC0 = 0;
	TRISC1 = 0;
	scl(1);
	sda(1);
//	_nop();
	sda(0);
	scl(0);
	_nop();
}
/**********************************************************
** 功能说明:  操作eeprom完成时发结束命令
** 输入参数: 
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
***********************************************************/
void iic_stop()
{
	TRISC0 = 0;
	TRISC1 = 0;
	sda(0);
	scl(1);
	_nop();
	sda(1);
	_nop();
	scl(1);
	_nop();
}
/**********************************************************
** 功能说明:  发数据给eeprom
** 输入参数: buf			类型:uchar		:需要发送的数据
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
***********************************************************/

void iic_send(uchar buf)
{
	uchar i;
	TRISC0 = 0;
	TRISC1 = 0;
	for(i = 0 ; i < 8 ;i++)
	{
		if( buf & 0x80 )
		{
			sda(1);
		}
		else
		{
			sda(0);
		}
		_nop();
		scl(1);
		//_nop();
		scl(0);
		//_nop();
		buf = buf << 1;
	}
}
/**********************************************************
** 功能说明:  从eeprom获取数据
** 输入参数: 
** 输出参数:  buf 		类型:uchar		:获取的数据
** 返 回 值:  无 
** 引用函数: 
***********************************************************/	
uchar iic_get()
{
	uchar  i,buf;
	buf = 0x00;
	TRISC0 = 0;
	TRISC1 = 1;
	for(i = 0 ; i < 8 ;i++)
	{		
		scl(1);
		_nop();
		buf = buf <<1;
		if(PORTC & 0x02)
		{
		buf = buf|0x01;
		}
		scl(0);
		_nop();	
	}
	return buf;
}
/**********************************************************
** 功能说明:  eeprom回应命令体
** 输入参数:  buf          类型:uchar 	:0响应/1无响应
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
***********************************************************/
uchar iic_ack()
{
	uchar buf;
	TRISC1 = 1;
	TRISC0 = 0;
	sda(1);
	_nop();
	scl(1);
	if(PORTC & 0x02)
		buf = 1;
	else
		buf = 0;
	scl(0);
	_nop();
	TRISC1 = 0;
	_nop();
	return buf;
}
/**********************************************************
** 功能说明:  收到数据发出响应
** 输入参数: 
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
***********************************************************/
void ack_iic(uchar buf)
{
	if(buf == 0)
	{
		sda(0);
	}
	else
	{
		sda(1);
	}
	_nop();
	
	scl(1);
	_nop();
	scl(0);
	_nop();
}




/**********************************************************
** 功能说明:  485串口数据处理
** 输入参数:  无	 
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
*********************************************************/
void serial_data()
{
	auto uchar start,length,buf,buf1;
//	uchar mokuaiadd;

⌨️ 快捷键说明

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