欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

韦根26协议读头的使用及proteus仿真-模拟韦根26读头的数据发送 使用定时器T1,采用16位定时器方式。 //8051 T1初始化 void Timer1_init { TMOD=0x10; //T1 16位定时器模式 ET1=0; //关闭定时器中断 TR1=0; //关闭定时器 TF1=0; //清除TF1标志 }       例如,就发送上面的这个数据:01000110111000001001010101  十进制的18580053       发送数据0的时候,就是将数据线D0拉低404us,发送数据1的时候,就是将数据线D1拉低404us。      首先设置定时器初值,用STC的下载器计算404us的预装入值。 拉低数据线,等待404us到时,之后抬高数据线,再等待2ms的时间,一位数据就发送完成了。 void Send_bit(bit bD) { //拉低数据线D0 404us TL1 = 0x8C;

最编程 2024-06-01 15:05:54
...

有4个1,因此奇校验位应为1,核对接收到的奇校验位odd是否位1

如果奇偶校验正确,显示数据,如果错误,给出错误提示。

完整检查数据函数:

bit DataCheck()
{
 uchar data count=0,i;
 unsigned long xdata temp;
 uchar idata odd,even;

 temp=WG26;

  //得到奇校验位
  if( (temp&0x00000001) ==0x00000001)
    odd=1;
  else
    odd=0;

 //统计第2-13位1的个数
 //把没用的6位移除
 for(i=0; i<6; i++)
   temp=temp<<1; 

   //得到偶校验位
 if( (temp&0x80000000) ==0x80000000)
    even=1;
 else
    even=0;
 
 //将偶校验位移除	
 temp=temp<<1;	 
 //开始统计第2-13位有几个1 
 for(i=0; i<12; i++)
 {
   if( (temp&0x80000000) == 0x80000000)
	  count++;
   temp=temp<<1;	
 }
 //判断偶校验位的正确性
 if( (count%2==0 && even==0) || (count%2==1 && even==1) )  
 {
	//接着判断奇校验位	14-25位
	count=0;
	for(i=0; i<12; i++)
	{
	  if( (temp&0x80000000) ==0x80000000)
	    count++;
      temp=temp<<1;
	}
	if( (count%2==0 && odd==1) || (count%2==1 && odd==0 ) )
	{
	  //数据正确
	  return 1;
	}
	else
	{
     return 0;
	}
 }
 else
   return 0;  //数据有错误  
}

实际硬件连接:

实际硬件连接和仿真有所不同,为了稳定接收数据,需要通过一片总线驱动芯片74LS573再连接74LS08到单片机,见图:

推荐阅读