51F单片机实现红外遥控器HT6221发射的红外编码解码程序

合集下载

51单片机红外解码资料+源代码

51单片机红外解码资料+源代码

位地 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H 址
源代码如下: #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7;
uchar irtime; //红外时间 uchar startflag; //启动接收 uchar irdata[33]; uchar bitnum; uchar irreceiveok; //红外接收完毕 uchar ircode[4]; uchar irprosok; uchar disp[8]; uchar code smg_du[]={
发射器发射的的信号为
接收器接收到的信号为
即 9ms 低电平后 4.5ms 高电平作为起始码,之后接受到两次 8 位客户码,一次八位数据码,和一次八位数据反码。
遥控器在按键按下之后周期性的发出同一种 32 位二进制编 码周期约为 108ms,一组码持续时间随本身的“0”“1”个数不同
而不同。大约在 45~63ms 之间,当一个键按下 36ms,振荡器使芯 片激活,将发射一组 108ms 的编码脉冲这 108ms 编码脉冲由一个 起始码(9ms),一个结束码(4.5ms),低八位地址码(9~18ms), 高八位地址码(9~18ms),八位数据码(9~18ms),和这八位数据 码反码(9~18ms),如果按下超过 108ms 仍未松开,接下来发射 的代码(连发代码)将仅有起始码(9ms)和结束码(2.5ms)组 成。
解码的关键是如何识别零和一: “0”和“1”都是以 0.56ms 低电平开始的,不同的是高电平 宽度不同,“0”为 0.56ms“1”为 1.168ms,所以必须根据高电平 宽度来区别“0”和“1”。 如果从 0.56ms 低电平过后,开始延时,0.56ms 后,若读到的 电平为低,说明该位为零,反之则为一,可靠其间,延时必须比 0.56ms'长一些,又不能超过 1.12ms,否则如果该位为零,读到的 已是下一位高电平,因此取(1.12+0.56)/2=0.84ms 最为可靠,一 般取 0.84ms 左右均可。根据码的格式,应该等待 9ms 起始码和 4.5ms 结束码完成后才能读码。 备注:定时器/计数器控制寄存器 TCON 位序 D7 D6 D5 D4 D3 D2 D1 D0 号 位符 TF1 TR1 TF0 IR0 IE1 IT1 IE0 IT0 号

51单片机的红外遥控解码参考程序

51单片机的红外遥控解码参考程序
uchar addr[4]={0};
EX0=0;
for(i=0;i<255;i++) //9ms内有高电平认为是干扰
{
if(P3&0x04) //255的值实际时间为800us
{
EX0=1;
return;
}
}
while(!(P3&0x04)); //等待9ms低电平过去
if(k>=8)
addr[i]=addr[i]|0x80; //高电平大于0.56ms,则为1
k=0;
}
}
P2=~(addr[2]); //P2的LED显示二进制键值
EX0=1;
}
while(1);
}
void io_init(void)
{
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
}
void int_init(void)
{
EX0=1;
EA=1;
}
void interrupt0()interrupt 0
{
uchar i=0,j=0,k=0,us=0;
#define uint unsigned int
#define uchar unsigned char
uchar led=0x00;
void io_init(void);
void int_init(void);
void main(void)
{
io_init();
int_init();
for(i=0;i<4;i++)

51单片机红外遥控程序

51单片机红外遥控程序
uchar show[2]={0,0};
unsigned long m,Tc;
unsigned char IrOK;
void delay(uchar i)
{
uchar j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void display()
{
dula=0;
P0=table[show[0]];
MOV R7,#202
DELAY882_A
NOP
NOP
DJNZ R7,DELAY882_A
RET
;=============================1000
DELAY1000 ;1.085x ((229x4)+5)=999.285
MOV R7,#229
DELAY1000_A
NOP
NOP
DJNZ R7,DELAY1000_A
Qq:735491739
红外遥控发射芯片采用PPM编码方式,当发射器按键按下后,将发射一组108ms的编码脉冲。遥控编码脉冲由前导码、8位用户码、8位用户码的反码、8位操作码以及8位操作码的反码组成。通过对用户码的检验,每个遥控器只能控制一个设备动作,这样可以有效地防止多个设备之间的干扰。编码后面还要有编码的反码,用来检验编码接收的正确性,防止误操作,增强系统的可靠性。前导码是一个遥控码的起始部分,由一个9ms的低电平(起始码)和一个4. 5ms的高电平(结果码)组成,作为接受数据的准备脉冲。以脉宽为0. 56ms、周期为1. 12ms的组合表示二进制的“0”;以脉宽为1. 68ms、周期为2. 24ms的组合表示二进制的“1”。如果按键按下超过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2. 5ms)组成。

红外遥控编码原理及C程序,51单片机红外遥控

红外遥控编码原理及C程序,51单片机红外遥控
break;
case 0x19:j=1;//100+
break;
case 0x0d:k=1;//200+
break;
case 0x16:l=1;//0
break;
case 0x0c:m=1;//1
{
temp=temp>>1; //最先读出的是高位数据
dingshiqi();//定时器记高低电平时间,数据码
if((HighTime>300)&&(HighTime<900)) //说明该位是0
temp=temp&0x7f;
if((HighTime>1200)&&(HighTime<2200)) //说明该位是1
uchar code table1[]={"User Code:"};
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--)//i=xms即延时约xms毫秒
for(j=100;j>0;j--);
}
void write_com(uchar com)
{//写液晶命令函数
{
a=0;b=0;c=0;d=0;
e=0;f=0;g=0;h=0;
i=0;j=0;k=0;l=0;
m=0;n=0;o=0;p=0;
q=0;r=0;s=0;t=0;
u=0;
}
void init_1602()
{//初始化函数
uchar num;
lcden=0;
rs=0;
write_com(0x38);//1602液晶初始化
while(1)

51单片机设计的红外线遥控器电路图及工作原理

51单片机设计的红外线遥控器电路图及工作原理

51单片机设计的红外线遥控器电路图及工作原理你家里是否有一个电视机遥控器或者空调机遥控器呢?你是否也想让它遥控其他的电器甚至让它遥控您的电脑呢?那好,跟我一起做这个“红外遥控解码器”。

该小制作所需要的元件很少:单片机TA89C2051一只,RS232接口电平与TTL电平转换心片MAX232CPE 一只,红外接收管一只,晶振11.0592MHz,电解电容10uF4只,10uF 一只,电阻1K1个,300欧姆左右1个,瓷片电容30P2个。

发光二极管8个。

价钱不足20元。

电路图及原理:主控制单元是单片机AT89C2051,中断口INT0跟红外接受管U1相连,接收红外信号的脉冲,8个发光二极管作为显示解码输出(也可以用来扩展接其他控制电路),U3是跟电脑串行口RS232相连时的电平转换心片,9、10脚分别与单片机的1、2脚相连,(1脚为串行接收,2脚为串行发送),MAX232CPE的7、8脚分别接电脑串行口的2(接收)脚、3(发送脚)。

晶振采用11.0592MHz,这样才能使得通讯的波特率达到9600b/s,电脑一般默认值是9600b/s、8位数据位、1位停止位、无校验位。

电路就这么简单了,现在分析具体的编程过程吧。

如图所示,panasonic遥控器的波形是这样的(经过反复测试的结果)。

开始位是以3.6ms低电平然后是3.6ms高电平,然后数据表示形式是0.9ms低电平0.9ms 高电平周期为1.8ms表示“0”,0.9ms低电平2.4ms高电平周期为3.3ms表示“1”,编写程序时,以大于3.4ms小于3.8ms高电平为起始位,以大于2.2ms小于2.7ms高电平表示“1”,大于0.84ms小于1.11ms高电平表示“0”。

因此,我们主要用单片机测量高电平的长短来确定是“1”还是“0”即可。

定时器0的工作方式设置为方式1:mov tmod,#09h,这样设置定时器0即是把GATE置1,16位计数器,最大计数值为2的16次方个机器周期,此方式由外中断INT0控制,即INT0为高时才允许计数器计数。

51单片机红外遥控解码程序

51单片机红外遥控解码程序

51单片机红外遥控解码程序类别:单片机/DSP 阅读:2975编者按:以下是网友编写的遥控解码程序!一种用延时等待的解码方法,比较容易理解,但缺点是占用CPU运行时间,第二种方法用定时器和外中断的解码方法,初学不易理解,但优点也很明显,第二种方法如果能解决连发解码就比较完美,更完善的红外遥控解码程序,请参考本站TOPA V-2008,TOP51-2005所配程序。

解码方法一;//单片机接收红外解读程序\\;硬件结构:8951,P0口数码管段码,P2.0-P2.3为位,P1为8个LED;P3.2为红外接收头,P2.7蜂鸣器,晶振12M;适用UPD6121 6122芯片接收;---------------------------------------------------------ORG 0000HAJMP MAIN ;转入主程序ORG 0003H ;外部中断P3.2脚INT0入口地址AJMP INT ;转入外部中断服务子程序(解码程序);以下为主程序进行CPU中断方式设置MAIN: SETB EA ;打开CPU总中断请求SETB IT0 ;设定INT0的触发方式为脉冲下降沿触发SETB EX0 ;打开INT0中断请求AJMP $;以下为进入P3.2脚外部中断子程序,也就是解码程序INT: CLR EA ;暂时关闭CPU的所有中断请求MOV R6,#10SB: ACALL YS1 ;调用882微秒延时子程序JB P3.2,EXIT ;延时882微秒后判断P3.2脚是否出现高; 电平如果有就退出解码程序DJNZ R6, SB ;重复10次,目的是检测在8820微秒内;如果出现高电平就退出解码程序;以上完成对遥控信号的9000微秒的初始低电平信号的识别。

JNB P3.2, $ ;等待高电平避开9毫秒低电平引导脉冲ACALL YS2 ;延时4.74毫秒避开4.5毫秒的结果码MOV R1,#1AH ;设定1AH为起始RAM区MOV R2,#4;PP: MOV R3,#8JJJJ: JNB P3.2,$ ;等待地址码第一位的高电平信号LCALL YS1 ;高电平开始后用882微秒的时间尺去判断信;号此时的高低电平状态MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中JNC UUU ;如果为0就跳转到UUULCALL YS3;UUU: MOV A,@R1 ;将R1中地址的给ARRC A ;将C中的值0或1移入A中的最低位MOV @R1,A ;将A中的数暂时存放在R1中DJNZ R3,JJJJ ;接收地址码的高8位INC R1 ;对R1中的值加1,换下一个RAMDJNZ R2,PP ;接收完16位地址码和8位数据码和8位数据反; 码,存放在1AH/1BH/1CH/1DH的RAM中MOV A,1CH ;比较数据码和数据反码是否正确?CPL AXRL A,1DH ;将1CH的值取反后和1DH比较不同则无效丢弃,核对数据是否准确JNZ EXITMOV DPTR,#TAB ;表头地址送指针MOV A,1DHANL A,#0FH ;相与,得到低四位码MOVC A,@A+DPTRMOV 1EH,A ;查表得表码存入1EHMOV A,1DHSWAP AANL A,#0FHMOVC A,@A+DPTRMOV 1FH,A ;查表得高四位码存入1FMOV R7,#20HDISP:MOV P0,1FH ;送数码管显示CLR P2.1ACALL YS2SETB P2.1MOV P0,1EHCLR P2.2ACALL YS2SETB P2.2MOV P1,1DH ;将按键的键值通过P1口的8个LED显示出来!CLR P2.7 ;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功LCALL YS2SETB P2.7 ;蜂鸣器停止DJNZ R7,DISPEXIT: SETB EA ;允许中断RETI ;退出解码子程序YS1: MOV R4,#20 ;延时子程序1,精确延时882微秒D1: MOV R5,#20DJNZ R5,$DJNZ R4,D1RETYS2: MOV R4,#10 ;延时子程序2,精确延时4740微秒D2: MOV R5,#235DJNZ R5,$DJNZ R4,D2RETYS3: MOV R4,#2 ;延时程序3,精确延时1000微秒D3:MOV R5,#248DJNZ R5,$DJNZ R4,D3RETTAB: DB 0C0H,0DEH,0A2H,8AH,9CH,89H,81H,0DAH,80H,88H,90H,85H,0E1H,86H,0A1H,0B1H;数据表,0-9-A-FEND解码方法二你的解码程序和我现在用的解码程序大体是一样的,我自己实际做了一下,发现按下遥控器,接收到红外信号后,数码管闪的厉害。

51单片机红外解码、超声波测距程序(详细解释程序)

51单片机红外解码、超声波测距程序(详细解释程序)

// c51红外解码、超声波测距程序#include <reg52.h>#define uchar unsigned char#define uint unsigned int#define count 4uchar data IRcode[4]; //定义一个4字节的数组用来存储代码uchar table[4];uchar enled[4]={0x1f,0x2f,0x4f,0x8f};uchar CodeTemp,temp,tt; //编码字节缓存变量uchari,j,k,temp,timeH,timeL,succeed_flag,flag,h,h1,h2,a,key,key1,key2; //延时用的循环变量uint distance,distance1,time; //距离,timesbit IRsignal=P3^2; //HS0038接收头OUT端直接连P3.2(INT0)sbit come=P3^3;sbit d=P1^1;//发送码sbit BZ=P1^0;sbit s=P3^7;//38ksbit ss=P3^6;//38kuchar m;// 开关控制//sbit n=P2;//电机反转code unsigned charseg7code[10]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28}; //显示段码/**************************** 定时器0中断************************/void timer0() interrupt 1{TH0=(65536-count)/256;TL0=(65536-count)%256;s=~s;//产生38K信号ss=~ss;//tt++;//发送超声波个数}/**************************** 延时0.9ms子程序************************/void Delay0_9ms(void){uchar j,k;for(j=18;j>0;j--)for(k=20;k>0;k--);}/***************************延时1ms子程序**********************/void Delay1ms(void){uchar i,j;for(i=2;i>0;i--)for(j=230;j>0;j--);}/***************************延时4.5ms子程序**********************/ void Delay4_5ms(void){uchar i,j;for(i=10;i>0;i--)for(j=225;j>0;j--);}/**************************** 解码延时子程序************************/ void Delay(void){uchar i,j,k;for(i=100;i>0;i--)for(j=100;j>0;j--)for(k=3;k>0;k--);}/**************************** 显示延时子程序************************/ void ledDelay(unsigned int tc) //延时程序{unsigned int i,j;for(i=0;i<10;i++)for(j=0;j<tc;j++);}/************************************************ ****************///定时器1中断,用做超声波测距无回波void timer1() interrupt 3{TR1=0;ET1=0;EX1=0;TH1=0;TL1=0;}/***********************显示程序*********************/ void Led(int date) //显示函数{ int i;table[0]=date/1000;table[1]=date/100%10;table[2]=date/10%10;table[3]=date%10;date=0;for(i=0;i<120;i++){P2=enled[i%4]&m;//P2口高四位控制数码管,低位陪分控制继电器P0=seg7code[table[i%4]]; //取出千位数,查表,输出。

51单片机实现红外线编码检测

51单片机实现红外线编码检测

51单片机实现红外编码检测通过51 单片机及外围电路实现对接受信号的处理(通过外部中断和计数器)获得信号的01编码,设备显示。

红外传感基础知识:❖红外发光管:红外发光二极管通常使用砷化镓(GaAs)、砷铝化镓(GaAlAs)等材料,采用全透明或浅蓝色、黑色的树脂封装。

产生的光波波长为940nm左右,为红外光❖红外接收头:左图为一常用的红外接收模块。

其内部含有高频的滤波电路,专门用来滤除红外线合成信号的载波信号(38KH),并送出接收到的信号。

当红外线合成信号进入红外接收模块,在其输出端便可以得到原先发射器发出的数字编码,只要经过单片机解码程序进行解码,便可以得知按下了哪一个按键,而做出相应的控制处理,完成红外遥控的动作。

❖红外发送协议:引导码+客户码1+客户码2+操作码+操作反码***用户真正须要的只有操作码***❖调制:“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率(因红外接收头能接收的红外线为38KHz 左右),还可达到降低电源功耗的目的。

主要内容:通过51 单片机及外围电路实现对接受信号的处理(通过外部中断和计数器)获得信号的01编码,用设备显示,(lcd或数码管);这里管脚的对应P3.2接受红外对管信息,lcd接线:主程序:#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<lcd.h>sbit IR=P3^2; //红外接口标志/*------------------------------------------------全局变量声明------------------------------------------------*/unsigned char irtime;//红外用全局变量bit irpro_ok,irok;unsigned char IRcord[4];unsigned char irdata[33];/*------------------------------------------------函数声明------------------------------------------------*/void Ircordpro(void);/*------------------------------------------------定时器0中断处理------------------------------------------------*/void tim0_isr (void) interrupt 1 using 1{irtime++; //用于计数2个下降沿之间的时间}/*------------------------------------------------外部中断0中断处理------------------------------------------------*/void EX0_ISR (void) interrupt 0 //外部中断0服务函数{static unsigned char i; //接收红外信号处理static bit startflag; //是否开始处理标志位if(startflag){if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5msi=0;irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1irtime=0;i++;if(i==33){irok=1;i=0;}}else{irtime=0;startflag=1;}}/*------------------------------------------------定时器0初始化------------------------------------------------*/void TIM0init(void)//定时器0初始化{TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值TH0=0x00; //重载值TL0=0x00; //初始化值ET0=1; //开中断TR0=1;}/*------------------------------------------------外部中断0初始化------------------------------------------------*/void EX0init(void){IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)EX0 = 1; //使能外部中断EA = 1; //开总中断}/*------------------------------------------------红外码值处理------------------------------------------------*/void Ircordpro(void)//红外码值处理函数{unsigned char i, j, k;unsigned char cord,value;k=1;for(i=0;i<4;i++) //处理4个字节{for(j=1;j<=8;j++) //处理1个字节8位{cord=irdata[k];if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差value|=0x80;if(j<8){value>>=1;}k++;}IRcord[i]=value;value=0;}irpro_ok=1;//处理完毕标志位置1}/*------------------------------------------------主函数------------------------------------------------*/void main(void){unsigned char temp[3];unsigned int i;EX0init(); //初始化外部中断TIM0init();//初始化定时器lcd_init(); // 初始化LCDdelay(10);lcd_pos(0); // 设置显示位置为第一行的第0个字符while(1)//主循环{if(irok) //如果接收好了进行红外处理{Ircordpro();irok=0;}if(irpro_ok) //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等{/*------------------------------------------------将ascii的数字显示:即将字符对应的十进制数的每一位付给temp并转换成字符------------------------------------------------*/temp[0]=IRcord[2]%10+48;//个位temp[1]=IRcord[2]%100/10+48;//十位temp[2]=IRcord[2]/100+48;//百位lcd_wcmd(0x01); //清除LCD的显示内容delay(1);lcd_pos(0);lcd_wdat('*');lcd_wdat(temp[2]);lcd_wdat(temp[1]);lcd_wdat(temp[0]);lcd_wdat('*');for(i=0;i<10;i++)delay(100);}}}/*-------------------------------------------------#include<lcd.h>文件(lcd用到的一些函数)----------------------------------------------------*/#include<reg52.h>#include <intrins.h>/*------------------------------------------------定义数据类型------------------------------------------------*/ typedef unsigned char BYTE;typedef bit BOOL ;/*------------------------------------------------定义控制位------------------------------------------------*/ sbit rs = P2^6; //sbit rw = P2^5;sbit ep = P2^7;/*------------------------------------------------声明函数------------------------------------------------*/delay(BYTE ms){ // 延时子程序BYTE i;while(ms--){for(i = 0; i< 250; i++){_nop_();_nop_();_nop_();_nop_();}}}BOOL lcd_bz(){ // 测试LCD忙碌状态BOOL result;rs = 0;rw = 1;ep = 1;_nop_();_nop_();_nop_();_nop_();result = (BOOL)(P0 & 0x80);ep = 0;return result;}lcd_wcmd(BYTE cmd){ // 写入指令数据到LCD while(lcd_bz());rs = 0;rw = 0;ep = 0;_nop_();_nop_();P0 = cmd;_nop_();_nop_();_nop_();_nop_();ep = 1;_nop_();_nop_();_nop_();_nop_();ep = 0;}lcd_pos(BYTE pos){ //设定显示位置lcd_wcmd(pos | 0x80);}lcd_wdat(BYTE dat){ //写入字符显示数据到LCD while(lcd_bz());rs = 1;rw = 0;ep = 0;P0 = dat;_nop_();_nop_();_nop_();_nop_();ep = 1;_nop_();_nop_();_nop_();_nop_();ep = 0;}lcd_init(){ //LCD初始化设定lcd_wcmd(0x38); //delay(1);lcd_wcmd(0x0c); //delay(1);lcd_wcmd(0x06); //delay(1);lcd_wcmd(0x01); //清除LCD的显示内容delay(1);}。

单片机红外遥控编码与解码

单片机红外遥控编码与解码

用电器、视听产品的普及,红外线遥控器已被广泛使用在各种类型的家电产品上(如遥控开关、智能开关等)。

其具有体积小、抗干扰能力强、功耗低、功能强、成本低等特点,在工业设备中也得到广泛应用。

一般而言,一个通用的红外遥控系统由发射和接收两大部分组成,如图1 所示:其中发射部分主要包括键盘矩阵、编码调制、红外发射管;接收部分包括光、电信号的转换以及放大、解调、解码电路。

举例来说,通常我们家电遥控器信号的发射,就是将相应按键所对应的控制指令和系统码( 由0 和1 组成的序列),调制在32~56kHz 范围内的载波上,然后经放大、驱动红外发射管将信号发射出去。

此外,现在流行的控制方法是应用编/ 解码专用集成电路芯片来实现。

不同公司的遥控芯片,采用的遥控码格式也不一样。

在此介绍目前广泛使用较普遍的两种,一种是NEC Protocol 的PWM( 脉冲宽度调制) 标准,一种是Philips RC-5 Protocol 的PPM( 脉冲位置调制) 标准。

NEC 标准(代表芯片WD6122):遥控载波的频率为38kHz( 占空比为1:3) ;当某个按键按下时,系统首先发射一个完整的全码,然后经延时再发射一系列简码,直到按键松开即停止发射。

简码重复为延时108ms,即两个引导脉冲上升沿之间的间隔都是108ms。

如图2所示即为完整的NTC编码。

对于NTC编码,由引导码、用户编码低位,用户编码高位、键数据编码、键数据编码五部分组成,引导码由一个9ms的载波波形和4.5ms的关断时间构成,它作为随后发射的码的引导,这样当接收系统是由微处理器构成的时候,能更有效地处理码的接收与检测及其它各项控制之间的时序关系。

编码采用脉冲位置调制方式(PPM)。

利用脉冲之间的时间间隔来区分“0”和“1”。

每次8位的码被传送之后,它们的反码也被传送,减少了系统的误码率。

数据0 可用“高电平0.56ms +低电平0.56ms”表示,数据1 可用“高电平0.56ms +低电平1.68ms”表示。

单片机实现红外接收解码

单片机实现红外接收解码

单片机实现红外接收解码摘要:接收到红外遥控器的脉冲波形,并通过解析其波形得到红外遥控器的相应解码,实习对相应设备的控制。

本文详细接受红外遥控技术原理并如何通过C51单片机实现红外遥控。

关键字:单片机,红外遥控,解码1.引言遥控器相信大家不会陌生,日常生活中会使用到各种各样的遥控器,比如电视机、DVD 机、空调、机顶盒甚至音响、热水器等都用到遥控器,其实红外技术已经走进与人们的生活并且与人们的生活息息相关了。

红外遥控器作为设备的输入控制具有操作简便、价格便宜等诸多好处。

您可以根据您公司产品需要和遥控器提供商协商定制遥控器,包括遥控器键盘布局、每个按键的键码等。

遥控器键盘上每个按键的键码是一个小于256的一个数值,按键后通过遥控器红外管产生脉冲发送出去,红外接收器接收到脉冲后,对脉冲流进行分析,提取键码值,并按照键码值实现其遥控目的。

2.红外接收原理红外遥控信号接收:红外接收电路可以使用集成接收器,接收器包括红外接收管及信号处理IC,接收器对外只有三个引脚,一个接电源的Vcc脚、一个接地的GND脚、一个脉冲信号输出脚,当然脉冲信号输出脚直接接单片机的某个可以使用的IO脚就可以了。

3.脉冲波形分析:每次按键,红外接收器这边会收到一串脉冲宽度不等的脉冲波形流,其脉冲流由35个脉冲波形构成:前导码:第1个脉冲波形用户码1:第2到第9个脉冲波形用户码2:第10到第17个脉冲波形键码:第18到第25个脉冲波形键码反码:第26到第33个脉冲波形连续按键脉冲:第34和第35个脉冲为结束脉冲(也即连续按键脉冲),在每次按键结束后会有两个结束脉冲,如果一直按键不放的话,会一直发送连续按键脉冲,并可以认为在收到10个连续按键脉冲后是下一个按键。

注意:不同的遥控器产生的用户码值可能不一样,笔者碰到两种不同的用户码:0x00,0xFF及0x04,0x7F。

脉冲流中有四种不同的脉冲波形宽度:其中前导码脉宽为:40(4ms) < 脉冲宽度< 50(5ms)连续按键脉宽为: 21(2.1ms) < 脉冲宽度 < 25(2.5ms)bit "0" 脉宽为: 3(0.3ms) < 脉冲宽度 < 7(0.7ms)bit "1" 脉宽为: 14(1.4ms) < 脉冲宽度 < 19(1.9ms)在收到一串脉冲流后,就要对其进行分析,先要检测第一个脉冲波形是不是前导码,如果不是,则继续检测前导码,如果是则检测如下32个脉冲波形:用户码1为1字节,由8个脉冲波形组成(其中一个脉冲波形表示字节中1 bit );用户码2为1字节; 键值为1字节;键值反码为1字节,键值反码为键值取反值。

红外遥控编码原理及C程序,51单片机红外遥控

红外遥控编码原理及C程序,51单片机红外遥控

红外遥控解解码程序#include <reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intsbit lcden=P1^0;sbit rs=P1^2;sbit ir=P3^2;sbit led=P1^3;sbit led2=P3^7;unsigned int LowTime,HighTime,x;unsigned char a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;unsigned char flag;//中断进入标志位uchar z[4];uchar code table[]={"husidonghahahah"};uchar code table1[]={"User Code:"};void delay(uint x){uint i,j;for(i=x;i>0;i--) //i=xms即延时约xms毫秒for(j=100;j>0;j--);}void write_com(uchar com){//写液晶命令函数rs=0;lcden=0;P2=com;delay(3);lcden=1;delay(3);lcden=0;}void write_date(uchar date){//写液晶数据函数rs=1;lcden=0;P2=date;delay(3);lcden=1;delay(3);lcden=0;}void init_anjian() //初始化按键{a=0;b=0;c=0;d=0;e=0;f=0;g=0;h=0;i=0;j=0;k=0;l=0;m=0;n=0;o=0;p=0;q=0;r=0;s=0;t=0;u=0;}void init_1602(){//初始化函数uchar num;lcden=0;rs=0;write_com(0x38);//1602液晶初始化write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);for(num=0;num<14;num++)//写入液晶固定部分显示{write_date(table[num]);delay(3);}write_com(0x80+0x40);for(num=0;num<9;num++){write_date(table1[num]);delay(3);}}void write_dianya(uchar add,char date){//1602液晶刷新时分秒函数4为时,7为分,10为秒char shi,ge;shi=date%100/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);}void dingshiqi() //定时器记高低电平时间{TH0=0; //定时器高八位置0TL0=0; //定时器低八位置0TR0=1; //开启定时器0while(ir==0); //如果是低电平就等待,给低电平计时TR0=0; //关闭定时器T0LowTime=TH0*256+TL0; //保存低电平时间TH0=0; //定时器高八位置0TL0=0; //定时器低八位置0TR0=1; //开启定时器0while(ir==1); //如果是高电平就等待,给引导码高电平计时TR0=0; //关闭定时器T0HighTime=TH0*256+TL0; //保存高电平长度}void main(){char i=0;TMOD=0x01; //定时器T0作为定时模式ET0=1; //开T0中断IT0=0; //外部中断,下降沿触发EX0=1; //开外部中断EA=1; //开总中断init_1602();while(1){}}void inter0() interrupt 0 //开始解码{EX0=0; //关闭外部中断0,不再接受红外信号,只解码当前的红外信号。

菜鸟学习51单片机之红外解码

菜鸟学习51单片机之红外解码

上面的程序结合前面对遥控发射信息的介绍来读,理解起来应该
不是很困难,好好看看。
下面就是操作 LED 灯了。解码之后我们怎么来运用红外遥控呢,
这里我们可以用其中的操作码或操作反码来使用它。每个按键对应的
操作码都不同,这样我们就可以判断是否是那个按键发过来的操作
码。控制程序如下:(如果操作码是 0x01)
if((HW_DAT[2]==0x01)&&(HW_OK==1))
{ HW_OK = 0; led = 0;
//标志位清 0,按一下之执行一次所以清 0 //点灯
}
}
}
/*******************************************************************
菜鸟学习 51 单片机
while(1)世界
以脉宽为 1. 68ms、周期为 2. 24ms 的组合表示二进制的“1”。
这里我们做的是解码,所以我们看下面的两个图,就是一体化接收头 输出的码。‘1’和‘0’时的低电平时间相同,所以这里我们主要还 是判断高电平来解析现在到底是 1 还是 0。如果高电平时间是 1.685ms 则是‘1’如果高电平时间为 0.56ms 则是‘0’.
上面提到过,前导码可以滤掉不用管,那么我们解码就可以得到 后面的:8 位的用户码,8 位的用户码反码,8 位操作码,8 位的操作 码反码。
菜鸟学习 51 单片机
while(1)世界
上图就是我们用来接收红外遥控的万能接收头。将 OUT 脚接在外部 中断 0 的引脚上,也就是 P3.2 脚上就可以了。下面我们根据程序来 分析和学习。
解码的,一个是 LED 灯的控制引脚。我们这个实验就做,用用的是外部中断 0,下降沿触发中断。并且需要定时器 0

51单片机红外的遥控解码程序的编写

51单片机红外的遥控解码程序的编写

51单片机红外的遥控解码程序的编写下面把这次红外编程的解码的经历简要的写一下,以便以后回顾总结:红外遥控过程是这样的:红外遥控器的矩阵键盘按键,接着专用芯片编码调制然后红外发射;红外接受头经过光电放大,解调,最后解码编程。

我的遥控专用芯片是UPD6122G-001.解码晶振是455kHz,调制载波频率是455kHz/12=38kHz。

此外调制信号是PWM进行调制的,0是脉冲波形位0.5625ms的高电平跟0.5625ms的低电平组成,1则是0.5625ms的高电平跟1.6785ms的低电平组成。

跟其他通用的波形一样,有键按下时,先是9ms的高电平的起始码,接着是一个4.5ms结果码,接下来就是数据了。

用户码的高8位,用户码的低8位,8位数据码,8位数据反码,最后还有一个停止位。

如果按键一直没松,则接下来就只是发送起始码(9ms高电平),接着是一个2.2ms的低电平,再接着是一个停止位。

我的红外接在单片机p3.7引脚上面,从网上收集了一些程序,基本上如同一则,汇编编写,跟外部中断还有关系。

于是便萌生了自己写一下的想法。

我的思路是用定时器进行计数,然后编程。

刚开始编写程序是,由于忘了对定时器的标志位进行置为,结果定时中断根本就没有执行,手头上又没有用仿真芯片,搞得我下载调试了十来次才发现了这个问题。

还有一个问题刚开始遥控能够解码的时候,可是一直按某个键,你按一次,她就变化一次,搞得我很是郁闷,差点儿没晕过去。

怎么找都不知道问题的所在,心里不断地打算放弃,不过最后还是坚持了下来,原来电路的实际解码电平跟资料上是相反的。

遥控器的实际电平由高变低,而电路板上却是由低变高。

这点确好相反。

总结:一要自信,二要坚持,才有可能完成你想做的事件。

#include"reg51.h"#include"2-16.h"#include"address.h"//需要显示的信息uchar code hello[] = "Hello,PengSen!";//变量uchar data psCount; //定时器计数器uchar data i;uchar data j;uchar data temp;uchar data dp[4]; //用来保存红外遥控的码值uchar data dp2[12];//用来显示红外遥控的码值sbit HW = P3^7;void delay(unsigned int y);void main(){//初始化initlcd();dp[0] = 0x0;dp[1] = 0x0;dp[2] = 0x0;dp[3] = 0x0;TMOD = 0x11; // 定时器0, 1工作模式1, 16位定时方式TH1 = 0xfe; //定时500uSTL1 = 0x33;TCON = 0x01;IE = 0x80;TR1 = 1;printf(hello,13);while(1){//报文头ET1 = 0;psCount = 0;while(HW == 1); //初始状态下,红外输出脚一直是高电平,等待遥控按键ET1 = 1;while(HW == 0);if( psCount > 17)//0.5* 17 = 8.5ms约为9.0ms{ET1 = 0;psCount = 0;ET1 = 1;while(HW == 1);if(psCount > 5)//超过0.5*5 = 2.5毫米,检查一下遥控命令是不是连发,不是则执行下面的程序{ET1 = 0;psCount = 0;dp[0] = 0x0;dp[1] = 0x0;dp[2] = 0x0;dp[3] = 0x0;//数据for(i = 0 ; i < 4; i++){for(j = 0; j < 8; j++){while(HW == 0);ET1 = 0;psCount = 0;ET1 = 1;while(HW == 1);if(psCount > 2)//根据波形长度判定码值为0或1temp = 0;elsetemp = 1;dp[i] |= (temp<<="">}}}}//停止位while(HW == 1);//数据显示delay(20);dp2[0] = dp[0]/100 + 0x30;dp2[1] = dp[0]%100/10 + 0x30;dp2[2] = dp[0]%10 + 0x30;dp2[3] = dp[1]/100 + 0x30;dp2[4] = dp[1]%100/10 + 0x30;dp2[5] = dp[1]%10 + 0x30;dp2[6] = dp[2]/100 + 0x30;dp2[7] = dp[2]%100/10 + 0x30; dp2[8] = dp[2]%10 + 0x30; dp2[9] = dp[3]/100 + 0x30;dp2[10] = dp[3]%100/10 + 0x30; dp2[11] = dp[3]%10 + 0x30; printf(dp2,12);delay(20);}}//延时子程序void delay(unsigned int y){uchar x;for(;y!=0;y--)for(x=200;x!=0;x--); }//定时器1中断void timer1() interrupt 3 {psCount++;TH1 = 0xfe; //定时500uS TL1 = 0x33;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void key4_process(void)
{
delay(10000);
LED = 1;
}
//-------------------------------------------------------------------------------
{
uint t;
t = (uint)a;
t <= 8;
t = t | (uint)b;
return t;
}
//---------------------------------------------------------------------------
//-------------------------------------------------------------------------
//IR RX DECODE ROUTINE
//AUTHER : Xu Sen
//CREATE DATE : May 28. 2007
void key1_process(void)
{
LED = 0;
delay(10000);
}
//----------------------------------------------------------------------------
//DEFINE THE BIT "0 " AND BIT "1" FOR DECODE
#define ST_UP 0xBB8
#define ST_DW 0x792
#define RST_UP 0x792
#define RST_DW 0x540
//-----------------------------------------------------------------------------------
void int0_ini(void)
{
IT01CF = 0x09;
IE = 0x81;
CKCON = 0x02;
}
//---------------------------------------------------------------------------------
//INTERRUPT INITIAL
//INT0 IS CFG AT P0.1, HIGH LEVEL ENABLE, EDGE TRIGERRED
#include "c8051F310.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//----------------------------------------------------------------------------
void key3_process(void)
{
LED = 0;
delay(10000);
}
//-------------------------------------------------------------------------------
//------------------------------------------------------------------------------------
void port_ini(void)
{
XBR1 = 0x40;
P0MDOUT = 0x04;
flag = 1;
}
//------------------------------------------------------------------------------------
//PORT IO INITIAL
//CFG THE LED AND IR DATA IO AS PUSH-PULL MODE
0x100,0x200,0x400,0x800,0x1000,0x2000,
0x4000,0x8000 };
//--------------------------------------------------------------------------
void key2_process(void)
{
delay(10000);
LED = 1;
}
//-----------------------------------------------------------------------------
#define K4 0x3
sbit LED = P3^4;
//--------------------------------------------------------------------------
//GOBAL VARIABLES
//DEFINE THE USER COMPOSITE CODE AND KEY VALUE
#define USER_CODE 0xEB31
#define K1 0x0
#define K2 0x1
#define K3 0x2
#define BIT1_UP 0x540
#define BIT1_DW 0x300
#define BIT0_UP 0x300
#define BIT0_DW 0x8C
//---------------------------------------------------------------------------
//uchar data_temp;
//uchar indata_temp;
uchar INDATA; //inversion of key value
//uint timer0_temp;
uint code constant[16] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
//--------------------------------------------------------------------------
bit flag = 0;
bit note = 0;
bit STB; //start bit
//delay function
//---------------------------------------------------------------------------
void delay(uint j)
{
uint t;
//Modified : May 30பைடு நூலகம் 2007
//Version : V1.0
//THE RECEIVE CODE IS THE INVERSION OF THE TRANSMITTE CODE
//-------------------------------------------------------------------------
}
//------------------------------------------------------------------------------------
//DISABLE WDT
//-----------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
void timer0_ini(void)
{
TCON = 0x11;
TMOD = 0x41;
P3MDOUT = 0x10;
P0SKIP = 0x02; ;
}
//--------------------------------------------------------------------------------
//TIMER0 INITIALISE FOR PULSE WIDTH MEASURE
//16BIT MODE, EXTERNAL INT0 ENABLE FOR CONTROL THE TIMER0
uint ADR; //adress code
//uint adr_temp;
uchar i = 0; //indicate the bit position
uchar DATA; //key value
//CONFIG THE OSC TO 24.5MHZ
//-------------------------------------------------------------------------------
void osc_ini(void)
{
OSCICN = 0x83;
for(t=0;t<j;t++);
}
//------------------------------------------------------------------------------
uint temp(uchar a, uchar b)
相关文档
最新文档