打印
[51单片机]

关于单线单工通信接收程序的问题,请各位指导,谢谢

[复制链接]
883|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
共轭富数|  楼主 | 2020-9-4 16:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的程序写完之后发现,能接收到第一个数,但第二个开始就不行了,我找了好多天问题所在,最后还是找不出来,请各位指导,程序如下:
void TimerInit(void)
{
TMCON = 0x00;  //bit1: 0为FOSC/12,1为FOSC
TMOD = 0x21;       //设置定时0,工作方式1


TR0 = 0;        //关定时器0


EA = 1;
  ET0 = 0;        //禁止定时器0中断
INT0F = 0x04;            //INT0下降沿触发
INT0R =0x00;                 // 禁止上升沿触发
EINT0 = 1;
}


}

INT16U GetHighTime()              //取高电平时间
{
TH0 = 0;                            //清零计数初值
TL0 = 0;
TR0 = 1;                          //启动计时
while(DATA)
{
  if(TH0 >= 0x1b)                   //时间超过7ms,强制退出循环
   break;
}
TR0 = 0;                            //停止计时
return (TH0*256+TL0);         
}
INT16U GetLowTime()              //取高电平时间
{
TH0 = 0;                            //清零计数初值
TL0 = 0;
TR0 = 1;                          //启动计时
while(!DATA)
{
  if(TH0 >= 0x1b)                   //时间超过7ms,强制退出循环
   break;
}
TR0 = 0;                            //停止计时
return (TH0*256+TL0);         
}
void INT0() interrupt 0        //中断函数,接收数据
{
CHAR i,j,abit;
INT16U time;
EINT0 = 0;                 //关外部中断0
//判定引导码

time = GetLowTime();
if((time < 4500)||(time > 6500))                  //超出4.5~6.5ms的范围退出中断
{
  EINT0 = 1;                                       //开启外部中断
  return;
}
time = GetHighTime();
if((time < 4500)||(time > 6500))               //超出4.5~6.5ms的范围退出中断
{
  EINT0 = 1;                                    //开启外部中断
  return;
}

//开始接收数据
for(i = 0;i < 5;i++)     //接收5个字节
{
  for(j = 0;j < 8;j++)     //接收8个位   
  {
   time = GetLowTime();
   if((time < 250)||(time > 500))       //超出250us~500us退出中断
   {
    EINT0 = 1;                          //开启外部中断
    return;
   }
   time = GetHighTime();
   if((time > 250)&&(time < 500))       //在250us~500us为位0
   {
    abit |= (0 << j);      //低位在前,数据右移
   }
   else if((time > 900)&&(time < 1500))      //在900us~1500us为位1
   {
    abit |= (0x01 << j);
   }
   else
   {
    EINT0 = 1;                           //开启外部中断
    return;
   }  
  }
  NewByte[i] = abit;        //接收完一字节后保存数据
  
}
dataflag = 1;              //接收完毕数据处理标志
EINT0 = 1;                     //开启外部中断

}

使用特权

评论回复

相关帖子

沙发
ayb_ice| | 2020-9-4 16:55 | 只看该作者
你这还不如模拟UART,来个下降沿,然后每隔一个BIT时间采样下GPIO

使用特权

评论回复
板凳
共轭富数|  楼主 | 2020-9-5 09:36 | 只看该作者
ayb_ice 发表于 2020-9-4 16:55
你这还不如模拟UART,来个下降沿,然后每隔一个BIT时间采样下GPIO ...

谢谢您的建言,问题已经解决,谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

35

帖子

0

粉丝