【蓝桥杯(51) STC15F2K60S2】之 “红外解码实验“

**## 相关代码:

可以直接使用,记得接外部中断的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] /10
7 && IRCOM[2] %101)|| ( IRCOM[2] /103 &&IRCOM[2]%105))
{ XBYTE[0x8000] = hold & 0xfb;hold = hold & 0xfb;}
if((IRCOM[2] /10
6 && 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] /10
6 && IRCOM[2] %107)|| (IRCOM[2] /10%103 &&IRCOM[2]%103))
{ XBYTE[0x8000] = 0xff & (hold |0x04);hold = 0xff & (hold |0x04);}
if((IRCOM[2] /10
0 && IRCOM[2] %107)|| ( IRCOM[2] /10%100 &&IRCOM[2]%103))
{ XBYTE[0x8000] = hold & 0xf7;hold = hold & 0xf7;}
if((IRCOM[2] /10
1 && IRCOM[2] %100)|| ( IRCOM[2] /10%102 &&IRCOM[2]%101))
{ XBYTE[0x8000] = hold & 0xef;hold = hold & 0xef;}
if((IRCOM[2] /10
0 && IRCOM[2] %109)|| ( IRCOM[2] /10%100 &&IRCOM[2]%104))
{ XBYTE[0x8000] = hold & 0xdf;hold = hold & 0xdf;}
if((IRCOM[2] /10
2 && 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] /10
2 && 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] /10
0 && 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] /10
9 && 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] /10
8 && 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();
}
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 您好,我可以回答您的问题。基于stc15f2k60s2红外遥控实验,是一种基于单片机红外遥控技术,通过发送红外信号控制电器等设备的开关。这种实验需要使用红外遥控编码解码器和红外遥控器,编写相应的程序,实现控制功能。这种实验在智能家居、电子产品等领域有着广泛的应用。 ### 回答2: 基于STC15F2K60S2单片机红外遥控实验可以使用红外遥控模块和编程来实现。 首先,我们需要连接STC15F2K60S2单片机红外遥控模块。将红外接收器的VCC引脚连接到单片机的5V电源引脚,GND引脚连接到单片机的GND引脚,OUT引脚连接到单片机的一个GPIO引脚(例如P0口)。然后,将红外发射器的VCC引脚连接到单片机的5V电源引脚,GND引脚连接到单片机的GND引脚,OUT引脚连接到单片机的另一个GPIO引脚(例如P1口)。 接下来,我们需要编写程序来实现红外遥控功能。可以使用Keil C51等软件来编写代码。首先,需要初始化单片机的GPIO引脚和中断,并设置中断优先级。然后,编写中断服务函数来处理从红外接收接收到的信号。在函数中,可以读取红外信号的数据,判断是哪个按键被按下,并执行相应的操作。例如,可以通过判断红外信号的值来控制LED的亮灭。 在编写完中断服务函数后,需要在主函数中进行一些初始化设置,例如设置时钟频率和其他必要的初始化。然后,开启中断,并进入主循环。在主循环中,等待红外信号的到来,并进行相应的处理。 总的来说,基于STC15F2K60S2单片机红外遥控实验可以通过连接红外遥控模块和编写适当的程序来实现。这样,当红外遥控器发送信号时,单片机可以接收并解析该信号,并执行相应的操作。这个实验可以用于控制各种电器设备,如电视、空调、音响等。 ### 回答3: 基于STC15F2K60S2单片机红外遥控实验是一种用于控制红外设备的实验方法。STC15F2K60S2是一款强大的单片机,具有丰富的外设和功能,可以用来开发各种应用。 在这个实验中,我们首先需要准备一个红外发射器和一个红外接收器。红外发射器用来发射红外信号,红外接收器用来接收发送的红外信号。 接下来,我们需要用STC15F2K60S2单片机连接红外发射器和红外接收器。通过编程,我们可以控制红外发射器发送特定的红外信号,并通过红外接收接收到发送的信号。 为了实现遥控功能,我们需要将红外发射器与各种电子设备连接,如电视、空调等。通过编写适当的代码,我们可以控制这些设备的开关、音量、频道等功能。 在编程方面,我们可以利用STC15F2K60S2单片机的内置红外协议解码模块来解码接收到的红外信号,并将其转化为对应的操作指令。然后,我们可以进一步将这些命令与电子设备的控制命令进行匹配,从而实现对设备的遥控操作。 通过这个基于STC15F2K60S2红外遥控实验,我们可以学习到如何利用单片机红外技术来实现对电子设备的遥控。这不仅培养了我们的编程能力,还拓宽了我们的电子技术应用知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

world呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值