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

📄 红外解码程序.c

📁 基于单片机开发的红外线遥控器控制的电器定时开关系统
💻 C
字号:
#include<INTRINS.H>
#include <AT89X51.h>  
#define uchar unsigned char
#define uint unsigned int
#define leng(x) sizeof(x)
#include "lcd1602.h"

//定义多少分钟
#define parameter 1  //比如,这里是 1 ,则表示定时为1分钟(就不用在下面程序那修改了)

sbit p32=P3^2; //红外中断引脚
sbit p11=P1^1; //控制继电器的引脚
uchar dm,i,j,k;
uchar a[4];//存储代码
uchar l,m,n,p,q; 
bit flag=0;
uint counter1=0,counter2=0;
uchar code tabl[]="0123456789abcdef";
uchar code str1[]="This is IR System!";
uchar code str2[]="IR DATA IS:00";
uchar code str_on[]= "SWITCH IS: ON";
uchar code str_off[]="SWITCH IS:OFF";
/*********************************/
void init_T0(void);
void display();
//void dis_off(void);
//void dis_on(void);
void ds1ms(void);
void ds2s(void);
void ds0_9ms(void);


//主程序
void main()
{
	uchar cnt=0;
	IT0=1;
	EX0=1;
	EA=1;
	dm=0;
	p11=0;
	lcd_init();

	////////////////////////////////////////////////////////////////////////////
	//此段中的内容是开机时显示的字符--用以装饰,不是必要的
	///////show "This is IR System!";
	write_lcd_command (DISPLAYCLR); //清屏
	for(cnt=0;cnt<leng(str1);cnt++)
	{
		if(cnt<16)
		{
			write_lcd_char(cnt,0,str1[cnt]); //调用液晶显示的程序包
		}
		else
		{
			write_lcd_char(cnt-16,1,str1[cnt]);
		}
	}
   
	//////////delay
	cnt=100;  //刚开机时的显示文字延迟时间参数,想要久一点则加大此值
	while(cnt--) 
	{
		ds2s();
	}

	///////////////////////////////////////////////////////////////////////////
	display();

	//flag=1;m=4;n=0;
	while(1)
	{
	 ///////////////////////
		if(flag==1) //如果接收到有效的遥控数据则执行下面的内容
		{ 
			if((m==4)&&(n==0))//如果是接收到指定的按键码,如这里是"出仓"
			{
				init_T0(); //开始定时s
				p11=1;	//显示灯点亮
				//dis_on(); //液晶显示"SWITCH IS: ON";
			}
			display(); //显示接收到的数字
			ds2s(); ds2s(); ds2s();
			flag=0;
		}
	 ///////////////////////
	}
}








//初始化定时器
void init_T0(void)
{
	TR0=0;
	TMOD=0x01;
	TH0=0X3C;
	TL0=0XB0;
	ET0=1;
	TR0=1;
	counter1=0;
	counter2=0;
}

//外部中断0的函数
void E0_1(void) interrupt 0
{   uchar DL,DH,a0;
    EA=0;
	 P2=0xff;
    for(k=0;k<1;k++)
   {
     ds0_9ms();
     if (p32==1) {break;}
     while(p32==0);
     ds0_9ms();a0=p32;
        if(a0==1)
        {   while(p32==1);
            for(i=0;i<4;i++)
             {
                 for(j=1;j<=8;j++)
                {
                  while(p32==0);
                  ds0_9ms();
                  if(p32==1)
                   { ds1ms();
                     dm=dm|0x80;
                     if(j<8) dm=dm>>1;
                    }
                   else  
                         if(j<8)dm=dm>>1;
                 }
               a[i]=dm;
               dm=0;
             }
    	 }
     }
  DL=0X0F&a[2];
  DH=a[2];
  DH=DH>>4;
  m=DL;n=DH;
  DL=0X0F&a[0];
  DH=a[0];
  DH=DH>>4;
  q=DL;p=DH;
     
   ds2s();
   ds2s();
   ds2s();
  flag=1;
  EA=1; 
}
//定时器中断程序
void T0_inter(void) interrupt 1
{
	TR0=0;
	TH0=0X3C;
	TL0=0XB0;
	TR0=1;

	counter1+=1;
	if(counter1==200)  //10S
	{
		counter1=0;
		counter2+=1;
		//if(counter2==1)	 //定时多少秒 counter2=1表示10秒
		if(counter2==(6*parameter)) //若用这句,则可以在本文头部那里修改parameter的值,
		{									 //parameter的值是多少就是定时多少分钟
			p11=~p11;
			TR0=0;
			ET0=0;
			counter2=0;
			display();
		}
	}	

}

//延时程序
/*********************************/
void ds1ms(void)
{
unsigned char i,j;
for(i=2;i>0;i--)
   for(j=230;j>0;j--) ;
}

void ds2s(void)
{
unsigned char i,j,k;
for(i=12;i>0;i--)  
  for(j=80;j>0;j--)
     for(k=10;k>0;k--) ;
}

/*********************************/
void ds0_9ms(void)
{
unsigned char j,k;
   for(j=18;j>0;j--)
     for(k=20;k>0;k--) ;
}

/*********************************/




//显示程序
/*********************************/
void display()
{
	uchar i;
	write_lcd_command (DISPLAYCLR); //清屏
	for(i=0;i<leng(str2);i++) 
	{
		write_lcd_char(i,0,str2[i]);
	}
	write_lcd_char(11,0,tabl[n]);
	write_lcd_char(12,0,tabl[m]);

	if(flag==0)
		for(i=0;i<leng(str_off);i++) 
		{
			write_lcd_char(i,1,str_off[i]);
		}
	else
		for(i=0;i<leng(str_on);i++) 
		{
			write_lcd_char(i,1,str_on[i]);
		}
}

⌨️ 快捷键说明

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