完整版 电路图和程序代码 下载地址

https://pan.baidu.com/s/1r-JdMLbuake_agVEpw3trw?pwd=8888

部分代码展示

/头函数
#include <reg52.h>
//宏定义
#define uint unsigned int
#define uchar unsigned char

//时间计算
#define Imax 14000    //此处为晶振为11.0592时的取值, 
#define Imin 8000    //如用其它频率的晶振时,
#define Inum1 1450    //要改变相应的取值。
#define Inum2 700 
#define Inum3 3000 
//解码变量
unsigned char Im[4]={0x00,0x00,0x00,0x00};

//全局变量
uchar f;
unsigned long m,Tc;
unsigned char IrOK;


//主函数
void main()
{
	P2=0xff;
	
	EA=1;//开启总中断
	 
	IT1=1;//下降沿有效
	EX1=1;//外部中断1开
	 
	TMOD=0x11;//定时器初始化  
	TH0=0;//T0赋初值
	TL0=0;
	TR0=0;//t0开始计时
	while(1)
	{
		if(IrOK==1) 
		{
			//1键
			if(Im[2]==0x0c)
			{
			   P2=0xfc;
			}
			//2键
			else if(Im[2]==0x18)
			{
			   P2=0xa2;
			}
			//3键
			else if(Im[2]==0x5e)
			{
			   P2=0xb0;
			}
			//4
			else if(Im[2]==0x08)
			{
			   P2=0x9c;
			}
			//5
			else if(Im[2]==0x1c)
			{
			   P2=0x91;
			}
			//6
			else if(Im[2]==0x5a)
			{
			   P2=0x81;
			}
			//7键
			else if(Im[2]==0x42)
			{
			   P2=0xf8;
			}
			//8
			else if(Im[2]==0x52)
			{
			   P2=0x80;
			}
			//9
			else if(Im[2]==0x4a)
			{
			   P2=0x90;
			}
			//0
			else if(Im[2]==0x16)
			{
			   P2=0xc0;
			}
			//关机
			else if(Im[2]==0x45)
			{
			   P2=0xff;
			}
		   IrOK=0;	  
		}
	}
}

//外部中断解码程序_外部中断1
void intersvr1(void) interrupt 2 using 1
{
 TR0=1;
 Tc=TH0*256+TL0;//提取中断时间间隔时长
 TH0=0; 
 TL0=0;         //定时中断重新置零
 if((Tc>Imin)&&(Tc<Imax))
 { 
	m=0;
	f=1;
	return;
 }       //找到启始码
 if(f==1)
 {
    if(Tc>Inum1&&Tc<Inum3) 
    {
   	Im[m/8]=Im[m/8]>>1|0x80; m++; 
    }
    if(Tc>Inum2&&Tc<Inum1) 
    {
      Im[m/8]=Im[m/8]>>1; m++; //取码
  	 }
  	 if(m==32) 
    {
      m=0;  
      f=0;
      if(Im[2]==~Im[3]) 
      {
           IrOK=1;
			  TR0=0; 
   	}
      else IrOK=0;   //取码完成后判断读码是否正确
    }
               //准备读下一码
 }
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐