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

📄 ir_shu_ma_guan.c

📁 51单片机的实验八 红外编码
💻 C
字号:
/****************************************
程序功能:红外一体化接收遥控器的编码并解码,
   LED数码管显示遥控器按下的数字,并且如果
   红外解码成功的话, 蜂鸣器发出"滴滴"的声音
   表示解码成功
****************************************/

#include <reg52.h>
#include <stdio.h>

sbit sound=P3^3;         //蜂鸣器
sbit IR=P3^2;            //P3.2为红外一体化接收

unsigned char dm,i,j,k;
unsigned char  aa[2]; //定义2个数组,用来存储代码,8位的数据码和8位的数据反码
unsigned long  bb;    //定义bb用来存放用户识别码,这里采用的是26位的用户识别


//0.9ms
void delay0_9ms(void)
{
   unsigned char j,k;
   for(j=18;j>0;j--)
   for(k=20;k>0;k--) ;
}

//1ms
void delay1ms(void)
{
  unsigned char i,j;
  for(i=2;i>0;i--)
  for(j=230;j>0;j--) ;
}

//4.5ms
void delay4_5ms(void)
{
   unsigned char i,j;
   for(i=10;i>0;i--)
   for(j=225;j>0;j--) ;
}

//100ms
void delay100ms(void)
{
  unsigned char i,j,k;
  for(i=200;i>0;i--)  
  for(j=20;j>0;j--)
  for(k=10;k>0;k--) ;
}



LED_display(unsigned char date)
{
	switch(date)
	{
	 case 0x11:   {P1=0x00;P2=0xf9;break;}          //显示1
	 case 0x12:   {P1=0x00;P2=0xa4;break;}          //显示2
	 case 0x13:   {P1=0x00;P2=0xb0;break;}          //显示3
	 case 0x14:   {P1=0x00;P2=0x99;break;}          //显示4
	 case 0x15:   {P1=0x00;P2=0x92;break;}          //显示5
	 case 0x16:   {P1=0x00;P2=0x82;break;}          //显示6
	 case 0x17:   {P1=0x00;P2=0xf8;break;}          //显示7
	 case 0x18:   {P1=0x00;P2=0x80;break;}          //显示8
	 case 0x19:   {P1=0x00;P2=0x90;break;}          //显示9
	 case 0x10:   {P1=0x00;P2=0xc0;break;}          //显示0
	 default:     {P1=0x00;P2=0xb6;}                //显示错误
   }
}



void main()
{
 IT0=1;           //外部中断0触发方式控制位,下降沿触发
 EX0=1;           //外部中断0(INT0)中断允许位
 EA=1;            //总中断
 dm=0;
 P2=0xc0;
 P1=0x00;
while(1);
}



void t0(void) interrupt 0 using 2//外部中断0的函数
{
    EA=0;                        //暂时关闭CPU的所有中断请求

    for(k=0;k<10;k++)            //重复10次,目的是检测在9毫秒内如果出现高电平就退出解码程序
  {                              //aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    
  delay0_9ms();                   //延时0.9毫秒
    if (IR==1) {k=10;break;}    //延时0.9毫秒后判断P3.2脚是否出现高电平如果有就退出解码程序
    else if(k==9)                //重复10次?
           {                     //bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
            while(IR==0);       //等待高电平避开9毫秒低电平引导脉冲
            delay4_5ms();           //延时4.5毫秒避开4.5毫秒的结果码

			
/********************************************
//26位的用户码,前13位数据码,后13位数据反码
*********************************************/
              for(j=1;j<=26;j++)//每组数据为26位
                {                 
                 while(IR==0);  //
                 delay0_9ms();
                  if(IR==1)
                   {
					   delay1ms();
	                   dm=dm|0x2000000;              //因为是26位,一个"1",后面25个"0",转化二进制即为"1000000"    
	                   if(j<26) dm=dm>>1;            //数据"1",右移一个"1",一共25次
                   }                
                 else  if(j<26) dm=dm>>1;            //数据"0",一共25次
                }                    
             bb=dm;
             dm=0;



/***************************************************
//16位的用户码,前8位数据码,后8位数据反码
****************************************************/

			  for(i=0;i<2;i++)     
               {                
                 for(j=1;j<=8;j++)//每组数据为8位
                {                
                 while(IR==0);  //
                 delay0_9ms();
                  if(IR==1)
                   {
				     delay1ms();
                     dm=dm|0x80;
                     if(j<8) dm=dm>>1;           //数据"1",右移一个"1",一共7次
                   }                
                  else  if(j<8) dm=dm>>1;          //数据"0",一共7次
                }                    
             aa[i]=dm;
             dm=0;
               }              

/***************************************************
//显示部分
****************************************************/	           
               if(aa[0]==~aa[1])         //验证成功
        	   {
	               sound=0;
             	   delay100ms();
				   LED_display(aa[0]);
	               sound=1;
        	   }

          }                     //bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
  }                             //aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
EA=1;
}

⌨️ 快捷键说明

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