资讯详情

C51单片机红外遥控控制继电器源程序

#include //头文件包含单片机寄存器

sbit IR=P3^2; //将IR位定义为P3.2引脚

unsigned char a[4]; //存储用户代码、用户反码和键数据代码

unsigned int LowTime,HighTime; ///储存高低电平的宽度

sbit Relay=P1^3; //将Relay位定义为P1.3引脚

/************************************************************

函数功能:解码4个字节的用户码和键数据码

说明:解码正确,返回1,否则返回0

出口参数:dat

*************************************************************/

bit DeCode(void)

{

unsigned chari,j;

unsigned char temp; ///存储解码的数据

for(i=0;i<4;i ) ///连续读取4个用户码和键数据码

{

for(j=0;j<8;j )///每个代码有8位数字

{

temp=temp>>1;//temp每个数据都向右移动,因为高位数据首先被读取

TH0=0; ///定时器清0

TL0=0; ///定时器清0

TR0=1; ///打开定时器T0

while(IR==0) //如果是低电平,等待

; ///低电平计时

TR0=0; ///关闭定时器T0

LowTime=TH0*256 TL0; //保持低电平宽度

TH0=0; ///定时器清0

TL0=0; ///定时器清0

TR0=1; ///打开定时器T0

while(IR==1) //如果是高电平,等待

;

TR0=0; //关闭定时器T0

HighTime=TH0*256 TL0; //保持高电平宽度

if((LowTime<370)||(LowTime>640))

return 0; //如果低电平长度不在合理范围内,则认为错误,停止解码

if((HighTime>420)&&(HighTime<620)) //如果高电平时间约为560微秒,则计数为560/1.085=516次

temp=temp&0x7f; //(520-100=420, 520 100=620)

if((HighTime>1300)&&(HighTime<1800)) //如果高电平时间约为1680微秒,则计数为1680/1.085=1548次

temp=temp|0x80; //(1550-250=1300,1550 250=1800),则该位是1

}

a[i]=temp; ///存储解码字节值a[i]

}

if(a[2]=~a[3])///验证键数据码是否等于其反码,一般不需要验证用户码

return 1; ///解码正确,返回1

}

/************************************************************

函数功能:执行遥控功能

*************************************************************/

void Function(void)

{

Relay=!Relay; //对P1.3引脚取反,控制继电器的吸合、释放

}

/************************************************************

函数功能:主函数

*************************************************************/

void main()

{

EA=1; //打开总中断

EX0=1; ///开外中断0

ET0=1; //定时器T0中断允许

IT0=1; ///外中断沿触发下降

TMOD=0x01; //使用定时器T0的模式1

TR0=0; //定时器T0关闭

while(1) ///等待红外信号中断

;

}

/************************************************************

函数功能:红外触发的外部中断处理函数

*************************************************************/

void Int0(void) interrupt 0 using 0

{

EX0=0; ///关闭外中断0,不再接收二次红外信号中断,只解码当前红外信号

TH0=0; //定时器T0的高8位清0

TL0=0; //定时器T0的低8位清0

TR0=1; ///打开定时器T0

while(IR==0) //如果是低电平,等待并计时低电平引导码

;

TR0=0; ///关闭定时器T0

LowTime=TH0*256 TL0;//保存低电平时间

TH0=0; //定时器T0的高8位清0

TL0=0; //定时器T0的低8位清0

TR0=1; ///打开定时器T0

while(IR==1)///如果是高电平,等待并计时引导码高电平

;

TR0=0; ///关闭定时器T0

HighTime=TH0*256 TL0; ////保存导码的高电平长度

……………………

…………本文篇幅有限 请从51黑下载剩余代码…………

标签: 低电平使继电器吸合的原因j917继电器tr50继电器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台