这是我的地第一篇博客,我也不知道该怎么样的格式去写,所以有不当之处还请海涵一二~~。这是我在今年暑假期间写的一个小程序,在大一下学期一直在学51单片机,所以在暑假的时候也就尝试着写这个红外解码的程序了,当时不知道该如何下手去,经过了查找大量的资料终于是可以入手去写了。在写的过程中也出现了很多问题,但是在仔细的琢磨下最终还是解决了,今天就在者分享一下源码~
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
unsigned char a[4],aa,bb;
unsigned int LowTime,HighTime;
sbit IR=P3^2;
sbit duan=P2^6;
sbit wei=P2^7;
sbit lcdrs = P1^0; //定义端口
sbit lcdrw= P1^1;
sbit lcden= P2^5;
bit DeCode(void)
{
unsigned char i,j;
unsigned char temp;
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
temp=temp>>1;
TH0=0;
TL0=0;
TR0=1;
while(IR==0);
TR0=0;
LowTime=TH0*256+TL0;
TH0=0;
TL0=0;
TR0=1;
while(IR==1);
TR0=0;
HighTime=TH0*256+TL0;
if((LowTime<400)||(LowTime>750)) return 0;
if((HighTime>470)&&(HighTime<550)) temp=temp&0x7f;
if((HighTime>1480)&&(HighTime<1600)) temp=temp|0x80;
}
a[i]=temp;
}
if(a[2]==~a[3]) return 1;
}
void delay(uchar z) //延时函数
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void write_com(uchar com)
{
lcdrs=0;
lcdrw=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
lcdrw=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
duan=0;
wei=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void main()
{
EA=1;
EX0=1;
ET0=1;
TMOD=0x01;
TR0=0;
while(1);
}
void jiema(uchar x)
{
aa=x/16;
bb=x%16;
}
void zhoduan() interrupt 1
{
uchar temp;
EX0=0;
TH0=0;
TL0=0;
TR0=1;
while(IR==0);
TR0=0;
LowTime=TH0*256+TL0;
TH0=0;
TL0=0;
TR0=1;
while(IR==1);
TR0=0;
HighTime=TH0*256+TL0;
if((LowTime>7500)&&(LowTime<9000)&&(HighTime>3500)&&(HighTime<5000))
{
if(DeCode()==1)
{
init();
write_com(0x80+0x04);
temp=a[2];
jiema(temp);
if(aa>=10)
aa=(aa+55);
else
aa=aa+48;
if(bb>=0xa)
bb=bb+55;
else
bb=bb+48;
write_data(aa);
write_data(bb);
}
}
EX0=1;
}