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

📄 commu485.c

📁 电能表源码
💻 C
字号:
/*************************************************************************************

	文件类型:485通讯模块
	文件作用:
	修改权限:
	文件相关:
	
	创 建 人:chenbo
	创建日期:2007.06.21
	当前版本:Ver0.1
	
	版本信息:Ver0.1					GeminiKQ

**************************************************************************************/
#include "Tiger.h"



unsigned int code botelv_table[]={300,1200,2400,4800,9600};
//=================================================
//函数功能:初始化485通讯模块
//
//=================================================
void init_485comm(void)
{ uint8  i;
//  uint16 temp_data;
 // if(ram[RAM_botelv]>4)                       //数据出错,默认为1200 
 //    ram[RAM_botelv]=0;
 // temp_data=botelv_table[ram[RAM_botelv]];
  CfgEU(5,1200,11,0);                        //设置通讯波特率; 11数据,偶校验
  CfgPort(7,2);                              //P1_3座位RXD4
  P1IE|=0x08;                                //输入使能
  CfgPort(8,2);                              //P1_4座位TXD4
  P1OE&=0xef;                                //输出使能
  for(i=0;i<25;i++)                          //清缓冲 25B
     buff_485data[i]=0;
  len_485commdata=0;
  point_sendaddr=0;
  timedelay_comm=0;
  sta_485comm=standby_comm;
  jiaoyan_type=type_enven;
  SetInterrupt(18);                           //打开接收中断
}

//=============================================================
//函数功能:485接收中断处理函数。
//
//==============================================================
void rec_485comm(void)
{uint8 i;
 timedelay_comm=0;                                     //清接收等待延时
 switch (sta_485comm)
     {case standby_comm:                               //等待状态
	       if((buff_485rec&0xff)==0x68)                //全国规约开始
		      { sta_485comm=recdata_comm;              //进入接收状态
			    len_485commdata=1;
				buff_485data[0]=(unsigned char)buff_485rec;  
				jiaoyan_type=type_enven;           //偶校验
				type_protocl485=type_quanguo;      //全国规约
			  }
		   break;
	  case recdata_comm:                           //接收状态
	       i=buff_485rec>>8;                       //取校验位
		  // if(i==0)                              //接收数据正确
		      { len_485commdata++;
 			    buff_485data[len_485commdata-1]=(unsigned char)buff_485rec;
			  }
          /*
           else                                     //接收数据出错
 		      { sta_485comm=standby_comm;           //进入等待状态
			    len_485commdata=0;                  //清接收缓冲
			  }
          */
		   break;
	  default:                                    //                           
	       break;
	 }
	 
}  

//==========================================================
//函数功能:发送第一个数据,开发送中断
//
//==========================================================
void start_send485(void)
{ //uint8 i;
  timedelay_comm=0;
  ClrInterrupt(18);                            //禁止接收
  SetInterrupt(17);                            //开发送中断
  sta_485comm=senddata_comm;                   //485处于发送状态
  SendUData(buff_485data[0],5);                //发送第一个数据
  /*
  i=check_bitnum(buff_485data[0]);            //发送奇偶校验位
  if(jiaoyan_type==type_enven)                //如果是偶校验
    { if(i==0)
	     SCON4&=0xf7;
      else
         SCON4|=0x08;
	}
  SBUF4=buff_485data[0];                      //发送第一数据
  */
  len_485commdata=len_485commdata-1;
  point_sendaddr=0;

}

//==========================================================
//函数功能:485发送中断相应函数
//
//==========================================================

void intrupt_send485(void)
{//uint8 i;
  timedelay_comm=0;
  if(sta_485comm==senddata_comm)
     { if(len_485commdata>0)                        //如果还未发送完毕
	       { len_485commdata=len_485commdata-1;
		     point_sendaddr++;
			 SendUData(buff_485data[point_sendaddr],5);
             /*
             i=check_bitnum(buff_485data[point_sendaddr]);            //发送奇偶校验位
             if(jiaoyan_type==type_enven)                             //如果是偶校验
                { if(i==0)
	                 SCON4&=0xf7;
                  else
                     SCON4|=0x08;
	            }
             SBUF1=buff_485data[point_sendaddr];                      //发送数据
             */
   	       }
		else                                                           //如果发送完毕 
		   { SetInterrupt(18);                                          //允许接收
		     ClrInterrupt(17);                                           //禁止发送
		     sta_485comm=standby_comm;                                  //485重新进入等待状态 
		   }

	 }
}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 

⌨️ 快捷键说明

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