📄 receive.c
字号:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
bit begin;//开始解码标志位
uint time;
uchar num=0;//数脉冲个数
unsigned char addrh,addrl;//接收地址
unsigned char key;//接收数据
void init()
{
INT0=1;
TMOD=0x01;
TH0=0;
TL0=0;
EA=1; //开总中断
EX0=1; //开外部中断
IT0=1; //跳变沿触发中断
}
void main()
{
init();
begin=0;
P2=0x00;
P1=0x00;
while(1)
{
//P2=addrh;
P1=addrl;
P2=key;
}
}
void accept_tongbu() interrupt 0
{
static unsigned char tempaddrl,tempaddrh;//接收地址缓存
static unsigned char tempkey;//接收数据缓存 EX0=0;
TR0=1;
while(!INT0); //等待低电平结束
TR0=0;
time=(TH0<<8)+TL0;
if((time>14000)&&(time<18000)) //检测同步码 同步码16 500us
{
TH0=0;TL0=0;
EX0=1;//关闭外部中断
}
else
{
TH0=0;TL0=0;
EX0=1;
begin=1;
}
if(begin)//开始解码了
{
if(num<8)//接收地址码低八位
{
tempaddrl=tempaddrl>>1;//将接收的到最低位移到最高位
if(time<800)//1000为宽脉冲与低脉冲界线,当振荡电阻为1M时,窄脉冲为110uS,宽脉冲为320uS
{
tempaddrl|=0x80;//宽脉冲为1
}
num++;//中断次数加1
}
else if(num<16)//接收地址码高八位
{
tempaddrh=tempaddrh>>1;//将接收的到最低位移到最高位
if(time<800)//210为宽脉冲与低脉冲界线,当振荡电阻为1M时,窄脉冲为110uS,宽脉冲为320uS
{
tempaddrh|=0x80;//宽脉冲为1
}
num++;//中断次数加1
}
else if(num<24)//接收数据码
{
tempkey=tempkey>>1;
if(time<800)
{
tempkey|=0x80;
}
num++;
}
else//cntint大于24也就是中断了25次时,关闭外部中断0,等待同步码
{
TH0=0;
TL0=0;
EX0=1;
time=0;
num=0;
begin=0;
addrh=tempaddrh;
addrl=tempaddrl;
key=tempkey;
tempaddrh=0;
tempaddrl=0;
tempkey=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -