51单片机发送一字符串给PC的代码。。。

D_G_Canfel 2011-08-12 05:01:16
以下是我写的代码,但没有返回的信息。P0口操作有效求解。。。。
#include <reg51.h>

#define VALUE_A 0x00
#define VALUE_B 0x0ff

sbit kan_led=P3^1;

unsigned char A_return[] = {'S','T','A','R','T','_','A'};
unsigned char B_return[] = {'S','T','A','R','T','_','B'};
unsigned char Other_ret[] = {'E','R','R','O','R','!','!'};

void InisSerial()
{
SCON = 0x50; // 设定串行口工作方式
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;

PCON &= 0xef; // 波特率不倍增
TR1 = 1; // 启动定时器1
}

void main()
{
unsigned char temp,count;
InisSerial();
kan_led = 0;
while(1)
{
TI = 0;
SBUF = VALUE_B;
while(!TI);
while(!RI);
RI = 0;
temp = SBUF;
if(temp == VALUE_A)
{
for(count=0;count<6;count++)
{
TI = 0;
SBUF = A_return[count];
while(!TI);
}
P0 = VALUE_A;
}
else if(temp == VALUE_B)
{
for(count=0;count<6;count++)
{
TI = 0;
SBUF = B_return[count];
while(!TI);
}
P0 = VALUE_B;
}
else
{
for(count=0;count<6;count++)
{
TI = 0;
SBUF = Other_ret[count];
while(!TI);
}
}
}
}
...全文
1354 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
D_G_Canfel 2011-08-14
  • 打赏
  • 举报
回复
恩,ksvhxd非常感谢。
无心 2011-08-14
  • 打赏
  • 举报
回复
在12M晶振下,9600波特率本就存在8.51%的误差,如果实验板上晶振本身误差较大或与其相连的两个电容质量不好,都有可能使通讯出现问题,你可将晶振换成11.0592M的,应就不会有问题了
D_G_Canfel 2011-08-14
  • 打赏
  • 举报
回复
问题已经解决了,我将波特率设为2400之后可以正常返回数据了。但还是不太清楚为什么在9600下就无法正常返回。。。。。
D_G_Canfel 2011-08-14
  • 打赏
  • 举报
回复
非常感谢ksvhxd,我也没注意到主要是实验板设计时,P3.1一定要置0之后才能启动LED灯。。。不过现在按你的说法该了串口的初始化的数值之后,汇过来的是乱码,难道还是波特率不对吗?
无心 2011-08-13
  • 打赏
  • 举报
回复
我晕,居然是这个低级错误

问题在这行

sbit kan_led=P3^1;

P3.1是TXD 你把它设成0 还有个屁输出,改成别的口就对了

还有
PCON &= 0xef; // 波特率不倍增
把这行删了或设成0X7E

D_G_Canfel 2011-08-13
  • 打赏
  • 举报
回复
不行啊。。。。悲剧啊。。。
无心 2011-08-13
  • 打赏
  • 举报
回复
还有
PCON &= 0xef; // 波特率不倍增

我记得应是 PCON &= 0x7f; 记不清了 你再查查
无心 2011-08-13
  • 打赏
  • 举报
回复
如是AT89C51 12M晶振,那你的串口初始值就有问题了,对应的串口初始化值应该是
TH1 = 0x00; //问题就在这里,你设成的0xfd 波特率就完全不对了
TL1 = 0xFD;
D_G_Canfel 2011-08-13
  • 打赏
  • 举报
回复
如果是设置的波特率有问题,起码应该收到一点乱码什么的吧。。。。但它什么都没有啊。。。。
D_G_Canfel 2011-08-13
  • 打赏
  • 举报
回复
我想不明白的是,下位机应该收到了上位机的指令。所以,P0口得操作才会有效。但是不知道为什么一直没东西返回。。。。。
D_G_Canfel 2011-08-13
  • 打赏
  • 举报
回复
恩,先谢了。晶振为:12Mhz;单片机为:AT89S51。外部有上拉电阻。我尝试使用其他数值来调试打结果是一样的,P0口接的小灯会亮就是没有返回的字符。。。
无心 2011-08-13
  • 打赏
  • 举报
回复
5楼 我写错了,应是“看PC机是否收到0xff,如没有则要检查通路和串口初始值”
无心 2011-08-13
  • 打赏
  • 举报
回复
还有,发送字符串的循环长度有误 for(count=0;count<6;count++) 字符串的个数是7个,这句
应改为for(count=0;count<7;count++) 字符才能发全
无心 2011-08-13
  • 打赏
  • 举报
回复
程序大致没有什么问题,仿真能能过,由于你没有提供单片机型号及晶振频率,串口初始化对不对就不知到了,这要看你在运行程序时,PC机是否收到0x00,如没有则要检查通路和串口初始值
zjut_yanyehe 2011-08-13
  • 打赏
  • 举报
回复
实验时有没有刷新过啊?
bjtea 2011-08-13
  • 打赏
  • 举报
回复
1)先把波特率降到1200,确保正确收到数据再说其他。
2)数据也不要用00,FF来调试。因为,P0端口自身的数值也是这两者之一(取决于你有无加外部上拉)。
3)另外,注意一下,51的P0口是集电极开路输出,用作输出时,需要外部上拉的。
D_G_Canfel 2011-08-12
  • 打赏
  • 举报
回复
但是为什么,P0口的操作有效呢?
bjtea 2011-08-12
  • 打赏
  • 举报
回复
大概是上、下位机的波特率不匹配,所以上、下位机都是,既收不到0,也收不到FF。
资源下载链接为: https://pan.quark.cn/s/9648a1f24758 在电子工程领域,51单片机作为一种广泛应用的微控制器,在教学和小型嵌入式系统中扮演着重要角色。本文将深入探讨如何利用51单片机通过串口通信向个人计算机(PC发送字符串,以及相关的技术和工具。首先,我们需要理解串口通信的基本原理。串口通信是计算机硬件之间常用的数据传输方式,通过一条数据线进行数据的发送和接收,常见的波特率如9600、19200等决定了数据传输的速度。在51单片机中,串行通信通常通过UART(通用异步收发传输器)实现,利用TXD(发送)和RXD(接收)两个引脚进行数据交换。 51单片机发送字符串PC的过程主要包括以下几个步骤: 初始化串口:配置单片机的串口工作模式,设置波特率、奇偶校验位、数据位和停止位。在Keil C编译器中,这通常通过配置SFR(特殊功能寄存器)如SCON(串行控制寄存器)、TMOD(定时器模式寄存器)和TH1/TL1(定时器寄存器)来实现。 构建字符串:在51单片机的内存中创建待发送字符串字符串通常以字符数组的形式存储,每个字符对应一个ASCII码。 发送字符:通过循环遍历字符串中的每个字符,每次取出一个字符并转换为相应的ASCII码,然后通过TXD引脚发送出去。发送时,通常会启动定时器来产生合适的波特率,确保数据的正确传输。 同步与校验:在发送过程中,需要确保单片机和PC的波特率一致,否则数据可能会接收错误。此外,可使用奇偶校验或CRC校验提高数据的可靠性。 PC端接收:在PC端,可以使用串口调试助手或者编程语言(如Python的PySerial库)来接收51单片机发送的数据。接收到的数据将按照ASCII码还原为字符显示在屏幕上。

27,511

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧