#include <reg52.h>
/* 晶振11.0592M */
#define uchar unsigned char
#define uint unsigned int
uchar uart_recive;
bit uart_OK;
#include <Key.h>
#include <Uart.h>
#define send0 send_pulse_565(); send_space_1685();
#define send1 send_pulse_565(); send_space_560();
#define SYS_DATA1 0x36 // 主到从
#define SYS_DATA2 0x25 // 从到主
sbit OUT = P1^0;
sbit IR_RE = P3^2;
sbit led = P1^1;
uchar date[4]; //date数组为存放地址原码,反码,数据原码,反码
uchar old_date;
bit k=0; //红外解码判断标志位,为0则为有效信号,为1则为无效
void send_bit(uchar one_bit); // 发送一位字节
void send_data(uchar); // 发送一个数据
void send_pulse_9000(void) //9ms脉宽
{
unsigned char a,b;
TR2 = 1;
for(b=35;b>0;b--)
for(a=127;a>0;a--);
TR2=0;
OUT=1;
}
void send_space_4500(void) //4.5ms间隔
{
unsigned char a,b;
OUT=1;
for(b=155;b>0;b--)
for(a=13;a>0;a--);
OUT=1;
}
void send_pulse_565(void) //0.565ms脉宽
{
unsigned char a,b;
TR2=1;
for(b=112;b>0;b--)
for(a=1;a>0;a--);
TR2=0;
OUT=1;
}
void send_space_1685(void) //1.685ms间隔
{
unsigned char a,b;
OUT=1;
for(b=240;b>0;b--)
for(a=2;a>0;a--);
OUT=1;
}
void send_space_560(void) //0.56ms间隔
{
unsigned char a,b;
OUT=1;
for(b=111;b>0;b--)
for(a=1;a>0;a--);
OUT=1;
}
void send_bit(uchar one_bit)
{
uchar i;
uchar key_num=0x01;
for(i=0;i<8;i++)
{
send_pulse_565 (); //先发0.565毫秒脉宽
if( (one_bit&key_num)==1 )
send_space_1685(); //先发低位 某位是1则延时1.685ms
else
send_space_560(); //如果是0则延时0.56ms
one_bit=one_bit>>1; //one_bit右移一位
}
}
void send_data(uchar one_data)
{
EX0 = 0;
send_pulse_9000(); //起始码 9ms的脉宽 考虑到误差
send_space_4500(); //4.5ms的间隔
send_bit(SYS_DATA1); //发系统码
send_bit(~SYS_DATA1); //发系统码的反码
send_bit(one_data); //发数据码
send_bit(~one_data); //发数据码的反码
EX0 = 1;
}
void time1() interrupt 5 //T2用来产生38kHz方波
{
TF2 = 0;
OUT=~OUT;
}
/*** 以上为发送程序 ***/
/*--------------------------延时1ms程子程序-----------------------*/
void delay1000()
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
/*---------------------------延时882us子程序-----------------------*/
void delay882()
{
unsigned char a,b;
for(b=3;b>0;b--)
for(a=145;a>0;a--);
}
/*--------------------------延时2400ms程子程序-----------------------*/
void delay2400()
{
unsigned char a,b;
for(b=141;b>0;b--)
for(a=7;a>0;a--);
}
/*****************************************************
/*----------------------------------------------------------*/
/*-----------------------红外解码程序(核心)-----------------*/
/*----------------------------------------------------------*/
void disp()
{
uchar date1, date2;
date1=date[1]^0xff; //如果得到的地址原码和地址反码相反
date2=date[3]^0xff; //如果得到的数据原码和数据反码相反
if((date[0] == date1) && (date[2] == date2) && (date[0] == SYS_DATA2) && (old_date != date[2]))
{
// 校演得到数据是否正确,分3步:
// 1 地址原码和地址反码相反
// 2 数据原码和数据反码相反
// 3 地址为所设定的地址 SYS_DAT2
// 4 每次收到的数据不一样
led = ~ led;
old_date = date[2];
P0 = tab[date[2]];
Uart_Send(date[2]);
}
}
void IR_decode()
{
uchar i,j;
while(IR_RE==0);
delay2400();
if(IR_RE==1) //延时2.4ms后如果是高电平则是新码
{
delay2400(); //延时4.8ms避开4.5ms的高电平
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
while(IR_RE==0); //等待地址码第1位高电平到来
delay882(); //延时882ms判断此时引脚电平
if(IR_RE==0)
{
date[i]>>=1;
date[i]=date[i]&0x7f;
}
else if(IR_RE==1)
{
delay1000();
date[i]>>=1;
date[i]=date[i]|0x80;
}
} //1位数据接收结束
} //32位二进制码接收结束
}
}
/*------------------------外部中断0程序-------------------------*/
/*------------------主要用于处理红外遥控键值--------------------*/
void int0() interrupt 0
{
uint i;
for(i=0;i<4;i++)
{
delay1000();
if(IR_RE==1){k=~k;} //刚开始为4.5ms的引导码,如果4ms内出现高电平则退出解码程序
}
if(k==0)
{
EX0=0; //检测到有效信号关中断,防止干扰
IR_decode(); //如果接收到的是有效信号,则调用解码程序
disp();
}
EX0=1; //开外部中断,允许新的遥控按键
}
/*---------------------------------------------------------------*/
/* 以下为主程序,主要对LCD初始化,开始界面设置 */
/*---------------------------------------------------------------*/
void main(void)
{
P0 = tab[0];
TMOD=0x21; // T0产生精确时间的延时或脉宽 16位
// T2产生38kHz方波 16位自动重装
RCAP2H = 0xff;
RCAP2L = 0xf3;
ET0=1; //允许定时器0中断
EX0=1; //允许外部中断0,用于检测红外遥控器按键
ET2 = 1;
// TR2 = 1;
EA = 1;
Uart_Init();
while(1)
{
if (uart_OK)
{
P0 = tab[uart_recive];
send_data(uart_recive);
uart_OK = 0;
}
Key_Scan();
}
}
qyz1211
- 粉丝: 17
- 资源: 32
最新资源
- 在线学习管理系统(LMS)的数据库 这个系统将包括学生、教师、课程、注册、作业、考试等多个实体以及它们之间的关系
- obsidian笔记软件常用插件
- Delphi 12 控件之Sublime Text 4 Build 4189 x64.7z
- 空中俯视物体检测13-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma数据集合集.rar
- Delphi 12 控件之DevExpressVCLProductDemos-24.2.3.exe
- 计算机网络学习之旅.pptx
- 免费下载:Miles Morales Spider-man Omnibus Vol. 2 (Saladin Ahmed, Tom Taylor)-Edk8V.zip
- Go语言案例,展示了一个简单的图书管理系统
- python基础教程常用技术详解.pdf
- 软件名称:站点版本管理器 英文名称:Site Version Manage(SVM)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈