红外遥控接收程序
基于AT89C51的红外接收程序
![基于AT89C51的红外接收程序](https://img.taocdn.com/s3/m/118a98878762caaedd33d406.png)
#include <AT89X51.H>#define uchar unsigned charsbit int0=P3^2;sbit k0=P2^0;sbit k1=P2^1;sbit k2=P2^1;sbit k3=P2^3;sbit k4=P2^4;sbit k5=P2^5;sbit k6=P2^6;sbit k7=P2^7;uchar temp=0x00;uchar temp1=0x00;void delay60ms(void) {unsigned char i,j;for(i=120;i>0;i--)for(j=248;j>0;j--);}void delay15min(void){unsigned char i,j,k;for(k=1500;k>0;k--)for(i=120;i>0;i--)for(j=248;j>0;j--);}void delay45min(void){unsigned char i;for(i=3;i>0;i--)delay15min();}void delay60min(void){unsigned char i;for(i=4;i>0;i--)delay15min();}void delay90min(void){unsigned char i;for(i=6;i>0;i--)delay15min();}void delay30min(void){unsigned char i;for(i=2;i>0;i--)delay15min();}void delay10ms (void){unsigned char i,j;for(i=20;i>0;i--)for(j=248;j>0;j--);}void dingshi(temp1){unsigned char count=0;while(1){ if(temp1==0){delay10ms();if(temp1==0){count++;if(count==5){count=0;}while(temp1==0);}switch(count){case 0:delay15min();break;case 1:delay30min();break;case 2:delay45min();break;case 3:delay60min();break;case 4:delay90min();break;}P2=0;}}}void panduan (temp){while(1){switch(temp){case 0x01: k0=0;case 0x02 :k1=0;case 0x03 :k3=0;case 0x04 :k4=0;case 0x05 :k5=0;case 0x06 :dingshi(temp);}}}void main(void){while(1)receive();{uchar i;for(i=0;i<8;i++){temp<<=1;if (int0!=0)temp=0x01;}for(i;i<16;i++){temp1<<=1;if (int0!=0)temp=0x01;}if(temp==0x47)delay60ms();if(temp==0x47){if(temp1==0x07)k7=0;else if(temp1==0x09)P2=0;elsepanduan(temp1);}}}//遥控器:M50462AP - JINXING - 30个按键//单片机:STC89C51RC//晶振:11.0592MHz//红外接收:1838/*--------------------------------------------------------------*/#include <reg52.H>/*--------------------------------------------------------------*///红外接口定义sbit IRDA = P1^4;unsigned char T_C; //50us计数次数46#define D_ERROR 5 //容错值sbit ser=P2^1; //595串行数据输入sbit srclk=P2^2; //移位时钟sbit rclk=P2^3; //锁存时钟unsigned char idata LED[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//共阳极段码表说明void outbyte(unsigned char a,unsigned char b){ unsigned char j;for(j=0;j<8;j++) //位码移位串行输出{ if(a&0x80) ser=1; else ser=0; a=a<<1;srclk=0; //595移位脉冲srclk=1; }for(j=0;j<8;j++) //段码移位串行输出{ if(b&0x80) ser=1; else ser=0;b=b<<1;srclk=0; srclk=1; }rclk=0; //595锁存脉冲rclk=1; }void T0_init(void){ TMOD |= 0x02; TH0 = 0xd2;TL0 = 0xd2; IE |= 0x82;TR0 = 1;}void T0_intservice(void) interrupt 1{ T_C++; }void main(void){ unsigned char i, j;unsigned char IRDA_dat[2];T0_init();while(1){ for(j = 0; j < 2; j++){ while(IRDA); //1for(i = 0; i < 8; i++){ T_C = 0;while(!IRDA); //0 0.25mswhile(IRDA); //1 0.75ms-0/1.75ms-1if((T_C > (40 - D_ERROR)) && (T_C < (40 + D_ERROR))) {IRDA_dat[j] >>= 1; IRDA_dat[j] |= 0x80;} //1else if((T_C > (20 - D_ERROR)) && (T_C < (20 + D_ERROR))) {IRDA_dat[j] >>= 1;} //0 }if(j == 1) while(!IRDA);//0if(IRDA_dat[0] != 0x47) break; //错误处理,引导码是否正确引导码C0~C7由1110XX10组成}outbyte(0x00, ~IRDA_dat[1]);IRDA_dat[0] = 0; IRDA_dat[1] = 0;}}。
红外接收解码原理和源程序
![红外接收解码原理和源程序](https://img.taocdn.com/s3/m/e2ae4f39793e0912a21614791711cc7931b778b4.png)
上述“0”和“1”构成旳32位二进制码经38kHz旳载频进行二次调制以提升发射效率,到达降低电源功耗旳目旳。然后再经过红外发射二极管产生红外线向空间发射,如图。
UPD6121G产生旳遥控编码是连续旳32位二进制码组,其中前16位为顾客辨认码,能区别不同旳电器设备,预防不同机种遥控码相互干扰。芯片厂商把顾客辨认码固定为十六进制旳一组数;后16位为8位操作码(功能码)及其反码。UPD6121G最多额128种不同组合旳编码。遥控器在按键按下后,周期性地发出同一种32位二进制码,周期约为108ms。一组码本身旳连续时间随它包括旳二进制“0”和“1”旳个数不同而不同,大约在45~63ms之间,图4为发射波形图。当一种键按下超出36ms,振荡器使芯片激活,将发射一组108ms旳编码脉冲,这108ms发射代码由一种起始码(9ms),一种成果码(4.5ms),低8位地址码(9ms~18ms),高8位地址码(9ms~18ms),8位数据码(9ms~18ms)和这8位数据旳反码(9ms~18ms)构成。假如键按下超出108ms仍未松开,接下来发射旳代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)构成。
注:P3.2接旳是外部中断
红外接受头将38K载波信号过虑,得到与发射代码反向接受代码
发射端旳“0”和“1”
红外解码旳关键就是辨认 0和1
Hale Waihona Puke 1. 解码旳关键是怎样辨认“0”和“1”,从位旳定义我们能够发觉“0”、“1”均以0.56ms旳低电平开始,不同旳是高电平旳宽度不同,“0”为0.56ms,“1”为1.68ms,所以必须根据高电平旳宽度区别“0”和“1”。假如从0.56ms低电平过后,开始延时,0.56ms后来,若读到旳电平为低,阐明该位为“0”,反之则为“1”,为了可靠起见,延时必须比0.56ms长些,但又不能超出1.12ms,不然假如该位为“0”,读到旳已是下一位旳高电平,所以取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms左右均可。
红外发射接收程序
![红外发射接收程序](https://img.taocdn.com/s3/m/235eb16b7e21af45b307a818.png)
红外发送调用SendIRdata();while(over==0);地址储存在addr(可根据需要改成发送16位地址,此程序发送的是八位地址,第二地址是第一个的反码)中,hwdata,c,d,over,dat是全局unsigned char ,在等待红外发送完成while(over==0)语句,等待时间为几十ms,可在前面或while中可执行其他程序。
(等待期间不需要执行其他程序也可把while语句放入SendIRdata()末尾)void SendIRdata(unsigned char x){TH1=0xdc;//发送9ms的起始码TL1=0xd8;TR2=1;TR1=1;hwdata=x;over=0;//红外发送结束标志,为1完成}/**************定时器1中断处理***************/void timeint(void) interrupt 3{switch(c){case 0: //起始码4.5msTH1=0xee;TL1=0x6c;TR2=0;c=1;dat=addr;//发送十六位地址的前八位break;case 1:TH1=0xfd; //560us高电平TL1=0xd0;TR2=1;c=2;break;case 2:if(dat&0x01){ TH1=0xf9;TL1=0x5c;}//1.7ms低电平else{ TH1=0xfd;TL1=0xd0;}//560us低电平TR2=0;dat>>=1;d++;c=1;if(d==8)dat=~addr;//发送十六位地址的后八位if(d==16)dat=hwdata;//发送八位数据if(d==24)dat=~hwdata;//发送八位数据的反码if(d==33){over=1;TR1=0;TR2=0;d=0;c=0;}break;}}外中断0 接收,储存在dat[3]全局变量中,hu,time1,time2,h,b,是unsigned char型全局变量,time是unsigned intvoid extern0() interrupt 0 //中断程序{if(hu==0){TL1=0;TH1=0;TR1=1;hu=1;}else{TR1=0;time1=TH1;time2=TL1;TL1=0;TH1=0;TR1=1;time=time1*256+time2;if(start==0){if((14000>time)&&(time>13000))start=1;}else{//if((time>2100)&&(2400>time))//{dat[h]>>=1; dat[h]=dat[h]|0x80;}//else//if((time>1000)&&(1250>time))//dat[h]>>=1;dat[h]>>=1;if((time>2100)&&(2400>time))dat[h]=dat[h]|0x80;b++;if(b>7){ b=0;h++;if(h>3){h=0;start=0;hu=0;if(dat[0]!=~dat[1]|| dat[2]!=~dat[3])dat[2]=0;}}}}}。
基于单片机的红外遥控接收电路
![基于单片机的红外遥控接收电路](https://img.taocdn.com/s3/m/78bb59583b3567ec102d8af3.png)
1 引言近年来随着计算机在社会各领域的渗透,单片机的应用正在不断地走向深入,同时也带动传统的控制、检测等工作日益更新。
传统的遥控器大多采用无线电遥控技术,随着科技的进步,红外线遥控技术的进一步成熟,红外遥控也逐步成为了一种被广泛应用的通信和遥控手段。
为了方便实用,传统的家庭电器逐渐采用红外线遥控。
工业设备中,在高压、辐射、有毒气体、粉尘等有害环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。
红外遥控的特点是不影响周边环境、不干扰其它电器设备。
由于其无法穿透墙壁,故不同房间的家用电器可使用通用的遥控器而不会产生相互干扰;电路调试简单,只要按给定电路连接无误,一般不需任何调试即可投入工作;编解码容易,可进行多路遥控。
红外遥控虽然被广泛应用,但各产商的遥控器不能相互兼容。
当今市场上的红外线遥控装置一般采用专用的遥控编码及解码集成电路,但编程灵活性较低,且产品多相互绑定,不能复用,故应用范围有限。
而本文采用单片机进行遥控系统的应用设计,遥控装置将同时具有编程灵活、控制范围广、体积小、功耗低、功能强、成本低、可靠性高等特点,因此采用单片机的红外遥控技术具有广阔的发展前景。
2 概述2.1 基于单片机的红外遥控系统概述当今社会科学技术的发展与日俱增,人们生活水平也是日益提高,为了减少人们的工作量,所以对各种家用电器、电子器件的非人工控制的要求越来越高,针对这种情况,设计出一种集成度比较高的控制体系是必然的。
现代科技的飞速发展在许多危险、不可近场合也对远程控制提出了越来越高的要求。
单片机是指一个集成在一块芯片上的完整计算机系统。
尽管他的大部分功能集成在一块小芯片上,但是它具有一个完整计算机所需要的大部分部件:CPU、内存、内部和外部总线系统,目前大部分还会具有外存。
同时集成诸如通讯接口、定时器,实时时钟等外围设备。
而现在最强大的单片机系统甚至可以将声音、图像、网络、复杂的输入输出系统集成在一块芯片上。
红外遥控器接收程序
![红外遥控器接收程序](https://img.taocdn.com/s3/m/4825040d76c66137ee0619dc.png)
//STC89C52RC//11.0592MHZ#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define TH0_V ALUE 0xc5#define TL0_V ALUE 0xc5 // 定时器计数值#define ANT P2^4 //红外IO口,可任意一个IO//系统变量定义区============================================================volatile unsigned char irr_b=0,s_s=0;//irr_b接收状态指示,s_s显示许可volatile signed long da=0; //32位数据码volatile unsigned char wb=0, a=0; //wb为接收到的位数,a为接收到信号高低电平判断依据volatile unsigned int js=0; //定时器计数volatile unsigned char a1=1,a2=1; //上升沿处理变量void timer_init(void){ET0=0;TMOD=0x02;TCON=0x10;TL0=TL0_VALUE;TH0=TH0_V ALUE;ET0=1;}void timer_start(){TR0=1;EA=1;}void timer0_interrupt(void) interrupt 1 //大约63us中断一次{js++;//判断下降a2=ANT;if (a1>a2){if(irr_b==0) //第一个中断{irr_b=1; //状态为:开始接收js=0;}else if(irr_b==1) //第二个以后的中断{a=js; //读取定时器的值if((170<a)&&(a<240)) //判断是引导,还是数据10.7ms-15.7ms 引导码长13.5ms{wb=0; //数据计数清零da=0; //数据清零js=0; //定时器清零}else //数据{if((8<a)&&(a<25)) //0.5ms-1.57ms 低电平长1.125ms{wb++;js=0;da=(da<<1) ;}else{if((25<a)&&(a<45)) //1.57ms-2.8ms 高电平长2.25ms{wb++;js=0;da=(da<<1) +1 ;}}if(wb>=32) //数据长度够32位{irr_b=0; //状态为停止接收wb=0; //数据计数清零s_s=1; //打开显示许可}}}}a1=a2; //a为两个下降沿之间的时间}void program(void){uchar ds=0,d1;while(1){ds=js;if(ds>250) //定时器超时,接收复位{js=0;irr_b=0;da=0;wb=0;s_s=0;}if(s_s==1) //显示开关打开,开始显示{TR0=0; //关闭全局中断//显示设备码d1=da>>8;d1=da; //把long型的da强制转换为char型的d1switch(d1){case 0xff:P2=0xff;uart_tx(255);break; //停止,灯全灭case 0x9f:P2=0xfe;uart_tx(191);break; //正转,对应的灯亮case 0x5f:P2=0xfd;uart_tx(239);break; //反转,对应的灯亮case 0xaf:P2=0xfb;uart_tx(251);break; //加速,对应的灯亮case 0x6f:P2=0xf7;uart_tx(254);break; //减速,对应的灯亮default:break; }s_s=0; //关闭显示开关TR0=1; //开全局中断}}}void delay_ms(unsigned int i){unsigned int j;while(i--){for(j=0;j<75;j++);}}void uart_init(){TMOD|=0X20; //只把M1置为1,其余位不变,默认为0TH1=0XFD;TL1=0XFD;SCON=0X50; // 设定串行口工作方式PCON&=0XEF; // 波特率不倍增,只把倍增位置0,其他位保持不变,默认为0TR1=1;}void uart_tx(unsigned char txd){SBUF=txd;while(!TI);TI=0;}void uart_cn(unsigned char *cn,unsigned char cn_nub){unsigned char i;for(i=0;i<(cn_nub);i++){uart_tx(cn[i]); //发送数据i_nop_();_nop_();_nop_();_nop_();_nop_(); //无实际意义,后移cpu指针,使指令按字对齐,减少取指令时的内存访问次数}}void main(){timer_init();timer_start();uart_init();EA=1;P2=0xf0;delay_ms(10);program();}。
红外遥控器程序及原理、程序
![红外遥控器程序及原理、程序](https://img.taocdn.com/s3/m/b8cdd69602d276a201292e10.png)
Data=0;//收到数据 0 }
if(Ok==1) {
hw_jsm<<=1; hw_jsm+=Data;
if(Num>=32)
{ hw_jsbz=1; break }
EXTI_ClearITPendingBit(EXTI_Line15); }
printf_init(); //printf 初始化
while(1)
{
if(hw_jsbz==1) //如果红外接收到
{
hw_jsbz=0;
//清零
printf("红外接收码 %0.8X\r\n",hw_jsm); //打印
hw_jsm=0;
//接收码清零
}
}
}
1.1 红外遥控简介简介 红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低, 成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用 到计算机系统中。 由于红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力,所以,在 设计红外线遥控器时,不必要像无线电遥控器那样,每套(发射器和接收器)要有不同的遥控 频率或编码(否则,就会隔墙控制或干扰邻居的家用电器),所以同类产品的红外线遥控器, 可以有相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。这对于大批量生产以 及在家用电器上普及红外线遥控提供了极大的方面。由于红外线为不可见光,因此对环境影 响很小,再由红外光波动波长远小于无线电波的波长,所以红外线遥控不会影响其他家用电 器,也不会影响临近的无线电设备。 红外遥控的编码目前广泛使用的是: NEC Protocol 的 PWM(脉冲宽度调制)和 Philips RC-5 Protocol 的 PPM(脉冲位置调制)。 普中科技 STM32 开发板配套的遥控器使用的是 NEC 协议,其特征如下: 1、 8 位地址和 8 位指令长度; 2、地址和命令 2 次传输(确保可靠性) 3、 PWM 脉冲位置调制,以发射红外载波的占空比代表“ 0”和“ 1”; 4、载波频率为 38Khz; 5、位时间为 1.125ms 或 2.25ms; NEC 码的位定义:一个脉冲对应 560us 的连续载波,一个逻辑 1 传输需要 2.25ms ( 560us 脉冲+1680us 低电平),一个逻辑 0 的传输需要 1.125ms( 560us 脉冲+560us 低 电平) 。而遥控接收头在收到脉冲的时候为低电平,在没有脉冲的时候为高电平,这样, 我们在接收头端收到的信号为:逻辑 1 应该是 560us 低+1680us 高,逻辑 0 应该是 560us 低+560us 高。 NEC 遥控指令的数据格式为:同步码头、地址码、地址反码、控制码、控制反码。同步 码由一个 9ms 的低电平和一个 4.5ms 的高电平组成,地址码、地址反码、控制码、控制 反 码均是 8 位数据格式。按照低位在前,高位在后的顺序发送。采用反码是为了增加传输的 可靠性(可 用于校验)。 2.数据码格式 数据格式包括了引导码、用户码、数据码和数据码反码,编码总占 32 位。数据反码是数据 码反相后的编码,编码时可用于对数据的纠错。注意:第二段的用户码也可以在遥控应用电 路中被设置成第一段用户码的反码。
5104红外接收程序
![5104红外接收程序](https://img.taocdn.com/s3/m/33bf786732687e21af45b307e87101f69f31fb40.png)
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时,自动清除按键标志。
电视机红外遥控和接收的制作(完整的电路、程序、照片)
![电视机红外遥控和接收的制作(完整的电路、程序、照片)](https://img.taocdn.com/s3/m/7c88b32cb4daa58da0114aaa.png)
程序:
#include<reg52.h> #include<intrins.h> #include<stdio.h>
#define uint unsigned int #define uchar unsigned char
sbit ir=P3^2 ; //红外端口 sbit P2_0=P2^0 ; //LED1 端口
} }
红外发射原理图:
晶振用的是 22.1184M
三级管驱动红外发射电路: 红外发射程序如下:(参考网上程序)
R16 另一边接 P1.0
#include <reg52.h> #define uint unsigned int #define uchar unsigned char bit irout;//红外管状态 sbit ir=P1^7;//红外发射管控制脚 uint count, set_count;//中断计数,设定中断次数 bit flag,keyflag;//红外发送标志,按键标志位 uchar irsys[4]={0x1a,0xa1,0xdc,0x03};//26 位系统码,最后一个字节只用 2 位 uchar ircode,irdata; /********************************************** 延时 1ms ***********************************************/
} } } }
/************************************* 主程序
*************************************/ void main() {
基于STMFHAL库的红外接收程序
![基于STMFHAL库的红外接收程序](https://img.taocdn.com/s3/m/2cb02635fe4733687f21aa2f.png)
基于STM32F1HAL库的红外解码程序,核心思想是通过外部下降沿中断记录相邻两个下降沿的时间,记录的数据存入数组,再根据数据判断是0还是1,获得NEC协议的4个码。
程序使用PG15作为中断输入,使用基本定时器7定时,相比在中断里面等待的方式节省了CPU时间,提高了效率,也方便移植到其他型号的MCU上。
程序没有处理连发的问题,感兴趣的可以尝试修改。
.c文件#include"bsp_ir.h"//irdata[33]存储相邻下降沿的cnt计数值uint8_tirdata[33],cnt=0,IR_OK=0;TIM_HandleTypeDefir_timx;voidIR_Init(void){GPIO_InitTypeDefGPIO_InitStruct;IR_GPIO_CLK_ENABLE;GPIO_InitStruct.Pin=IR_GPIO_PIN;GPIO_InitStruct.Mode=GPIO_MODE_IT_FALLING;//下降沿中断GPIO_InitStruct.Pull=GPIO_PULLUP;//上拉HAL_GPIO_Init(IR_GPIO_PORT,&GPIO_InitStruct);HAL_NVIC_SetPriority(IR_EXTI_IRQn,1,1);HAL_NVIC_EnableIRQ(IR_EXTI_IRQn);IR_TIMx_Init(249,71);}//Tout=(arr+1)*(psc+1)/sck//设计Tout=250us,psc=71,arr=249,sck=72MHzvoidIR_TIMx_Init(uint16_tarr,uint16_tpsc){ir_timx.Instance=IR_TIMx;ir_=psc;ir_=TIM_COUNTERMODE_UP;ir_=arr;ir_=TIM_CLOCKDIVISION_DIV1;ir_=TIM_AUTORELOAD_PRELOAD_DISABLE;IR_TIMx_RCC_CLK_ENABLE();HAL_NVIC_SetPriority(IR_TIMx_IRQn,1,0);HAL_NVIC_EnableIRQ(IR_TIMx_IRQn);HAL_TIM_Base_Init(&ir_timx);__HAL_TIM_CLEAR_FLAG(&ir_timx,TIM_FLAG_UPDATE);HAL_TIM_Base_Start_IT(&ir_timx);}//定时器中断服务函数voidIR_TIMx_IRQHandler(void){HAL_TIM_IRQHandler(&ir_timx);}//定时器更新中断回调函数voidHAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim) {if(htim->Instance==IR_TIMx){cnt++;}}//外部中断服务函数//根据霖锋老师89C51篇关于红外接收的程序修改voidIR_EXTI_IRQHandler(void){staticuint8_tuCounter;staticuint8_tStartflag=0;//开始接收标志HAL_GPIO_EXTI_IRQHandler(IR_GPIO_PIN);if(!Startflag){Startflag=1;cnt=0;}elseif(Startflag){if((cnt<60)&&(cnt>40))//引导码检测(9+4.5)/0.25=54 uCounter=0;irdata[uCounter]=cnt;//cnt存储了相邻两个下降沿的时间差cnt=0;uCounter++;if(uCounter==33)//接收完成{uCounter=0;IR_OK=1;Startflag=0;}}}//获得命令码//成功返回命令码,错误返回0uint8_tIR_GET_CODE(void){uint8_ti,j,k=1,value=0,ir_code[4];//ir_code[0]:用户码ir_code[1]:用户码反码ir_code[2]:命令码ir_code[3]:命令码反码if(IR_OK!=1)return0;else{IR_OK=0;for(i=0;i<4;i++){for(j=0;j<8;j++){value>>=1;//注释部分对应低位在前的情况if(irdata[k]>6) //0:1.125/0.25=4.5<6,1:2.25/0.125=9>6value|=0x80;k++;}ir_code[i]=value;}k=1;value=0;if(ir_code[2]+ir_code[3]==0xFF)//数据校验{returnir_code[2]; //返回的是命令码}elsereturn0;}}.h文件#ifndef_BSP_IR_H#define_BSP_IR_H#include"stm32f1xx_hal.h"//用PG15的EXTI中断来检测红外引脚电平跳变,基本定时器7用来计时//可根据自己需要修改#defineIR_TIMxTIM7#defineIR_TIMx_RCC_CLK_ENABLE()__HAL_RCC_TIM7_CLK_ENABLE()#defineIR_TIMx_IRQnTIM7_IRQn#defineIR_TIMx_IRQHandlerTIM7_IRQHandler#defineIR_GPIO_CLK_ENABLE __HAL_RCC_GPIOG_CLK_ENABLE()#defineIR_GPIO_PORTGPIOG#defineIR_GPIO_PINGPIO_PIN_15#defineIR_EXTI_IRQnEXTI15_10_IRQn#defineIR_EXTI_IRQHandlerEXTI15_10_IRQHandler//遥控器上按键的控制码,十进制,根据自己遥控器上的按键修改#definePOWER162#defineMODE98#defineSPEAK226#definePLAY34#definePREV2#defineNEXT194#defineEQ224#defineVOL_PLUS144#defineVOL_REDU168#defineRPT152#defineU_SD176#defineZERO104#defineONE48#defineTWO24#defineTHREE122#defineFOUR16#defineFIVE56#defineSIX90#defineSEVEN66#defineEIGHT74#defineNINE82voidIR_Init(void);voidIR_TIMx_Init(uint16_tarr,uint16_tpsc);uint8_tIR_GET_CODE(void);#endifMain函数中直接调用IR_GET_CODE函数即可获得命令码。
红外发射接收程序
![红外发射接收程序](https://img.taocdn.com/s3/m/99c40a80bceb19e8b8f6ba1d.png)
/*-----------------------------------------------名称:红外发射接收修改:无内容:*红外测试程序,用单片机通过发射管发射38K的调制频率码,由一体化接收并解码由发光管显示。
*正常情况下,由于反射和高灵敏度接收,LED4(P1.7)一直闪烁,可以用黑色纸片完全遮挡接收头使*之不能接收到发射管的信号,这是LED4熄灭。
说明功能性正常------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED=P2^3; //红外发射sbit LED1=P0^1;bit Flag;void Init_Timer0(void){TMOD |= 0x01;TH0=0xf0; /* Init value */TL0=0x00;EA=1; /* interupt enable */ET0=1; /* enable timer0 interrupt */TR0=1;}/******************************************************************/ /* 定时器0初始化 *//******************************************************************/ void Timer0_isr(void) interrupt 1 using 1{TH0=0x0f; /* Init value */TL0=0x00;Flag=!Flag;}/******************************************************************/ /* 主函数 *//******************************************************************/ main(){unsigned int j;Init_Timer0(); //定时器初始化LED1=0;while(1){ //读取一体化接收头数值if(Flag){for(j=0;j<27;j++)//大约38KHz{LED=!LED; //发射管输出}}}}#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED=P0^1;sbit IR=P2^3; //红外一体化接收sbit LED1=P0^2;sbit BUZZER=P2^5;void delayus(unsigned us){ unsigned int i,j;for(i=0;i<us;i++)for(j=0;j<101;j++);}main(){LED1=0;BUZZER=0;while(1){unsigned int a,b;b=0;for(a=0;a<22;a++){ if(IR==0)b=b+1;delayus(6);//对脉冲采样}if(b>5){LED=0;BUZZER=0;}else{LED=1;BUZZER=1;}//有障碍物灯灭、蜂鸣器响}}。
带连码红外接收程序
![带连码红外接收程序](https://img.taocdn.com/s3/m/a6f545f8aef8941ea76e05f1.png)
} start_T1;//在已经开始接收 32 码后,重新开启定时器 }ewvalue>120)//位周期大于某某数,表示位值为 1 {
point|=0x80000000; }//否则为 0
bit_amount++; if(bit_amount>=33)//32 位码接收完毕 {
REG.receive_start=0;//重置各标志位 bit_amount=0; REG.receive_32bits=0; if(p[0]==(uchar)(~p[1])&&p[2]==(uchar)(~p[3])) {
typedef struct FLG flag;
volatile flag REG;
void PORT_init(void) {
DDRB|=(1<<2); PORTA|=(1<<7);//上拉输入捕捉引脚,以提高稳定性 } //下面初始化中包含输出比较中断用于防止定时器计数过长而死机, //省去输出比较中断也无妨,可以测试一下 void Timer1_capture_init(void) { TCCR1B|=(1<<7); OCR1A=2000;
说起红外遥控,大家最熟悉的不过是 NEC 的红外协议了,现在重温一下这个协议。在红外遥控发射端, NEC 协议逻辑“1”是 560us 的 38K 载波(占空比 1/4 到 1/3,这个占空比值是基于发射端的电源节能考虑 的,好比一个周期不变的电源开关,闭合的时间越短就越省电,但刚好能满足接收端的识别要求)和 1690us 的低电平组成;逻辑“0”则是由 560us 的 38K 载波和 560us 低电平组成。所以两者的周期各为:2.25ms 和 1.12ms,具体如图 1 所示。
红外线遥控解码接收程序-C语言
![红外线遥控解码接收程序-C语言](https://img.taocdn.com/s3/m/b870d39d6037ee06eff9aef8941ea76e58fa4a8b.png)
红外线遥控解码接收程序-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上运用红外线解码程序.主要的问题在于延迟上。
基于51单片机红外发射与接收C程序(word文档良心出品)
![基于51单片机红外发射与接收C程序(word文档良心出品)](https://img.taocdn.com/s3/m/29672eb25fbfc77da269b1fa.png)
}
//khz(116);//3.028ms精确的时间
//khz(64);//2.006ms
//khz(40); //1.052ms
//delayms(125);//2.012ms这里是一些时间的介绍
//delayms(65);//1.054ms
//delayms(93);//1.5ms
void fashu(uchar num)
}
}
void main()
{
init();
//delayms(45);//0.642ms
//delayms(35);//0.502ms
//delayms(115);//1.623ms
//delayms(72);//1.02ms
//delayms(84);//1.188ms
//delayms(31);//0.446ms
sbit key1=P3^3;
sbit key2=P3^4;
sbit key3=P3^5;
sbit LED=P1^0; //发射指示灯
sbit out=P3^7;
uchar i,a,num1;
void init()//初始化作用
{
key1=1;
key2=1;
key3=1;
}
void delay(uchar aa)
tishi();
}
}
}
void main()
{
init();
while(1)
{
keyscan();
}
}
红外接收程序
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
红外遥控器接收_LCD_DS18B20结合程序
![红外遥控器接收_LCD_DS18B20结合程序](https://img.taocdn.com/s3/m/ffbc761852d380eb62946de5.png)
#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};sbit IRIN = P3^2; //红外接收器数据线sbit BEEP = P1^0; //蜂鸣器控制线sbit DQ=P2^4;sbit LCD_RS = P2^5;sbit LCD_RW = P2^6;sbit LCD_EN = P2^7;uchar IRCOM[7];uint temp;uchar temp1;uchar num[4];uchar aa;uint a,bb=0;uchar code cdis1[ ] = {"Present:"};uchar code cdis2[ ] = {"High: Low:"};void delay(uchar x); //x*0.14MSvoid delay1(int ms);void beep(void);void delay2(uint x)//延时函数{uchar i;while (x--)for(i=0;i<120;i++);}void delay3 (uint a)//小延时函数{while (a--);}/*******************************************************************//* *//*检查LCD忙状态*//*lcd_busy为1时,忙,等待。
lcd-busy为0时,闲,可写指令与数据。
*//* *//*******************************************************************/bit lcd_busy(){bit result;LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;delayNOP();result = (bit)(P0&0x80);LCD_EN = 0;return(result);}/*******************************************************************//* *//*写指令数据到LCD *//*RS=L,RW=L,E=高脉冲,D0-D7=指令码。
stm32f070红外线接收程序
![stm32f070红外线接收程序](https://img.taocdn.com/s3/m/a1c921d9ba4cf7ec4afe04a1b0717fd5370cb249.png)
stm32f070红外线接收程序stm32f070红外线接收程序:/* * Ir input pin * mode:floating input * pin: PA1 * GPIO_AF: TIM2_CH2 */ void Ir_Pin_Init() { GPIO_InitTypeDefGPIO_InitStructure;GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_2); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_SetBits(GPIOA,GPIO_Pin_1); //output 1 } //PA1TIM2_CH2 //使用GPIO输入捕获实现红外接收void Remote_Init() { NVIC_InitTypeDef NVIC_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM_ICInitStructure; /*使能TIM1时钟,默认时钟源为PCLK1(PCLK1未分频时不倍频,否则由PCLK1倍频输出),可选其它时钟源*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); Ir_Pin_Init();TIM_ClearITPendingBit(TIM2,TIM_IT_Update|TIM_IT_CC2); //清除中断和捕获标志位TIM_TimeBaseStructure.TIM_Period =1000; //设定计数器自动重装值最大10ms溢出TIM_TimeBaseStructure.TIM_Prescaler = 480-1; //预分频器,0.1M的计数频率,10us加1.TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up; //TIM向上计数模式TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx TIM_ICInitStructure.TIM_Channel =TIM_Channel_2; // 选择输入端IC2映射到TI2上TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获TIM_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频TIM_ICInitStructure.TIM_ICFilter = 0x03;//IC4F=0011 配置输入滤波器8个定时器时钟周期滤波TIM_ICInit(TIM2,&TIM_ICInitStructure);//初始化定时器输入捕获通道NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //TIM2中断NVIC_InitStructure.NVIC_IRQChannelPriority = 2; //优先级0级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器TIM_ITConfig(TIM2,TIM_IT_Update|TIM_IT_CC2,ENABLE);//允许更新中断,允许CC2IE捕获中断TIM_Cmd(TIM2,ENABLE); //使能定时器2 }。
单片机红外接收程序
![单片机红外接收程序](https://img.taocdn.com/s3/m/f2ffb2234b35eefdc8d33331.png)
/*************************************************************红外接收程序,数码管,蜂鸣器,led动作************************************************************/#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit dula=P2^6; //数码管段选锁存sbit wela=P2^7; //数码管位选锁存sbit re=P2^4; //红外接收管输入引脚,可随意定义IO口sbit fmq=P2^3; //蜂鸣器uchar code tabledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};uchar code tablewe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};uchar data3,data4,str[32]; //定义全局变量,data3是接收的第三个数据也就是用户码,data4是data3的反码,str[32]存放着32位的数据void delay(uint z){uchar x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void delay600us(void) //延时600us{uchar a,b;for(b=61;b>0;b--)for(a=3;a>0;a--);}void delay1500us(void) //延时1500us{uchar a,b;for(b=197;b>0;b--)for(a=2;a>0;a--);}void delay3500us(void) //延时3500us{uchar a,b;for(b=18;b>0;b--)for(a=88;a>0;a--);}void delay8000us(void) //延时8000us{uchar a,b,c;for(c=1;c>0;c--)for(b=254;b>0;b--)for(a=13;a>0;a--);}start(void) //处理引导码{bit sflag=0; //引导码接收成功标志1S:while(re); //高电平等待while(~re) //引导码出现了进入循环{delay8000us();if(re==0)delay1500us(); else goto S; //不是引导码,重新等待if(re==1)delay3500us(); else goto S; //不是引导码,重新等待if(re==1){sflag=1; return sflag;break; //引导码接收成功,退出循环}else goto S; //不是引导码,重新等待}while(re); //跳过剩余的高电平while(~re); //跳过低电平delay600us(); //延时600us,准备判断高低电平,以确定是数据0还是1,因为0和1仅仅是高电平的时间不一样}receive_bit(void) //接收一位{if(re==1){while(re);while(~re);delay600us();return 1; //是数据1}else{while(~re);delay600us();return 0; //是数据0}}receive_string(void) //接收4个字节{uchar i;for(i=0;i<32;i++){str[i]=receive_bit();}return str[32];}conversion_data3(void) //提取出第三个字节{uchar i,n=7;data3=0;for(i=16;i<24;i++){data3=str[i]<<n|data3;n--;}return data3;}conversion_data4(void) //提取出第四个字节{uchar i,n=7;data4=0;for(i=24;i<32;i++){data4=str[i]<<n|data4;n--;}return data4;}judge(void) //判断第四字节是否是第三字节的反码{bit jflag;uchar a,b;a=conversion_data3();b=conversion_data4();if(a==~b)jflag=1; //是反码标志1else jflag=0;return jflag;}void smg_init(void) //数码管初始化{dula=1;P0=0x71;dula=0;wela=1;P0=tablewe[0];wela=0;}void smg_display(void) //判断第三个数码值,显示相应的按键值{switch(conversion_data3()){case 0xb4:P0=tabledu[0];break;//0case 0x98:P0=tabledu[1];break;//1case 0x8c:P0=tabledu[2];break;//2case 0xbd:P0=tabledu[3];break;//3case 0x88:P0=tabledu[4];break;//4case 0x9c:P0=tabledu[5];break;//5case 0xad:P0=tabledu[6];break;//6case 0xa1:P0=tabledu[7];break;//7case 0xa5:P0=tabledu[8];break;//8case 0xa9:P0=tabledu[9];break;//9default:break;}}void main(){smg_init();while(1){if(start()){receive_string();if(judge()==1){fmq=0;P1=conversion_data4();dula=1;smg_display();dula=0;fmq=1;}}delay(6000);delay(6000);delay(6000);}}。
红外接收程序,1602上显示用户码和数据码
![红外接收程序,1602上显示用户码和数据码](https://img.taocdn.com/s3/m/2394a21c52d380eb63946d08.png)
*输入:行,列,需要输入1602的数据
*输出:无
***********************************************************************/
void L1602_char(uchar hang,uchar lie,char sign)
while(!hwx);//低电平开始,不处理只等待高电平接收
ly_ct=0;
while(hwx){//高电平开始,
delay100us();
if(ly_ct>25)
return;
return;
}
if(ly_ct<35)//NEC引导码引导码的后4。5MS,ly_ct约45
return;
/***********开始接收四个字节内容**************************************/
for(i=0;i<4;i++){
for(ia=0;ia<8;ia++){
case 0x82:num=6;break;
case 0xf8:num=7;break;
case 0x80:num=8;break;
case 0x90:num=9;break;
case 0x88:num=10;break;
case 0x83:num=11;break;
case 0xc6:num=12;break;
else IRCOM[5]=IRCOM[5]+0x30;
if(IRCOM[6]>9) { IRCOM[6]=IRCOM[6]+0x37;}
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include "remote.h"
UINT IrCode; //高8位为系统码,低八位为数据码
/*************************************************************************** *FUNCTION NAME: DelayIr
*CREATE DATE: 2012/6/7
*CREATED BY: XS
*FUNCTION: IR采样延时:0.14ms
*MODIFY DATE: 2012/6/7
*INPUT: 无
*
*RETURN: 无
***************************************************************************/ void DelayIr(UCHAR timer)
{
UCHAR i;
while(timer--)
{
for (i = 0; i<13; i++);
}
}
/*************************************************************************** *FUNCTION NAME: RemoteDecode
*CREATE DATE: 2012/6/7
*CREATED BY: XS
*FUNCTION: IR遥控解码
*MODIFY DATE: 2012/6/7
*INPUT: 无
*
*RETURN: 无
***************************************************************************/ void RemoteDecode(void)
{
UCHAR i,j,n = 0;
UCHAR irDat[4] = {0};
EX0 = 0;
DelayIr(1);
if (IRIN==1)
{
EX0 = 1;
return;
}
DelayIr(29);
if (IRIN==1)
{
EX0 = 1;
return;
}
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{
DelayIr(2);
}
for (i=0;i<4;i++) //收集四组数据
{
for (j=0;j<8;j++) //每组数据有8位
{
while (IRIN) //等IR 变为低电平,跳过4.5ms的前导高电平信号。
{
DelayIr(2);
}
while (!IRIN) //等IR 变为高电平
{
DelayIr(2);
}
while (IRIN) //计算IR高电平时长
{
DelayIr(2);
n++;
if (n>=30) //0.14ms计数过长自动离开。
{
EX0 = 1;
return;
}
} //高电平计数完毕
irDat[i] = irDat[i] >> 1; //数据最高位在前
if (n>=8)
irDat[i] = irDat[i] | 0x80; //数据最高位补“1”
n = 0;
}
}
// if (irDat[2] != ~irDat[3]) //数据码与其反码比较
// {
// EX0 = 1;
// return;
// }
IrCode = (irDat[2]<<8) + irDat[3];
EX0 = 1;
}
/*************************************************************************** *FUNCTION NAME: ExitInt0
*CREATE DATE: 2012/6/8
*CREATED BY: XS
*FUNCTION: 红外遥控解码:NEC码:系统码+系统反码+数据码+数据反码
*MODIFY DATE: 2012/6/8
*INPUT: 无
*RETURN: 无
***************************************************************************/ void ExitInt0(void) interrupt 0
{
RemoteDecode();
}。