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

51单片机串口模拟

发布时间:2023-05-16 13:53:30

① 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单片机串行口实验virtualterminal窗口在哪里

1. virtual terminal 默认显示字符,如果单片机发送的是非显示字符,裤亩和则虚拟终端不会显示,会导致用户认为通讯未通。 运行程序,在虚拟终端窗口里面点击右键,在弹出菜单里面: 选HEX DISPLAY MODE,则显示按十六耐举进制胡盯显示,能显示所有字符。

2.virtual terminal 默认情况下不显示回显字符, 运行程序,在虚拟终端窗口里面点击右键,在弹出菜单里面: 选Echo Typed Characters 显示回显字符

3.virtual terminal 和模拟物理串口COMPIM不能同时使用,同时使用会发生相互影响。

③ 请教51单片机高手,关于IO管脚模拟串口的问题呢,我写了一个发送的函数,收到的始终是81(16进制显示)

应该是延时时间不准确,造成波特绝世樱率不对,所以输出的返兄字符必然也就不对了。
另外实际应用时程序里可能还会有别的中断,那么运行这段程序时要把中断先关掉,否则也会导致波特率并丛不对。

④ 51单片机模拟串口控制lcd12864,显示不完全求解

第1种代码:单片机运行到while(1);这条语句后就不会往下走了,一直在这里死循环,运行空语句。就不会给液晶送数据了。
第2种代码:单片机运行到while(1)后会往下执行,进入while循环,循环的给液晶送数据。循环的输出。就是有分号和没分号的区别。
如果没有把while(1);语句放在末尾还是会循环输出,因为在循环的执行main函数。
交流与联系加我扣扣,我账号里的数字是扣扣号。
第1种代码:
---------------------------------------------------------------------------------------------------------------------
void main(void)
{
uchar i=0; //败升循环输出
uchar code a[]="01234567"; // 7没有显示,6在反白里
T0_init(); //T0初始化
LCD_init(); //LCD初始化

I_com(0x80); //地址定位
while(1); /腊枯好*将这个循环改为整个语句循环放倒“地址定位”处就没有问题了但一直循环输出,纠结 */
for(i=0;a[i]!='\0';++i)
{
I_data(a[i]);
}
}
-----------------------------------------------------------------------------------------------------------------------第2种轮铅代码:
void main(void)
{
uchar i=0; //循环输出
uchar code a[]="01234567"; // 7没有显示,6在反白里
T0_init(); //T0初始化
LCD_init(); //LCD初始化

I_com(0x80); //地址定位
while(1) /*将这个循环改为整个语句循环放倒“地址定位”处就没有问题了但一直循环输出,纠结 */
for(i=0;a[i]!='\0';++i)
{
I_data(a[i]);
}
}

⑤ 你好~我这个程序是51单片机IO口模拟串口通信的

在代码最衫侍后加一个大括号,其它一概不改氏塌稿,仿真运行的结果输出的数据时序关系完全正常,说明您的程序功能都是对的。

您的波特率设置是9600(晶振为11.0592M)现在是按照初始化为160(注释说140估计是笔误,哦键误),溢出周期是 96, 11059200/96/12 =9600

如果晶振为12M可能歼孝有点误差,要改为 256-104 =152 (=0x98)

⑥ 在51单片机中,用io口模拟出来的串口,也会有串口中断的功能吗

如果你用竖枣来模拟串口接收的I/O是两个外中断口(p3.2和p3.3)之一,可以数握做到接余毕拆收中断。发送是CPU直接操作的,中断没有意义。

⑦ 51单片机要接电脑的usb口模拟串口,需不需要接其他的芯片

需要电压转换芯片 即驱动芯片。
单片机一般是3.3V或者5V的,电脑的串口在主板上有一个电源转换芯片,将低压升级到RS232标准电压,+-12V,因此,单片机和电脑转口连接,也需要一个电压转换芯片。
这种那个芯片很多,如MAX232等,可以实现2路串口电压转换。

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

给你发一个 我做得模拟串口发送程序吧,模拟悔姿成功。希望对你能有碧肢绝帮助。
#include<reg51.h>

#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);
}
}

⑨ 51单片机模拟串口通讯,起始位判断问题

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

⑩ 51单片机扩展模拟串口问题

你这个程序太乱了,可以循环方式的,而且164就是一个简单的移位寄存器,没必要一定要操作到ACC,也不用模拟串口。
我的建议:
先断开你的数码管,取消中断方式,把164接好(RESET接地,A1接高,P3^2接A2,P3^3接SCK)
define P3^2 A2
define P3^3 SCK
temp = 0x44;//Seg[4];
for(i=0;i++;i<8)
{
SCK = 0;
if(temp & 0x01) A2 =1
else A2 = 0;
SCK = 1;
temp = temp<<1
}
大概就是这个意思,用万用表测试输出的QA-QH有没有变化,等164调好了,再加中断或其他程序什么的

阅读全文

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

热点内容
手游mc服务器怎么设置管理员 浏览:200
pso算法优化参数 浏览:606
java打开pdf文件怎么打开 浏览:369
用银行家算法拒绝死锁的例题 浏览:670
洗盘选股指标源码 浏览:705
百度云盘下载的压缩包怎么解压 浏览:737
加密类型是TKIP被我弄掉了 浏览:234
贝刻智能手环app如何下载 浏览:838
公司电脑上的加密文件解密 浏览:462
服务器怎么配置数据库 浏览:889
压缩机和制冷剂 浏览:182
树莓派手机版编程 浏览:926
谷歌编程挑战赛时间安排 浏览:438
自动学习机源码 浏览:938
明日之后星曳镇是什么服务器 浏览:474
编程学有年龄限制吗 浏览:571
工程可靠度pdf 浏览:900
包子解压玩具会爆吗 浏览:143
资治通鉴柏杨版pdf 浏览:852
跆拳道pdf 浏览:205