//STC 15F104W
#include
#define TURE 1
#define FALSE 0
sbit IR=P3^2;//红外接口标志
sbit Relay=P3^4;//继电器1输出端口
sbit Buzzer=P3^3;//蜂鸣器
sbit Key=P3^5;//按键
unsigned char irtime;//红外用全局变量
unsigned char i;
bit flag;
bit irpro_ok,irok;
unsigned char IRcord[4];
unsigned char irdata[33];
void Delay(unsigned char mS); //声明函数延时函数
void Ir_work(void); //声明函数红外工作函数
void Ircordpro(void);//声明函数红外处理函数
void Keyscan(void)//键盘扫描
{
if(!Key)//按键按下则开关电气
{
Delay(10);//去抖
if(!Key)
{
while(!Key)
{};
Delay(10);//去抖
while(!Key)
{};
{
Relay=!Relay;
Buzzer=!Buzzer;
Delay(500);
Buzzer=!Buzzer;
}
}
}
}
void Delay(unsigned char mS)//延时声明
{
unsigned char us,usn;
while(mS!=0)
{
usn = 4;
while(usn!=0)
{
us=0xf0;
while (us!=0) {us--;};
usn--;
}
mS--;
}
}
void tim0_isr (void) interrupt 1 using 1//定时器声明
{
irtime++;
}
void ex0_isr (void) interrupt 0 using 0//外部中断声明
{
static unsigned chari;//接收红外信号处理
static bit startflag;//是否开始处理标志位
if(startflag)
{
if(irtime<63&&irtime>=33)//引导码 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;
}
}
void TIM0init(void)//定时器0初始化
{
TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
TH0=0x00;//reload value
TL0=0x00;//initial value
ET0=1;//开中断
TR0=1;
}
void EX0init(void) //外部定时初始化
{
IT0 = 1; //INT0 (P3.2)
EX0 = 1; //Enable EX0 Interrupt
EA = 1;
}
void main(void) //主函数
{
Relay=1;
Buzzer=0;
Key=1;
EX0init(); // 初始化
TIM0init();
while(1)//主循环
{
Keyscan();//按键扫描
if(irok)
{
Ircordpro();
irok=0;
}
if(irpro_ok)//处理遥控信号
{
Ir_work();
}
}
}
void Ir_work(void)//红外处理,此值可修改
{
switch(IRcord[2])//仅判断其中1个数据,如果防止串码,需要同时对比4个字节数据
{
case 0x02: Relay=!Relay; // 0x02 红外遥控 用户码 可自行更改
Delay(10);
Buzzer=!Buzzer;
Delay(500);
Buzzer=!Buzzer;
Delay(400);
Buzzer=!Buzzer;
Delay(500);
Buzzer=!Buzzer;
break;
default:break;
}
irpro_ok=0;
IRcord[1]=0;//清除值,防止误码
IRcord[2]=0;
}
void Ircordpro(void)//红外码值处理函数
{
unsigned char i, j, k;
unsigned char cord,value;
k=1;
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………