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

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;
}
++++++++++++++
下面还有程序,我只贴出这些。
我认为应该是硬件的问题。但是我极其认真的比较了有问题的板子和没问题的板子实在找不出差别。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。