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

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条回答
liziwu
1楼-- · 2019-07-17 06:25
 精彩回答 2  元偷偷看……
98dian
2楼-- · 2019-07-17 08:13
三个120并联等于40欧姆,近距离没什么问题,30欧姆以上实验都没问题。实验结果而已。产品可不行,算设计错误,最后原因查出来评不上工程师。

我的系统接了80个从机,最远800米。只需要在800米双绞线两端焊2个120欧姆即可;板子上无需加电阻。
1988xiaoniao
3楼-- · 2019-07-17 12:46
下载程序时,必须保证半双工485芯片 75176 处于输出状态,也就是第2/3管脚RE/DE 必须为低电平! 如图,这只要在2个红 {MOD}X 之一位置焊接一个短路块即可;——下载程序时拔掉短路块,工作时短接短路块。

单片机电路图
攻城师
4楼-- · 2019-07-17 17:58
简单 说就是各节点同时争抢总线,发送冲突检测随机时间退避算法。原理图??呵呵...485的EN脚还要用个IO去控制,岂不是浪费资源?
   1110291231e465438775b697bd.jpg
fuduo
5楼-- · 2019-07-17 21:44
靠 轻易不回帖 被楼主的 宇宙级问题
给掉出来了  瞅瞅其他人的解答

电子速客
6楼-- · 2019-07-18 03:01
 精彩回答 2  元偷偷看……

一周热门 更多>