新塘N76E003红外遥控解码程序

发布者:梦回归处最新更新时间:2022-10-08 来源: csdn关键字:N76E003  红外遥控解码 手机看文章 扫描二维码
随时随地手机看文章

一直用的STM8S003的单片机,后来价格涨到三块多不得不换。拿上新塘N76E003芯片,资源中规中矩,相比用习惯Cortex® M 内核微控制器和STM8,用这个芯片资源就有些少了,先来个简单的红外遥控解码。(打算用外部IO中断来触发解码的,调试时发现会无规律的触发IO中断,只得用IO扫描方式去解红外遥控信号。)


以日本NEC的编码协议组成: 引导码,16bit用户码(地址码),8bit命令码(功能码)及其反码


1、引导码由一个9ms的载波波形和4.5ms的关断时间构成(9ms低电平+4.5ms高电平)。


2、地址码共16bit(8位系统码和8位系统反码),低位在前,高位在后。


遥控码特征:


采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”。0与1前端的低电平持续都是0.56ms,那么就是后面的高电平持续时间不同,0为0.56ms,1为1.685ms。


程序有个问题:数据接收方向当时搞反了,接收回来的数据刚好是高低位位置互换,不影响使用就没去改。


//-----------------my_IR.c------------------------------------------------------------


 #include "my_IR.h"


 /*------------------------------------------------------


 NEC协议红外遥控解码


 计数使用资源:Timer0


 由于设定Timer0定时值,计算出来的值不正确,


 超时在Timer3中断里处理


 --------------------------------------------------------*/


 #define REMOTE_ID 0x0 


 sbit IR_IO=P0^0;


 bit bIR_scan=0; 


 bit bIR=0;


 UINT8 IR_cont=0;


 UINT8 IR_code=0; //遥控按键值


 //-----------------------------------------------


 UINT16 Dval; //计数器的值


 unsigned long RmtRec=0; //接收到的数据


 uint16_t TIM0_GetCounter(void)


 {


  uint16_t tmpcntr = 0;


  tmpcntr = ((uint16_t)TH0 << 8);


  tmpcntr = tmpcntr| (uint16_t)(TL0); 


  return ((uint16_t)tmpcntr*0.75);


 }


 UINT8 IR_SCAN(void)


 {


  UINT8 i=0; 


  UINT8 t1,t2; 


  if(bIR_scan==0) return 0;


  bIR_scan=0;


  RmtRec=0;

 


  if(IR_IO==0) 


  {


  clr_TR0; 


  clr_TF0;


  TL0 =0; 


  TH0 =0;


  set_TR0; //Start Timer0


  bIR=0;IR_cont=0;


  while ((IR_IO==0)&&(bIR != 1)); //Check Timer0 Time-Out Flag


  clr_TR0; //Stop Timer0


  clr_TF0;


  Dval=TIM0_GetCounter(); 


  if(Dval>8600&&Dval<9300) //9ms


  {


  TL0 =0;


  TH0 =0; 


  set_TR0; //Start Timer0


  bIR=0;IR_cont=0;


  while ((IR_IO==1)&&(bIR != 1)); //Check Timer0 Time-Out Flag


  clr_TR0; //Stop Timer0


  clr_TF0;


  Dval=TIM0_GetCounter(); 


  if(Dval>4200&&Dval<4700) //4.5ms


  {


  //----------------------------------------------------------


  do{


  TL0 =0;


  TH0 =0; 


  set_TR0; //Start Timer0


  bIR=0;IR_cont=0;


  while ((IR_IO==0)&&(bIR != 1)); //Check Timer0 Time-Out Flag


  clr_TR0; //Stop Timer0


  clr_TF0;


  Dval=TIM0_GetCounter(); 

 


  if(Dval<300&&Dval>800) //560us


  {


  return 0;


  }


  TL0 =0;


  TH0 =0; 


  set_TR0; //Start Timer0


  bIR=0;IR_cont=0;


  while ((IR_IO==1)&&(bIR != 1)); //Check Timer0 Time-Out Flag


  clr_TR0; //Stop Timer0


  clr_TF0;


  Dval=TIM0_GetCounter(); 


  if(Dval>300&&Dval<800) //560为标准值,560us


  {


  RmtRec<<=1; 


  RmtRec|=0; //接收到0 


  i++;


  }else if(Dval>1400&&Dval<1800) //1680为标准值,1680us


  { 


  RmtRec<<=1; 


  RmtRec|=1; //接收到1


  i++;


  }


  else if(Dval>2200&&Dval<2600) //得到按键键值增加的信息 2500为标准值2.5ms


  {

 


  }


  }while(i<32);


  //--------------------------------------------------------------------


  t1=RmtRec>>24; //得到地址码


  t2=(RmtRec>>16)&0xff; //得到地址反码 


  if((t1==(UINT8)~t2)&&t1==REMOTE_ID)//检验遥控识别码(ID)及地址 


  { 


  t1=RmtRec>>8;


  t2=RmtRec; 


  IR_code=t1;


  if(t1==(UINT8)~t2)return 1;//键值正确 


  }


  //--------------------------------------------------------------------- 


  } 


  }


  }


  return 0;


 }


 void my_IR_Init(void)


 {


  P00_Input_Mode;


  clr_T0M; //T0M=0, Timer0 Clock = Fsys/12


  TMOD |= 0x01; //Timer0 is 16-bit mode


  set_TR0; //Start Timer0


  TL0 =LOBYTE(TIMER_DIV12_VALUE_40ms); //Find define in "Function_define.h" "TIMER VALUE"


  TH0 =HIBYTE(TIMER_DIV12_VALUE_40ms);


  //clr_TR0; //Stop Timer0


 }

//-----------------my_IR.c------------------------------------------------------------


 #ifndef __MY_IR_H


 #define __MY_IR_H


 #include "n76e003.h"

 //


 extern bit bIR_scan; 


 extern bit bIR;


 extern UINT8 IR_cont;


 extern UINT8 IR_code;


 void my_IR_Init(void);


 UINT8 IR_SCAN(void);


 #endif /*__MY_IR_H*/


关键字:N76E003  红外遥控解码 引用地址:新塘N76E003红外遥控解码程序

上一篇:单片机 温度调控 大功率设备调整PWM输出
下一篇:ZigBee-CC2530单片机 - LED呼吸灯

推荐阅读最新更新时间:2024-11-01 21:45

STM32编程之用TIM定时器的输入捕获功能红外遥控解码
1、主程序 #include sys.h #include usart.h #include led.h #include lcd.h #include delay.h #include remote.h #include stm32f10x_tim.h /* 程序功能:用STM32的定时器输入捕获功能进行红外解码。 当按下红外遥控器的按键时,LCD显示键值和连按的次数; 同时串口也输出同样的数据。 日期:2015年7月27日 地点:湖北工业职业技术学院电子工程系 硬件连接: PA1---TIM5_CH2; */ int main(void) { u8 i=0; d
[单片机]
N76E003 夏普GP2Y1010 PM2.5
首先来看传感器内部结构与单片机的连接图。由下图可知,实际上使用的I/O就是3、5脚。其中3脚为PWM驱动LED闪烁频率的引脚,在下文中可以看到时序。而5脚Vo则是传感器检测到的灰尘,而输出的电压值。在下文的程序中,将使用N76E003单片机自带的带隙电压进行测量,以此保证ADC不被供电电压影响。 https://download.csdn.net/download/u014798590/10948021 (工程文件、数据手册与电路可以在这下载) 下图为GP2Y1010传感器的线序(注意,线的颜色不一定一致) 下图为3脚输入的电平,这里我们使用PWM5/P0.3(这里注意看左侧的电路,LED导通的条件)。 经下图公式
[单片机]
<font color='red'>N76E003</font> 夏普GP2Y1010 PM2.5
N76E003 ADC计算电压值
分享下调试ADC计算电压值理解的相关内容。 最重要的公式 要记住ADC测量结果无非就是一个代表电压量的值,管脚上的模拟信号转换为12位二进制数据(0xFFF),例如:如果参考电压是5V,ADC输入也是5V,那ADC转换结果就是0xFFF;如果参考电压是5V,ADC输入是2.5V,那ADC转换结果就是0xFFF除以2。ADC转换结果除以满量程ADC值(即0xFFF)就是与参考电压的比例,这个比例乘以参考电压就是实际电压值(Vain)。 计算代码如下: // CN Spec, 18.1.1, P193, ADC_DATA = 4095 * (Vain/Vref) // So: Vain = (ADC_DATA * Vref)
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved