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

📄 main.c

📁 接收遥控器发出的指令并存储
💻 C
字号:
#include "ir_type.h"
#include "24C02.h"	
static unsigned char flag=0; //定义38K载波使能位
static unsigned char data DT,DC=0x00; //定义接收红外数据计数器
static unsigned char rdarray[80]; 
//延时函数

void Delay9ms();
void Delay4_5ms();
void Delay560us();
//void Delay3(unsigned char a);
void Delay400us();

//***定义遥控输出控制函数×××//
void SEND_IR_GUIDE();
void SEND_IR_1();
void SEND_IR_0();
void SEND_One_Byte(char thedata);

//主函数
void main()
 {
unsigned char h=0,l,k,y;
//unsigned char uk;
//unsigned char rdarray[80]; 
//extern void Read_N_Bytes(char *buffer,char n,char addr); 
IP=	0x01;
TMOD = 0x02; 
TH0=0xF3;
ET0=1;
//TR0=1;//定时器0方式2,产生38KHz调制信号
EA = 1;      //允许CPU中断
IT0 = 1;     //INT0下降沿有效
EX0 = 1;     //开INT0中断
// P1=0xff;
//printf("\nDC=%d",DC);
Dout = 0;
LED=DC;
Led=0;					  
while(1)
{
if(K4 == 0)//判断K5是否被按下
		{
			Delay2(500);//延时消抖
			if(K4 == 0)
			{  
			  EX0=0;
			  //Write_One_Byte(DC,0x0A);//往2402的0X04地址写如数值0X07
			}
		}

		if(K5 == 0)
		{
			Delay2(500);
			if(K5 == 0)
			{
				 EX0=1;
			     flag = Read_One_Byte(DC);//将读出来的数值给tmp
				//P0  = seg_tab[tmp];
				LED=flag;
                //Delay2(50000);
			}
		}
if(K3 == 0)//判断K3是否被按下
{Delay9ms();//延时10MS	 
if(K3 == 0)//再次确定K3是否被按下
{
if(DC>0)
{
DC++;
Write_One_Byte(0xF2,DC);
for(y=0;y<DC;y++)Write_One_Byte(y,rdarray[y]);
}
else
{ 
DC=Read_One_Byte(0xF2);
for(y=0;y<DC;y++)rdarray[y] = Read_One_Byte(y);
}
LED=DC;
for(l=500;l>0;l--)Delay9ms();
LED=rdarray[2];
}
}
 //发送数据
if(K2 == 0)//判断K2是否被按下
{	
Delay9ms();//延时10MS
if(K2 == 0)//再次确定K2是否被按下
{	
for(k=2;k<DC;k++)
{
SEND_IR_GUIDE();
SEND_One_Byte(rdarray[0]);
SEND_One_Byte(rdarray[1]);			
SEND_One_Byte(rdarray[k]);
DT=~rdarray[k];
SEND_One_Byte(DT);
SEND_IR_1();  //Stop Bit 
Led=~Led;
for(l=40;l>0;l--)Delay9ms();                  
}
}
}
}
}
/*******************数据位定义*************************/
void SEND_IR_GUIDE()
{
unsigned char i,j;
TR0=1;	 
for (j=25;j>0;j--)
for (i=83;i>0;i--);
TR0=0;
Dout = 0;
for (j=25;j>0;j--)
for (i=90;i>0;i--);	
}
void SEND_IR_1()
{unsigned char i,j; //总的延时时间=[(2*i)+1]*j+1+1
TR0=1;
for (j=1;j>0;j--)
for (i=119;i>0;i--);
TR0=0;
Dout = 0;
for (j=6;j>0;j--)
for (i=138;i>0;i--);
}
void SEND_IR_0()
{
unsigned char i,j; //总的延时时间=[(2*i)+1]*j+1+1
TR0=1;	
for (j=1;j>0;j--)
for (i=119;i>0;i--);
TR0=0;
Dout = 0;
for (j=2;j>0;j--)
for (i=138;i>0;i--);
}
void SEND_One_Byte(char thedata)
{		  
unsigned char i;
for(i=0;i<8;i++)
{if((thedata>>i)&0x01)
SEND_IR_1();
else
SEND_IR_0();
}
}
/*********************延时函数******************
void Delay560us() //晶振=12MHz 延时时间=560us-4us
{ 
unsigned char i,j; //总的延时时间=[(2*i)+1]*j+1+1
for (j=2;j>0;j--)
for (i=123;i>0;i--);

}


void Delay4_5ms() //晶振=12MHz 延时时间4.5ms
{ 
unsigned char i,j ;
for (j=25;j>0;j--)
for (i=90;i>0;i--);


}	  *************/ 
void Delay9ms() //晶振=12MHz 延时时间9ms
{ 
unsigned char i,j; 
for (j=50;j>0;j--)
for (i=90;i>0;i--);
}  

/***************延时时间=404us*************************/
void Delay400us() //晶振=12MHz 
{ //晶振=11.0592MHz 延时时间≈438us
unsigned char i,j; //总的延时时间=[(2*i)+1]*j+1+1
for (j=2;j>0;j--)
for (i=100;i>0;i--);
}


/*********38KHz载波***********/
void timeint( ) interrupt 1 using 2
{Dout=~Dout;}
/**********************************************************
*外中断0 遥控解码函数(子程序)
**********************************************************/
void IR() interrupt 0 using 3 //选择工作寄存器组
{	
   
	//DC++;
if(RD==1)
{
unsigned char i,k,l;
unsigned char KeyCoding[4]; //定义数组,存放接收到的数据
EA = 0; //关外中断0
if (P3_2==0) //P3.2低电平继续
{
for (i=20;i>0;i--) //循环检测20次,低电平引导信号干扰检测(9ms)
{
Delay400us(); //延时438us
if (P3_2==1) //低电平引导信号出现高电平就跳出
{
EA = 1; //开外中断
return;
}
}
while(P3_2==0); //等待高电平引导信号到了.
for (i=10;i>0;i--) //循环检测10次,高电平引导信号干扰检测(4.5ms)
{
Delay400us();
if (P3_2==0) //高电平引导信号出现低电平就跳出
{
EA = 1; //开外中断
return;
}
}

while(P3_2==1); //等待高电平引导信号结束.
//接收4个字节的数据
for (k=0;k<4;k++)
{
for (i=8;i>0;i--) //8位数据
{
while(P3_2==0); //等待第一个地址码的高电平到了.(保证判断每位数据的起点一致)
Delay400us();
Delay400us(); //延时0.876ms去判断P3.2的状态(0.56ms<延时时间<1.125ms)
KeyCoding[k]>>= 1; //右移1位
if(P3_2==1) //仍是1,最高位写入1,0跳过
KeyCoding[k]|= 0x80;
while(P3_2==1); //等待高电平结束
}
}
//比较地址码和地址反码,不同解码错误退出
if (KeyCoding[0]!=~KeyCoding[1]||KeyCoding[2]!=~KeyCoding[3])
{
	EA = 1; //开外中断
return;
}
DC++;
if(DC==1)
{
rdarray[0]= KeyCoding[0];
rdarray[1]= KeyCoding[1];
rdarray[2]= KeyCoding[2];
DC++;
}

else rdarray[DC]= KeyCoding[2];
Led=~Led;
for(l=150;l>0;l--)Delay9ms();
LED=KeyCoding[2];
for(l=150;l>0;l--)Delay9ms();
/*
switch (KeyCoding[2])
{//按键判断
case 0x14:
LED=0xfe;
DT = 1;//确定键
//这里添加代码
break;
case 0x11: //向上键
LED=0xfb;
DT = 1;
//这里添加代码
break;
case 0x09: //向下键
LED=0xef;
DT = 1;
//这里添加代码
break;
case 0x1b: //向左键
LED=0xdf;
DT = 1;
//这里添加代码
break;
case 0x12: //向右键
LED=0xfa;
DT = 1;
//这里添加代码
break;
case 0x07: //系统设定键
LED=0x00;
DT = 1;
//这里添加代码
break;
case  0x18:
LED=0xff;
DT=1;
break;
}*/
}
}
else
{
EA = 1; //开外中断
return;
}
EA = 1;
}

/***************************
void Delay3(unsigned char a)//按键延时函数
{
    unsigned char k;
     for(k=0;k<125;k++)
    
	 while(a) a--;     
}	
******************************/	

⌨️ 快捷键说明

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