📄 2262test.txt
字号:
#include<reg52.h>
#define uchar unsigned char
void display();
void delay_1s(uchar);
bit T0Action;
bit Action;
bit RECEIVE; //接收标志
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_7=P1^7; //接收脚
sbit P3_5=P3^5; //发光二极管
sfr AUXR =0x8E;
sfr P1M0 =0x91;
sfr P1M1 =0x92;
sfr P3M0 =0xb1;
sfr P3M1 =0xb2;
void main()
{
uchar i;
uchar temp,data0,data1,counttime;
unsigned int time,time1,time2;
// AUXR=0x80; //定时器0不分频
T0Action=0;
RECEIVE=0; //接收标志位
Action=0;
TMOD = 0x01; // 定时器0 工作方式1
TH0=0x00;
TL0=0x00;
P1_0=0;
P1_1=0;
P1_2=0;
P1_3=0;
P3_5=0;
while(1)
{
do{}while(P1_7==1);
if((P1_7==0) && (T0Action==0)) //等待低电平,低电平开始记时
{
TR0=0;
TH0=0x00;
TL0=0x00;
TF0=0;
TR0=1;
T0Action=1;
while(1)
{
if((P1_7==1) && (T0Action==1))
{
TR0=0;
time=TH0*256+TL0; //记下低电平宽度时间
T0Action=0;
break;
}
}
}
if((time>9000) && (time<12000)) //检测同步码约11ms
{
counttime=0;
data0=0;
data1=0;
time=0;
RECEIVE=1; //检测到同步码时 置标志位 RECEIVE=1
P3_5=1; //绿发光二极管灯亮(调试用)
}
if(RECEIVE==1) //检测到同步码后开始解码
{
RECEIVE=0;
while(1)
{
L1:do{}while(P1_7==1);
if((P1_7==0) && (T0Action==0)) //等待第一个低电平,一有低电平马上记时
{
TR0=0;
T0Action=1;
TH0=0x00;
TL0=0x00;
TF0=0;
TR0=1;
while(1)
{
if((P1_7==1) && (T0Action==1))
{
TR0=0;
time=TH0*256+TL0; //记下第一个低电平宽度时间
T0Action=0;
TH0=0x00;
TL0=0x00;
TF0=0;
TR0=1; //开始记高电平时间
break;
}
}
}
do{}while(P1_7==1);
if((P1_7==0) && (T0Action==0)) //等待第二个低电平,一有低电平马上记时
{
TR0=0;
time2=TH0*256+TL0; //记下一个高电平宽度时间
T0Action=1;
TH0=0x00;
TL0=0x00;
TF0=0;
TR0=1;
while(1)
{
if((P1_7==1) && (T0Action==1))
{
TR0=0;
time1=TH0*256+TL0; //记下第二个低电平宽度时间
T0Action=0;
break;
}
}
}
if((time==time1) && (time<1500)) //判断两个低电平宽度时间是否相等,限时1500us
{
if((time>780) && (time<1150)) //低电平宽度时间
{
if((time2>210) && (time2<450)) //高电平宽度时间
{
temp=0x00; //0
}
else goto L1; //误码,返回重新接收数据
}
else if((time>210) && (time<450)) //低电平宽度时间
{
if((time2>780) && (time2<1150)) //高电平宽度时间
{
temp=0x01; //1
}
else goto L1; //误码,返回重新接收数据
}
else goto L1; //误码,返回重新接收数据
counttime++;
if(counttime<=8) //开始接收前8位 地址码
{
data0=(data0<<1)|temp;
}
else if((counttime>8) && (counttime<=12)) //开始接收后4位 数据码
{
data1=(data1<<1)|temp;
if(counttime==12) // 第12位
{
Action=1;
break; //接收完毕,退出解码程序
}
}
}
else goto L1; //误码,返回重新接收数据
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -