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

📄 hongwai_receiver.c

📁 红外控制万年历
💻 C
字号:
//只接收数据和起始码 ,简化协议编程 ,中断1设为下降沿触发,接收到中断后启动定时器
//计算低电平的维持时间,得到正确的接收码则发光二极管亮
//发送数据时先发射最低位
#define uchar unsigned char
 int    hongwai_receiver[9]={0,0,0,0,0,0,0,0,0};     //存放载波周期数
 uchar  hongwai_re_cishu=0;                          //                        
 int    hongwai_shuju=0;                             //载波周期的个数
 uchar  hongw_receive=0;                             //存放接收到的数据
 bit    hongwai_re_enable=0;                         //允许计算低电平的维持时间
 bit    hongwai_dis_enable=0;                        //允许显示接收倒的数据
 sbit   hongwai_get=P3^3;                            //用于读端口操作
 void   hongwai_control();                           //对接受的数据进行识别处理
 


void hongwai_Delay(int j)                            //延时函数
{
    int m;
	for(m=0;m<j;m++)
	{
		int i;
		for(i=0; i<300; i++){;}	                     //约1ms
	}
}



void waibu_int(void) interrupt 2
{
   EX1=0;
   hongwai_re_enable=1;
   TR0 = 1;                           //有红外数据来才开计数器
}




void hongwai_ini(void) 
{
  IT1 = 1;                            //设外部中断1 为下降沿触发 
  EX1=1;
  ET0 = 1;                            //定时器0中断允许 
  EA = 1;                             //允许CPU中断
  TMOD =TMOD& 0xf1;                   //设定时器0和1为16位模式1 
  TH0 = 0xff; 
  TL0 = 0xe6;                         //设定时值0的装入值,输出脉冲频率为38K,即26us中断一次  
                                      //计数器对数字温度计影响较大,开始时不要打开
}



void timeint(void) interrupt 1        //定时器0中断处理 
{ 
  TH0=0xff; 
  TL0=0xe6;                           //26us中断一次,再重装数据
  if(hongwai_re_enable==1)
  {
      if(hongwai_get==0)
        {
	      hongwai_shuju++;            //计算0电平维持的时间
	    }
      else
        {
	      EX1=1;
	      hongwai_re_enable=0;
	      hongwai_receiver[hongwai_re_cishu]=hongwai_shuju;
		  hongwai_shuju=0;
	      hongwai_re_cishu++;
	    }
      if(hongwai_re_cishu==9)        //接收完成
        {
	      hongwai_re_cishu=0;
		  hongwai_dis_enable=1;      //允许显示接收的数据
	   
	    }
  }
} 


void hongwai_control()                          //发送数据时先发射最低位
{ 
   int i;
  
   if(hongwai_dis_enable==1)                    //
    {
              
        if(300<hongwai_receiver[0]<360)         //检测起始码是否正确300
          {

	        for(i=1;i<9;i++)
	           {
			     hongw_receive>>=1;             //数据you移
		         if((hongwai_receiver[i]<80)&&(hongwai_receiver[i]>40))       //是否为高电平
	                { hongw_receive|=0x80;   }
                 
	           }
	      }
 
	   hongwai_dis_enable=0;                    //
	   TR0 = 0;                      
       switch ( hongw_receive )                 //为空格键时,键值与显示字符的对应关系
          { 

            case 0x38: 
			        time_daoji_enable=~time_daoji_enable;    //键盘a键,控制倒计时开/关
					break; 
            case 0x64: 
			       time_naoling_enable=~time_naoling_enable; //键盘b,控制闹铃开/关
					break; 
          }
   }

}






⌨️ 快捷键说明

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