资讯详情

红外解码程序换种写法(1602显示码值,还用码值当命令做其他事)

#include<reg52.h> #define uint unsigned int #define uchar unsigned char sbit =P3^2; //红外标志 sbit RS = P1^0; sbit RW = P1^1; sbit E = P1^2; sbit beep = P1^7; uint hour,minute,second,count; char code Tab[16]={'0','1','2','3','4','5', '6','7','8','9','A','B','C','D','E','F'}; //char code Tab[16]="0123456789abcdef";//两种定义方法都可以 char data TimeNum[]=" ";//data:固定指前面0x00-0x7f的 //128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。 char data Test1[]=" "; void DelayMs(uchar z); /******************************************************************/ /* 变量声明 */ /******************************************************************/ uchar irtime;//红外用全局变量 bit irpro_ok,irok; uchar IRcord[4]; //处理后的红外码,分别是 客户码,客户码,数据码,数据码反码 uchar irdata[33]; //33个高低电平的时间数据 /******************************************************************/ /* 函数声明 */ /******************************************************************/ void Ir_work(void); void Ircordpro(void); void ShowString (unsigned char line,char *ptr); /******************************************************************/ /* 定时器0中断服务函数 */ /******************************************************************/ void beep1() { uchar i; for (i=0;i<4;i++) {beep=0; DelayMs(400); beep=1; DelayMs(400); } } void beep2() { uchar i; for (i=0;i<5;i++) {beep=0; DelayMs(300); beep=1; DelayMs(300); } } void beep3() { uchar i; for (i=0;i<2;i++) {beep=0; DelayMs(500); beep=1; DelayMs(500); } } void shan() { uchar i; for (i=0;i<3;i++) {P0=0x55; DelayMs(1000); P0=0xff; DelayMs(1000); } } void tim0_isr (void) interrupt 1 using 1//定时器0中断服务函数 { irtime++; //用于计数2个下降沿之间的时间 } /******************************************************************/ /* 外部中断0函数 */ /******************************************************************/ void ex0_isr (void) interrupt 0 using 0//外部中断0服务函数 { uchar i; //接收红外信号处理 bit startflag; //是否开始处理标志位 if(startflag) { if(irtime<63&&irtime>=33)//引导码 TC9012的头码,9ms+4.5ms i=0; irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1 irtime=0; i++; if(i==33) { irok=1; i=0; } } else { irtime=0; startflag=1; } } /******************************************************************/ /* 定时器0初始化 */ /******************************************************************/ void M0init(void)//定时器0初始化 { TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值 TH0=0x00; //重载值 TL0=0x00; //初始化值 ET0=1; //开中断 TR0=1; } /******************************************************************/ /* 外部中断初始化 */ /******************************************************************/ void EX0init(void) { IT0 = 1; //指定外部中断0下降沿触发,I0 (P3.2) EX0 = 1; //使能外部中断 EA = 1; //开总中断 } /******************************************************************/ /* 红外键值处理 */ /******************************************************************/ void Ir_work(void) //红外键值散转程序 { TimeNum[5] = Tab[IRcord[0]/16]; //处理客户码并显示 TimeNum[6] = Tab[IRcord[0]%16]; TimeNum[8] = Tab[IRcord[1]/16]; //处理客户码并显示 TimeNum[9] = Tab[IRcord[1]%16]; TimeNum[11] = Tab[IRcord[2]/16]; //处理数据码并显示 TimeNum[12] = Tab[IRcord[2]%16]; TimeNum[14] = Tab[IRcord[3]/16]; //处理数据反码并显示 TimeNum[15] = Tab[IRcord[3]%16]; ShowString(1,TimeNum);//显示处理过后的码值 switch(IRcord[3]) { case 0xf3: beep1();break; case 0xe7: beep2();break; case 0xa1: beep3() ;break; case 0xf6: shan() ;break; } irpro_ok=0; //处理完成后清楚标志位 } /******************************************************************/ /* 红外解码函数处理 */ /******************************************************************/ void Ircordpro(void)//红外码值处理函数 { uchar i, j, k; uchar 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=value|0x80; } else { value=value; } if(j<8) { value=value>>1; } k++; } IRcord[i]=value; value=0; } irpro_ok=1;//处理完毕标志位置1 } /******************************************************************/ /* 毫秒函数声明 */ /******************************************************************/ void DelayMs(int z) { int x,y; for(x=z;x>0;x--) for(y=220;y>0;y--); } /******************************************************************/ /* 写入命令函数 */ /******************************************************************/ void Write_com(uchar c) { DelayMs(5);//操作前短暂延时,保证信号稳定 E=0; RS=0; RW=0; DelayMs(5); E=1; P0=c; E=0; } /******************************************************************/ /* 写入数据函数 */ /******************************************************************/ void Write_dat(uchar c) { DelayMs(5); //操作前短暂延时,保证信号稳定 E=0; RS=1; RW=0; DelayMs(5); E=1; P0=c; E=0; RS=0; } /******************************************************************/ /* 写入字节函数 */ /******************************************************************/ void ShowChar(uchar pos,uchar c) { unsigned char p; if (pos>=0x10) p=pos+0xb0; //是第二行则命令代码高4位为0xc else p=pos+0x80; //是第二行则命令代码高4位为0x8 Write_com (p);//写命令 Write_dat (c); //写数据 } /******************************************************************/ /* 写入字符串函数 */ /******************************************************************/ void ShowString (uchar line,char *ptr) { uchar l,i; l=line<<4; for (i=0;i<16;i++) ShowChar (l++,*(ptr+i));//循环显示16个字符 } /******************************************************************/ /* 初始化函数 */ /******************************************************************/ void InitLcd() { DelayMs(15); Write_com(0x38); //display mode Write_com(0x38); //display mode Write_com(0x38); //display mode Write_com(0x06); //显示光标移动位置 Write_com(0x0c); //显示开及光标设置 Write_com(0x01); //显示清屏 }

/******************************************************************/ /* 主函数 */ /******************************************************************/ void main(void) { EX0init(); //初始化外部中断 TIM0init();//初始化定时器 InitLcd(); DelayMs(15); while(1) { if(irok) //如果接收好了进行红外处理 { Ircordpro(); irok=0; } if(irpro_ok) //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等 { Ir_work(); } } }

-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台