#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--;
}
******************************/
IR.rar_IR_STB_dvd_按键连发
版权申诉
153 浏览量
2022-09-20
14:51:02
上传
评论
收藏 5KB RAR 举报
小波思基
- 粉丝: 70
- 资源: 1万+
最新资源
- 2022NOC软件创意编程赛项真题python小学高年级-决赛(有解析)
- mathml转换latex需要的xsl文件
- 2022NOC软件创意编程赛项真题图形化小学高年级-决赛赛(有解析)
- gbase驱动下载gbase-connector-java-8.3.81.53驱动下载
- 2022NOC软件创意编程赛项真题图形化小学低年级-决赛赛(有解析)
- InsightFace从青铜到王者,超大规模人脸识别的优雅解法
- python后端开发spider框架详解
- 基于 STM32 与 ESP8266 的智能家居系统源码.zip
- 毕业设计:基于SSM的mysql-个性化点餐配送系统(源码 + 数据库 + 说明文档)
- 基于matlab的鱼苗计数识别(GUI界面).zip代码57
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈