串口通信 sbuf的问题
时间:10-02
整理:3721RD
点击:
今天试了一下串口通信、两个单片机。一个是发送端。产生流水灯。一个是接收端。接受发送端的流水灯信息、然后同步、
但是有问题出现了。
这个是发送代码;每100ms移动一次、同时发送一个信息给接收单片机
#include <reg52.h>
#include <intrins.h>
void sbufint()
{
EA=1;
TMOD=0X20;//定时器1;工作方式是2.常数自动转装载8位定时
TH1=253;
TL1=253;//初值
SCON=0x50;//工作方式1,波特率9600bit/s,允许接收
PCON=0x80;//模式控制
TR1=1;//启动定时器
}
void Delay100ms() //@11.0592MHz
{
unsigned char i, j;
i = 180;
j = 73;
do
{
while (--j);
} while (--i);
}
unsigned char SEND(unsigned char senddat)
{
SBUF=senddat;
while(TI==0);
TI=0;
return(0);
}
void main()
{
sbufint();
P1=0xfe;
while(1)
{
SEND(P1);
Delay100ms();
P1=_crol_(P1,1);
//P1=~P1;
}
}
这个是接受端代码;每150ms接受一次;
#include "reg52.h"
#include "intrins.h"
void sbufint()
{
EA=1;
TMOD=0X20;//定时器1;工作方式是2.常数自动转装载8位定时
TH1=253;
TL1=253;//初值
SCON=0x50;//工作方式1,波特率9600bit/s,允许接收
PCON=0x80;//模式控制
TR1=1;//启动定时器
}
void Delay150ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 7;
j = 78;
k = 167;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
unsigned char rec()
{
unsigned char recdat;
recdat=SBUF;
while(RI==0);
RI=0;
return(recdat);
}
void main()
{
sbufint();
while(1)
{
P1=rec();
Delay150ms();
}
}
但是实际上是这样子的。请看gif图
左边的那个是接收端,右边的那个是发送端’100ms流动一次;
但是情况是这样子的。
发送端:还是100ms移动一次。
接受端:流水灯不是100ms。这个可以肯定。,但是竟然没有出现跳变;;也就说。接受端还是流水灯。就是时间间隔比发送端长一点而已、、、
怎么会出现这样的情况呢;;;;;好奇怪的事情呀;;
难道是这样吗?
所以我就是想请教一下大家。
关于sbuf的问题。
1.sbuf里面的容量是8bit吗?
sbuf里面的值是每接受一次的话,是重新擦写一次的吗?比如0ms是dat1;100ms的时候立即吧dat1擦除,由dat2覆盖。200ms的时候dat3覆盖dat2?
还是dat1和dat2在100ms的是偶同时存在,然后200ms的时候dat1,dat2 dat3是一直存在的。?
谢谢。请指教。
但是有问题出现了。
这个是发送代码;每100ms移动一次、同时发送一个信息给接收单片机
#include <reg52.h>
#include <intrins.h>
void sbufint()
{
EA=1;
TMOD=0X20;//定时器1;工作方式是2.常数自动转装载8位定时
TH1=253;
TL1=253;//初值
SCON=0x50;//工作方式1,波特率9600bit/s,允许接收
PCON=0x80;//模式控制
TR1=1;//启动定时器
}
void Delay100ms() //@11.0592MHz
{
unsigned char i, j;
i = 180;
j = 73;
do
{
while (--j);
} while (--i);
}
unsigned char SEND(unsigned char senddat)
{
SBUF=senddat;
while(TI==0);
TI=0;
return(0);
}
void main()
{
sbufint();
P1=0xfe;
while(1)
{
SEND(P1);
Delay100ms();
P1=_crol_(P1,1);
//P1=~P1;
}
}
这个是接受端代码;每150ms接受一次;
#include "reg52.h"
#include "intrins.h"
void sbufint()
{
EA=1;
TMOD=0X20;//定时器1;工作方式是2.常数自动转装载8位定时
TH1=253;
TL1=253;//初值
SCON=0x50;//工作方式1,波特率9600bit/s,允许接收
PCON=0x80;//模式控制
TR1=1;//启动定时器
}
void Delay150ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 7;
j = 78;
k = 167;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
unsigned char rec()
{
unsigned char recdat;
recdat=SBUF;
while(RI==0);
RI=0;
return(recdat);
}
void main()
{
sbufint();
while(1)
{
P1=rec();
Delay150ms();
}
}
但是实际上是这样子的。请看gif图
左边的那个是接收端,右边的那个是发送端’100ms流动一次;
但是情况是这样子的。
发送端:还是100ms移动一次。
接受端:流水灯不是100ms。这个可以肯定。,但是竟然没有出现跳变;;也就说。接受端还是流水灯。就是时间间隔比发送端长一点而已、、、
怎么会出现这样的情况呢;;;;;好奇怪的事情呀;;
难道是这样吗?
所以我就是想请教一下大家。
关于sbuf的问题。
1.sbuf里面的容量是8bit吗?
sbuf里面的值是每接受一次的话,是重新擦写一次的吗?比如0ms是dat1;100ms的时候立即吧dat1擦除,由dat2覆盖。200ms的时候dat3覆盖dat2?
还是dat1和dat2在100ms的是偶同时存在,然后200ms的时候dat1,dat2 dat3是一直存在的。?
谢谢。请指教。
接收端你试下用中断来控制,你这样读很难做到同步的。开机有先后,你做不到刚刚好同时开机,除非是程序控制。
主要问题不是说是不是同一个时间启动。而是说。左右两边都是流水灯。随着时间的推移。流水灯本来相差间隔就会越来越大。所以接收端 P1=sbuf就会出现跳位的,但是为什么接收端一直还是流水灯呢?我的问题是这个。我就是觉得。不应该是流水灯的呀,应该会调位的呀。,。
看看然后收藏。