**## 相关代码:
可以直接使用,记得接外部中断的IO口到红外接收口**
#include <STC15F2K60S2.h> //包含51单片机相关的头文件
#include <intrins.h>
#include <absacc.h>
#define uint unsigned int //重定义无符号整数类型
#define uchar unsigned char //重定义无符号字符类型
unsigned char SMG_duanma[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x80,0x8e,0xbf,0x7f};
unsigned char SMG_weima[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char hold = 0xff;
uchar IRCOM[7];
/***完成话筒,光敏电阻,蜂鸣器.端口定义/
sbit IRIN=P3^3; //定义红外接收端口
/完成红外接收端口的定义/
void Display();
void Delay500(unsigned int t)
{
do{Display();}while(–t != 0);
}
void Delay140us() //@11.0592MHz
{
unsigned char i, j;
i = 2;
j = 126;
do
{
while (--j);
} while (--i);
}
void DelaySMG(unsigned char t)
{
while(t–);
}
void Clear()
{
XBYTE[0xc000] = 0xff;
XBYTE[0xe000] = 0xff;
}
void Display()
{
XBYTE[0xc000] = 0x01;
XBYTE[0xe000] = SMG_duanma[IRCOM[2] / 10000000 % 10];
DelaySMG(100);
XBYTE[0xc000] = 0x02;
XBYTE[0xe000] = SMG_duanma[IRCOM[2] / 1000000 % 10];
DelaySMG(100);
XBYTE[0xc000] = 0x04;
XBYTE[0xe000] = SMG_duanma[IRCOM[2] / 100000 % 10];
DelaySMG(100);
XBYTE[0xc000] = 0x08;
XBYTE[0xe000] = SMG_duanma[IRCOM[2] / 10000 % 10];
DelaySMG(100);
XBYTE[0xc000] = 0x10;
XBYTE[0xe000] = SMG_duanma[IRCOM[2] / 1000 % 10];
DelaySMG(100);
XBYTE[0xc000] = 0x20;
XBYTE[0xe000] = SMG_duanma[IRCOM[2] / 100 % 10];
DelaySMG(100);
XBYTE[0xc000] = 0x40;
XBYTE[0xe000] = SMG_duanma[IRCOM[2] / 10 % 10];
DelaySMG(100);
XBYTE[0xc000] = 0x80;
XBYTE[0xe000] = SMG_duanma[IRCOM[2] % 10];
DelaySMG(100);
Clear();
}
void delayms(unsigned char x) //0.14mS延时程序
{
unsigned char i; //定义临时变量
while(x–) //延时时间循环
{
for (i = 0; i<13; i++) {} //14mS延时
}
}
void IR_IN() interrupt 2 using 0 //定义INT2外部中断函数
{
unsigned char j,k,N=0,i; //定义临时接收变量
EX1 = 0; //关闭外部中断,防止再有信号到达
delayms(15); //延时时间,进行红外消抖
if (IRIN==1) //判断红外信号是否消失
{
EX1 =1; //外部中断开
return; //返回
}
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{
delayms(1); //延时等待
}
while(IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
{
delayms(1); //延时等待
}
for (j=0;j<4;j++) //采集红外遥控器数据
{
for (k=0;k<8;k++) //分次采集8位数据
{
while (!IRIN) //等 IR 变为高电平
{
delayms(1); //延时等待
}
while (IRIN) //计算IR高电平时长
{
Delay140us(); //延时等待
N++; //计数器加加
if (N>=30) //判断计数器累加值
{
EX1=1; //打开外部中断功能
return; //返回
}
}
IRCOM[j]=IRCOM[j] >> 1; //进行数据位移操作并自动补零
if (N>=6) //判断数据长度
{
IRCOM[j] = IRCOM[j] | 0x80; //数据最高位补1
}
N=0; //清零位数计录器
}
}
{ XBYTE[0x8000] = hold & 0xfe;hold = hold & 0xfe;}
if((IRCOM[2] /107 && IRCOM[2] %100)|| (IRCOM[2] /100%101 && IRCOM[2] /10%106 &&IRCOM[2]%103))
{ XBYTE[0x8000] = hold & 0xfd; hold = hold & 0xfd;}
if((IRCOM[2] /107 && IRCOM[2] %101)|| ( IRCOM[2] /103 &&IRCOM[2]%105))
{ XBYTE[0x8000] = hold & 0xfb;hold = hold & 0xfb;}
if((IRCOM[2] /106 && IRCOM[2] %108)|| (IRCOM[2] /100%101 && IRCOM[2] /10%106 &&IRCOM[2]%102))
{ XBYTE[0x8000] = 0xff & (hold |0x01);hold = 0xff & (hold |0x01);}
if((IRCOM[2] /106 && IRCOM[2] %104)|| (IRCOM[2] /100%101 && IRCOM[2] /10%106 &&IRCOM[2]%100))
{ XBYTE[0x8000] = 0xff & (hold |0x02);hold = 0xff & (hold |0x02);}
if((IRCOM[2] /106 && IRCOM[2] %107)|| (IRCOM[2] /10%103 &&IRCOM[2]%103))
{ XBYTE[0x8000] = 0xff & (hold |0x04);hold = 0xff & (hold |0x04);}
if((IRCOM[2] /100 && IRCOM[2] %107)|| ( IRCOM[2] /10%100 &&IRCOM[2]%103))
{ XBYTE[0x8000] = hold & 0xf7;hold = hold & 0xf7;}
if((IRCOM[2] /101 && IRCOM[2] %100)|| ( IRCOM[2] /10%102 &&IRCOM[2]%101))
{ XBYTE[0x8000] = hold & 0xef;hold = hold & 0xef;}
if((IRCOM[2] /100 && IRCOM[2] %109)|| ( IRCOM[2] /10%100 &&IRCOM[2]%104))
{ XBYTE[0x8000] = hold & 0xdf;hold = hold & 0xdf;}
if((IRCOM[2] /102 && IRCOM[2] %102)|| (IRCOM[2] /100%101 && IRCOM[2] /10%103 &&IRCOM[2]%109))
{XBYTE[0x8000] = 0xff & (hold |0x08);hold = 0xff & (hold |0x08);}
if((IRCOM[2] /102 && IRCOM[2] %105)|| (IRCOM[2] /10%101 &&IRCOM[2]%102))
{XBYTE[0x8000] = 0xff & (hold |0x10);hold = 0xff & (hold |0x10);}
if((IRCOM[2] /101 && IRCOM[2] %103)|| ( IRCOM[2] /10%100 &&IRCOM[2]%106))
{XBYTE[0x8000] = 0xff & (hold |0x20);hold = 0xff & (hold |0x20);}
if((IRCOM[2] /101 && IRCOM[2] %102)|| (IRCOM[2] /100%101 && IRCOM[2] /10%103 &&IRCOM[2]%104))
{ XBYTE[0x8000] = hold & 0xbf;hold = hold & 0xbf;}
if((IRCOM[2] /102 && IRCOM[2] %104)|| (IRCOM[2] /100%101 && IRCOM[2] /10%104 &&IRCOM[2]%100))
{ XBYTE[0x8000] = hold & 0x7f;hold = hold & 0x7f;}
if((IRCOM[2] /109 && IRCOM[2] %104)|| (IRCOM[2] /100%101 && IRCOM[2] /10%107 &&IRCOM[2]%105))
{for(i=0;i<3;i++){XBYTE[0x8000] = 0x55;Delay500(1000);XBYTE[0x8000] = 0xaa;Delay500(1000);}}
if((IRCOM[2] /100 && IRCOM[2] %108)|| (IRCOM[2] /100%101 && IRCOM[2] /10%103 &&IRCOM[2]%102))
{XBYTE[0x8000] = 0xff & (hold |0x40);hold = 0xff & (hold |0x40);}
if((IRCOM[2] /102 && IRCOM[2] %108)|| (IRCOM[2] /100%101 && IRCOM[2] /10%104 &&IRCOM[2]%102))
{XBYTE[0x8000] = 0xff & (hold |0x80);hold = 0xff & (hold |0x80);}
if((IRCOM[2] /109 && IRCOM[2] %100)|| (IRCOM[2] /100%101 && IRCOM[2] /10%107 &&IRCOM[2]%103))
{for(i=0;i<3;i++){XBYTE[0x8000] = 0xff;Delay500(1000);XBYTE[0x8000] = 0x00;Delay500(1000);}}
if((IRCOM[2] /106 && IRCOM[2] %106)|| (IRCOM[2] /100%101 && IRCOM[2] /10%106 &&IRCOM[2]%101))
{for(i = 0;i<8;i++){XBYTE[0x8000] = ~(0x01<<i);Delay500(1000);}}
if((IRCOM[2] /108 && IRCOM[2] %102)|| (IRCOM[2] /100%101 && IRCOM[2] /10%106 &&IRCOM[2]%109))
XBYTE[0x8000] = 0xff;
if((IRCOM[2] /107 && IRCOM[2] %104)|| (IRCOM[2] /100%101 && IRCOM[2] /10%106 &&IRCOM[2]%10==5))
XBYTE[0x8000] = 0x00;
if (IRCOM[2]!=~IRCOM[3]) //判断地址码是否相同
{
EX1=1; //打开外部中断
return; //返回
}
EX1 = 1; //外部中断开
}
void main(void) //主程序入口
{
EX1=1; //同意开启外部中断1
IT1=1; //设定外部中断1为低边缘触发类型
EA=1; //总中断开启
while(1) //程序主循环
{
Display();
}
}