本次解码过程,使用【外部中断0】,【定时器0】相互组合
废话少续,直接上源代码,只需要简单修改,即可完成配置
/*=================================================================================// 功 能:STC8系列,15系列,中断解码红外NEC协议(12mhz)// 整 理:北聿 QQ:QKnA4147 日 期:2022.06.23===================================================================================*/#include <STC8Fxx.h>
#include <math.h>
#include <stdio.h>
#include <intrins.h>#define uchar unsigned charuchar irtime; //红外接收时间
uchar startflag; //启动接收
uchar irdata[33]; //存放33位(引导码1+2组用户码16+2组数据码16)
uchar bitnum; //第几位码
uchar irreceok; //表示红外接收完毕的标志位
uchar ircode[4]; //存放4组码
uchar irprosok; //判断是否存储完成void Initload(void) //12.000MHz
{TMOD = 0x02; //定时器0方式2TL0 = 0x00; //设置定时初值 0TH0 = 0x00; //设置定时初值 0ET0 = 1; //定时器中断打开TR0 = 1; //定时器0开始计时IT0 = 1; //设置为下降沿触发EX0 = 1; //打开外部中断EA = 1; //总中断打开
}void timer0 () interrupt 1
{irtime++; //最大255 红外时间
}void int0 () interrupt 0 //p3.2//接收红外信号处理
{static unsigned char bitnum; static bit startflag;if(startflag){if(irtime<58&&irtime>=33) //晶振12Mhz,小于15mm且大于8.4msbitnum = 0; //第1位码irdata[bitnum] = irtime; //先装引导码irtime = 0;bitnum++; if(bitnum==33) //等于33,接收完{bitnum = 0; irreceok = 1; }}else{startflag = 1;irtime = 0; //红外时间清零}
}void irpros(void) //存储接收码
{uchar k,i,j;uchar cord,value;k = 1; //不取引导码,从第1个开始for(j=0;j<4;j++){for(i=1;i<=8;i++){cord=irdata[k]; if(cord>7)value|=0x80; //高位相或if(i<8){value>>=1;} k++;}ircode[j] = value;value=0;}irprosok = 1;
}void led(void)
{ //0xA8用户码一,0xDE用户码二(或用户码一的反码),0x01按键码,0xFE常用于按键码反码if((ircode[0] == 0xA8)&&(ircode[1] == 0xDE)&&(ircode[2] == 0x01)&&(ircode[3] == 0xFE)){//此处要是执行的功能}ircode[0]=0; ircode[1]=0; ircode[2]=0; ircode[3]=0;
}void main(void)
{ Initload();while(1){if(irreceok) //判断红外是否接收完{irpros();irreceok = 0;}if(irprosok){led();}}
}