按键红外远程控制继电器.docx
《按键红外远程控制继电器.docx》由会员分享,可在线阅读,更多相关《按键红外远程控制继电器.docx(8页珍藏版)》请在冰豆网上搜索。
按键红外远程控制继电器
//tool.h头文件,sheng制作
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitR_Red=P3^2;//HS0038接收头OUT端直接连P3.2(INT0)
sbitLed=P2^0;//指示灯
//输入按钮定义
sbitSB1=P3^0;//SB1
sbitSB2=P3^4;//SB2
sbitSB3=P3^7;//SB3
//wify模块引脚定义
//sbitWify_rst=P1^0;
sbitWify_K1=P1^0;//连接
sbitWify_A1=P1^1;
sbitWify_A2=P1^2;
sbitWify_Contral=P1^3;//控制权获取
//输出模块
sbitKA1=P2^4;
sbitKA2=P2^5;
sbitKA3=P2^6;
sbitKA4=P2^7;
//延时ms
voiddelayms(uintx)
{
uchara;
while(x--)
for(a=123;a>0;a--);
}
/****************************1ms延时子程序************************/
voidDelay1ms()
{uchari,j;
for(i=2;i>0;i--)
for(j=230;j>0;j--);
}
/****************************0.9ms延时子程序************************/
voidDelay0_9ms()
{
ucharj,k;
for(j=18;j>0;j--)
for(k=20;k>0;k--);
}
/**************************2.5ms延时子程序**********************/
voidDelay2_5ms()
{
uchari,j;
for(i=10;i>0;i--)
for(j=118;j>0;j--);
}
ucharKey_Scan()//独立键盘检测
{
//读数准备
SB1=SB2=SB3=1;
if(SB1==0||SB2==0||SB3==0)//可能有其它一个按下
{
delayms(10);//去抖
if(SB1==0)//SB1按下
{while(!
SB1);return1;}
elseif(SB2==0)//SB2按下
{while(!
SB2);return2;}
elseif(SB3==0)//SB3按下
{while(!
SB3);return3;}
else
return0;
}
else
return0;
}
//运行文件
#include"mytool.h"
chardataIRcode[4];//定义一个4字节的数组用来存储代码
ucharCodeTemp;//编码字节缓存变量
uchari,j,k;//延时用的循环变量,读取位和字节
bitMotor_FWD;//电机正转
bitMotor_REV;//电机反转
bitMotor_STOP;//电机停止
bitMotor_FWD_SB;//电机正转,按钮专用
bitMotor_REV_SB;//电机反转,按钮专用
bitMotor_STOP_SB;//电机停止,按钮专用
bitFinsh_re;//中断收完四字节数据
intmain(void)
{
uchari,j;//一般变量
uchartemp;//键盘暂存
ucharSB_data[4];//红外按键录处数据
bittest_ok;
bitIf_Wify;
bitreline_if;//是否用红外功能
P2=0x00;
P1=0x00;
/***************中断相关*******************/
EA=1;//开中断
ET1=1;
IT0=1;//INT0为负边沿触发,(1:
负边沿触发,0:
低电平触发)
EX0=1;//外部中断INT0开,(1:
开,0:
关)
/***************中断相关*******************/
CodeTemp=0;//初始化红外编码字节缓存变量
Motor_FWD=Motor_REV=Motor_STOP=0;//输出继电器初始化动作变量
Wify_A1=Wify_A2=Wify_Contral=0;
If_Wify=0;//是否远程控制
Led=0;//指示灯不亮
reline_if=0;//初始化关闭红外
test_ok=0;
j=0;
SB_data[0]=SB_data[1]=SB_data[2]=SB_data[3]=0;
Finsh_re=0;
for(i=12;i>0;i--){Led=~Led;delayms(300);}//灯闪表示作准备
Led=0;//准备就绪,灯长亮
for(i=0;i<4;i++)IRcode[i]=0x00;
while
(1)
{
temp=Key_Scan();//键盘检
//红外检测
if(Finsh_re==1&&j<4)
{
if(IRcode[2]!
=0)
{
if(j==0)
{
SB_data[j]=IRcode[2];
IRcode[2]=0x00;
j++;
Finsh_re=0;
for(i=4;i>0;i--){Led=~Led;delayms(300);}//灯闪表示作准备
}
if(j>=1&&IRcode[2]!
=0x00)
{
if(IRcode[2]!
=SB_data[j-1])//不同按键
{
SB_data[j]=IRcode[2];
IRcode[2]=0x00;
j++;
Finsh_re=0;
for(i=4;i>0;i--){Led=~Led;delayms(300);}//灯闪表示作准备
}
}
}
}
if(IRcode[2]==SB_data[3])reline_if=!
reline_if;//红外之间转换
if(j>=4&&reline_if==1)//已经录入红外
{
if(IRcode[2]==SB_data[0]){Motor_FWD=0;Motor_REV=0;Motor_STOP=1;}
if(IRcode[2]==SB_data[1]){Motor_FWD=1;Motor_REV=0;Motor_STOP=0;}
if(IRcode[2]==SB_data[2]){Motor_FWD=0;Motor_REV=1;Motor_STOP=0;}
}
/*****键盘输入*****/
if(temp==1){Motor_FWD_SB=0;Motor_REV_SB=0;Motor_STOP_SB=1;}
if(temp==2){Motor_FWD_SB=1;Motor_REV_SB=0;Motor_STOP_SB=0;}
if(temp==3){Motor_FWD_SB=0;Motor_REV_SB=1;Motor_STOP_SB=0;}
/*****WIFY输入*****/
if(Wify_Contral)
{
Led=1;
if(Wify_A1==0&&Wify_A2==0){Motor_FWD=0;Motor_REV=0;Motor_STOP=1;}
if(Wify_A1==1&&Wify_A2==0){Motor_FWD=1;Motor_REV=0;Motor_STOP=0;}
if(Wify_A1==0&&Wify_A2==1){Motor_FWD=0;Motor_REV=1;Motor_STOP=0;}
}
/*****输出*****/
if(Motor_FWD||Motor_FWD_SB){KA1=1;KA2=0;}
if(Motor_REV||Motor_REV_SB){KA1=0;KA2=1;}
if(Motor_STOP||Motor_STOP_SB){KA1=0;KA2=0;}
}
return0;
}
/************************中断0解码服务子程序**********************/
voidint0(void)interrupt0using2
{
EA=0;
for(k=0;k<10;k++)
{
Delay0_9ms();
if(R_Red==1)//如果0.9ms后R_Red=1,说明不是引导码
{
k=10;
break;
}
elseif(k==9)//如果持续了10×0.9ms=9ms的低电平,说明是引导码
{
while(R_Red==0);
Delay2_5ms();
if(R_Red==0)//连发码
break;//边发跳出
else
Delay2_5ms();//跳过持续4.5ms的高电平
for(i=0;i<4;i++)//分别读取4个字节
{
for(j=1;j<=8;j++)//每个字节8个bit的判断
{
while(R_Red==0);//等待上升沿
Delay0_9ms();//从上升沿那一时刻开始延时0.9ms,再判断R_Red
if(R_Red==1)//如果R_Red是"1",则向右移入一位"1"
{
Delay1ms();
CodeTemp=CodeTemp|0x80;
if(j<8)
CodeTemp=CodeTemp>>1;
}
else
if(j<8)CodeTemp=CodeTemp>>1;//如果R_Red是"0",则向右移一位,自动补"0"
}
IRcode[i]=CodeTemp;
CodeTemp=0;
}
Finsh_re=1;
k=0;
}
}
EA=1;
}