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

📄 d_485

📁 485多机通信+lcd液晶显示
💻
字号:
/*************************************************************************************************
* 文 件 名:485.c
* 功    能:485主机通信模块
* 硬件条件: 1.CPU型号:ATMEL2051
*            2.晶振:11.0592
* 作    者:zwb
* 日    期:2009年04月24号
*************************************************************************************************/
//-----------------------函数声明,变量定义--------------------------------------------------------
#include <reg51.h>
#include <INTRINS.h>
#include <string.h>
#define  unchar  unsigned char
#define COUNT 10          // 定义接收缓冲区大小 
unsigned char	Receive_buffer[COUNT]; //定义接收缓冲区
unsigned char	Rateflow_buffer[COUNT];//瞬时流量缓冲区
unsigned char	Veloflow_buffer[COUNT];//瞬时流速缓冲区
unsigned char	Percentageflow_buffer[COUNT];//流量百分比缓冲区
unsigned char	Resistanceflow_buffer[COUNT];//流体电阻值缓冲区
unsigned char	Positive_buffer[COUNT];//正向总量缓冲区
unsigned char	Opposite_buffer[COUNT];//反向总量缓冲区
unsigned char	Alarm_buffer[COUNT];//报警状态缓冲区
unsigned char	Diameter_buffer[COUNT];//管道直径缓冲区
unsigned char	Set_buffer[COUNT];//参数设置缓冲区
unsigned char	  point;    //定义接收数据个数指示变量
unsigned char	COM_dzdata[2];//定义主机发送地址和命令


//============================================================================
//函数功能;延时子程序
// ===========================================================================
void delay(void)
{
	unchar i=124;
	while(i--);
}
//--------------------------------------------------------------------------------------------------
// 函数名称: UART_init()串口初始化函数
// 函数功能: 在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s
//            串口接收中断允许,发送中断禁止
//--------------------------------------------------------------------------------------------------
void UART_init(void)
{
                     //初始化串行口和波特率发生器 
	SCON =0x98;          //选择串口工作方式2,打开接收允许
	TMOD =0x40;          //定时器1工作在方式2
	PCON = 0x80;
	TH1 =0xfa;           //实现波特率9600(系统时钟11.0592MHZ)
	TR1 =1;              //启动定时器T1
	ET1 =0; 
	PS=1;                //设计串行口中断优先级
	EA =1;               //单片机中断允许
	ES=0;               //禁止串行口中断
}
//--------------------------------------------------------------------------------------------------
// 函数名称: com_longerrup()串口接收中断处理函数
// 函数功能: 接收包括起始位'S'在内的十位数据到数据缓冲区
//--------------------------------------------------------------------------------------------------
com_interrupt(void) interrupt 4 using 3
{
  unchar RECEIVR_buffer;
  if(RI)                                //处理接收中断
	{
	RI=0;                                //清除中断标志位
	RECEIVR_buffer=SBUF;            //接收串口数据
	if(  point==0)       //如果还没有接收到起始位
		{ if(point>0&&point<10)     //判断是否接收够十位数据
	 	 Receive_buffer[point++]=RECEIVR_buffer;//不够,把接收到的数据放入接收缓存区
		}
	else point=0;                   //缓冲区已满,清除缓存区内数据重新接收
	} 
 if(TI)                                  //处理发送中断
	{TI=0;}
}

//--------------------------------------------------------------------------------------------------
// 函数名称: CLU_checkdata()计算校验位函数
// 输入变量: 无
// 输出变量: checkdata,包括起始位在内的前九位数据的校验和
// 函数功能: 计算校验和
//--------------------------------------------------------------------------------------------------
unsigned char CLU_checkdata(void)
{           //计算校验位
 	unchar point,checkdata=0;
	for(point=2;point<7,TI=1;point++)
 	 {
 		checkdata=checkdata^Receive_buffer[point];
   	 }
   return(checkdata);
 }
//====================================================================
//函数名称:SurveyData(void)
//输入变量:测量数据
//输出变量:无
//函数功能:存放从机发来的测量数据
//====================================================================

void SurveyData(void)
{   
	unchar i;
	i=COM_dzdata[1];
	switch(i)
		{
		case 0x00:memcpy(Rateflow_buffer,Receive_buffer,10); break;
	    case 0x01:memcpy(Veloflow_buffer,Receive_buffer,10); break;
		case 0x02:memcpy(Percentageflow_buffer,Receive_buffer,10); break;
		case 0x03:memcpy(Resistanceflow_buffer,Receive_buffer,10); break;
		case 0x04:memcpy(Positive_buffer,Receive_buffer,10); break;
		case 0x05:memcpy(Opposite_buffer,Receive_buffer,10); break;
		case 0x06:memcpy(Alarm_buffer,Receive_buffer,10); break;
		case 0x07:memcpy(Diameter_buffer,Receive_buffer,10); break;

		default:break;}
}

//- - - - - - - - - - - - - -  ------------------------------------------------------------------ --------
//函数名称:发送命令
//函数功能:主机发送通信命令
// --------------------------------------------------------------------------------------------------
void send_COM (void)
{	
	unchar i;
	for(i=0;i<2;i++)
		{
			SBUF=COM_dzdata[i];
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();			
		}
	ES=1;                //允许串行口中断
	
}
//=====================================================================
//函数名称:Converse_data
//函数功能:转换数据类型
//输入函数:字符型接收到的数据
//输出函数:长整形数据
//==================================================================
void	Converse_data(void)
{     unchar i;
      i=COM_dzdata[1];
	switch(i)
		{
		case 0:	 Rateflow_buffer[2]=(Rateflow_buffer[2]>>4)*10+(Rateflow_buffer[2]&0x0f);
				 Rateflow_buffer[3]=(Rateflow_buffer[3]>>4)*10+(Rateflow_buffer[3]&0x0f);
				 Rateflow_buffer[4]=(Rateflow_buffer[4]>>4)*10+(Rateflow_buffer[4]&0x0f);break;
		case 1:	 Veloflow_buffer[2]=(Veloflow_buffer[2]>>4)*10+(Veloflow_buffer[2]&0x0f);
				 Veloflow_buffer[3]=(Veloflow_buffer[3]>>4)*10+(Veloflow_buffer[3]&0x0f);
				 Veloflow_buffer[4]=(Veloflow_buffer[4]>>4)*10+(Veloflow_buffer[4]&0x0f);break;
		case 2:	 Percentageflow_buffer[2]=(Percentageflow_buffer[2]>>4)*10+(Percentageflow_buffer[2]&0x0f);
				 Percentageflow_buffer[3]=(Percentageflow_buffer[3]>>4)*10+(Percentageflow_buffer[3]&0x0f);break;
		case 3:	 Resistanceflow_buffer[2]=(Resistanceflow_buffer[2]>>4)*10+(Resistanceflow_buffer[2]&0x0f);
				 Resistanceflow_buffer[3]=(Resistanceflow_buffer[3]>>4)*10+(Resistanceflow_buffer[3]&0x0f);break;	
		case 4:	 Positive_buffer[2]=(Positive_buffer[2]>>4)*10+(Positive_buffer[2]&0x0f);
				 Positive_buffer[3]=(Positive_buffer[3]>>4)*10+(Positive_buffer[3]&0x0f);
				 Positive_buffer[4]=(Positive_buffer[4]>>4)*10+(Positive_buffer[4]&0x0f);
				 Positive_buffer[5]=(Positive_buffer[5]>>4)*10+(Positive_buffer[5]&0x0f);
				 Positive_buffer[6]=(Positive_buffer[6]>>4)*10+(Positive_buffer[6]&0x0f);break;
		case 5:	 Opposite_buffer[2]=(Opposite_buffer[2]>>4)*10+(Opposite_buffer[2]&0x0f);
				 Opposite_buffer[3]=(Opposite_buffer[3]>>4)*10+(Opposite_buffer[3]&0x0f);
				 Opposite_buffer[4]=(Opposite_buffer[4]>>4)*10+(Opposite_buffer[4]&0x0f);
				 Opposite_buffer[5]=(Opposite_buffer[5]>>4)*10+(Opposite_buffer[5]&0x0f);
				Opposite_buffer[6]=(Opposite_buffer[6]>>4)*10+(Opposite_buffer[6]&0x0f);break;
	default:break;}
		
}
//--------------------------------------------------------------------------------------------------
// 函数名称: 主函数
// 函数功能: 调度个子函数,完成通信过程
//--------------------------------------------------------------------------------------------------
 void main(void)
 {
  unchar checkdata;
 do
 {
	  UART_init();       //初始化串口
	  send_COM ();
	  if(point==9)       //判断数据是否接收完成
	  {
	  	checkdata=CLU_checkdata();    //调用求校验和函数
	  	if(checkdata==Receive_buffer[8])        //判断校验和是否正确
  		{	
	  	point=0;
		SurveyData();
		Converse_data();
  		}
	  }
  }
  while(1);
 }






 

⌨️ 快捷键说明

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