导航:首页 > 操作系统 > 单片机模拟串口

单片机模拟串口

发布时间:2022-05-05 10:56:29

Ⅰ 如何使用只有模拟串口的单片机进行串行通信

数模是将单片机内的数据输出转换为模拟信号。是单片机通过数模转换器以模拟量的方式与外部建立联系。
模数是将外部模拟信号变为数字信号输入单片机。是外部模拟信号通过模数转换器与单片机建立联系。
串口通讯是单片机与外设之间数字信号的交互。
$bar1->echoName();

Ⅱ 51 单片机模拟串口的问题 目前发送数据没有问题,接收数据时只能接收前两位,如发送010203 只能接收到01

我前几天也做模拟串口程序,也遇到了与你类似的问题,不过现在解决了。
数据格式由一个起始位,八个数据位,一个或两个结束位组成。在数据发送是结束位是不能省。
但在数据接收时,程序中就没有必要等待结束位了,因为在等待结束位的过程中,把下一个数据的起始中断也等待过去了。
把函数uchar RByte()中的最后一个WaitTF0();删除,程序就能连续接收数据了。
下面是我的程序,你看一下就明白了。
/*
模拟串口收发程序
改程序发送口采用任一IO口,接收口采用外部中断0口,实现了9600bit/s的串口通信
信号产生与接收采用定时器定时溢出标志来进行控制
注意问题:
1、中断的中断标志要保证状态正确
2、定时器定时要精确
*/

#include<reg52.h>
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;
}

Ⅲ 我这个程序是51单片机IO口模拟串口通信的

你不用中断服务程序来置标志,当溢出是TF0自动置1,你只需清0就OK了。
你的问题肯定是波特率不一致造成的,一是你两个设备的波特率是否一致,你查探一下,另一个是因为你用中断服务程序处理标志,会影响波特率的,给其造成误差。

Ⅳ 单片机模拟串口通信有什么利弊

串口通信,或者 IIC 通信,应该是由专门的硬件,来完成的。

CPU 对这些硬件,设置一下,再传送一下数据,就可以等待结果了。

有些单片机,太简陋,没有相应的硬件,只能用软件编程,模拟硬件,来实现。

执行这些程序,当然,必须占用 CPU 的时间。这就是《占用大量的cpu资源》。

有时,还要使用定时器、中断源,这也是《占用大量的资源》。

Ⅳ 单片机模拟串口 收到的数据存在哪里了 或者是怎么将收到的数据存起来

你开接收中断,将接收的数据存到一个数组里,然后在调用数组,分别取处理就OK了

Ⅵ 51单片机模拟串口

接收端是不会判断所谓某个字节的起始位的,接收机如果是在接收的状态,那么只要它的接收引脚检测到有低电平(这个低电平不是检测一次,而是检测3次,判断有2次均是低电平则最终判断为低电平,即起始位),那么接收端就开始以设定的波特率接收数据,判断数据时也是判断3次2次有效,也就是说,只要检测到低电平它就接收。
假如发送端已经在发送过程中,再接上接收端,那么接收的数据一定是错的,你可以试试,随便将接收状态下的RXD用导线接地一下,接收机肯定收到数据。
那么是不是不可避免这种情况的发生呢?
是可以的避免的,但是发送端的时间需要有个数据的时间间隔,否则永远出不来这个循环错误:1,确保接收端就绪先于发送端,那么第一个字节的起始位必定被检测到; 2,发送第9位,接收到数据后,判断数据和第9位是对应,若对应则再接收之后的数据;3, 添加必要地起始字节如0xaa,当接收端接收到第一个数据,并且为0xaa时,才进入接收真正的有效数据,一个起始字节不够就两个;
总之在接收时就作条件判断,直至同步为止。

Ⅶ 用STC单片机模拟串口,接收的时候,只有第一个字节是正确的,后边的都错误,而且接收的数据比正确的数据短

不要用函数调用来延时!!
对于时间精度要求高的场合,函数调用是很不合适,因为函数的参数传递,当前状态的进栈出栈都要消耗时间,而这些时间你未必能完全掌握,就象你的串口接收,我估计波特率的偏差肯定非常大,所以才会造成你所说的情况。
建议你还是用定时器来延时,以while(TF0)或while(TF1)来等待延时结束。

Ⅷ STC单片机,普通IO口模拟串口通讯,不使用定时器,使用软件程序延时,相同的延时程序,能够正常发送数据。

STC单片机不是有独立波特率发生器么?干嘛不用呢
如果你不用PWM模块的话,PWM也可以做定时器,
为什么一定要软件模拟呢

如果一定要用延时的方式来接收,首先你必须用中断来接收起始位,并且在中断中完成所有的接收工作,如果是用定时器查询的话,使用中间点检测,并且保证此时只有定时器一个中断在开放

Ⅸ 如何使用52单片机的IO模拟串口

其实A和B通信不一定要用串口啊,用IO模拟SPI或者I2C都可以啊

阅读全文

与单片机模拟串口相关的资料

热点内容
编译原理统计终结符与非终结符 浏览:796
为什么会显示获取服务器失败 浏览:889
ic验证用什么编译工具 浏览:723
php获取微信code 浏览:573
pdf切割页 浏览:257
小学音乐教案app哪个软件好 浏览:46
aix创建vg命令 浏览:936
程序员五年多少行代码 浏览:862
unix环境高级编程第三版pdf中文 浏览:644
找项目部包杂工用什么app 浏览:381
数控洗床圆弧编程举例 浏览:412
途观压缩机继电器 浏览:164
linuxnslookup安装 浏览:845
java回文数编程 浏览:638
无刷电机控制算法 浏览:744
查看gcc是否编译成功 浏览:898
单片机软件测试 浏览:959
linuxgconf 浏览:864
成都做app需要注意什么 浏览:3
服务器代码如何输入 浏览:420