STC红外线测试C程序

合集下载

红外线遥控解码接收程序-C语言

红外线遥控解码接收程序-C语言
delay1000()
{
uchar i,j;
i=5;
do{j=95;
do{j--;}
while(j);
i--;
}while(i);
}
/*---------------------------延时882us子程序-----------------------*/
date[i]>>=1;
date[i]=date[i]|0x80;
}
} //1位数据接收结束
} //32位二进制码接收结束
/*-----------------------红外解码程序(核心)-----------------*/
/*----------------------------------------------------------*/
void IR_decode()
{
uchar i,j;
//在STC12C5410上运用红外线解码程序.主要的问题在于延迟上。
#include <regx51.h>
#define uchar unsigned char
#define uint unsigned int
#define IR_RE P3_2
bit k=0; //红外解码判断标志位,为0则为有效信号,为1则为无效
红外线遥控解码接收程序-C语言
#include <regx51.h>
#define uchar unsigned char
#define uint unsigned int
#define IR_RE P3_2
bit k=0; //红外解码判断标志位,为0则为有效信号,为1则为无效

cv 单片机红外遥控c程序

cv 单片机红外遥控c程序
if(IR_buf[2]==0x01) // 01H键(键值码为01H)
RELAY=1; //继电器关闭
Display();
}
}
/********以下是外中断0函数********/
void IR_decode() interrupt 0
{
EX0=1; //开外中断0
return; //0.14ms计数过长则返回
}
}
IR_buf[j]=IR_buf[j] >> 1; //若计数小于6,数据最高位补"0",说明收到的是"0"
/********以下是延时函数********/
void Delay_ms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
/*********以下是蜂鸣器响一声函数********/
if (count>=6) {IR_buf[j] = IR_buf[j] | 0x80;} //若计数大于等于6,数据最高位补"1",说明收到的是"1"
count=0; //计数器清0
}
}
if (IR_buf[2]!=~IR_buf[3]) //将键数据反码取反后与键数据码码比较,若不等,表示接收数据错误,放弃
// IR_buf[2]、IR_buf[3]为键数据码和键数据码反码接收缓冲区
uchar disp_buf[2]={0x10,0x10}; //显示缓冲单元,初值为0x10(即16),指向显示码的第16个"-"

c51单片机红外解码程序-汇编版和c语言版

c51单片机红外解码程序-汇编版和c语言版

纯软件解码---汇编版利用程序判电平和时间进行解码,缺点是浪费系统软件资源;优点是对系统硬件要求稍低ORG0000HT0ZDBIT20H.2XHBITP3.3;红外接收头数据接口RSBITP2.3RWBITP2.4EBITP2.5BBBITP3.6ORG0000H;AJMPMAINORG000BH;T0中断入口LJMPT0ZDCXORG0100H;主程序首地址MAIN:LCALLCSHMOVDPTR,#TAB;总查表SETBEA;T0中断设定SETBET0MOVTMOD,#01HDDXH:;信号接收前准备SETBP2.0;关信号指示灯MOVP0,#0FFHCLRTR0;关T0中断CLRT0ZD;接收信号时间判断MOVR5,#4;延时计数MOVTH0,#00HMOVTL0,#00H;================解码主要过程===========关键============================================================ JBXH,$;等待电平变低,解码从这开始CLRP2.0;开信号指示灯,表示正在接收信号MOVP0,#8EHSETBTR0;开T0中断LCALLYS3MSJBXH,DDXH;干扰检测LCALLYS3MSJBXH,DDXH;干扰检测DD1:JBT0ZD,DDXH;是否超出接收允许时间JNBXH,DD1;等待电平变高LCALLYS3MSJNBXH,DDXH;干扰检测DD2:JBT0ZD,DDXH;是否超出接收允许时间JBXH,DD2;等待电平变低JSSJ:;信号确认,开始接收数据MOVR0,#30HZJ:;接收一个字节数据MOVR2,#8WEI:;位数据,分辩0和1JBT0ZD,DDXH;是否超出接收允许时间JNBXH,WEI;等待电平变高LCALLYS845MOVC,XH;取位数据RRCADD3:JBT0ZD,DDXH;是否超出接收允许时间JBXH,DD3;等待电平变低,为1的高电平提供过度DJNZR2,WEI;8位数据是否接收完MOV@R0,AINCR0CJNER0,#34H,ZJ;四字节数据是否接收完MOVA,33HCPLACJNEA,32H,DDXH;键值确认,解码MOVR4,A;==========这里已经取出键值,存在R4中================================================== MOVR7,#100;TSY:MOVR6,#255DJNZR6,$CPLBBDJNZR7,TSYMOVA,#0CDH;键值高位输出LCALLYJP_XZLMOVA,R4MOVB,#10HDIVABMOVCA,@A+DPTR LCALLYJP_XSJMOVA,#0CEH;键值低位输出LCALLYJP_XZLMOVA,BMOVCA,@A+DPTR LCALLYJP_XSJ; LCALLDYBF;调用灯控制子程序LJMPDDXH;返还等待下一次信号YS845:;延时845微秒MOVR7,#255DJNZR7,$MOVR7,#165DJNZR7,$RETYS3MS:;延时3msMOVR7,#8DDD:MOVR6,#255DJNZR6,$DJNZR7,DDDRETT0ZDCX:;T0中断程序MOVTL0,#00HMOVTH0,#00HDJNZR5,T0FHSETBT0ZDT0FH:RETI;===============以下是多余部分=========================================================================== DYBF:MOVA,#0C0H;用号码前高位输出LCALLYJP_XZLMOVA,30HMOVB,#10HDIVABMOVCA,@A+DPTRLCALLYJP_XSJMOVA,#0C1H;用户码前低位输出LCALLYJP_XZLMOVA,BMOVCA,@A+DPTRLCALLYJP_XSJMOVA,#0C4H;用户码后高位输出LCALLYJP_XZLMOVA,31HMOVB,#10HDIVABMOVCA,@A+DPTRLCALLYJP_XSJMOVA,#0C5H;用户码后低位输出LCALLYJP_XZLMOVA,BMOVCA,@A+DPTRLCALLYJP_XSJ;============此处专门针对我的开发板和遥控,不是解码的关键,只是一种应用举例MOVA,R4CJNEA,#0CH,BA1;是否1号键按下CPLP1.0;点亮1号灯BA1:CJNEA,#18H,BA2;是否2号键按下CPLP1.1;点亮1号灯BA2:CJNEA,#5EH,BA3;是否3号键按下CPLP1.2;点亮1号灯BA3:CJNEA,#08H,BA4;是否4号键按下CPLP1.3;点亮1号灯BA4:CJNEA,#1CH,BA5;是否5号键按下CPLP1.4;点亮1号灯BA5:CJNEA,#5AH,BA6;是否6号键按下CPLP1.5;点亮1号灯BA6:CJNEA,#42H,BA7;是否7号键按下CPLP1.6;点亮1号灯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_XZLMOVA,#47H;G的ASCII码LCALLYJP_XSJMOVA,#85H;LCALLYJP_XZLMOVA,#58H;X的ASCII码LCALLYJP_XSJMOVA,#88H;LCALLYJP_XZLMOVA,#5AH;Z的ASCII码LCALLYJP_XSJMOVA,#89H;LCALLYJP_XZLLCALLYJP_XSJMOVA,#8AH; LCALLYJP_XZLMOVA,#69H;i的ASCII码LCALLYJP_XSJMOVA,#8CH; LCALLYJP_XZLMOVA,#5AH;Z的ASCII码LCALLYJP_XSJMOVA,#8DH; LCALLYJP_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_XZLLCALLYJP_XSJMOVA,#0CBH;LCALLYJP_XZLMOVA,#5AH;Z的ASCII码LCALLYJP_XSJMOVA,#0CCH;LCALLYJP_XZLMOVA,#3AH;:的ASCII码LCALLYJP_XSJMOVA,#0CFH;LCALLYJP_XZLMOVA,#48H;H的ASCII码LCALLYJP_XSJRET;=========写指令到液晶============= YJP_XZL:LCALLCHECK_BUSY;查询忙碌状态CLRECLRRSCLRRWSETBEMOVP0,A;写指令CLRERET;==========写数据到液晶============== YJP_XSJ:LCALLCHECK_BUSY;查询忙碌状态CLRESETBRSCLRRWSETBEMOVP0,A;写数据CLRERET;=========查询忙碌标志============CHECK_BUSY:PUSHACCBUSY_LOOP:CLRESETBRWCLRRSSETBEMOVA,P0;读取状态JBp0.7,BUSY_LOOPPOPACCLCALLDELRETDEL:MOVR6,#5L1:MOVR7,#248DJNZR7,$DJNZR6,L1RETTAB:DB30H,31H,32H,33H,34H,35H,36H,37H,38H,39H DB41H,42H,43H,44H,45H,46HEND中断加定时器---C语言版优点:完全是状态解码,极少的占用系统软件资源(CPU),随时都可以解码,而不管系统此时运行到何处。

基于STC单片机的红外解码测试仪设计

基于STC单片机的红外解码测试仪设计

53第2卷 第6期基于STC 单片机的红外解码测试仪设计钱小四(厦门建霖健康家居股份有限公司,福建 厦门 361000)摘要:很多家用电器都采用红外遥控作为短距离无线控制方式,文章采用STC 单片机作为核心解码控制器,通过其强大功能分析解码各种红外遥控器的数据,为遥控器厂家及产品设计人员提供一种可靠便捷的解码仪器,能极大的提高制造企业生产效率。

关键词:STC 单片机;红外解码;测试仪中图分类号:TP368.1;TN407 文献标识码:A 文章编号:2096-6164(2020)06-0053-021 红外解码测试仪概述红外解码测试仪是专门用于红外遥控器的数据解码测试仪器,不仅解码常用的NEC 、RC5等市场覆盖率高的协议的遥控器,还可以解码市场上常见空调协议如格力、海信、奥克斯、LG 等长数据的遥控器及其它自定义类型的家用电器红外遥控器;各种协议的解码精度都保持在3%的范围内,超出范围的不良产品均可以通过仪器筛选出;可支持40种以上红外遥控协议,同时也可以兼容无线通讯模块如2.4G 或蓝牙模块的解码测试,能极大提升遥控器生产厂家的生产检测效率,同时也为设计开发人员提供极其便利设计及检测的方法。

2 红外线原理特征描述红外线是波长在760 nm ~1 mm 之间的电磁波,它的频率高于微波而低于可见光,是一种人的眼睛看不到的光线。

红外通信一般采用红外波段内的近红外线,波长在0.75 um ~25 um 之间。

红外数据协会(IRDA)成立后,为了保证不同厂商的红外产品能够获得最佳的通信效果,红外通信协议将红外数据通信所采用的光波波长的范围限定在850 nm ~940 nm 之内。

作为无线局域网的传输方式,红外线方式的最大优点是不受无线电干扰,且它的使用不受国家无线管理委员会的限制。

中国遥控器产量占全球总产量的80%;遥控器制造业属于一个发展成熟及竞争激烈的行业,集中度较高。

国内遥控器企业目前大多停留在劳动力密集的代加工状态,受成本限制测试仪器使用率低、生产效率低下。

STC89C58RD+ 红外遥控解码与串口程序

STC89C58RD+ 红外遥控解码与串口程序

STC89C58RD+ 红外遥控解码与串口程序//以下程序适用于STC89C58RD+ ,使用22.1184MHz晶振,用1838来对红外遥控器解码,1838的1脚接外中断0脚,即单片机P3.2脚//红外遥控器发出的红外信号经过1838处理后输出的是9.5ms低电平(也可能是4.5ms低电平)加4.5ms高电平的前导码,后面8位的地址码,8位的地址反码(也可能是地址码),8位的数据码,8位的数据反码,总共32位码//其中0码由O.56ms低电平和0.56ms高电平组合而成.脉冲宽度为1.12ms;1码由0.56ms低电平和1.69ms高电平组合而成,脉冲宽度为2.25ms#include<reg52.h>#include<stdio.h>#include<string.h>unsigned char count;unsigned int Address_Part,Data_Part;unsigned char date;bit Rev_flag;bit Over_flag;//unsigned int time_data[35];//unsigned char time_count;void init_config()//初始化函数{TMOD=0x21;//设置定时器0为工作方式1,定时器1为方式2--8位自动重装PCON |=0x80;//SMOD=1,要产生115200波特率必须置位REN=1;//启动串行接收数据SM0=0;SM1=1;//SM0,SM1设置串行口为工作方式1,10位异步收发器-->1位起始位,8位数据,1位停止位TI=1;//要使用printf()函数,就需要置位,后期不能置0TL1=0xff;//256-(2*fosc/(384*baud));TH1=0xff;//定时器1的初值,22.1184M晶振TR1=1;//启动T1定时器TH0=0x00;TL0=0x00;//设置定时器0初值IT0=1;//设置外中断0为下降沿触发ET0=1;//开定时器0允许中断//ET1=1;//开定时器1允许中断EX0=1;//开外中断0//TR0=1;ES=1;//开串口中断EA=1;//开总中断Rev_flag=0;Over_flag=0;}void main(){init_config();while(1){if(Over_flag){Over_flag=0;printf("Address_Part:%x,Data_Part:%x\n\r",Address_Part,Data_Part);}if(Rev_flag)//判断串口接受到数据,只是把从串口调试助手发过来的数据发回去,测试收发用而已{ES=0;Rev_flag=0;SBUF=date;//发送数据while(!TI);//发送数据完毕才跳出死循环ES=1;// TI=0;}/* if(time_count==40)//把收到的时间th值传给串口打印出来{time_count=0;printf("time:\n\r");for(;time_count<35;time_count++){printf("%d \n\r",time_data[time_count]);}memset(time_data,0,sizeof(time_data));EX0=1;//开外中断0}*/}}void exter() interrupt 0{unsigned int th;unsigned char tl;bit ds;TR0=0;//关定时器0th=TH0;//提取出高8位tl=TL0;//提取出低8位th<<=8;//左移8位th=th|tl;//算出定时器总共的计数值TH0=0x00;//初始值TL0=0x00;/* time_data[time_count]=th;//这段代码的作用是在不知道th的数值是多少为前导码,为0,为1时,把收到的时间th给提取出来,方便传给串口打印出来time_count++;if(time_count==35){time_count=40;EX0=0;}TR0=1;*//*这段判断前导码和0、1的值是12M晶振下的if(th>950&&th<1225)ds=0;//判断0和1else if(th>2050&&th<2345)ds=1;else if(th>13325&&th<13600)//判断前导码*///这段判断前导码和0、1的值是22.1184M晶振下的if(th>1900&&th<2260)ds=0;//判断0和1else if(th>4000&&th<4300)ds=1;else if(th>24900&&th<25350)//判断前导码{Address_Part=0;Data_Part=0;count=0;Over_flag=0;TR0=1;return;}else{TR0=1;return;}//去除干扰,当接收的是准备进前导码时的下降沿和截止码时,该语句起作用,没有该语句,则只能接收一次count++;if(count<16){Address_Part=Address_Part|ds;Address_Part=Address_Part<<1;TR0=1;}else if(count==16){Address_Part=Address_Part|ds;TR0=1;}else if(count<32){Data_Part=Data_Part|ds;Data_Part=Data_Part<<1;TR0=1;}else if(count==32){Data_Part=Data_Part|ds;Over_flag=1;}//接收完32位,后面应该有连续码,但不需要,所以不作处理}void time0() interrupt 1//要是没有该函数,可能会因为溢出而导致解码不正确{TR0=0;}void ser() interrupt 4{if(RI)//一定要加该判断句,不然串口调试助手那里会一直收到数据{RI=0;date=SBUF;//提取数据Rev_flag=1;}}。

红外测距c程序

红外测距c程序

void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } //====================================================== void write_com(uchar com) { lcdrs=0; P0=com; delay(5); lcden=1; delay(5); lcden=0; } //========================================================= void write_data(uchar date) { lcdrs=1; P0=date; delay(5); lcden=1; delay(5); lcden=0; } //========================================================= void init0() { lcden=0; lcdws=0; write_com(0x38); write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80); }
lll=160; if(ll>322&&ll<=365) lll=165; if(ll>288&&ll<=322) lll=170; if(ll>263&&ll<=288) lll=175; if(ll>230&&ll<=263) lll=180; if(ll>203&&ll<=230) lll=185; if(ll>178&&ll<=203) lll=190; if(ll>153&&ll<=178) lll=195; if(ll>1&&ll<=153) lll=200; return(lll); } */ //======================================================== uint ADC(uchar chn1) { uchar i; uchar addr8; //通道地址 uint ADresult; //转换码 AD_eoc=1;

基于stc89c52单片机的红外计数器设计及实现

基于stc89c52单片机的红外计数器设计及实现摘要:本文介绍了基于STC89C52单片机的红外计数器的设计和实现。

该计数器采用红外传感器作为输入信号,使用单片机作为处理器,能够实现自动计数,可以应用于各种场合的计数任务。

本文从硬件设计、软件设计两个方面进行了详细介绍,并给出了实际测试结果。

关键词:STC89C52单片机;红外计数器;硬件设计;软件设计一、绪论二、硬件设计2.1 红外传感器红外传感器是红外计数器的输入信号源,采用两个红外传感器进行输入信号的采集。

一般来说,红外传感器具有发射管和接收管两部分组成,发射管会发射一个特定频率的红外光,接收管则可以接收这个频率的红外光。

通过发射管和接收管之间的反射和折射效应,可以实现对物体进行探测。

2.2 显示器为了方便实时显示计数结果,该计数器装配了数码管显示器。

数码管显示器可以显示0~9的数字,通过不同的控制信号可以实现不同数字的显示。

2.3 单片机选型由于计数器需要进行计算和显示计数结果,因此需要一款性能优良的单片机来实现这些功能。

本设计采用了STC89C52单片机作为处理器。

STC89C52单片机是一款高性能、低功耗的8位单片机,具有多种外设和扩展接口,适合于各种应用场合。

2.4 电源模块为了保证计数器的正常工作,需要提供稳定可靠的电源。

本设计采用了交流电转直流电的方式,通过稳压芯片将电源输出电压稳定在5V左右,以满足单片机和显示器的工作电压要求。

3.1 程序设计流程该计数器的程序设计采用C语言编写,主要实现了两个功能:读取红外传感器输入的信号,进行计数并更新计数结果。

具体程序设计流程如下:1)初始化端口:设置单片机输入输出管脚的模式和初值。

2)初始化定时器:设置定时器的时钟源、计数模式和计数初值。

3)循环读取输入信号:连续检测两个红外传感器的输入信号,当检测到信号变化时,进行计数并更新计数结果。

4)显示计数结果:将计数结果存储到单片机中的寄存器中,通过数码管实现实时显示。

STC12C5A60S2红外发射程序


endcount=20;
flag=1;
count=0;
do{}while(count<endcount); //停止发送红外信号即编码中的高电平
//if(irdata&0X01) //判断二进制数个位为1还是0
if(irdata-(irdata/2)*2)
case(0xdd):senddat[n]=5,display(5),++n;break;
case(0xbd):senddat[n]=6,display(6),++n;break;
case(0x7d):senddat[n]=7,display(7),++n;break;
}
P1=0xfb;
/*
移植时注意与传统8051单片机的软件延时不同,因12c系列处理速度更快!!!
*/
#include"STC12C5A60S2.h"
#define uchar unsigned char //数据类型的宏定义
#define uint unsigned int //数据类型的宏定义
sbit OUT=P3^4;
// case(0x7b):senddat=table[11];break;
}
/*P1=0xf7;
temp=P1;
switch(temp)
{
case(0xe7):senddat=table[12];break;
case(0xd7):senddat=table[13];break;
void delay1ms(uint i)
{
uchar j;

红外遥控器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;
}
/*******************************************************************/

红外线报警器测试程序

红外线报警器测试程序**************************************************************************简单的被动式红外线报警器PB1: 绿色LEDPB0: 红色LEDPD7: 蜂鸣器PC5: 连接TL0083的输出端PD0: 红外LED2004年8月4日***************************************************************************/#include <iom8v.h>//和单片机类型相对应的头文件,选择Atmega8做实验;#include <macros.h>void delay_nus(unsigned int n);//函数声明,本实验中会用到这两个函数void delay_nms(unsigned int n);void main(void)//主函数{ //L6unsigned int i;unsigned char n;OSCCAL=0X9E;//系统时钟校准,不同的芯片和不同的频率,//其校准值是不一样的TCCR0=BIT(CS01);//T/C0时钟8分频TIMSK=BIT(TOIE0);//允许定时器T/C0溢出中断SEI();//开中断DDRD|=BIT(0)|BIT(7);//设置PD0、7为输出口DDRC&=~BIT(5);//设置PC5为输入口DDRB|=BIT(1)|BIT(0);//定义B口的PB0、PB1为输出口PORTB|=BIT(1);//PB1口输出高电平,绿灯亮while(1){ //L5for (n=0;n<10;n++){ //L4delay_nus(60);if ((PINC&0B00100000)==0) //检测PC5是否为低电平{ //L3i++;if (i>8)//如果连续检测到有301-399次PC5都为低电平,则报警{ //L2CLI();for(i=0;i<10;i++){ //L1PORTB&=~BIT(1);//关闭绿灯PORTD|=BIT(7);//打开蜂鸣器PORTB^=BIT(0);//翻转PB1口,红灯快闪delay_nms(300);} //L1PORTD&=~BIT(7);//关闭蜂鸣器PORTB&=~BIT(0);//关闭红灯i=0;SEI();} //L2 */PORTB|=BIT(1);//打开绿灯} //L3} //L4//-------------------码调制----------------------------/CLI();//PD0连续2ms都无输出PORTD&=~BIT(0);delay_nms(2);TCNT0=245;SEI();//PD0连续600us产生38KHZ信号//delay_nus(100);} //L5 */} //L6#pragma interrupt_handler LED0:iv_TIMER0_OVF//指定中断服务程序的入口void LED0(void)//产生38KHz的方波信号{PORTD^=BIT(0);//翻转PD0口电平TCNT0=245;}void delay_nus(unsigned int n)//n微秒延时函数{unsigned int i;for (i=0;i<n;i++){asm("nop");}}void delay_nms(unsigned int n)//n毫秒延时函数{unsigned int i;for (i=0;i<n;i++) //执行n次1毫秒延时delay_nus(1000);}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*****************技术支持yuzhongjun8@*****************************/
/***应用与51系列、STC系列、经本人测试无误************************************************************/
WriteCMD(0x80+5);
LCD_write_string(TimeNum);//显示处理过后的码值
delay(1);
WriteCMD(0x80+40);
LCD_write_string("KEY:");
WriteCMD(0x80+0x40+0x04);
switch(IRcord[2])
{
case 0xb6:LCD_write_string("1");break;
default:break;
delay(1);
}
irpro_ok=0; //处理完成后清楚标志位
}
/******************************************************************/
/*定时器2初始化*/
/******************************************************************/
void Time2_EXF2 (void) interrupt 5 //T2EX中断
{
static unsigned char i; //接收红外信号处理
static bit startflag; //是否开始处理标志位
if(TF2)
{irtime++; //有多少个256us、用于计数2个下降沿之间的时间
void Time2_init()
{
EA=0;
T2MOD &= 0xFC;/* T2OE=0;定时器2输出不允许*/
T2MOD |= 0x00;/* DCEN=0才能引起EXF2的中断*/
EXF2=0;/* reset flag定时器2外部标志位清除*/
TF2=0;/*清除T2的溢出标志*/
TCLK=0;RCLK=0;/* disable baud rate generator不用于波特率发生器*/
/*红外键值处理*/
/******************************************************************/
void Ir_work(void) //红外键值散转程序irpro_ok=1
{
TimeNum[0] = Tab[IRcord[0]/16]; //处理客户码并显示
/*红外解码函数处理*/
/******************************************************************/
void Ircordpro(void)//红外码值处理函数//irok=1
{
unsigned char i, j, k;
unsigned char cord,value;
EXEN2=1;/* ignore events on T2EX视T2EX(P1.1)端信号有效、允许T2EX产生捕获*/
TH2 = (65536-256)/256;/*T2初始值*/
TL2 = (65536-256)%256;
C_T2=0;/* timer mode定时模式*/
CP_RL2=1;/* reload mode不重载模式--要捕获*/
case 0x2e:LCD_write_string("Left");break;
case 0x2a:LCD_write_string("Right");break;
case 0x17:LCD_write_string("Power");break;
case 0x21:LCD_write_string("Ok");break;
TimeNum[1] = Tab[IRcord[0]%16];
TimeNum[3] = Tab[IRcord[1]/16]; //处理客户码并显示
TimeNum[4] = Tab[IRcord[1]%16];
TimeNum[6] = Tab[IRcord[2]/16]; //处理数据码并显示
TimeNum[7] = Tab[IRcord[2]%16];
{
Ir_work();
}
}
}
/******************************************************************/
/*定时器2中断服务函数及其捕获服务程序*/
/******************************************************************/
}
else//低电平
{
value=value;
}
if(j<8)
{
value=value>>1;
}
k++;
}
IRcord[i]=value;//4个字节的数据
value=0;
} irpro_ok=1;//处理完毕标志位置1
}
/******************************************************************/
TH2 = (65536-256)/256;/*T2重载值*/
TL2 = (65536-256)%256;
TF2 = 0;/*手动清除T2的溢出标志*/
}
if(EXF2)/* reset interrupt flag复位中断标志位*/
{
if(startflag)
{
if(irtime&2的头码,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;}
EXF2=0;/*手动清除T2的外部标志*/
}
}
void main(void)
{
Time2_init();
LCD_init(); //初始化液晶
delay(1);
while(1)//主循环
{
if(irok) //如果接收好了进行红外处理
{
Ircordpro();
irok=0;
}
if(irpro_ok) //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
/*函数声明*/
/******************************************************************/
unsigned char irtime;//红外用全局变量
bit irpro_ok,irok;
unsigned char irdata[33]; //33个高低电平的时间数据
TimeNum[9] = Tab[IRcord[3]/16]; //处理数据反码并显示
TimeNum[10] = Tab[IRcord[3]%16];
WriteCMD(0x01);
WriteCMD(0x80);
LCD_write_string("code:");//显示处理过后的码值
delay(1);
case 0x01:LCD_write_string("2");break;
case 0x02:LCD_write_string("3");break;
case 0x28:LCD_write_string("Up");break;
case 0x2c:LCD_write_string("Down");break;
#include<regx52.h>
#include "delay.h"//此处省去
#include "lcd.h"//此处省去
//sbit IR=P1^1; //红外接口标志
char code Tab[16]="0123456789ABCDEF";
char data TimeNum[]=" ";
/******************************************************************/
k=1;
for(i=0;i<4;i++) //处理4个字节
{
for(j=1;j<=8;j++) //处理1个字节8位
{
cord=irdata[k];
if(cord>7)//0.256*7=1.79ms,大于此为高电平,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
{
value=value|0x80;
ET2=1;/* enable timer2 interrupt允许T2中断*/
TR2=1;/* timer2 run开始计时*/
EA=1;/* interupt enable中断允许*/
}
/******************************************************************/
unsigned char IRcord[4]; //处理后的红外码,分别是客户码,客户码,数据码,数据码反码
相关文档
最新文档