unsigned char dat//用于存储单片机接收发送缓冲寄存器SBUF里面的内容
sbit gewei=P2^2//个位选通定义
sbit shiwei=P2^3//十位选通定义
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x77,0x7c,0x39,0x5e,0x79,0x71}
//{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,}// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
void Delay(unsigned int tc) //延时程序
{
while( tc != 0 )
{unsigned int i
for(i=0i<100i++)
tc--}
}
void LED() //LED显示接收到的数据
{
shiwei=0
P0=~table[dat/16]
Delay(8)
shiwei=1
gewei=0
P0=~table[dat%16]
Delay(5)
gewei=1
}
void Init_Com(void)//功能:串口初始化,波特率9600,方式1
{
TMOD = 0x20
PCON = 0x00
SCON = 0x50
TH1 = 0xFd
TL1 = 0xFd
TR1 = 1
}
void main()//主程序功能:实现接收数据并把接收到的数据原样发送回去///////
{
Init_Com()//串口初始化
// P1=0xf0
while(1)
{
if ( RI ) //扫描判断是否接收到数据,
{
dat = SBUF //接收数据SBUF赋与dat
RI=0 //RI清零。
SBUF = dat //在原样把数据发送回去
}
LED()//显示接收到的数据
}
}
1、用定时器0产生中断,定时时间设为50毫秒,中断一次计数一次,每计数到30次就是1.5秒,向串口发送一次数据。2、用延时,时间不是很精准。
void main()
{ 初始化串口;
..........
while(1)
{ delay_ms(1500)//延时1.5秒
SBUF=dat//发送一个数据,dat为要发送的数据
}
//延时函数,m的取值由实际情况调试决定
void delay_ms(unsigned int n)
{ unsigned int m
while (n--)
{
m= 450
while (m--)
}
如果上位机和下位机的程序没有bug,一般通讯出问题都是由于两次通讯间隔太短造成的,这样的情况一般都是这个原因,通讯失败不是本句造成的,和前后的代码有很大关系,以下几点建议:1、单步调试程序,如果通讯不会失败,那就要调整代码,降低通讯的频率;
2、修改通讯协议,在下位机增加响应位,PC每发一次指令后等待响应,这样可以完全避免软件造成的通讯失败;PC端程序还可以增加延时判断,这样子串口通讯的代码会非常强壮。
另外要注意的,不可按照理想的波特率计算通讯指令发送的频率,显示和理论还是有很大差异的;高的波特率会产生噪音,长距离通讯会有问题。
解决的办法是 连续发送
sp.WriteLine("STOP")
sp.WriteLine("STOP")
sp.WriteLine("STOP")
sp.WriteLine("STOP")
延时
一般最好的效果是在700~1200毫秒,
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)