请教单片机宇宙级问题(附电路图和程序)

2019-07-16 06:40发布

我做这个项目的目的:主机一个,从机数目小于8个,从机地址在1-250之间不重复。从机采集AD值发给主机显示。主机上电一开始发送1-255地址码给从机,从机接收到和自己相符的地址码后发回主机,主机保存在数组里。然后从机轮流向主机发送数据。
我的问题:
开始焊了8个从机,一个主机能很好的工作。主机采用stc12C5A08AD从机用的是stc12C5604AD。晶振都是 11.0592.12pf电容。但是后来焊接的几个从机出现了很多问题,

单片机电路图
问题一:主机的串口是和485芯片前的光耦相连的,这时不能通过串口给单片机下载程序。串口必须断开光耦才能下载程序。(这个问题在第一次焊接的板子上不存在)。
问题二:接着问题一,下载程序后,如果不断开串口和光耦额定连线,程序运行到一个子函数后就一直运行该子函数,该子函数功能是发送地址1-250到从机(具体程序看下面)。但是有时候也可能只运行该子函数一次(我的要求就是一次)。
我用过的办法。
1.以为12pf电容太小,结果换了30pf的也不行。
2.把没有问题的板子上的单片机和有问题的板子的单片机互换。结果有问题的还是照旧,。没问题的还是没问题。就是排除了单片机问题。
3.测量电源正常,光耦换了N个。还不行。我直接把光耦去掉,用串口直接485芯片还是不行。貌似必须串口悬空才能下载程序。只有悬空才能不循环执行那个子函数。
下面是函数:
void get_num(void)
{
uchar temp=16;
uint N=0;
uchar k=0;
Uartinit();
Delay1ms(200);
TB8=1;RED=1;
for(N=1;N<251;N++)
{
//if(N==253)
// {break;}
Delay1ms(200);
EN=0; //使能发送
Delay1ms(10);
SBUF=N;
while(TI==0);
TI=0;
Delay1ms(100);
EN=1; //使能接受
Delay1ms(10);
if(RI==1)
{
RI=0;
temp=SBUF;
pot_address[k]=temp; //从机发来的地址保存数组里

k++;
}

}
RED=0;
}

void main()
{ uchar i,j,n,temp,addr1,k;
uint m;
P2=0xff;
UartInit();
Tim0_init();
S119=1;
RED=0;
get_num(); //我用串口连接电脑,查看运行情况
//程序执行到子函数,就一直循环执行这个子函数。
for(i=0;i<8;i++)
{
if(pot_address==0)
{
bbb=i+1;
break;
}
else
bbb=9;
}
++++++++++++++
下面还有程序,我只贴出这些。
我认为应该是硬件的问题。但是我极其认真的比较了有问题的板子和没问题的板子实在找不出差别。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
gaoshao
1楼-- · 2019-07-16 10:18
你的这个问题是你自己基础不老造成的
自己慢慢想,硬件软件都有问题
wangka
2楼-- · 2019-07-16 13:22
 精彩回答 2  元偷偷看……
kevinvind
3楼-- · 2019-07-16 14:13
以前遇到过光耦的问题,光耦输出到74HC164,结果传输时总有问题,费了些时间,最后发现原来是光耦的速度不够快,导致光耦输出信号的上升沿不够陡,不得已又加了整形电路后解决的。
之后明白应该直接使用高速光耦更合适。

不知道楼主也是这问题不?
liuqiyan
4楼-- · 2019-07-16 20:02
批判下楼主
不知道你搞研发时候到底看没看过芯片资料,485芯片在输入断开的情况下,RXD是输出高电平的。这个问题拿脑袋想都想得通——
如果一个485设备,在不插电缆的时候,RXD输出为低或者有信号,单片机不是要疯了{:50:}
liuqiyan
5楼-- · 2019-07-17 01:45
再给你点教训:
运行某个你不希望的函数,是软件上的问题,不要去找借口说这个单片机可以对,那个不能对,芯片出问题的概率小于你买彩票中奖的概率,你现在应该静下心来找,这个函数为什么被运行了,也许在硬件和软件设计上有你根本没有考虑到的漏洞或者边界情况!没有经过这样历练出来的工程师,始终只是一个模仿者而不是开发者!
palatree
6楼-- · 2019-07-17 05:48
我经验太少了。以前没做过通信,都是单机小产品。这次真是见笑了。

一周热门 更多>