#include "N76E003.h"
#include "SFR_Macro.h"
#include "Function_define.h"
#include "Common.h"
#include "Delay.h"
#define uchar unsigned char
#define uint unsigned int
sbit IR = P1^7; //定义红外脉冲数据接口 外部中断1输入口
sbit SCLK = P3^0; //初始时钟
sbit RST = P1^6; //CE端
sbit DATA = P0^7; //数据读写端
uchar IRtime; //检测红外高电平持续时间(脉宽)
uchar IRcord[4]; //此数组用于储存分离出来的4个字节的数据(用户码2个字节+键值码2个字节)
uchar IRdata[33]; //此数组用于储存红外的33位数据(第一位为引导码用户码16+键值码16)
bit IRpro_ok, IRok; //第一个用于红外接收4个字节完毕。IRok用为检测脉宽完毕
void Init_T1()
{
TIMER1_MODE2_ENABLE;//定时器0和定时器1工作方式2,8位自动重装
TH1 = 0X00;//高8位装入0那么定时器溢出一次的时间是256个机器周期
TL0 = 0X00;
EA = 1; //总中断
ET1 = 1; //定时器1中断
TR1 = 1; //启动定时器1
IT1 = 1; //设置外部中断1为跳沿触发方式,来一个下降沿触发一次
EX1 = 1; //启动外部中断1
}
void Time1() interrupt 3 //定义定时器1
{
IRtime++; //检测脉宽,1次为192uS
}
void EXT1_T1() interrupt 2 //定义外部中断1
{
static uchar i;
static bit startflag;
if(startflag)
{
if((IRtime < 78) &&(IRtime >= 63))
/*判断是否是引导码,低电平电平9000us+高4500us
这个自己可以算我以11.0592来算了NEC协议的引导码低8000-10000+高4000-5000
如果已经接收了引导码那么i不会被置0就会开始依次存入脉宽*/
i = 0;//如果是引导码那么执行i=0把他存到IRdata的第一个位
IRdata[i] = IRtime; //以T0的溢出次数来计算脉宽,把这个时间存到数组里面到后面判断
IRtime = 0; //计数清零,下一个下降沿的时候在存入脉宽
i++; //计数脉宽存入的次数
if(i == 33) //如果存入34次 数组的下标是从0开始i等于33表示执行了34次
{
IRok = 1;
i = 0; //把脉宽计数清零准备下次存入
}
}
else
{
IRtime = 0; //引导码开始进入把脉宽计数清零开始计数
startflag = 1; //开始处理标志位置1
}
}
void IRcordpro()
{
uchar i,j, k,cord,value;/*i用于处理4个字节,j用于处理一个字节中每一位,k用于33次脉宽中的哪一位
cord用于取出脉宽的时间判断是否符合1的脉宽时间*/
k = 1; //从第一位脉宽开始取,丢弃引导码脉宽
for(i = 0; i < 4;i++)
{
for(j = 0; j < 8; j++)
{
cord = IRdata[k]; //把脉宽存入cord
if(cord > 7) //如果脉宽大于我11.0592的t0溢出率为约278us*5=1390那么判断为1//1.3ms
value = value |0x80; /*接收的时候是先接收最低位,
把最低位先放到value的最高位在和0x08按位或一下
这样不会改变valua的其他位的数值只会让他最高位为1*/
if(j < 7)//限制条件
value = value >> 1; //value位左移依次接收8位数据。
k++;//每执行一次脉宽位加1
}
IRcord[i] = value;//每处理完一个字节把它放入IRcord数组中。
value = 0;//清零value方便下次在存入数据
}
IRpro_ok = 1;//接收完4个字节后IRpro ok置1表示红外解码完成
}
void Init_GPIO()
{
Set_All_GPIO_Quasi_Mode;//所有口设置为双向口
P01_PushPull_Mode;//左路输出
P02_PushPull_Mode;//左路输出
P03_PushPull_Mode;//左路输出
P04_PushPull_Mode;//左路输出
P10_PushPull_Mode;//左路输出
P00_PushPull_Mode;//左路输出
P11_PushPull_Mode;//左路输出
P17_Input_Mode;//P17输入上拉模式
clr_P00;
clr_P01;
clr_P02;
clr_P03;
clr_P04;
clr_P10;
clr_P11;
clr_P12;
clr_P13;
}
void main ()
{
Init_T1();
Init_GPIO();
while(1)
{
if(IRok) //判断脉宽是否检测完毕
{
IRcordpro(); //根据脉宽解码出4个字节的数据
IRok = 0; //重新等待脉宽检测
if(IRpro_ok) //解码完成
{
uint i;
i = IRcord[2] << 8;
i |= IRcord[1];//将第一个用户反码和按键码结合判断
switch(i)
{
case 0x45ff: P04 = ~P04;break;
case 0x44ff: P03 = ~P03;break;
case 0x40ff: P10 = ~P10;break;
case 0x43ff: P11 = ~P11;break;
case 0x47ff: P02 = ~P02;break;
case 0x15ff: P00 = ~P00;break;
default:break;
}
}
}
}
}
|
———————————————— 版权声明:本文为CSDN博主「cssBIS」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/cssBIS/article/details/105745025