按键红外远程控制继电器.docx

上传人:b****3 文档编号:3895691 上传时间:2022-11-26 格式:DOCX 页数:8 大小:16.28KB
下载 相关 举报
按键红外远程控制继电器.docx_第1页
第1页 / 共8页
按键红外远程控制继电器.docx_第2页
第2页 / 共8页
按键红外远程控制继电器.docx_第3页
第3页 / 共8页
按键红外远程控制继电器.docx_第4页
第4页 / 共8页
按键红外远程控制继电器.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

按键红外远程控制继电器.docx

《按键红外远程控制继电器.docx》由会员分享,可在线阅读,更多相关《按键红外远程控制继电器.docx(8页珍藏版)》请在冰豆网上搜索。

按键红外远程控制继电器.docx

按键红外远程控制继电器

//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;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1