|
/****************************************************************
程序功能:
红外解码试验,遥控控制LED小灯的亮灭
*******************************************************************/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit RIdata=P3^2;
sbit s1=P1^0;
sbit s2=P1^1;
sbit s3=P1^2;
sbit bee=P1^7;
#define SMG P0
sbit led1=P2^0;
sbit led2=P2^1;
sbit led3=P2^2;
sbit led4=P2^3;
uchar smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};
uchar Displaydata[3];
uchar IrValue[4];
void Red_Decode_Init();
void Smg_Display();
void delay(uint t)
{
while(t--);
}
void main()
{
uint t;
Red_Decode_Init();
while(1)
{
Displaydata[0]=smgduan[IrValue[2]/16];
Displaydata[1]=smgduan[IrValue[2]%16];
Displaydata[2]=smgduan[16];
Smg_Display();
if(IrValue[2]==0x0c) //按数字1,第一个LED灯亮
{
led1=0;
}
if(IrValue[2]==24) //按数字2,第二个LED灯亮
{
led2=0;
}
if(IrValue[2]==94) //按数字3,第三个LED灯亮
{
led3=0;
}
if(IrValue[2]==8) //按数字4,第四个LED灯亮
{
led4=0;
}
if(IrValue[2]==28) //按数字5,蜂鸣器
{
bee=1;
delay(10000);
bee=0;
delay(1000)
bee=1;
delay(10000);
bee=0;
delay(5000);
}
if(IrValue[2]==0x5a) //按数字6,第一个LED灯灭
{
led1=1;
}
if(IrValue[2]==0x42) //按数字7,第二个LED灯灭
{
led2=1;
}
if(IrValue[2]==0x52) //按数字8,第三个LED灯灭
{
led3=1;
}
if(IrValue[2]==0x4a) //按数字9,第四个LED灯灭
{
led4=1;
}
if(IrValue[2]==0x45) //按电源键,所有LED灯灭
{
led1=1;
led2=1;
led3=1;
led4=1;
bee=0;
}
}
}
void Red_Decode_Init() //初始化 中断打开
{
IT0=1;
EX0=1;
EA=1;
}
void Decode() interrupt 0
{
uchar j,k;
uint err,time;
delay(700);
if(RIdata==0)
{
err=1000;
while(RIdata==0&&err>0)
{
delay(1);
err--;
}
if(RIdata==1) //转为高电平没有持续4.5ms是否算正确?
{
err=500;
while(RIdata==1&&err>0)
{
delay(1);
err--;
}
}
//已经确认收到了起始信号
for(k=0;k<4;k++)
{
for(j=0;j<8;j++)
{
err=60;
while(RIdata==0&&err>0)
{
delay(1);
err--;
}
err=500;
time=0;
while(RIdata==1&&err>0)
{
delay(10);
time++;
err--;
if(time>30)
{
return;
}
}
IrValue[k]>>=1;
if(time>8)
IrValue[k]|=0x80;
}
}
if(IrValue[2]!=~IrValue[3])
{
return;
}
}
}
void Smg_Display() //数码管显示
{
uchar i;
for(i=0;i<3;i++)
{
switch(i)
{
case 0: s3=0; s2=0; s1=0; break;
case 1: s3=0; s2=0; s1=1; break;
case 2: s3=0; s2=1; s1=0; break;
}
SMG=Displaydata[i];
delay(100);
SMG=0X00;
}
} |
|