📄 rem.c
字号:
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#include <reg51.h>
#include <mylib.h>
sbit prem=P3^3; //定义遥控接收脚
uchar remkey; //设置四个遥控数据区域,前两个为用户自定义代码,后两个为实际接受的数据
bit relable; //其中前两个字节实测相等,后两个字节正好相反,以此作为遥控数据正确性效验。
void rem()interrupt 2
{uchar ram[4]={0,0,0,0};
uchar i; //干扰脉冲检测记数
uchar count; //移位控制记数
uchar ramc;
if(relable)
return; //遥控接收数据数组下标
for(i=0;i<30;i++);
{
delay(1);
if(prem) //刚开始的引导码为4.5MS的低电平,如果在此期间出现高电平则视为干扰脉冲,退出中断
return;
}
while(prem!=1); //引导码4.5MS低电平之后应为4.5MS的引导高电平,此处为等待高电平的到来。
delay(46); //延时大概4.6MS正好跨过4.5MS的引导高电平而进入32位数据的第一位。
for(ramc=0;ramc<4;ramc++)//从此处开始进入32位4个字节的遥控数据接收,此处的外循环为字节切换
for(count=0;count<8;count++)//以下将接收到的数据移位到数组的每一个单元
{
while(prem!=1); //实际上逻辑1和逻辑0都是以0.56MS的低电平开始,所不同的是高电平的延长时间,高电平延长时间为1.6MS的是1,高电平为0.56MS的是0。第21行的延时语句已经进入逻辑0和逻辑1的公共特性区(0.56MS的低电平区)此处的语句将等待高电平的到来,以便以高电平的长短来区分1和0。
delay(8); //延时0.8MS后判断遥控接收脚的电平以此判断0或1,此处的延时应高于0.56MS而小于1.12MS
if(prem==1)
{
ram[ramc]=(ram[ramc]<<1)+1;//如果是遥控接收脚是高电平,将1移入当前单元。
delay(10); //延时1MS跨入下一个遥控发射码逻辑1,或0的低电平
}
else
ram[ramc]=(ram[ramc])<<1; //如果是遥控接收脚是低电平,将0移入当前单元。
} //因为是接收到逻辑0,所以26行的延迟已经足够进入下一个遥控发射码逻辑1,或0的低电平。
if(ram[3]!=(~ram[2]))//32位数据接收完后进行后两个字节的效验,发生错误将4个字节清零,
{ram[0]=0;
ram[1]=0;
ram[2]=0;
ram[3]=0; //很有必要进行校验,因为由于遥控器和接收头的空间位置的变化经常造成接收数据的错误。
return;
}
remkey=ram[3];
} //接收成功后数据存放在数组ram(只用后两个单元的任何一个就行了
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -