韦根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到单片机,见图: