红外解码C语言程序
红外解码程序
//51单片机11.0592兆晶振接收到低电平0.56ms 高电平1.69为1#include<reg51.h>#include <ctype.h>#include <stdio.h>#include "CaoZuo_5110.h"#include <stdio.h>#define uint32 unsigned long int#define uchar unsigned char#define uint unsigned intuchar bitnum,startflag , irdate[33];uchar m=0;uint ircode[4];//必须为int型因为%x发送的是整数char a[12]=0;uchar ok=0,reok=0;char lian1,lian2;void irchuli();void comsend(void ){ uchar i;TI=1; //不要放在for里面for(i=0;i<4;i++){// SBUF=ircode[i];// while(TI==0);// TI=0;printf("%x",ircode[i]);}TI=0; //不要放在for里面}void main(){EA = 1;//总中断允许开EX0=1;//外中断0允许中断IT0=1;TMOD=0x22; //定时器T0工作方式2 TH0=0x9c;TL0=0x9c;//自动重载TH1=0xfd;TL1=0xfd;ET0=1;TR0=1;// ET1=1;SCON=0X58;PCON=0;TR1=1;LCD_init(); //初始化液晶LCD_clear();LCD_write_english_string(0,0,"THE CODE IS :");while(1){if(ok==1){irchuli();sprintf(a,"%x%x%x%x",ircode[0],ircode[1],ircode[2],ircode[ 3]);LCD_write_english_string(0,3,a);comsend();ok=0;}}}void irchuli(){uchar k,i,j;uchar value=0;k=1;for(j=0;j<4;j++){for(i=0;i<8;i++){value=value>>1;if(irdate[k]>18){value|=0x80;}k++;}ircode[j]=value;}reok=1;}void Time0() interrupt 1 {m++;}void EX_0() interrupt 0 {if(startflag){if(m>90){bitnum=0;}irdate[bitnum] =m;m=0;bitnum++;if(bitnum==33){bitnum=0;ok=1;}}else { startflag=1;m=0; } }。
红外遥控编码原理及C程序,51单片机红外遥控
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单片机的NEC红外解码C语言程序
基于51单片机的NEC红外解码C语言程序#includetypedef unsigned intuint ;typedef unsigned char uchar ;#define Main_fosc 11059200ULsbitIR_test = P3^2;sbit du = P2^6;sbit we = P2^7;ucharDat[33],Number[4],counter,Receive_ok;/*-----------函数声明------------*/voidIR_init();void translate();void display(uchar *n);voidDelay_ms(uintnum);/*-------------------------------*/uchar table[]={0x3F, //"0"0x06, //"1"0x5B, //"2"0x4F, //"3"0x66, //"4"0x6D, //"5"0x7D, //"6"0x07, //"7"0x7F, //"8"0x6F, //"9"0x77, //"A"0x7C, //"B"0x39, //"C"0x5E, //"D"0x79, //"E"0x71, //"F"};void main(){IR_init();while(1){if(Receive_ok)translate();display(Number);}}voidIR_init(){TMOD = 0X02;TH0 = 0xa4;TL0 = 0xa4;EA = 1;ET0 = 1;TR0 = 1;EX0 = 1;IT0 = 1; //下降沿触发}void timer0()interrupt 1 {counter++; // 100us}/*------红外接收中断------*/voidIR_read() interrupt 0{static bit start_flag = 0;static char i=1;if(start_flag){if(counter>=125&&counter<=145) {counter = 0;Dat[0] = 1;}else if(Dat[0] == 1){if(counter>14)Dat[i] = 1;elseDat[i] = 0;counter = 0;i++;if(i==33){Dat[0] = 0;Receive_ok = 1;start_flag = 0;i = 1;}}else{start_flag = 0;}}else{counter = 0;start_flag = 1;}}/*----------解码---------*/ void translate(){uchari,j;for(i=0;i<4;i++)for(j=0;j<8;j++){Number[i]>>=1;if(Dat[i*8+j+1]) Number[i] |= 0x80;}Receive_ok = 0;}/*------数码管显示------*/ void display(uchar *n) {uchar a[8],i;a[0] = n[0]/16;a[1] = n[0]%16;a[2] = n[1]/16;a[3] = n[1]%16;a[4] = n[2]/16;a[5] = n[2]%16;a[6] = n[3]/16;a[7] = n[3]%16;for(i=0;i<8;i++){we = 1;switch(i){case 0:P0 = 0xfe;break; //1111 1110 case 1:P0 = 0xfd;break; //1111 1101 case 2:P0 = 0xfb;break; //1111 1011 case 3:P0 = 0xf7;break; //1111 0111 case 4:P0 = 0xef;break; //1110 1111 case 5:P0 = 0xdf;break; //1101 1111 case 6:P0 = 0xbf;break; //1011 1111 case 7:P0 = 0x7f;break; //0111 1111 }we = 0;du = 1;P0 = table[a[i]];du = 0;Delay_ms(1);}}/*---------延时1MS----------*/ voidDelay_ms(uintnum){uint i;do{i = Main_fosc/96000;while(i--);}while(--num); }。
万能遥控器红外解码C程序
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--) ;
if(IRsignal==1) //如果IRsignal是"1",则向右移入一位"1"
{Delay1ms();
CodeTemp=CodeTemp|0x80;
if(j<8) CodeTemp=CodeTemp>>1;
}
else
if(j<8)CodeTemp=CodeTemp>>1;//如果IRsignal是"0",则向右移一位,自动补"0"
{while(IRsignal==0);
Delay4_5ms();
//跳过持续4.5ms的高电平
for(i=0;i<4;i++)
//分别读取4个字节
{for(j=1;j<=8;j++)
//每个字节8个bit的判断
{ while(IRsignal==0);
//等待上升沿
Delay0_9ms();
//从上升沿那一时刻开始延时0.9ms,再判断IRsignal
/* 前16位为8位用户码及其反码,后16位为8位的操作码及其反码
*/
/* 以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示"0"; */
51单片机红外遥控解码,很详细(汇编语言,C语言等)
//i++;
if(TH0<3)
b=1;
else b=0;
TH0=0;
TL0=0;
}
uchar hw_key()
{
uchar j,m;
//i=0;
hw_start(); //等待低电平到来
hw_pulse();
for(j=0;j<24;j++) //测试用户码脉冲宽度
{
hw_pulse();
}
for(j=0;j<8;j++) //测试键码脉冲宽度
{
hw_pulse();
if(b==1)
m=(m<<1)|1;
else
m<<=1;
}
return m; //键码
}
while(in==0); //高电平到了,
TR0=0; //关闭定+;
TH0=0;
TL0=0;
TR0=1; //高电平到了,启动定时器1,测试高电平宽度
while(in==1); //低电平到了,
TR0=0; //关闭定时器1,高电平宽度测试完
请注意甄别内容中的联系方式诱导购买等信息谨防诈骗
51单片机红外遥控解码,很详细(汇编语言,C语言等)
单片机源程序如下:
#include
#define hw_hs0038_ENTITY
#include "hw_hs0038.h"
sbit in=P3^2;
//uchar i=0;
//uchar k[2];
bit bdata b=0;
/*
void timer0(void) interrupt 1 using 1
红外遥控器C语言参考例程
/*检查LCD忙状态*/
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。*/
/* */
/*******************************************************************/
bit lcd_busy()
{
bit result;
void delay(uchar x); //x*0.14MS
void delay1(int ms);
void beep();
sbit IRIN = P3^2; //红外接收器数据线
sbit BEEP = P1^5; //蜂鸣器驱动线
sbit RELAY= P1^4; //继电器驱动线
uchar IRCOM[7];
while (IRIN)
{
delay(1);
N++;
if (N>=30)
{ EX0=1;
return;}
}
IRCOM[j]=IRCOM[j] >> 1;
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
}//end for k
}//end for j
if (IRCOM[2]!=~IRCOM[3])
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*******************************************************************/
c单片机红外解码程序汇编版和c语言版
c单片机红外解码程序汇编版和c语言版集团企业公司编码:(LL3698-KKI1269-TM2483-LUI12689-ITT289-纯软件解码 --- 汇编版利用程序判电平和时间进行解码,缺点是浪费系统软件资源;优点是对系统硬件要求稍低ORG 0000HT0ZD BIT 20H.2XH BIT P3.3 ;红外接收头数据接口RS BIT P2.3RW BIT P2.4E BIT P2.5BB BIT P3.6ORG 0000H ;AJMP MAINORG 000BH ;T0中断入口LJMP T0ZDCXORG 0100H ;主程序首地址MAIN:LCALL CSHMOV DPTR,#TAB ;总查表SETB EA ;T0中断设定SETB ET0MOV TMOD,#01HDDXH: ;信号接收前准备SETB P2.0 ;关信号指示灯MOV P0,#0FFHCLR TR0 ;关T0中断CLR T0ZD ;接收信号时间判断MOV R5,#4 ;延时计数MOV TH0,#00HMOV TL0,#00H;================解码主要过程===========关键============================================================ JB XH,$ ;等待电平变低,解码从这开始CLR P2.0 ;开信号指示灯,表示正在接收信号MOV P0,#8EHSETB TR0 ;开T0中断LCALL YS3MSJB XH,DDXH ;干扰检测LCALL YS3MSJB XH,DDXH ;干扰检测DD1:JB T0ZD,DDXH ;是否超出接收允许时间JNB XH,DD1 ;等待电平变高LCALL YS3MSJNB XH,DDXH ;干扰检测DD2:JB T0ZD,DDXH ;是否超出接收允许时间JB XH,DD2 ;等待电平变低JSSJ: ;信号确认,开始接收数据MOV R0,#30HZJ: ;接收一个字节数据MOV R2,#8WEI: ;位数据,分辩0和1JB T0ZD,DDXH ;是否超出接收允许时间JNB XH,WEI ;等待电平变高LCALL YS845MOV C,XH ;取位数据RRC ADD3:JB T0ZD,DDXH ;是否超出接收允许时间JB XH,DD3 ;等待电平变低,为1的高电平提供过度DJNZ R2,WEI ;8位数据是否接收完MOV @R0,AINC R0CJNE R0,#34H,ZJ ;四字节数据是否接收完MOV A,33HCPL ACJNE A,32H,DDXH ;键值确认,解码MOV R4,A;==========这里已经取出键值,存在R4中==================================================MOV R7,#100;TSY:MOV R6,#255DJNZ R6,$CPL BBDJNZ R7,TSYMOV A,#0CDH ;键值高位输出LCALL YJP_XZLMOV A,R4MOV B,#10HDIV ABMOVC A,@A+DPTRLCALL YJP_XSJMOV A,#0CEH ;键值低位输出LCALL YJP_XZLMOV A,BMOVC A,@A+DPTRLCALL YJP_XSJ ;LCALL DYBF ;调用灯控制子程序LJMP DDXH ;返还等待下一次信号YS845: ;延时845微秒MOV R7,#255DJNZ R7,$MOV R7,#165DJNZ R7,$RETYS3MS: ;延时3msMOV R7,#8DDD:MOV R6,#255DJNZ R6,$DJNZ R7,DDDRETT0ZDCX: ;T0中断程序MOV TL0,#00HMOV TH0,#00HDJNZ R5,T0FHSETB T0ZDT0FH:RETI;===============以下是多余部分=============================================================== ============DYBF:MOV A,#0C0H ;用号码前高位输出LCALL YJP_XZLMOV A,30HMOV B,#10HDIV ABMOVC A,@A+DPTRLCALL YJP_XSJMOV A,#0C1H ;用户码前低位输出LCALL YJP_XZLMOV A,BMOVC A,@A+DPTRLCALL YJP_XSJMOV A,#0C4H ;用户码后高位输出LCALL YJP_XZLMOV A,31HMOV B,#10HDIV ABMOVC A,@A+DPTRLCALL YJP_XSJMOV A,#0C5H ;用户码后低位输出LCALL YJP_XZLMOV A,BMOVC A,@A+DPTRLCALL YJP_XSJ;============此处专门针对我的开发板和遥控,不是解码的关键,只是一种应用举例MOV A,R4CJNE A,#0CH,BA1 ;是否1号键按下CPL P1.0 ;点亮1号灯BA1:CJNE A,#18H,BA2 ;是否2号键按下CPL P1.1 ;点亮1号灯BA2:CJNE A,#5EH,BA3 ;是否3号键按下CPL P1.2 ;点亮1号灯BA3:CJNE A,#08H,BA4 ;是否4号键按下CPL P1.3 ;点亮1号灯BA4:CJNE A,#1CH,BA5 ;是否5号键按下CPL P1.4 ;点亮1号灯BA5:CJNE A,#5AH,BA6 ;是否6号键按下CPL P1.5 ;点亮1号灯BA6:CJNE A,#42H,BA7 ;是否7号键按下CPL P1.6 ;点亮1号灯BA7:CJNE A,#52H,BAB ;是否8号键按下CPL P1.7 ;点亮1号灯BAB:RETCSH:;=============液晶初始化===============MOV A, #00111000B ;8位数据,双行显示,5-7字型LCALL YJP_XZL ;调用写液晶指令MOV A, #00001100B ;显示屏开启,光标出现在地址计数器位置,光标不闪烁LCALL YJP_XZL ;调用写液晶指令MOV A, #00000110B ;光标右移一格,AC值加一,字符全部不动LCALL YJP_XZL ;调用写液晶指令MOV A,#81H ;LCALL YJP_XZLMOV A, #4CH ;L的ASCII码LCALL YJP_XSJMOV A,#83H ;LCALL YJP_XZLMOV A, #47H ;G的ASCII码LCALL YJP_XSJMOV A,#85H ;LCALL YJP_XZLMOV A, #58H ;X的ASCII码LCALL YJP_XSJMOV A,#88H ;LCALL YJP_XZLMOV A, #5AH ;Z的ASCII码LCALL YJP_XSJMOV A,#89H ;LCALL YJP_XZLMOV A, #68H ;h的ASCII码LCALL YJP_XSJMOV A,#8AH ;LCALL YJP_XZLMOV A, #69H ;i的ASCII码LCALL YJP_XSJMOV A,#8CH ;LCALL YJP_XZLMOV A, #5AH ;Z的ASCII码LCALL YJP_XSJMOV A,#8DH ;LCALL YJP_XZLMOV A, #61H ;a的ASCII码LCALL YJP_XSJMOV A,#8EH ;LCALL YJP_XZLMOV A, #6FH ;o的ASCII码LCALL YJP_XSJMOV A,#0C2H ;LCALL YJP_XZLMOV A, #48H ;H的ASCII码LCALL YJP_XSJMOV A,#0C6H ;LCALL YJP_XZLMOV A, #48H ;H的ASCII码LCALL YJP_XSJMOV A,#0CAH ;LCALL YJP_XZLMOV A, #4AH ;J的ASCII码LCALL YJP_XSJMOV A,#0CBH ;LCALL YJP_XZLMOV A, #5AH ;Z的ASCII码LCALL YJP_XSJMOV A,#0CCH ;LCALL YJP_XZLMOV A, #3AH ;:的ASCII码LCALL YJP_XSJMOV A,#0CFH ;LCALL YJP_XZLMOV A, #48H ;H的ASCII码LCALL YJP_XSJRET;=========写指令到液晶============= YJP_XZL:LCALL CHECK_BUSY;查询忙碌状态CLR ECLR RSCLR RWSETB EMOV P0,A;写指令CLR ERET;==========写数据到液晶==============YJP_XSJ:LCALL CHECK_BUSY;查询忙碌状态CLR ESETB RSCLR RWSETB EMOV P0,A;写数据CLR ERET;=========查询忙碌标志============CHECK_BUSY:PUSH ACCBUSY_LOOP:CLR ESETB RWCLR RSSETB EMOV A,P0;读取状态JB p0.7,BUSY_LOOPPOP ACCLCALL DELRETDEL: MOV R6,#5L1: MOV R7,#248DJNZ R7,$DJNZ R6,L1RETTAB:DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39HDB 41H,42H,43H,44H,45H,46HEND中断加定时器---C语言版优点:完全是状态解码,极少的占用系统软件资源(CPU),随时都可以解码,而不管系统此时运行到何处。
c51单片机红外解码程序-汇总版和c语言版
精心整理纯软件解码---汇编版利用程序判电平和时间进行解码,缺点是浪费系统软件资源;优点是对系统硬件要求稍低ORG0000HT0ZDBIT20H.2XHBITP3.3;红外接收头数据接口RSBITP2.3RWBITP2.4============================================================JBXH,$;等待电平变低,解码从这开始CLRP2.0;开信号指示灯,表示正在接收信号MOVP0,#8EHSETBTR0;开T0中断LCALLYS3MSJBXH,DDXH;干扰检测LCALLYS3MSJBXH,DDXH;干扰检测DD1:JBT0ZD,DDXH;是否超出接收允许时间JNBXH,DD1;等待电平变高LCALLYS3MSJNBXH,DDXH;干扰检测DD2:JBT0ZD,DDXH;是否超出接收允许时间JBXH,DD2;等待电平变低JSSJ:;信号确认,开始接收数据ZJ:;MOVR7,#100;TSY:MOVR6,#255DJNZR6,$CPLBBDJNZR7,TSYMOVA,#0CDH;键值高位输出LCALLYJP_XZLMOVA,R4MOVB,#10HDIVABMOVCA,@A+DPTRLCALLYJP_XSJMOVA,#0CEH;键值低位输出LCALLYJP_XZLMOVA,BMOVCA,@A+DPTR LCALLYJP_XSJ; LCALLDYBF;调用灯控制子程序LJMPDDXH;返还等待下一次信号YS845:;延时845微秒MOVR7,#255RETRETDIVABMOVCA,@A+DPTR LCALLYJP_XSJMOVA,#0C1H;用户码前低位输出LCALLYJP_XZLMOVA,BMOVCA,@A+DPTR LCALLYJP_XSJMOVA,#0C4H;用户码后高位输出LCALLYJP_XZLMOVA,31HMOVB,#10HDIVABMOVCA,@A+DPTRLCALLYJP_XSJMOVA,#0C5H;用户码后低位输出LCALLYJP_XZLMOVA,BMOVCA,@A+DPTRLCALLYJP_XSJ;============此处专门针对我的开发板和遥控,不是解码的关键,只是一种应用举例BA7:CJNEA,#52H,BAB;是否8号键按下CPLP1.7;点亮1号灯BAB:RETCSH:;=============液晶初始化===============MOVA,#00111000B;8位数据,双行显示,5-7字型LCALLYJP_XZL;调用写液晶指令MOVA,#00001100B;显示屏开启,光标出现在地址计数器位置,光标不闪烁LCALLYJP_XZL;调用写液晶指令MOVA,#00000110B;光标右移一格,AC值加一,字符全部不动LCALLYJP_XZL;调用写液晶指令MOVA,#81H;LCALLYJP_XZLMOVA,#4CH;L的ASCII码LCALLYJP_XSJMOVA,#83H;LCALLYJP_XZLLCALLYJP_XZLMOVA,#61H;a的ASCII码LCALLYJP_XSJMOVA,#8EH;LCALLYJP_XZLMOVA,#6FH;o的ASCII码LCALLYJP_XSJMOVA,#0C2H;LCALLYJP_XZLMOVA,#48H;H的ASCII码LCALLYJP_XSJMOVA,#0C6H;LCALLYJP_XZLMOVA,#48H;H的ASCII码LCALLYJP_XSJMOVA,#0CAH;LCALLYJP_XZLMOVA,#4AH;J的ASCII码LCALLYJP_XSJMOVA,#0CBH;LCALLYJP_XZLMOVA,#5AH;Z的ASCII码RETRETCLRESETBRSCLRRWSETBEMOVP0,A;写数据CLRERET;=========查询忙碌标志============ CHECK_BUSY:PUSHACCBUSY_LOOP:CLRESETBRWCLRRSSETBEMOVA,P0;读取状态JBp0.7,BUSY_LOOPPOPACCLCALLDELRETDEL:MOVR6,#5RET/////////#definezd_cffsIT0///中断触发方式设置#definezd_dkEX0///中断打开设置////#definestc_dsqszAUXR&=0x7F;//定时器时钟12T模式,不需要可在AUXR....前加// ///**************************************************/****************************************************************** *****本程序使用外部中断加定时器来实现红外解码,占用系统软件资******** *****源极少,硬件方面占用了一个外部中断,定时器中断还可以进行******** *****一些简单的运用,软件部分可以做很多的动作,就看你发挥了!**************************************************************************/ #defineshi_jian定时器设置,请勿更改unsignedcharhwyhmh,hwyhml,hwjz,hwsj,hwjmws;///全局变量bithwjmok,yxjm;///全局变量,红外解码OK,允许解码voidmain(void){EA=1;//总中断打开zd_cffs=1;//外部中断_边沿触发方式zd_dk=1;//外部中断_打开ET0=1;//while(1)}}}定时器0{hwjz=0;TR0=0;//}voidZDhwjsCX(void)zd_rkdzusing3{unsignedinta=TH0*256+TL0;TL0=0;TH0=0;TR0=1;///开启T0if(a>shi_jian_*13000&&a<shi_jian_*14000)///if1分支2.判引导码13-14ms {hwsj=0;hwjmws=32;yxjm=1;}elseif(yxjm)///if1分支1.已收到引导码,允许解码{if(a>shi_jian_*11000&&a<shi_jian_*12000&&hwjmws==0)///if2分支1。
红外线遥控解码接收程序-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();if(IR_RE==1) //延时2.4ms后如果是高电平则是新码{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中精确的延时与计算的实现>>里的评论有很好的诠释.以上程序段可以应用在51/52单片机里.下面的程序可以应用在STC12C5410/STC12C2052型号的单片机里面.//在STC12C5410上运用红外线解码程序.主要的问题在于延迟上。
PIC16F57 红外遥控解码 C程序
// 4MHZ crystal, the main loop time must below 100us, if you need faster,
// change crystal or optimize your code ( different 100us for different task.)
// the accurate time must be calculate by yourself, i just get a sample
//********************************************************************
#define dat_time_100us 100 //100us, must be adjust
}
cal_high = 1; // just calculate at the falling edge
if(!leader)
//config leader code
{
if(!begin_leader)
{
begin_leader = 1;
else
//2、receive PPM
{
//receive custom code and key code
code_counter++;
// if 2.25ms : 1
// 1.125ms : 0
if(code_time > 16) // 1.168ms
/*
if(continute_key_time == 0)
{
continuted_key_time = **(you configed time)
#mspfPWM红外解码(C语言)
基于msp430f149的PWM红外解码的研究摘要:因为红外遥控的实用与经济性,本文研究PWM方式调制的红外解码的实现。
红外线遥控是目前使用最广泛的一种通信和遥控手段。
因为红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。
工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。
1红外遥控系统通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如下所示:<一)发射部分键盘矩阵、编码调制、LED红外发送器<红外接收头 VS0038能够正常接收的角度2 遥控发射器及其编码<1)遥控发射器专用芯片很多<2)根据编码格式可以分成:脉冲宽度调制和脉冲相位调制两大类现在我们研究以运用比较广泛,解码比较容易实现的脉冲宽度调制来加以说明。
当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码也不同。
这种遥控码具有以下特征:(a)采用脉宽调制的串行码(b)以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”(c)以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”遥控器发出由“0”和“1”组成的32位二进制码,经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。
然后再通过红外发射二极管产生红外线向空间发射,,其中前16位为用户识别码,能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。
后16位为8位的操作码和8位的操作反码用于核对数据是否接收正确。
<其中的地址码为用户识别码,它又分为用户码与用户反码)当遥控器上任意一个按键按下超过36ms时,LC7461芯片的振荡器使芯片激活,将发射一个特定的同步码头,对于接收端而言就是一个9ms的低电平,和一个4.5ms的高电平,这个同步码头可以使程序知道从这个同步码头以后可以开始接收数据。
C语言写的红外遥控解码程序
C语言写的红外遥控解码程序#include “STC89C51RC.H”sbit DQ = P4;sb it SPK = P1;#include absacc.h#define seg1 XBYTE[0xffec]#define seg2 XBYTE[0xffed]#define seg3 XBYTE[0xffee]#define seg4 XBYTE[0xffef]unsigned char IRMcode[4];unsigned char code ledmap[]=//共阴LED 数码管译码表{0x3f,0x06,0x5b,0x4f,0x66,//0,1,2,3,4,0x6d,0x7d,0x07,0x7f,0x6f,//5,6,7,8,9,0x77,0x 7C,0x39,0x5E,0x79,//A,b,C,d,E,0x71,//F,};void delay(unsigned int);void main(){EA = 1;EX2 = 1; while(1){if (IRMcode[2]==~IRMcode[3]){seg1 = ~ledmap[IRMcode[2]/100];seg2 = ~ledmap[IRMcode[2]/10%10];seg3 = ~ledmap[IRMcode[2]%10];seg4 = 0xff;//熄灭}}}void Sound(void){SPK = 0;delay(10000);SPK = 1;}void IRMint(void) interrupt 6 using 2{unsigned char count;unsigned int count1;unsigned char i,j;EA = 0;count = 9;while(-- count){delay(100);//440usif(DQ){EA = 1;return;}}while(DQ==0);//通过引导码余下的低电平//以上完成引导码4.5ms 的低电平检测count = 9;count1 = 0;while(-- count){delay(100);//440usif(DQ==0){EA = 1;return;}}while(DQ==1)//通过引导码余下的高电平{ if(count1++1000) {P1=0x55;EA = 1;return;}}//以上完成引导码4.5ms 的高电平检测count1 = 0;for(j=0;j4;j++)//有效字节数设定{for(i=0;i8;i++)//字节bit 数{while(DQ==0);//通过编码低电平delay(200);//延时判断编码高电平维持长度IRMcode[j]=1;if(DQ)IRMcode[j]|=0x01;while(DQ==1){//通过编码余下的。
红外解码程序(用1602显示码值)
红外解码程序(用1602显示码值)#include #define uchar unsigned char#define uint unsigned intsbit beep=P1;bit startflag; //定义一个扫描开始标志位bit irreceok;//红外接收OK 标志位bit irprosok;//红外接收处理OK 标志位uchar irdata[33];//定义一个存放编码的数组。
引导码1 位,客户码8 位,客户反码8 位,数据码8 位,数据反码8 位,共33 位uchar bitnum;//接收到的第几位数据的标志位uchar irtime;//定义红外扫描时间uchar ircode[4];//为四个码值定义一个数组存放,把四位码分开uchar disp[8];//四组数据,每组拆成高四位和低四位,共八个元素/**************1602 部分******************/sbit lcden=P1 ;sbitlcdrs=P1;sbitlcdrw=P1;/*cha r code Tab[]={0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F};*/char code Tab[]=“0123456789abcdef”;void delay(uint z) //延时子程序{ uint x,y; for(x=z;x>0;x--) for(y=220;y>0;y--);}void write_com(uchar com)//定义一个带参数的写命令子程序{lcdrs=0; //1602的rs 为0 时,接收命令,为1 时接收数据P0=com;//把void write_com(uchar com)中的COM 中的数据给P0 口delay(2);lcden=1;delay(2);lcden=0;delay(2);}void init_1602()//定义一个初始化子程序{lcden=0;lcdrw=0;write_com(0x38);//调用write_com 子程序并把0x38 赋给P0 口,显示模式打开write_com(0x0f);//调用write_com 子程序并把开显示,显示光标,光标闪烁指令码赋给P0 口write_com(0x06);//调用write_com 子程序并把地址指针加1,整屏不移动指令码赋给P0 口//write_com(0x80+0x10);//数据指针初始化,让指针指向可显示的最右端write_com(0x80);//数据指针初始化,让指针指向最左端,显示从第一行开始write_com(0x01);//调用write_com 子程序并把”清零指”令码赋给P0 口} void write_dat(uchar dat)//定义一个带参数的写数据子程序{lcdrs=1; //1602 的rs。