这个是红外解码程序:
/***********************************************************************/
/***********************************************************************/
/*************************** ****************************/
/***********************************************************************/
/************************** ***************************/
/************************** ***************************/
/***********************************************************************/
/***********************************************************************/
/************************ ************************/
/************************ 红外遥控 C语言程序 ************************/
/************************ ************************/
/***********************************************************************/
/***********************************************************************/
/***********************************************************************/
//数码管后2位显示机器码,前2位显示键值。晶振最好用11.0592M,当键值为0xb9的,继电器动作。
/***********************************************************************/
#include
#include
void beep();
void SystemInit(void);
void Delay_840us(void);
void Delay_2400us(void);
void LedDisp();
unsigned char GetCode(void);//获得码
void delay(unsigned char loop);
sbit IRIN = P3^2;
sbit BEEP = P1^6;
sbit swch = P1^7;
unsigned char KeyValue;//机器码
unsigned char MaValue;//键值码;
unsigned char disbuf[4];//数码管显示缓冲
unsigned char scan[4]={0x04,0x08,0x10,0x20};//p2位选择
unsigned char code table[16] =//共阴码
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7C,0x39,0x5E,0x79,0x71};
void beep()//蜂鸣器
{
unsigned char i;
for (i=0;i<100;i++)
{
delay(5);
BEEP=~BEEP;
}
BEEP=0;
}
void delay(unsigned char loop) //us延时
{ unsigned char i;
for(i=0;i
void Delay_840us(void)
{ TL1=-774;
TH1=((-774)>>8);
TR1=1;
while(!TF1);
TF1=0;
TR1=0;
}
void Delay_2400us(void)
{ TL1=-2212;
TH1=((-2212)>>8);
TR1=1;
while(!TF1);
TF1=0;
TR1=0;
}
void SystemInit(void)
{//P1=0xff;
IRIN=1;
BEEP=1;
IE=0x81; //使能INT0 EX0=1;
IT0=1; //INT0负跳变触发
TMOD=0x10; //定时器1工作在方式1
EA=1;
EX0=1;
}
unsigned char GetCode()//读码:
{ unsigned char n;
static temp=0;
for(n=0;n<8;n++)
{ while(!IRIN);
Delay_840us();
if(IRIN) //0
{ temp=(0x80|(temp>>1));
while(IRIN);
}
else temp=(0x00|(temp>>1));//1
}
return temp;
}
void LedDisp()
{ unsigned char i;
for(i=0;i<4;i++)
{
P0=table[disbuf[i]];
P2 = scan[i];
delay(50);
P0=0x00;
}
}
void main(void)
{
SystemInit();
BEEP =0;
while(1)
{ //以下是查表显示
disbuf[0]=(((KeyValue&0xf0)>>4)&0x0f);
disbuf[1]=KeyValue&0x0f;
disbuf[2]=(((MaValue&0xf0)>>4)&0x0f);
disbuf[3]=MaValue&0x0f;
LedDisp();
}
}
void int0_irq(void) interrupt 0
{ unsigned char n;
unsigned char Count=0;
unsigned char addrl,addrh,num1,num2;
EA=0;
for(n=10;n>0;n--) //检测9ms开始码
{ Delay_840us();
if(IRIN)
{ Count++;
break;
}
}
if(Count)
{ //KeyValue=Count;
EA=1;
return;
}
while(!IRIN);
Delay_2400us(); //4.5ms结果码
if(!IRIN)
{EA=1;return;}
Delay_2400us();
addrl=GetCode();
addrh=GetCode();
num1=GetCode();
num2=GetCode();
if(num1!=~num2)//错码;
{ KeyValue=14;
EA=1;
return;
}
KeyValue=num2;
MaValue=addrh;
beep();
if( KeyValue==0xb9 ) swch=~swch;
EA=1;
}
1602液晶程序:
#include
#define uint unsigned int
#define uchar unsigned char
sbit lcdrs=P2^2;
sbit lcdrw=P2^3;
sbit lcden=P2^4;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}//1毫秒左右延时
//lcdwrite() LCD写指令
void lcdwrite(uchar write)
{
lcdrs=0;
P0=write;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
//lcdshuju() LCD写数据
void lcdshuju(uchar shuju)
{
lcdrs=1;
P0=shuju;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
//lcdon() LCD显示初始化
void lcdon()
{
lcden=0;
lcdwrite(0x38);//显示模式
lcdwrite(0x0c);//开显示,光标不闪烁
lcdwrite(0x06);//光标设置
lcdwrite(0x01);
}
程序都没有问题,我都测试过,自己研究下,在主程序里面调用就可以了;别人的程序只能用来参考,真正最适合你自己的程序只能自己看明白,然后自己编译修改,如果有不明白我可以帮你,注意一些细节,相信你可以的。
我研究了3个星期才彻底搞明白的,哈哈,你加点油就OK了,3个星期还早呢