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

📄 cdma800.c

📁 10W功放模块监控程序
💻 C
📖 第 1 页 / 共 4 页
字号:
	pChecksum[1] = checksum / 256;   
	return;
}

/**********************************************************
** 功能说明:  接受数据数组的初始化
** 输入参数:  
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
************************************************************/
void receive_free()
{
	auto uchar i;
	for(i = 0; i < BUF_LENGTH; i ++)
	{
		receive_buf[i] = 0;
	}
}

/**********************************************************
** 功能说明:  对sda端口进行赋值
** 输入参数:  buf			  类型:uchar   :0或1
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
************************************************************/
void sda(uchar buf)
{
	 if(buf)
	 {
	 	portc_wbuf = portc_wbuf | 0x01; 
	 	PORTC = portc_wbuf;
	 }
	 else
	 {
	 	portc_wbuf = portc_wbuf & 0xfe;
	 	PORTC = portc_wbuf;
	}
}
/**********************************************************
** 功能说明:  对scl端口进行赋值
** 输入参数:  buf			  类型:uchar   :0或1
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
************************************************************/
void scl(uchar buf)
{
	 if(buf)
	 {
	 	portc_wbuf = portc_wbuf | 0x02; 
	 	PORTC = portc_wbuf;
	 }
	 else
	 {
	 	portc_wbuf = portc_wbuf & 0xfd;
	 	PORTC = portc_wbuf;
	}	
}
/**********************************************************
** 功能说明:  读eeprom的值
** 输入参数:  addr		  类型:uint  :读数的地址
** 输出参数:  buf          类型:uchar :读出的数据
** 返 回 值:  无
** 引用函数: 
*************************************************************/
uchar rrom(uint addr)
{
	uchar buf;
	union buf_union comm;
	T1CON=0x00;
	RCIE=0;
	CREN=0;
	dog();
	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();
	T1CON=0x31;
	CREN=1;
	RCIE=1;
		receive_time_on = 0;
	receive_time_count = 0;
	receive_over = 0;
	tran_flag=0x00;
	headend_flag=0x00;
    return buf;
}
/**********************************************************
** 功能说明:  写eeprom
** 输入参数:  addr		  类型:uchar :写数据的地址
		 	 buf          类型:uchar :读出的数据
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
************************************************************/
uchar wrom(uint addr,uchar buf)
{
	uchar ubuf;
	uchar  wcount;
    union buf_union comm;
    T1CON=0x00;
    RCIE=0;
	CREN=0;
	dog();
    wcount = 0;
	comm.buf1 = addr;
iic_write_re:
	if( wcount > 4 )
	{
		iic_stop();
		_nop();
		wcount = 0;
		err_eeprom = 1;
		T1CON=0x31;
		CREN=1;
    	RCIE=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();
	T1CON=0x31;
	CREN=1;
    RCIE=1;
	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;
	TRISC1 = 0;
	TRISC0 = 1;
	for(i = 0 ; i < 8 ;i++)
	{		
		scl(1);
		_nop();
		buf = buf <<1;
		if(PORTC & 0x01)
		{
			buf = buf|0x01;
		}
		scl(0);
		_nop();	
	}
	return buf;
}
/**********************************************************
** 功能说明:  eeprom回应命令体
** 输入参数:  buf          类型:uchar 	:0响应/1无响应
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
************************************************************/
uchar iic_ack()
{
	uchar buf;
	TRISC1 = 0;
	TRISC0 = 1;
	sda(1);
	_nop();
	scl(1);
	if(PORTC & 0x01)
		buf = 1;
	else
		buf = 0;
	scl(0);
	_nop();
	TRISC0 = 0;
	_nop();
	return buf;
}
/**********************************************************
** 功能说明:  收到数据发出响应
** 输入参数: 
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
************************************************************/
void ack_iic(uchar buf)
{
	if(buf == 0)
	{
		sda(0);
	}
	else
	{
		sda(1);
	}
	_nop();
	
	scl(1);
	_nop();
	scl(0);
	_nop();
}
/**********************************************************
** 功能说明: 中断处理子程序(包括接收中断、定时器中断)
** 输入参数:  
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
**********************************************************/
void interrupt int_process(void)
{
	auto uchar i;
//	uchar buf;
	if(RCIF == 1)  //USART接收中断标志位为1
	{
		if(portd_wbuf&0x10)//如果处于发送状态,返回主程序,不处理缓冲区中的数据
		{
			return;
		}
		if(receive_over == 1 )//如果接收完成标志为1,则接收完成,不再接收数据.
		{
			return;
		}
		if(receive_cnt > 79)//接收缓冲超过80个字节时,就为溢出,将接收缓冲重新计数
		{
			receive_time_on = 0;//接收超时定时器开关关闭
			receive_time_count = 0;//接收超时定时计数器清零
			receive_cnt = 0;//发送或接收的字节数清零.
			for(i = 0; i < BUF_LENGTH; i++)  //将接收缓冲清零
			{
				receive_buf[i] = 0;
			}
			return;
		}		
		receive_buf[receive_cnt] = RCREG;
//		if (receive_cnt==1)
//		{
//			buf=receive_buf[receive_cnt];
//		}
		if(receive_buf[receive_cnt] == 0x4E)//接收到的字节是包头或包尾
		{
			if(headend_flag==0x01)//判断接收到的是包头还是包尾,如果标志=1,则接收到过包头,现在接收到的是包尾;
			{
				headend_flag=0x02;//接收到的是包尾
			}
			if(headend_flag==0x00)//判断接收到的是包头还是包尾,如果标志=0,则接收到的是包头,之前没接收到包尾和包头;
			{
				receive_buf[0]=0x4E;
				headend_flag=0x01;//接收到的是包头
				receive_cnt = 0x01;//接收的字节数为1个.
				receive_time_on = 0x01;//接收超时定时器开关打开
				receive_time_count = 0x00;//接收超时定时计数器清零
//				for(i = 0; i < BUF_LENGTH;i++)//将接收缓冲清零
//				{
//					receive_buf[i] = 0;
//				}
				return;				
			}
		}		
		else if(receive_buf[0] != 0x4E)//如果缓冲区接收到的第一个字节不是包头
		{
			receive_cnt = 0x00;//发送或接收的字节数清零.
			receive_time_on = 0x00;//接收超时定时器开关关闭
			receive_time_count = 0x00;//接收超时定时计数器清零
			return;
		}	
		
		if((receive_buf[receive_cnt-1] == 0x5E)&&(tran_flag==0x00))//接收到转义字节0x5E
		{
		//	tran_flag=0x01;
			if	(receive_buf[receive_cnt] == 0x4D)//0X5E的转义处理
			{
				receive_buf[receive_cnt-1]	=0X4E;
				tran_flag=0x01;//完成转义处理
				//receive_cnt--;
				return;
			}
			else if(receive_buf[receive_cnt]==0x5D)//0X5E的转义处理
			{
				
				tran_flag=0x01;//完成转义处理
				receive_buf[receive_cnt-1]=0x5E;
				//receive_cnt--;
				return;
			}
			else if(tran_flag==0x01)//0X5E的转义处理
			{
				tran_flag=0x00;
			}
			else //说明接收错误,返回
			{
				tran_flag=0x00;
				headend_flag=0x00;
				receive_time_on = 0;//接收超时定时器开关关闭
				receive_time_count = 0;//接收超时定时计数器清零
				receive_cnt = 0;//发送或接收的字节数清零.
				return;
			}			
		}
		receive_cnt++;		
		if(headend_flag==0x02)//接收到了包头和包尾,并且没有接收到转义字节0X5E或转义处理已完成
		{
			tran_flag=0x00;
			headend_flag==0x00;//包头包尾标志清零
			receive_time_on = 0;//接收超时定时器开关关闭
			receive_time_count = 0;//接收超时定时计数器清零
			receive_over = 1;//接收完成标志置1
			RCIE = 0;//接收允许标志位清零,不允许接收
			CREN = 0;  
			return;
		}
	}
	else if(TMR1IF == 1)
	{
		chushi++;
	//	if (chushi<=0x0d6b)
	//	{
			TMR1IF=0;
	//	}
		return;		
	}
	else if(TMR2IF == 1)
	{
	//	i= 100;
		TMR2IF =0;
		return;
	}
}
/**********************************************************
** 功能说明: 查询温度值或频率信道号
** 输入参数:  fstadr  类型:uint: 温度值首地址或频率值首地址	 
			  bytenumb  类型:uchar:占字节数,1代表占1个字节,2代表占2个字节
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
**********************************************************/
uchar Query_tp(uint fstadr,uchar bytenumb)
{
	uchar i;
	uchar length;
	uchar buf;
	//buf = receive_buf[9];//包序号
	
	//length =rrom(tpdots) ;//温度或频率划分点数
	buf=bytenumb*30;
	for(i=0; i<buf; i++)
	{
		receive_buf[i+10]= rrom(fstadr+i);
	}
	//length =buf+2;
length =buf+3;
	return length;	
}

/**********************************************************
** 功能说明: 查询所有温补、标称值补偿、频响补偿参数编码,编码占2个字节
** 输入参数:  adsnumb  类型:uchar: =1,选择温补编码表格;=2,选择标称值补偿编码表格;=3,选择频补编码表格
			  bubuf	 类型:uchar: 温度或标称值或频响补偿参数总数
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
**********************************************************/
uchar Query_csd(uchar adsnumb,uchar bubuf )
{
	uchar i,buf;
	uchar length;
	buf = receive_buf[9];//包序号
	
	for(i=0; i<(bubuf*2); i++)
	{
		dog();	       			
		if(adsnumb==1)
		{
			receive_buf[i+10]= prtemp[i];
		}

		else
		{
			receive_buf[i+10]= attact[i];
		}
	}
	//length =bubuf*2+2;
	
	length =bubuf*2+3;
	return length;	
}

/**********************************************************
** 功能说明: 查询所有温补、标称值补偿、频响补偿参数表内容,所有补偿参数占1个字节
** 输入参数:  firstadr  类型:uint: 补偿参数表的首地址
			  bubuf	 类型:uchar: 温度或标称值或频响补偿参数总数
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
**********************************************************/
uchar Query_cszd(uint firstadr,uchar bubuf)
{
	uchar i,buf;
	uchar length;
	buf = receive_buf[10];//位置	
	for(i=0; i<bubuf; i++)
	{
	dog();
	receive_buf[i+11]= rrom(firstadr+i+(buf-1)*bubuf);
	}
	//length =bubuf+3;
	length =bubuf+4;
	return length;		
}
/**********************************************************
** 功能说明: 设置温度值或频率信道号
** 输入参数:  fstadr  类型:uint: 温度值首地址或频率值首地址	 
			  bytenumb  类型:uchar:占字节数,1代表占1个字节,2代表占2个字节
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
**********************************************************/
uchar Set_tp(uint fstadr )
{
	uchar i;
	uchar length;
	uchar *P = 0;
	
//	length = receive_buf[7]-2;//命令体长度-2
	length = receive_buf[7]-3;//命令体长度-3
	P = receive_buf+10;
	i=0;
	while(length)
	{
	dog();
	wrom(fstadr+i,*P++);
	i++;
	length--;
	}
//length = 2;//回应命令体为2字节
length = 3;//回应命令体为2字节
	return length;
}


/**********************************************************
** 功能说明: 设置所有温补、标称值补偿、频响补偿参数表内容,所有补偿参数占1个字节
** 输入参数:  firstadr  类型:uint: 补偿参数表的首地址
			  bubuf	 类型:uchar: 温度或标称值或频响补偿参数总数
** 输出参数:  
** 返 回 值:  无
** 引用函数: 
**********************************************************/
uchar Set_cszd(uint firstadr,uchar bubuf)
{	
	uchar i,buf;
	uchar length;
	uchar *P = 0;
	//erro=0;
	//length = receive_buf[7]-3;
	length = receive_buf[7]-4;
	buf = receive_buf[10];//位置
	P = receive_buf+11;
	i=0;
	while(length)
	{
	dog();
	wrom(firstadr+(buf-1)*bubuf+i,*P++);
	i++;
	length--;
	}
//length = 2;
length = 3;
	return length;		
}

⌨️ 快捷键说明

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