红外接收代码分享

合集下载

nec码红外遥控完整编码

nec码红外遥控完整编码

nec码红外遥控完整编码红外遥控编码程序如下:NEC .SECTION 'DATA'a_REM_CODE DB ? ;KEY DATA CODEa_CUSTOMER_1 DB ? ;遥控器头码(客户码)低八位a_CUSTOMER_2 DB ? ;遥控器头码(客户码)高八位#define CUS_6221_1 00110100b ;1234H#define CUS_6221_2 00010010b ;@------------------------------------------------NEC_CODE .SECTION 'CODE';@************* SUBROUTINE[xx]: Send Remote Code ************;;遥控码发送:SEND_REMOTE_CODE:clr WDT ;清除进位标志,检测遥控发送的有效的按键SZ fg_SendActive ;SZ表示以0结尾的字符串JMP READY_SEND ;跳转到READY_SEND模块retREADY_SEND:NEC_CODE:mov A,a_KEY_NUM ;将数值发送到寄存器A中,直接寻址mov M_TBLP,ATABRDL a_REM_CODE ;查表专用指令;读取遥控头码(客户码)低八位数值 MOV A,CUS_6221_1MOV a_CUSTOMER_1,AMOV A,CUS_6221_2MOV a_CUSTOMER_2,A以上为READY_SEND运行模块,同时是为后面NEC码发送的准备;首先将一个按键的数值已以直接寻址方式发送到寄存器A中,将寄存器A的是发送到M_TBLP 中,然后查表a_REM_CODE,将CUS_6221_1的值发送到寄存器中,在赋值给遥控器头码(客户码)低八位a_CUSTOMER_1,同理,将CUS_6221_2赋值给遥控器头码(客户码)低八位a_CUSTOMER_2,随后即开始发送NEC遥控码。

红外编码——精选推荐

红外编码——精选推荐

红外编码格式最近在研究的在S3C6410的上的IRM3638 红外接收器件。

发现其中红外编码采用PT2222编码,进一步研究发现,红外编码是有好几种编码.特的将编码格式取出来放在这里.一.TC9028、TC9012、TC9243 编码方式TC9028、TC9012和TC9243这三者的编码方式是完全一致的,该码型的一帧数据中含有32 位,即8 位用户编码,8 位用户编码的重复码,8 位键数据编码(D0~D7)以及他的反码。

用户码和键数据码的发送均是低位在前,高位在后。

如上图1 所示:一帧完整的发射码有引导码、用户编码和键数据码三部分组成。

引导码由一个 4.5ms高电平脉冲及4.5ms 的低电平脉冲组成;八位用户编码,被连续发送两次:八位的键数据码也被连续发送两次,第一次发送的是键数据码的原码,第二次发送的是键数据码的反码。

―1‖和―0‖的区分取决于脉冲之间的时间,称之为脉冲位置调制方式(PPM)。

波形如图4。

当SEL接DRV0 脚时,选中的8 位用户编码为(C7-C0:00001110(0EH)),该码型的输出波形如图2所示,重复码波形如图 3所示,―1‖和―0‖的波形如图4所示,载波波形如图5所示:―1‖和―0‖的区分取决与脉冲之间的时间,称之为脉冲位置调制方式(PPM),如图4所示。

发射端输出高电平时按图5的载波波形发送:频率:38KHz;占空比:1/3。

2、UPD6122 和PT2222 编码方式:PT2222与upd6122 的编码方式完全一致,该码型所发射的一帧码含有一个引导码,8 位的用户编码(例如C7~C0=14H)及其反码,8 位的键数据码及其反码。

下图给出了这一帧码的结构。

如上图6所示,引导码由一个9ms 的载波波形和4.5ms 的关断时间构成,它作为随后发射的码的引导。

在发重复码时,引导码由一个9ms 的载波波形和2.25ms 的关断时间构成。

每次8 位的码被传送的同时,它们的反码也被传送。

红外遥控器发射板代码和接收板代码

红外遥控器发射板代码和接收板代码

本文是基于单片机红外通讯的代码,代码分为发射板代码和接收板代码。

指令码是用户发给接收系统的指令,用以控制设备完成相应的操作。

指令码是一串数据流,其构成如图3-2。

一个完整的指令码由10ms高平引导码、3ms低平开始码、1ms脉宽正脉冲、3ms低平结束码、下一个10ms高平引导码组成。

其中引导码、开始码和结束码都是为了系统能够正确接受信号而设置的,能够判断信号是否有效、信号起始和结束。

信号中的脉冲个数才是我们指令码的指令所在,不同的脉冲个数对应不同的指令。

图3-2 指令码的组成3.3 红外遥控发射系统的设计红外遥控发射部分系统框图见图3-3。

发送端采用单片机的定时中断功能,由定时器T1产生周期为26us 的矩形脉冲,即每隔13us定时器T1产生中断输出一个相反的信号使单片机输出端产生周期为38KHz的脉冲信号。

系统通过连着单片机的按键获取用户遥控指令码,经按键扫描确认,然后交由单片机编码生成信息码,再由红外发射二极管将信息码发射出去。

在次设计中用到了T1和T0两个定时器,定时器T0控制T1开启和关闭,T0定时长度由指令码中高低电平维持时间长度决定。

具体发射过程如下:(1)定时器T1打开10ms,发射10ms引导码。

(2)定时器T1关闭3ms,发射3ms低平开始码。

(3)定时器T1打开1ms,发射1ms脉宽高电平脉冲。

(4)定时器T1关闭1ms,发射1ms脉宽低电平。

(5)重复(3)和(4)发射一定数目的脉冲。

(6)最后T1打开2ms和最后一个脉冲的1ms低电平一起构成3ms结束码,最终发射的信号如图3-2。

3.4 红外遥控接收系统的设计红外遥控接收电路框图见图3-4。

红外接收端普遍采用价格便宜,性能可靠的一体化红外接收头(MS0038 , 它接收红外信号频率为38KHz ,周期约26μs)。

它能同时对信号进行放大、检波、整形,得到TTL 电平的编码信号。

当接收头接收到26us周期的脉冲,输出低电平,否则输出高电平。

STM32单片机红外遥控

STM32单片机红外遥控

STM32单片机红外遥控红外遥控接口电路STM32单片机红外遥控程序源代码#include "sys.h"#define LED_RED PBout(12) //红色发光二极管控制管脚初始化PB12 #define LED_GREEN PBout(13) //绿色发光二极管控制管脚初始化PB13 #define LED_YELLOW PBout(14) //黄色发光二极管控制管脚初始化PB14 #define LED_BLUE PBout(15) //蓝色发光二极管控制管脚初始化PB15 #define BEEP PBout(5) //蜂鸣器端口定义PB5#define RDATA PAin(1) //红外数据输入脚//红外遥控识别码(ID),每款遥控器的该值基本都不一样,但也有一样的//我们选用的遥控器识别码为0#define REMOTE_ID 0static u8 fac_us=0; //us延时倍乘数static u16 fac_ms=0; //ms延时倍乘数void delay_init(u8 SYSCLK);void delay_ms(u16 nms);void delay_us(u32 nus);void Led_Init(void); //发光二极管控制管脚初始化void Red_Led_Light(void); //点亮红色发光二极管void Green_Led_Light(void); //点亮绿色发光二极管void Yellow_Led_Light(void); //点亮黄色发光二极管void Blue_Led_Light(void); //点亮蓝色发光二极管void Red_Led_Goout(void); //熄灭红色发光二极管void Green_Led_Goout(void); //熄灭绿色发光二极管void Yellow_Led_Goout(void); //熄灭黄色发光二极管void Blue_Led_Goout(void); //熄灭蓝色发光二极管void Beep_Init(void);void Beep_Tweet(void);void Beep_Silent(void);extern u8 Remote_Cnt; //按键次数,此次按下键的次数extern u8 Remote_Rdy; //红外接收到数据extern u32 Remote_Odr; //命令暂存处u32 Remote_Odr=0; //命令暂存处u8 Remote_Cnt=0; //按键次数,此次按下键的次数u8 Remote_Rdy=0; //红外接收到数据void Remote_Init(void); //红外传感器接收头引脚初始化u8 Remote_Process(void); //红外接收到数据处理u8 Pulse_Width_Check(void); //检查脉宽extern u8 USART_RX_BUF[64]; //接收缓冲,最大63个字节.末字节为换行符extern u8 USART_RX_STA; //接收状态标记//如果想串口中断接收,请不要注释以下宏定义//#define EN_USART1_RX //使能串口1接收void uart_init(u32 pclk2,u32 bound);/*************************************************************开发板上电后,用红外遥控器对着开发板上的红外接收头。

红外IR的代码解释

红外IR的代码解释

#include <reg52.h> //特殊寄存器头文件#define c(x) (x*110592/120000) //是晶振值,为计数器计一下所需要的微秒数,120000为12M,110592为11.0592Msbit Ir_Pin=P3^3; //位声明,把P3.3/外部中断1的状态读到Ir_Pin中unsigned char codeLed_Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //共阳极数码显示码0-F.unsigned char code Led_Sel[]={0xe,0xd,0xb,0x7}; //位选编码unsigned char Led_Buf[4]; //显示缓冲区char Led_Index; //位选信号定义unsigned char Ir_Buf[4]; //用于保存解码结果//============================================================ //数码管扫描timer0() interrupt 1 using 1 //定时器中断零程序{TH0=(65536-1000)/256;TL0=(65536-1000)%256; //定时器0设定约1000us中断一次,用于数码管扫描P0=0xff; //数码管初始显示零P2=Led_Sel[Led_Index]; //位选P0=Led_Tab[Led_Buf[Led_Index]]; //段选if(++Led_Index>3) Led_Index=0; //四个扫描完了,到第一个数码管}//============================================================ unsigned intIr_Get_Low() //脉冲为低电平的时间{TL1=0;TH1=0; //为定时器1赋初值TR1=1; //开启定时器1while(!Ir_Pin &amp;&amp; (TH1&amp;0x80)==0); //判断,如果P3.3口为低电平则执行TR1=0TR1=0; //关闭定时器1return TH1*256+TL1; //返回TH1*256+TL1的值}//============================================================ unsigned intIr_Get_High() //脉冲高电平时间{TL1=0;TH1=0; //为定时器1赋初值TR1=1; //开启定时器1while(Ir_Pin &amp;&amp; (TH1&amp;0x80)==0); //判断,如果P3.3口为低电平则执行TR1=0TR1=0; //关闭定时器1return TH1*256+TL1; //返回TH1*256+TL1的值}//============================================================ main(){unsigned inttemp;char i,j;Led_Index=1;TMOD=0x11;TL0=(65536-1000)%256;TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描EA=1; //开总中断ET0=1; //定时计数器0的开放控制位TR0=1; //定时器0的运行控制位Led_Buf[0]=0;Led_Buf[1]=0;Led_Buf[2]=0;Led_Buf[3]=0; //显示区设成0do{restart:while(Ir_Pin); //判断P3.3口temp=Ir_Get_Low(); //取脉冲为低电平的时间if(temp<c(8500) || temp>c(9500)) continue; //引导脉冲低电平9000 temp=Ir_Get_High(); //取脉冲高电平时间if(temp<c(4000) || temp>c(5000)) continue; //引导脉冲高电平4500 for(i=0;i<4;i++) //4个字节for(j=0;j<8;j++) //每个字节8位{temp=Ir_Get_Low();if(temp<c(200) || temp>c(800)) goto restart; //根据编码格式,低电平小于0.2ms大于0.8ms视为无效电平,重新检测temp=Ir_Get_High();if(temp<c(200) || temp>c(2000)) goto restart; //根据编码格式,低电平小于0.2ms大于2ms视为无效电平,重新检测Ir_Buf[i]>>=1; //把Ir_Buf[i]右移一位,然后赋值给Ir_Buf[i]if(temp>c(1120)) Ir_Buf[i]|=0x80; //根据编码格式,如果电平大于1.12ms,则把0x80赋值给Ir_Buf[i]}Led_Buf[0]=Ir_Buf[2]&amp;0xf;Led_Buf[1]=(Ir_Buf[2]/16)&amp;0xf;Led_Buf[2]=Ir_Buf[3]&amp;0xf;Led_Buf[3]=(Ir_Buf[3]/16)&amp;0xf; //显示结果}while(1);}2010-08-20 08:14 6624731|五级#define c(x) (x*110592/120000) //是晶震值,为计数器计一下所需要的微秒数,120000为12M,110592为11.0592Mtemp=Ir_Get_Low(); //取脉冲为低电平的时间if(temp<c(8500) || temp>c(9500)) continue;//引导脉冲低电平9000 //根据红外编码有起始9ms的低电平时间,大于8.5小于9.5为防止计数器有误差temp=Ir_Get_High(); //取脉冲高电平时间if(temp<c(4000) || temp>c(5000)) continue;//引导脉冲高电平4500 //根据红外编码有起始4.5ms的高电平时间for(i=0;i<4;i++) //4个字节for(j=0;j<8;j++) //每个字节8位{temp=Ir_Get_Low();if(temp<c(200) || temp>c(800)) goto restart;//根据编码格式,低电平小于0.2ms大于0.8ms视为无效电平,重新检测temp=Ir_Get_High();if(temp<c(200) || temp>c(2000)) goto restart;//意思同上。

红外遥控码值

红外遥控码值
}
}
}
}
k++;
}
IRcord[i]=value;
value=0;
}
irpro_ok=1;//处理完毕标志位置1
}
/*------------------------------------------------
irtime=0;
i++;
if(i==33)
{
irok=1; //说明记录好啦一帧数据,接收好啦一个红外信号
i=0;
}
}
else
{
irtime=0;
startflag=1;
uchar IRcord[4]; //记录一帧数据
uchar irdata[33]; //记录33个电平的持续时间
/*------------------------------------------------
函数声明
------------------------------------------------*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit IR=P3^2;
bit irpro_ok,irok; //位变量声明 0或1
uchar irtime,key;//红外用全局变量
void EX0init(void)
{
IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)
EX0 = 1; //
EA = 1; //开总中断

TL1838红外接收0、1解码

TL1838红外接收0、1解码

Write_Data(zifu[((a[2]&0xf0)>>4)]);
Write_Data(zifu[(a[2]&0x0f)]);
Write_Data('H');
Write_Data(0x20);
Write_Data(zifu[((a[3]&0xf0)>>4)]);
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
void delaynms(unsigned int n)
{
unsigned char i;
for(i=0;i<n;i++)
void Display(void) //a[4]为16进制数,将其以16进制数形式显示在液晶上
{
Write_DDRAM_Address(0x40); // 设置显示位置为第一行的第1个字
Write_Data(zifu[((a[0]&0xf0)>>4)]);
Write_Data(zifu[(a[0]&0x0f)]);
//本解码程序适用于NEC的upd6121及其兼容芯片的解码,支持大多数遥控器 实验板采用12MHZ晶振
//对应遥控器的键的操作码:1:0CH 2:18H 3:5EH 4:08H 5:1CH 6:5AH 7:42H 8:52H 9:4AH 0:16H 100+:19H 200+:0DH
TH0=0; //定时器清0
TL0=0; //定时器清0

红外通信基础(含代码)

红外通信基础(含代码)

红外通信基础(含代码)红外发光⼆极管。

它实际上是⼀只特殊的发光⼆极管编码⽅式⼆进制脉冲码的形式有多种,其中最为常⽤的是PWM码(脉冲宽度调制码)和PPM码(脉冲位置调制码,脉冲串之间的时间间隔来实现信号调制)。

数据格式数据格式包括了引导码、⽤户码、数据码和数据码反码,编码总占32位。

数据反码是数据码反相后的编码,编码时可⽤于对数据的纠错。

传输位定义⽤户码或数据码中的每⼀个位可以是位 ‘1’ ,也可以是位 ‘0’。

区分 ‘0’和 ‘1’是利⽤脉冲的时间间隔来区分,这种编码⽅式称为脉冲位置调制⽅式,英⽂简写PPM传输过程,注意有上拉电阻,即输出端⼝默认为⾼电平附上代码/************************************************************************************** * 红外通信实验 *实现现象:具体接线操作请参考视频下载程序后,数码管显⽰红外遥控键值数据注意事项:红外遥控模块的短接⽚J1短接,红外遥控器内的电池绝缘⽚⼀定要抽掉***************************************************************************************/ #include "reg52.h" //此⽂件中定义了单⽚机的⼀些特殊功能寄存器typedef unsigned int u16; //对数据类型进⾏声明定义typedef unsigned char u8;sbit LSA=P2^2;sbit LSB=P2^3;sbit LSC=P2^4;sbit IRIN=P3^2;u8 IrValue[6];u8 Time;u8 DisplayData[8];u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、H的显⽰码/******************************************************************************** 函数名 : delay* 函数功能 : 延时函数,i=1时,⼤约延时10us*******************************************************************************/void delay(u16 i){while(i--);}/******************************************************************************** 函数名 :DigDisplay()* 函数功能 :数码管显⽰函数* 输⼊ : ⽆* 输出 : ⽆*******************************************************************************/void DigDisplay(){u8 i;for(i=0;i<3;i++){switch(i) //位选,选择点亮的数码管,{case(0):LSA=0;LSB=0;LSC=0; break;//显⽰第0位case(1):LSA=1;LSB=0;LSC=0; break;//显⽰第1位case(2):LSA=0;LSB=1;LSC=0; break;//显⽰第2位}P0=DisplayData[i];//发送数据delay(100); //间隔⼀段时间扫描P0=0x00;//消隐}}/******************************************************************************** 函数名 : IrInit()* 函数功能 : 初始化红外线接收* 输⼊ : ⽆* 输出 : ⽆*******************************************************************************/void IrInit(){IT0=1;//下降沿触发EX0=1;//打开中断0允许EA=1; //打开总中断IRIN=1;//初始化端⼝}/******************************************************************************** 函数名 : main* 函数功能 : 主函数* 输⼊ : ⽆* 输出 : ⽆*******************************************************************************/void main(){IrInit();while(1){DisplayData[0] = smgduan[IrValue[2]/16];DisplayData[1] = smgduan[IrValue[2]%16];DisplayData[2] = smgduan[16];DigDisplay();}}/******************************************************************************** 函数名 : ReadIr()* 函数功能 : 读取红外数值的中断函数* 输⼊ : ⽆* 输出 : ⽆*******************************************************************************/void ReadIr() interrupt 0{u8 j,k;u16 err;Time=0;delay(700); //7msif(IRIN==0) //确认是否真的接收到正确的信号{err=1000; //1000*10us=10ms,超过说明接收到错误的信号/*当两个条件都为真是循环,如果有⼀个条件为假的时候跳出循环,免得程序出错的时侯,程序死在这⾥*/while((IRIN==0)&&(err>0)) //等待前⾯9ms的低电平过去{delay(1);err--;}if(IRIN==1) //如果正确等到9ms低电平{err=500;while((IRIN==1)&&(err>0)) //等待4.5ms的起始⾼电平过去{delay(1);err--;}for(k=0;k<4;k++) //共有4组数据{for(j=0;j<8;j++) //接收⼀组数据{err=60;while((IRIN==0)&&(err>0))//等待信号前⾯的560us低电平过去 {delay(1);err--;}err=500;while((IRIN==1)&&(err>0)) //计算⾼电平的时间长度。

红外线遥控解码接收程序-C语言

红外线遥控解码接收程序-C语言

红外线遥控解码接收程序-C语言.txt铁饭碗的真实含义不是在一个地方吃一辈子饭,而是一辈子到哪儿都有饭吃。

就算是一坨屎,也有遇见屎壳郎的那天。

所以你大可不必为今天的自己有太多担忧。

红外线遥控解码接收程序-C语言#include <regx51.h>#define uchar unsigned char#define uint unsigned int#define IR_RE P3_2bit k=0; //红外解码判断标志位,为0那么为有效信号,为1那么为无效uchar date[4]={0,0,0,0}; //date数组为存放地址原码,反码,数据原码,反码/*--------------------------延时1ms程子程序-----------------------*/delay1000(){uchar i,j;i=5;do{j=95;do{j--;}while(j);i--;}while(i);}/*---------------------------延时882us子程序-----------------------*/delay882(){uchar i,j;i=6;do{j=71;do{j--;}while(j);i--;}while(i);}/*--------------------------延时2400us程子程序-----------------------*/delay2400(){uchar i,j;i=5;do{j=237;do{j--;}while(j);i--;}while(i);}//**************************************************************//**************************************************************/*----------------------------------------------------------*//*-----------------------红外解码程序(核心)-----------------*//*----------------------------------------------------------*/void IR_decode(){uchar i,j;while(IR_RE==0);delay2400();{delay1000();delay1000();for(i=0;i<4;i++){for(j=0;j<8;j++){while(IR_RE==0); //等待地址码第1位高电平到来delay882(); //延时882us判断此时引脚电平///CY=IR_RE;if(IR_RE==0){date[i]>>=1;date[i]=date[i]|0x00;}else if(IR_RE==1){delay1000();date[i]>>=1;date[i]=date[i]|0x80;}} //1位数据接收完毕} //32位二进制码接收完毕}}//*****************************************************************//********************************************************************/*------------------------外部中断0程序-------------------------*//*------------------主要用于处理红外遥控键值--------------------*/void int0() interrupt 0{uchar i;k=0;EX0=0; //检测到有效信号关中断,防止干扰for(i=0;i<4;i++){delay1000();if(IR_RE==1){k=1;} //刚开场为9ms的引导码. }if(k==0){// EX0=0; //检测到有效信号关中断,防止干扰IR_decode(); //如果接收到的是有效信号,那么调用解码程序P0=date[1];delay2400();delay2400();delay2400();}EX0=1; //开外部中断,允许新的遥控按键}//*********************************************************************//********************************void main(){SP=0x60; //堆栈指针EX0=1; //允许外部中断0,用于检测红外遥控器按键EA=1; //总中断开while(1);}总结:关于本段程序的准确延时在<<C51中准确的延时与计算的实现>>里的评论有很好的诠释.//在STC12C5410上运用红外线解码程序.主要的问题在于延迟上。

红外遥控器参考代码

红外遥控器参考代码
void Ircordpro(void)//红外码值处理函数
{
unsigned char i, j, k;
unsigned char cord,value;
if(irdata[0]>=47&&irdata[0]<=50)
{
k=1;
for(i=0;i<4;i++) //处理4个字节
{
for(j=1;j<=8;j++) //处];
if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
{
if(startflag)
{
if(irtime<50&&irtime>=47)//引导码 TC9012的头码,9ms+4.5ms
i=0;
irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
/* 变量声明 */
/******************************************************************/
unsigned char irtime;//红外用全局变量
{
if(irpro_ok)
{
switch(IRcord[2])//判断第三个数码值
{
case 0x1D:P1=0xFE;break;//1 显示相应的按键值
} irpro_ok=1;//处理完毕标志位置1
}
}
//主程序
void main(void)
{
IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)

单片机红外接受解码程序成功版

单片机红外接受解码程序成功版

单片机红外接受解码程序成功版1、效果图2、发射码格式3、38KH载波发射(完整的发射图)4、 0 与 1的区别5、载波6、小结7、代码发射码格式38KH载波发射(完整的发射)0与1的区别载波小结1、发射端发射出来的是高电平。

但是接收到的是低电平。

(接收到的数据与发射的相反)2、我这里用的外部下降沿触发的中断3、使用12M的晶振完4、整源码下载地址:代码#include <reg51.h>sbit IR=P3^2; //红外接口标志sbit dm = P2^2; //段码sbit wm = P2^3; //位码unsigned char hc[8]; //数码管显示缓存unsigned char DM[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0 x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~Funsigned char WM[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位码。

显示的位置unsigned char sj[33]; //接收脉冲时间数组char w=0; //数码管显示缓存指针(0~7)unsigned char i; //脉冲个数记录unsigned char mcsj; //脉冲时间(大于0.56ms小于1.125ms为0,大于1.125ms小于2.25ms)bit MC=0; //接收红外脉冲开始标志(0:脉冲已经结束,1:脉冲刚开始)bit JS=0; //脉冲接收结束标志位(1标志接收结束)bit JM=0; //解码完成标志位(1:解码完成)void Delay(unsigned char f);void dsq_0() interrupt 1 using 1 //定时器T0中断服务函数{mcsj++; //256}void wbzd_0() interrupt 0 //外部中断服务函数{if(MC){if(mcsj>32) //判断是不是引导码。

红外线接收程序

红外线接收程序
IT1=1; // 设置成 下降沿触发方式
while(1){ //循环显示,接收都由
display(l_tmpdate,8);
}
}
void display(unsigned char *lp,unsigned char lc)//显示
{
unsigned char i; //定义变量
tmp>>=1;
if(l_lhj[i]>30)
tmp+=0x80;
}
l_tmpdate[4]=tmp/16;
l_tmpdate[5]=tmp%16+0x80;
tmp=0;
for(i=51;i<67;i++,i++){ //同上,这里处理控制位后8位
tmp>>=1;
}
i--;
}
tmp=0;
//这里显示了全部的四段码,包括地址位两段,控制位两段,每段用点分开
for(i=3;i<19;i++,i++){ //处理地址位前8位,这是3是因为去掉前面的引导码。对低电平时间数据的数理,
tmp>>=1; //右移一位,接收低电平在前
for(i=19;i<35;i++,i++){ //同上,这里处理地址位后8位
tmp>>=1;
if(l_lhj[i]>30)
tmp+=0x80;
}
l_tmpdate[2]=tmp/16;
l_tmpdate[3]=tmp%16+0x80;
tmp=0;

使用irmp库创建的基于stm32的红外遥控例程+源代码+文档说明

使用irmp库创建的基于stm32的红外遥控例程+源代码+文档说明

使用irmp库创建的基于stm32的红外遥控例程+源代码+文档说明全文共四篇示例,供读者参考第一篇示例:使用irmp库创建的基于stm32的红外遥控例程引言红外遥控技术在现代生活中得到了广泛应用,无论是电视遥控、空调遥控还是其它家用电器遥控,都离不开红外遥控技术。

而在嵌入式系统中,基于STM32开发的红外遥控系统也广泛应用于各种智能家居、智能家电中。

本文将介绍如何使用irmp库创建一个基于STM32的红外遥控例程,并提供源代码和文档说明。

一、什么是irmp库irmp库是一个用C语言编写的红外接收器解码库,可以用于解码不同品牌、型号的红外遥控器信号。

它支持多种不同的协议,包括NEC、SONY、RC-5等。

irmp库可以很方便地在STM32系列的单片机中使用,实现红外信号的接收和解码。

二、STM32开发环境搭建在使用irmp库创建红外遥控例程之前,首先需要搭建STM32开发环境。

可以选择Keil、IAR等集成开发环境进行开发。

在安装好开发环境后,需要配置好对应的STM32系列的芯片支持,包括芯片型号、引脚配置、时钟设置等。

然后创建一个新的工程,并导入irmp库的源代码。

三、irmp库的使用irmp库的使用主要分为两个部分:初始化红外接收器和处理接收到的红外码。

首先需要在初始化阶段对红外接收器进行配置,包括选择引脚、设置定时器等。

然后就可以启动红外接收器,开始接收红外信号。

在接收到红外信号后,irmp库会自动对信号进行解码,并将解码后的红外码存储在一个全局变量中。

在接收到红外码后,可以通过对不同的红外码进行判断,实现不同功能的控制。

四、红外遥控例程的实现下面以一个简单的LED控制为例,来演示如何使用irmp库创建一个基于STM32的红外遥控例程。

假设我们要用红外遥控器控制一个LED灯的开关。

1. 创建一个新的工程,并导入irmp库的源代码。

2. 配置红外接收器的引脚和定时器。

3. 在主函数中启动红外接收器,并进入一个无限循环。

MLX90614红外测温代码

MLX90614红外测温代码

1.通过本实验掌握MLX90614的原理。

2.通过实验掌握数码管基本原理3.通过实验掌握矩阵键盘的使用4.通过实验掌握1602的使用二.实验内容通过MLX90614非接触式测得物体温度三.实验器材1.主控屏+5V电源2.DCP-PRJ09红外测温仪四.实验原理图五.实验步骤1.接上电源2.运行Keil u Vision软件,新建一个工程,新建一个工程文件。

将文件添加到工程中并编译,如有错,请更改直到编译成功,如有错,请更改直到编译成功4.用编程器将生成的HEX文件烧写到单片机中,或用STC单片机专用的串口烧写软件,通过MAX232串口烧写到单片机中(只能用于STC单片机)。

或用仿真器来执行程序,将程序下载到仿真器中,具体方法请参考仿真器的使用一节。

用编程器将生成的HEX文件烧写到单片机中。

5.程序下完后可以看到液晶屏有温度显示,用手掌覆盖红外传感器上方2cm处,看到此时液晶屏温度即为手掌的表面温度。

6.按下1键可以看到数码管显示,用手掌覆盖红外传感器上方2cm处,看到此时数码管温度即为手掌的表面温度。

此时液晶屏温度保持不变。

7.按下除1键其他键,此时液晶屏又重新显示温度。

实验代码如下://----------------------------//说明:显示分为2部分:数码管显示,液晶屏显示//按1键数码管显示,此时液晶屏保持静止//复位时或按除1键外其他键时,液晶屏显示,数码管熄灭//-------------------------------------------------------------------------#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned char#define Nack_number 10//**************端口定义************************************************** uchar flag;//LCD控制线接口sbit RS=P0^6;//RS端sbit RW=P0^7;//读写端sbit LCDE=P3^5;//使能端//mlx90614端口定义sbit SCK=P3^7;//时钟线sbit SDA=P3^6;//数据线sbit DPY1=P3^2;//温度显示第1个数码管段选sbit DPY2=P3^3;//温度显示第2个数码管段选sbit DPY3=P3^4;//温度显示第3个数码管段选sbit row1=P0^3;//矩阵键盘第1列sbit row2=P0^4;//矩阵键盘第2列sbit row3=P0^5;//矩阵键盘第3列sbit cow1=P0^0;//矩阵键盘第1行sbit cow2=P0^1;//矩阵键盘第2行sbit cow3=P0^2;//矩阵键盘第3行//************数据定义**************************************************** bdata uchar flag1;//可位寻址数据sbit bit_out=flag1^7;sbit bit_in=flag1^0;uchar temp H,temp L,err;void CALTEMP(uint TEMP);void Read Key(void);void init Int();void delay1(uint z);void show();uchar key_num;uchar mah[5];/********数码管码值定义*******************************************************/ uchar code LED01[]={ //LED显示代码,0-9共阳不带小数点的0x C0,0x F9,0x A4,0x B0,0x99,0x92,0x82,0x F8,0x80,0x90};uchar code LED02[]={ //LED显示代码,0-9共阳带小数点的0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};/**********全局变量定义******************************************************/ bit b20ms,b100ms;//定时标志位uchar c20ms,c100ms;//定时毫秒数//**************************LCD1602***********************************//向LCD写入命令或数据*****************************************************#define LCD_COMMAND 0//命令#define LCD_DATA 1//数据#define LCD_CLEAR_SCREEN 0x01//清屏#define LCD_HOMING 0x02//光标返回原点//设置显示模式*******0x08+*********************************************#define LCD_SHOW 0x04//显示开一.实验目的#define LCD_HIDE 0x00//显示关#define LCD_CURSOR 0x02//显示光标#define LCD_NO_CURSOR 0x00//无光标#define LCD_FLASH 0x01//光标闪动#define LCD_NO_FLASH 0x00//光标不闪动//设置输入模式**********0x04+******************************************** #define LCD_AC_UP 0x02//光标右移AC+#define LCD_AC_DOWN 0x00//默认光标左移AC-#define LCD_MOVE 0x01//画面可平移#define LCD_NO_MOVE 0x00//默认画面不移动//**************************mlx90614*********************************** //command mode命令模式#define Ram Access 0x00//对RAM操作#define Eepom Access 0x20//对EEPRAM操作#define Mode 0x60//进入命令模式#define Exit Mode 0x61//退出命令模式#define Read Flag 0xf0//读标志#define Enter Sleep 0xff//进入睡眠模式//ram address read only RAM地址(只读)#define Abmient Temp Addr 0x03//周围温度#define IR1Addr 0x04#define IR2Addr 0x05#define Line Abmient Temp Addr 0x06//环境温度/*0x0000 0x4074 16500 0.01/单元-40 125*/#define Line Obj1Temp Addr 0x07 //目标温度,红外温度/*0x27ad-0x7fff 0x3559 22610 0.02/单元-70.01-382.19 0.01 452.2*/#define Line Obj2Temp Addr 0x08//eepom address EEPROM地址#define TObj Max Addr 0x00//测量范围上限设定#define TObj Min Addr 0x01//测量范围下限设定#define PWMCtrl Addr 0x02//PWM设定#define Ta Range Addr 0x03//环境温度设定#define Ke Addr 0x04//频率修正系数#define Config Addr 0x05//配置寄存器#define SMbus Addr 0x0e//器件地址设定#define Reserverd1Addr 0x0f//保留#define Reserverd2Addr 0x19//保留#define ID1Addr 0x1c//ID地址1#define ID2Addr 0x1d//ID地址2#define ID3Addr 0x1e//ID地址3#define ID4Addr 0x1f//ID地址4//************函数声明***************************************************** void start();//MLX90614发起始位子程序void stop();//MLX90614发结束位子程序uchar Read Byte(void);//MLX90614接收字节子程序void send_bit(void);//MLX90614发送位子程序void Send Byte(uchar number);//MLX90614接收字节子程序void read_bit(void);//MLX90614接收位子程序void delay(uint N);//延时程序uint readtemp(void);//读温度数据void init1602(void);//LCD初始化子程序void busy(void);//LCD判断忙子程序void cmd_wrt(uchar cmd);//LCD写命令子程序void dat_wrt(uchar dat);//LCD写数据子程序void display(uint Tem);//显示子程序void Print(uchar*str);//字符串显示程序//*************主函数*******************************************void main(){uint Tem;//温度变量init Int();SCK=1;SDA=1;delay(4);SCK=0;delay(1000);SCK=1;init1602();//初始化LCDwhile(1){while(b100ms)//每100ms扫描一次键盘{b100ms=0;Read Key();}if(key_num==1)//按下1键时,进行数码管显示{Tem=readtemp();CALTEMP(Tem);show();}if(key_num!=1)//液晶屏显示{Tem=readtemp();//读取温度cmd_wrt(0x01);//清屏Print("Temperature:");//显示字符串Temperature:且换行display(Tem);//显示温度Print("^C");//显示摄氏度delay(100000);//延时再读取温度显示}}}void Print(uchar *str) //字符串显示程序{while(*str!='\0') //直到字符串结束{dat_wrt(*str); //转成ASCII 码str++; //指向下一个字符}}//--------------输入转换并显示(用于LCD1602)-------------------- void display(uint Tem){uint T,a,b;T=Tem*2;if(T>=27315) //温度为正{T=T-27315; //a=T/100; //温度整数b=T-a*100; //温度小数if(a>=100) //温度超过100 度{dat_wrt(0x30+a/100); //显示温度百位dat_wrt(0x30+a%100/10); //显示温度十位dat_wrt(0x30+a%10); //显示温度个位} else if(a>=10) //温度超过10 度{dat_wrt(0x30+a%100/10); //显示温度十位dat_wrt(0x30+a%10); //显示温度个位}else //温度不超过10 度{dat_wrt(0x30+a); //显示温度个位}dat_wrt(0x2e); //显示小数点if(b>=10) //温度小数点后第1 位数不等于0 {dat_wrt(0x30+b/10); //显示温度小数点后第1 位数dat_wrt(0x30+b%10); //显示温度小数点后第2 位数}else //温度小数点后第1 位数等于0{dat_wrt(0x30); //显示温度小数点后第1 位数0dat_wrt(0x30+b); //显示温度小数点后第2 位数}}else //温度为负{T=27315-T;a=T/100; b=T-a*100;dat_wrt(0x2d); //显示负号if(a>=10) //温度低于负10 度{dat_wrt(0x30+a/10); //显示温度十位dat_wrt(0x30+a%10); //显示温度个位}else //温度高于负10 度{dat_wrt(0x30+a); //显示温度个位}dat_wrt(0x2e); //显示小数点if(b>=10) //温度小数点后第1 位数不等于0{dat_wrt(0x30+b/10); //显示温度小数点后第1 位数dat_wrt(0x30+b%10); //显示温度小数点后第2 位数}else //温度小数点后第1 位数等于0{dat_wrt(0x30); //显示温度小数点后第1 位数0dat_wrt(0x30+b); //显示温度小数点后第2 位数}}}//--------------------根据十六进制计算温度-------------------------------------------------------- void CALTEMP(uint TEMP){uint T;uint a,b;uchar A4,A5,A6,A7,A8; T=TEMP*2;if(T>=27315){T=T-27315;a=T/100;b=T-a*100;if(a>=100){A4=a/100;a=a%100;A5=a/10;a=a%10;A6=a;}else if(a>=10){A4=0;A5=a/10;a=a%10;A6=a;}else{A4=0;A5=0;A6=a;}if(b>=10){A7=b/10;b=b%10;A8=b;}else{A7=0;A8=b;}}else{T=27315-T;a=T/100;b=T-a*100;A4=9;if(a>=10){A5=a/10;a=a%10;A6=a;}else{A5=0;A6=a;}if(b>=10){A7=b/10;b=b%10;A8=b;}else{A7=0;A8=b;}}mah[4]=A4;mah[3]=A5;mah[2]=A6;mah[1]=A7;mah[0]=A8; }//------------------------------void start(void) //停止条件是SCK=1 时,SDA 由1 到0 {SDA=1;delay(4);SCK=1;delay(4);SDA=0;delay(4);SCK=0;delay(4);}//------------------------------void stop(void) //停止条件是SCK=1 时,SDA 由0 到1 {SCK=0;delay(4);SDA=0;delay(4);SCK=1;delay(4);SDA=1;}//---------发送一个字节---------void Send Byte(uchar number){uchar i,n,dat;n=Nack_number; //可以重发次数Send_again:dat=number;for(i=0;i<8;i++) //8 位依次发送{if(dat&0x80) //取最高位{bit_out=1; //发1}else{bit_out=0; //发0}send_bit(); //发送一个位dat=dat<<1; //左移一位}read_bit(); //接收1 位应答信号if(bit_in==1) //无应答时重发{stop();if(n!=0){n--; //可以重发Nack_number=10 次goto Repeat; //重发}else{goto exit; //退出}}else{goto exit;}Repeat:start(); //重新开始goto Send_again; //重发exit: ; //退出}//-----------发送一个位--------- void send_bit(void){if(bit_out==1){SDA=1; //发1}else{SDA=0; //发0}_nop_();SCK=1; //上升沿delay(4);delay(4);SCK=0;delay(4);delay(4);}//----------接收一个字节-------- uchar Read Byte(void){uchar i,dat;dat=0; //初值为0 for(i=0;i<8;i++){dat=dat<<1; //左移read_bit(); //接收一位if(bit_in==1){dat=dat+1; //为1 时对应位加1}SDA=0; //发送应答信号0send_bit();return dat; //带回接收数据}//----------接收一个位----------void read_bit(void){SDA=1; //数据端先置1bit_in=1;SCK=1; //上升沿delay(4);delay(4);bit_in=SDA; //读数据_nop_();SCK=0;delay(4);delay(4);}//------------------------------uint readtemp(void){SCK=0;start(); //开始条件Send Byte(0x00); //发送从地址00 RS=0; //指向指令寄存器Send Byte(0x07); //发送命令start(); //开始条件Send Byte(0x01); //读从地址00bit_out=0;temp L=Read Byte(); //读数据低字节bit_out=0;temp H=Read Byte(); //读数据高字节bit_out=1;err=Read Byte(); //读错误信息码stop(); //停止条件return(temp H*256+temp L);}//******************LCD 显示子函数***********************void init1602(void) //初始化LCD{cmd_wrt(0x01); //清屏cmd_wrt(0x0c); //开显示,不显示光标,不闪烁cmd_wrt(0x06); //完成一个字符码传送后,光标左移,显示不发生移位cmd_wrt(0x38); //16×2 显示,5×7 点阵,8 位数据接口}void busy(void) //LCD 忙标志判断{flag=0x80; //赋初值高位为1 禁止while(flag&0x80) //读写操作使能位禁止时等待继续检测{P1=0xff;RS=0; //指向地址计数器RW=1; //读LCDE=1; //信号下降沿有效flag=P1; //读状态位高位为状态LCDE=0;}}void cmd_wrt(uchar cmd) //写命令子函数{LCDE=0;busy(); //检测读写操作使能吗P1=cmd; //命令RS=0; //指向命令计数器RW=0; //写LCDE=1; //高电平有效LCDE=0;}void dat_wrt(uchar dat) //写数据子函数{busy(); //检测读写操作使能吗LCDE=0;if(flag==16){RS=0; //指向指令寄存器RW=0; //写P1=0XC0; //指向第二行LCDE=1; //高电平有效LCDE=0;}RS=1; //指向数据寄存器RW=0; //写P1=dat; //写数据LCDE=1; //高电平有效LCDE=0;}//------------延时--------------void delay(uint n){uint j;for(j=0;j<n;j++){_nop_();}}//------------定时器初始化函数---------------- void init Int(){TMOD = 0x10; //定时器1 方式1TH1=(65536-1000)/256; //定时器1 设置1ms 定时TL1=(65536-1000)%256;EA=1; //开总中断ET1 = 1; //开定时器T1 中断TR1 = 1; //启动定时器T1}//------------定时器中断处理函数-------------------void timer1handle() interrupt 3 //定时器3 1ms 中断{TH1=(65536-1000)/256;TL1=(65536-1000)%256;c20ms++;c100ms++;if(c20ms >= 20) //20ms 计时器{c20ms = 0;b20ms = 1;}if(c100ms >= 50) //100ms 计时器{c100ms = 0;b100ms = 1;}}//--------------------------温度显示函数------------------------void show(){DPY1=0;P2=LED01[mah[3]]; //转换8 位数显示,不带小数点的delay1(2);P2=0x FF;DPY1=1;DPY2=0;P2=LED02[mah[2]]; //转换8 位数显示,带小数点的delay1(2);P2=0x FF;DPY2=1;DPY3=0;P2=LED01[mah[1]]; //转换8 位数显示,不带小数点的delay1(2);P2=0x FF;DPY3=1;}void Read Key(void){row1=0; //矩阵键盘第1 列,将第一列拉低,扫描是否有按键按下,第一列按键括:1,4,7 row2=1; //矩阵键盘第2 列row3=1; //矩阵键盘第3 列cow1=1; //矩阵键盘第1 行cow2=1; //矩阵键盘第2 行cow3=1; //矩阵键盘第3 行_nop_(); //延时函数if(!(cow1&cow2&cow3)) //如果有键按下,就返回,且判断是那个键值,否则继续扫描下一列{if(cow1==0)key_num=2;if(cow2==0)key_num=5;if(cow3==0)key_num=8;return;}row1=1; //矩阵键盘第1 列,将第一列拉低,扫描是否有按键按下,第一列按键包括:2,5,8 row2=0; //矩阵键盘第2 列row3=1; //矩阵键盘第3 列cow1=1; //矩阵键盘第1 行cow2=1; //矩阵键盘第2 行cow3=1; //矩阵键盘第3 行_nop_(); //延时函数if(!(cow1&cow2&cow3)) //如果有键按下,就返回,且判断是那个键值,否则继续扫描下一列{if(cow1==0)key_num=2;if(cow2==0)key_num=5;if(cow3==0)key_num=8;return;}row1=1; //矩阵键盘第1 列,将第一列拉低,扫描是否有按键按下,第一列按键包括:3,6 row2=1; //矩阵键盘第2 列row3=0; //矩阵键盘第3 列cow1=1; //矩阵键盘第1 行cow2=1; //矩阵键盘第2 行_nop_(); //延时函数if(!(cow1&cow2)) //如果有键按下,就返回,且判断是那个键值,否则继续扫描下一列{if(cow1==0)key_num=3;if(cow2==0)key_num=6;return;}}//--------------数码管显示延时函数-----------------------------------------------------void delay1(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}。

5104红外接收程序

5104红外接收程序

5104红外接收程序//cmd_state 起始码、用户码、指令码所处的状态标志//cmd_data 指令码7位数据存储器//cmd_start 起始码接收完毕标志//cmd_admin 用户码接收完毕标志//cmd_bit 端口中断或定时器溢出中断接收到的一位数据,该数据有三种状态:1、0、错误static volatile uchar cmd_state,cmd_data;static volatile bit cmd_start,cmd_admin;void IntCmd(){if(!cmd_start) //若起始码未接收到,则先持续处理起始码{if(cmd_bit==1){switch (cmd_state){case 1:cmd_state=2;break; //1 1case 2:cmd_state=2;break; //1 1 1时,舍弃第一个接收到的1 default:cmd_state=1;break; //1 否则,认为是起始码的第一个bit }}else if(cmd_bit==0){switch (cmd_state){case 2:cmd_state=3;break; //1 1 0 正确的起始码default:cmd_state=0;break; //?? ?? ?? ??(全部字节不对,)}}else cmd_state=0; //若接收到的是错误位,则清除起始码的侦测记录if(cmd_state==3) //得到完整的起始码{cmd_state=0;cmd_admin=0;cmd_start=1;}}else{if(!cmd_admin){if(cmd_bit==1){if(cmd_state==1){cmd_state=0;cmd_data=0;cmd_admin=1;}else cmd_state=1;}else //若用户码出现0或者错误位,则重置起始码{cmd_state=0;cmd_start=0;}}else{if(cmd_bit==1||cmd_bit==0){cmd_data=(cmd_data<<1)|cmd_bit;cmd_state++;if(cmd_state==7){cmd_state=0;cmd_start=0;cmd_admin=0;switch (cmd_data){case 0X01:Key1=1;break; //第1个键按下每个按键可以用按键时间来替换,当倒计时为0时,自动清除按键标志。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档