红外解码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。