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);
}
}
}
}
...全文
1426 18 打赏 收藏 转发到动态 举报
写回复
用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。
内容概要:本文系统研究了基于CNN-SVM的卷积神经网络与支持向量机融合的数据分类预测方法,聚焦其在工业故障识别中的应用,提供了完整的Matlab代码实现。通过CNN提取输入数据的深层空间特征,再由SVM进行高精度分类,充分发挥两者优势,有效提升了故障识别的准确性、鲁棒性与泛化能力。该方法特别适用于处理电力系统、机械设备等领域的高维、非线性、强噪声监测数据,在变压器故障诊断、轴承缺陷识别等场景中具有重要应用价值。文档还整合了机器学习、深度学习、图像处理、路径规划、电力系统优化等多个前沿科研方向的技术资源,配套大量Matlab/Simulink仿真案例与Python代码,全面支持科研复现与工程实践。; 适合人群:具备一定编程基础,熟练掌握Matlab或Python语言,从事电气工程、自动化、人工智能、机械故障诊断等相关领域研究的研发人员及高校研究生; 使用场景及目标:① 实现工业设备的状态监测与多类别故障分类;② 深入理解CNN与SVM融合模型的设计原理与工程实现细节;③ 借助所提供的丰富算法案例开展科研复现、模型优化与系统仿真验证; 阅读建议:建议按照文档目录结构系统化学习,结合百度网盘提供的完整代码资源进行动手实践,重点关注CNN特征提取层与SVM分类器之间的数据接口设计与参数调优策略,同时可延伸学习文中涉及的其他智能算法及其在电力系统、信号处理等领域的交叉应用,全面提升科研创新能力。

27,522

社区成员

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

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