本帖最后由 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的协议,也就是说接收错了。
请大家教我,我程序里哪里有错误,该怎么改,好纠结,谢谢大家  
|