51单片机 红外解码 temp = (0x80|(temp>>1));是什么意思

51单片机 红外解码 temp = (0x80|(temp>>1));是什么意思,第1张

temp = (0x80|(temp>>1)); 是将temp最高位变为1;而emp=(0x00|(temp>>1));是将最高为变为0你用的AVR的单片机吧,这种用法在AVR单片机中比较常用

以NEC格式为例:

按键一次: 依次发送 引导码 + 地址 + 地址取反 + 数据 + 数据取反

按键: 隔110ms左右发一次引导码(重复),并不带任何数据(全部为高电平)

所以根据这个特点可以识别长按键:

程序接收一帧数据后,提取出地址和数据,然后判断

//有地址和数据的,为一次按键

//地址和数据为空的,为重复按键

if((ir_addr_code==0xffff)&&(ir_origin_data==0xff)&&(ir_data==0xff))

{

repeat=1;

key= last_key;

}

1去网站上下载“遥控精灵”这个软件。

2把遥控精灵安装到手机,选择想要遥控的空调的品牌进行匹配。

3匹配成功后,选择场景如客厅,如果手机提示接收到红外信号就说明可以遥控了。

具体 *** 作步骤:

一、首先你的手机得有红外功能,你可以在网上查询一下自己的手机是否具有红外功能。

二、然后现在很多新型的智能手机都有自带的遥控功能,那么就可以直接进入遥控功能里面控制空调了。

三、如果你的手机没有自带的遥控功能,你可以下载一个遥控APP,并对应空调型号,然后就可以使用遥控功能了。

四、若是你的手机没有红外功能的话,你可以在网上购买红外硬件。

五、安装好红外硬件后还需要下载一个遥控APP,然后对应空调型号,这样就可以使用手机控制空调了。

在解码方式一栏点击上下键,选中需要的解码方式,点击确定更改解码方式,即可更改为自己需要的解码方式。

当有多个频道需要改或者上面的 *** 作无效的时候,就按下面的方法一键把所有频道 *** 作更改。(尤其是海信电视,有时候需要先退出电视家,再打开,再解就可以了)

按 “OK”键进入设置,选择解码方式。

//////////////////////////////////////

//晶振频率为6MHz 一个机器周期2us //

//实现按键地址码、指令码的数码管显示//

//2010-06-01 //

//////////////////////////////////////

#include<reg52h>

#define uchar unsigned char

#define uint unsigned int

sbit dula=P2^6;

sbit wela=P2^7;

bit overflag,dataover;//开始接收数据,数据处理完毕

uchar timedata;//定时器0溢出次数

uchar chubus[33];//33Byte数据 timedata组成的数组

uchar jieguos[4];//地址码,地址反码,数据码,数据反码;

void initial()//初始化

{

IT0=1;EX0=1;//负边沿触发

TMOD=0x01;ET0=1;TR0=1;//模式1,十六位定时器

TH0=0xff;TL0=0x06;//05ms溢出

EA=1; //开总中断

}

void time0() interrupt 1//定时器0中断

{TH0=0xff;TL0=0x06;

timedata++;

}

void ex0() interrupt 0//外部中断0,接收数据

{

static bit startflag;//开始接收

static uchar i;

if(startflag)

{

if(timedata<32&&timedata>=16) i=0;

chubus[i]=timedata;

timedata=0;

i++;

if(i==33){overflag=1;i=0;}

}

else

{

startflag=1;

timedata=0;

}

}

void chulidata()

{

uchar chubu;//初步数据

uchar jieguo;//结果数据

uchar x,y,z=1;

for(x=0;x<4;x++)//处理四组数据

{

for(y=1;y<=8;y++)//处理一组数据8Byte

{

chubu=chubus[z];

jieguo=jieguo>>1;

if(chubu>3) jieguo=jieguo|0x80;//大于15mS为1

z++;

}

jieguos[x]=jieguo;

jieguo=0;

}

dataover=1;

}

void delay(uint z)

{

uint x ,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void display()

{

uchar gao,gao1;

uchar di,di1;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

gao1=table[jieguos[0]/16];

di1=table[jieguos[0]%16];

gao=table[jieguos[2]/16];

di=table[jieguos[2]%16];

dula=1;

P0=gao1;

dula=0;

P0=0xff;

wela=1;

P0=0x7e;

wela=0;

delay(2);

dula=1;

P0=di1;

dula=0;

P0=0xff;

wela=1;

P0=0xfd;

wela=0;

delay(2);//地址码

dula=1;

P0=gao;

dula=0;

P0=0xff;

wela=1;

P0=0x77;

wela=0;

delay(2);

dula=1;

P0=di;

dula=0;

P0=0xff;

wela=1;

P0=0x6f;

wela=0;

delay(2);//指令码

}

void main()

{

initial();//初始化

while(1)

{

if(overflag)//数据接收完毕

{

chulidata();//处理数据,完成标志dataover

overflag=0;

}

if(dataover)

{

display();//数码管显示

}

}

}

上面的sbit dula=P2^6; sbit wela=P2^7;分别是什么意思??

--为引脚,定义一个变量名称。

这里的P2^6和P2^7和IO口的P2^6,P2^7有什么关系??

--它们就是它们。

dula和wela是用来显示键值所用的数码管的段和位吗?

--看程序,它们都干些什么,就知道了。

把他们定义成P2^6和P2^7和数码管段与位所连接的IO口有关系吗?

--有关、无关,去看电路图。

另外uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};是显示这些码代表的键?

--这些,是显示数字用的。

--是不是代表键,你执行程序,就看出来了。

还是用这些码所代表的数码管的段和位或者别的什么的来显示按键值?

--试试看。

--有些程序,都是瞎编,显示什么,作者自己,都不清楚。

以上就是关于51单片机 红外解码 temp = (0x80|(temp>>1));是什么意思全部的内容,包括:51单片机 红外解码 temp = (0x80|(temp>>1));是什么意思、求单片机红外遥控解码识别长按和短按键的C语言例子、格力空调怎样用手机红外解码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9357633.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存