51单片机串口不够用,怎么样模拟

51单片机串口不够用,怎么样模拟,第1张

给你发一个 我做得模拟串口发送程序吧,模拟成功。希望对你能有帮助。

#include<reg51h>

#define uint unsigned int

#define uchar unsigned char

sbit Rxd=P1^0;

sbit Txd=P1^1;

uchar b[10]="fengfeng";

void delay(uint z)

{

int x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void init()

{

TMOD=0x02;

P1=0xff;

TL0=0xa0; //波特率 9600

TH0=0xa0;

TR0=0;

TF0=0;

}

void send(uchar aa)

{

uint i=8;

TL0=0xa0; //波特率 9600

TH0=0xa0;

TR0=1;

Txd=(bit)1;

while(!TF0);

TF0=0;

Txd=(bit)0; //起始位

while(!TF0);

TF0=0;

while(i--)

{

Txd=(bit)(aa&0x01);

while(!TF0);

TF0=0;

aa=aa>>1;

}

Txd=(bit)1;

while(!TF0);

TF0=0;

Txd=(bit)1;

while(!TF0);

TF0=0;

TR1=0;

}

void Putstring(uchar buf)

{

while(buf!='\0')

{

send(buf);

buf++;

delay(200);

}

}

void main()

{

init();

while(1)

{

// Putstring("I Love You!");

// delay(200);

send(0x11);

delay(1000);

send(0x12);

delay(1000);

send(0x13);

delay(1000);

send(0x14);

delay(1000);

}

}

我前几天也做模拟串口程序,也遇到了与你类似的问题,不过现在解决了。

数据格式由一个起始位,八个数据位,一个或两个结束位组成。在数据发送是结束位是不能省。

但在数据接收时,程序中就没有必要等待结束位了,因为在等待结束位的过程中,把下一个数据的起始中断也等待过去了。

把函数uchar RByte()中的最后一个WaitTF0();删除,程序就能连续接收数据了。

下面是我的程序,你看一下就明白了。

/

模拟串口收发程序

改程序发送口采用任一IO口,接收口采用外部中断0口,实现了9600bit/s的串口通信

信号产生与接收采用定时器定时溢出标志来进行控制

注意问题:

1、中断的中断标志要保证状态正确

2、定时器定时要精确

/

#include<reg52h>

sbit txd=P3^1;

sbit rxd=P3^2;

sbit en=P1^7;

sbit clk=P3^7;

#define uchar unsigned char

uchar number,flag;

uchar num[10]={0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};

void wait(uchar i);

void send(uchar aa);

void main()

{

uchar i;

IE=0;EA=1;

TMOD=0x12;

TR0=0;EX0=1;

IT0=1;en=0;

while(1)

{

if(num[0]==0x49&&num[1]==0x85&&num[2]==0x54&&num[3]==0x31&&num[4]==0x59&&num[5]==0x87&&num[6]==0x91&&num[7]==0x25&&num[8]==0x34&&num[9]==0x62)

{

en=1;

number=0;

for(i=0;i<10;i++)

{send(num[i]);num[i]=0x00;}

en=0;

}

}

}

void send(uchar aa)

{

uchar i;

txd=0;

wait(0xb9);

for(i=0;i<8;i++)

{txd=aa&0x01;aa>>=1;wait(0xb9);}

txd=1;

wait(0xb9);

flag=0;

}

void int0() interrupt 0

{

uchar i;

EX0=0;clk=!clk;

wait(0xad);

for(i=0;i<7;i++)

{

number>>=1;clk=!clk;

if(rxd)number=0x80|number;

else number=0x00|number;

wait(0xb9);

}

number>>=1;clk=!clk;

if(rxd)number=0x80|number;

else number=0x00|number;

wait(0xd9);

num[flag]=number;

flag++;clk=!clk;

IE0=0;EX0=1;

if(flag>=10)flag=0;

}

void wait(uchar i)

{

TF0=0;

TH0=i;TL0=i;

TR0=1;

while(TF0==0);

TF0=0;TR0=0;

}

KEIL中用虚拟串口调试串口程序,只能查看串口发送的字符,不能接收。

如下图,在运行状态下,点开UART串口。

要真正调试串口程序,还是用proteus 更好些,用虚拟终端,就像是单片机与电脑串行通信一样,可以在虚拟终端上显示,也可以在虚拟终端上输入。如下图

虚拟串口只能在 本机上使用,不能直接在计算机间通讯。

在本机上开发串口程序时,可以使用创建两个虚拟串口,并把两个串口虚拟连接,通讯的两个程序一个程序连接一个,这样就可以在同一台电脑上进行程序调试了。

如果用虚拟串口在两台电脑间通讯,除虚拟串口程序外,还得用串口转网络程序。采用 程序-虚拟串口-串口转网络--网络传输--串口转网络--虚拟串口 - 程序 方式进行连接。

总体来说,虚拟串口方便了在没有串口的计算机上开发调试串口程序。

这属于技巧问题。发送端设置发送队列起始标志字节,这标志字节可以不止一个,最后发送校验字节,校验算法自己决定。接收端设置接收队列,不管什么起始位结束位,对整个队列进行移位处理,接收一位后判断起始标志字节,不是起始标志退出,是则判断校验字节,正确了你就完整收到一对列数据了。

以上就是关于51单片机串口不够用,怎么样模拟全部的内容,包括:51单片机串口不够用,怎么样模拟、51 单片机模拟串口的问题 目前发送数据没有问题,接收数据时只能接收前两位,如发送010203 只能接收到01、KEIL中如何用虚拟串口调试串口程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9473781.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存