本帖最后由 h_8816002 于 2017-1-5 15:19 编辑
大家好!
我想通过51输出一组波形,但是久久无法成功,找不出问题所在,烦请大家帮我一下,万分感谢。。。。好气啊!
目标波形:
图1
图2
大家请看,这个信号的启动信号是一个 120ms的低电平+6ms的高电平,然后
图3
图4
这是数据位,图3是数据位,图4是数据校验位。
这个控制信号:逻辑1定义为”高电平持续时间:低电平持续时间=3:1“;逻辑0定义为”高电平持续时间:低电平持续时间=1:3“
因此可以读出这个控制信号的数据是 1000 0000(先发送低位)
按照这个规则,我想输入图1-图3为止的波形也就是不输出那个8位校验位,于是我的程序如下:
#include <reg52.h>
sbit sda=P2^4; //数据总线
unsigned int addr;
void read_xl();
void delay_xms(unsigned int t) //+76us
{
unsigned char a,b,c;
for(a=0;a<t;a++)
for(b=0;b<3;b++)
for(c=0;c<205;c++);
}
void main()
{
sda=1;
addr=0x80; //装载数据
read_xl();
while(1);
}
void read_xl()
{
unsigned char i;
sda=0; //启动序列
delay_xms(120); // 120ms
sda=1;
delay_xms(6);
for(i=0;i<8;i++) //8位数据
{
sda=1;
if(addr&1) //判断数据是0还是1
{
delay_xms(6); //高电平处理
sda=0;
delay_xms(2);
}
else
{
delay_xms(2); //低电平处理
sda=0;
delay_xms(6);
}
addr>>=1; //数据右移
}
sda=0;
}
可是输出波形是乱七八糟的: 图5
图6
大家看这是输出波形
启动位是对了,数据从低位开始 0000 0001 ,但是最后这个逻辑1不符合3:1的协议,也就是说接收错了。
请大家教我,我程序里哪里有错误,该怎么改,好纠结,谢谢大家
|