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

📄 红外接受.c

📁 是一个51单片机红外发送接收的程序。 c51编写!
💻 C
字号:
#include <myincludes.h>
#define dp GD02  
   //得PIND2的值   (INT0)

char k,buf[4];

void delay_0_5ms(void)
{
unsigned int i;
for(i=1;i<(unsigned int)(4*147-2);i++)    //稍比发送的长一点
;
}

/********************************************************************
* 函数说明:1 MS延时程序 *
********************************************************************/
void delay_1ms(void)
{
unsigned int i;
for(i=1;i<(unsigned int)(8*143-2);i++)
;
}

void Delay_Ms(uint num)
{
uint i;
for(i=0;i<num;i++) delay_1ms();
}

/*每次发送的32二进制码可分成两部分,其中前16位是遥控器辨识码,
主要用于区别不同遥控器,后16位是 操作码。这两个部分的后8位都是前8位的反码,
用作数据校验。*/
/*数据头的时间:Th=9+4.5=13.5ms
数据"0"的时间:T0=0.565+0.56=1.125ms
数据"1"的时间:T1=1.685+0.56=2.245ms*/


/********************************************************************
* 函数说明:外中断0初始化程序 *
*********************************************************************/
void int0_init(void)
{
MCUCR=0x02;//开中断0、下降沿触发脉冲
GIFR=0Xff;
}
#pragma interrupt_handler ext_int0:2 //M16参考外中断向量
/********************************************************************
* 函数说明:外中断0中断处理程序 *
*********************************************************************/
void ext_int0(void)
{    unsigned char i,j; 
    CLI();              //暂时屏蔽外部中断 
     for (i=0;i<8;i++)   //延时8毫秒
   {
    delay_1ms();      //调用1ms延迟程序。
    if(dp==1) //判断INT0端口的状态。操作的是PD2,PD2为高吗?变回高就退出
    {
     SEI();           //开中断
     return;          //如果为高,说明是干扰或出错,跳出这个循环。
    }
   } 
   
    while(dp==0); //等待9ms的低电平结束,

    Delay_Ms(4);   //避过4.5ms的结果码
	delay_0_5ms();
    for (j=0;j<4;j++)
   {
       k=0;
    for (i=0;i<8;i++)
       {
          while(dp==0); //等待每一个数据位的0.565ms低电平后的高电平                   
       if (dp)
       {
           delay_1ms();     //为高电平,再延迟1ms,
        k |= BIT(i);       //第i位读取1
       }
       else
       {
        k &= ~BIT(i);     //第i位读取0
       }
        }
   buf[j] = k ;          //保存读到的数据   buf[2]就是所真正要接收的数据
   }
   if ((buf[2]+buf[3]) != 0xff)  //判断数据的第三字节和第四字节的取反后相等吗?
   {
     SEI(); //开中断
     return;     //如果不相等说明是干扰或出错,跳出整个循环。
   } 


   //////////////////////////////////////////////加要加的函数
   
   SEI(); //开中断
}	

void main()
 {
   SEI();
   int0_init();
   while(1);
   }

⌨️ 快捷键说明

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