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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
while(1)
{
}
}
void inter0() interrupt 0 //开始解码
{
EX0=0;//关闭外部中断0,不再接受红外信号,只解码当前的红外信号。
dingshiqi();//定时器记高低电平时间,引导码
if((LowTime>8500)&&(LowTime<9500)&&(HighTime>3600)&&(HighTime<5000))
rs=0;
lcden=0;
P2=com;
delay(3);
lcLeabharlann Baiduen=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()//初始化按键
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"};
case 0x47:c=1;//CH+
break;
case 0x44:d=1;//<<<<
break;
case 0x40:e=1;//>>>>
break;
case 0x43:f=1;//>>||
break;
case 0x07:g=1;//-
break;
case 0x15:h=1;//+
break;
case 0x09:i=1;//EQ
temp=temp|0x80;
}
z[i]=temp;//将解码出的字节值储存在a[i]
}
if(z[2]=~z[3])
{
led2=~led2;
x=z[2];
init_anjian();
switch(x)
{
case 0x45:a=1;//CH-
break;
case 0x46:b=1;//CH
break;
while(ir==0);//如果是低电平就等待,给低电平计时
TR0=0;//关闭定时器T0
LowTime=TH0*256+TL0;//保存低电平时间
TH0=0;//定时器高八位置0
TL0=0;//定时器低八位置0
TR0=1;//开启定时器0
while(ir==1);//如果是高电平就等待,给引导码高电平计时
{
temp=temp>>1; //最先读出的是高位数据
dingshiqi();//定时器记高低电平时间,数据码
if((HighTime>300)&&(HighTime<900)) //说明该位是0
temp=temp&0x7f;
if((HighTime>1200)&&(HighTime<2200)) //说明该位是1
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
void dingshiqi()//定时器记高低电平时间
{
TH0=0;//定时器高八位置0
TL0=0;//定时器低八位置0
TR0=1;//开启定时器0
{
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液晶初始化
红外遥控解解码程序
#include <reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P1^0;
sbit rs=P1^2;
sbit ir=P3^2;
sbit led=P1^3;
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);
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)
{//写液晶命令函数
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;
break;
case 0x19:j=1;//100+
break;
case 0x0d:k=1;//200+
break;
case 0x16:l=1;//0
break;
case 0x0c:m=1;//1
//如果是引导码,就开始解码,否则放弃,引导码的低电平计时
//次数=9000us/1=9000,判断区间:(8300-500=7800,8300+500=8800)
{
uchar i,j;
uchar temp;
//led=~led;
for(i=0;i<4;i++) //连续读取4个用户码和键功能码
{
for(j=0;j<8;j++)//每个码有8位数字
TR0=0;//关闭定时器T0
HighTime=TH0*256+TL0;//保存高电平长度
}
void main()
{
char i=0;
TMOD=0x01;//定时器T0作为定时模式
ET0=1;//开T0中断
IT0=0;//外部中断,下降沿触发
EX0=1;//开外部中断
EA=1;//开总中断
init_1602();
相关文档
最新文档