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

📄 commuinfr.c

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

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

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

//============================================================
//函数功能:初始化红外通讯模块
//
//=============================================================
void init_infrcomm(void)
{ uint8 i;
  F_commudiv=0;
  CfgPort(5,0);                               // P1_1初始化为GPIO口
  P1OE&=0xfd;                                 // 输出使能
  P1OD|=0x02;                                 // 输出高电平

  SetIR(43,43);                               // 设置载波型号占空比 86
  CfgEU(2,1200,11,0);                         // 串口号2,拨特率1200,通讯方式11位,偶校验

  for(i=0;i<25;i++)                           // 清缓冲
     buff_reddata[i]=0;

  CfgPort(13,2);                              // P2_4作为RXD2
  P2IE|=0x10;                                 // 输入使能
//  CfgPort(14,2);                 //           // P2_5作为TXD2
  CfgPort(14,0);                              // P2_5初始化为GPIO口
  P2OE&=0xdf;                                 // 输出使能
  P2OD&=0xdf;                                 // 输出低电平

  len_infrcommdata=0;
  point_infrsendaddr=0;
  timedelay_infrcomm=0;
  sta_infrcomm=standby_comm;
  jiaoyan_typeinfr=type_enven;
  SetInterrupt(8);                           // 打开接收中断
}

//=============================================================
//函数功能:接收中断处理函数。
//
//==============================================================
void rec_infrcomm(void)
{// unsigned int i;
 timedelay_infrcomm=0;                           // 清接收等待延时
 switch (sta_infrcomm)		                     // 当前通讯状态
     {case standby_comm:                // 等待状态
	       if((buff_intrrec&0xff)==0x68)         // 全国规约开始
		      { sta_infrcomm=recdata_comm;       // 进入接收状态
			    len_infrcommdata=1;				 // 接收到的数据个数
				buff_reddata[0]=(unsigned char)buff_intrrec;	 // 头 68H 
				jiaoyan_type=type_enven;         // 偶校验
				type_protoclinfr=type_quanguo;   // 全国规约
			  }
		   break;
	  case recdata_comm:     // 接收状态
		      len_infrcommdata++;				 // 接收数据的个数+1
 			  buff_reddata[len_infrcommdata-1]=(unsigned char)buff_intrrec;   
		   break;
	  case hook_comm:     		 // 挂起状态
		  ClrInterrupt(8);       // 关接收中断 
	      break;
	  default:    				// 出错,重新初始化
	  init_infrcomm();                      
	  break;
	 }
}  

//==========================================================
//函数功能:发送第一个数据,开发送中断
//
//==========================================================
void start_sendinfr(void)
{ //uint8 i;
  timedelay_comm=0;
  
  CfgPort(14,2);                               // P2_5作为TXD2
  ClrInterrupt(8);                             // 禁止接收
  SetInterrupt(7);                             // 开发送中断

  sta_infrcomm=senddata_comm;                  // 处于发送状态
  SendUData(buff_reddata[0],2);                // 发送第一个数据
  len_infrcommdata=len_infrcommdata-1;
  point_sendaddr=0;
}

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

void intrupt_sendinfr(void)
{//uint8 i;
  timedelay_comm=0;
  if(sta_infrcomm==senddata_comm)
     { if(len_infrcommdata>0)                        //如果还未发送完毕
	       { len_infrcommdata=len_infrcommdata-1;
		     point_sendaddr++;
			 SendUData(buff_reddata[point_sendaddr],2);
/*			 ////// 
             i=check_bitnum(buff_reddata[point_sendaddr]);     // 发送奇偶校验位
             if(jiaoyan_type==type_enven)                      // 如果是偶校验
                { if(i==0)
	                 SCON2&=0xf7; 
                  else
                     SCON2|=0x08;
	            }
             SBUF2=buff_reddata[point_sendaddr];                //发送数据
			 *//////
   	       }
		else                                              // 如果发送完毕 
		   {
	        init_infrcomm();
		  /* 
		   SetInterrupt(8);                             // 允许接收
		     ClrInterrupt(7);                             // 关发送中断 
		     sta_infrcomm=standby_comm;                   // 485重新进入等待状态 
             CfgPort(14,0);                               // P2_5初始化为GPIO口
             P2OE&=0xdf;                                  // 输出使能
             P2OD&=0xdf;                                  // 输出低电平
  			 CfgPort(13,2);                               // P2_4作为RXD2
  			 P2IE|=0x10;                                  // 输入使能
  			 len_infrcommdata=0;
  			 point_infrsendaddr=0;
  			 timedelay_infrcomm=0;
  			 sta_infrcomm=standby_comm;
  			 jiaoyan_typeinfr=type_enven;
			 */
		   }
	 }
	else 
     init_infrcomm();
}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 

⌨️ 快捷键说明

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