最近用STC12C5202AD芯片,实现主机与从机通信功能,用的是RS485协议,上面是RS485电路图,现在的情况是只能收发一个数据,无论主机发送多少个数据,从机也只能收发一个数据,调试了整天也没有找到原因,下面是我编写的程序:
#include<reg52.h> unsigned char TEMP,a; sbit RE = P1^2; //接收允许开关 sbit DE = P1^1; //发送允许开关
/************************************** 延时程序 **************************************/ void delay(unsigned char i) { unsigned char j; for(i; i > 0; i--) for(j = 200; j > 0; j--); }
void init() { TMOD=0X20; //设置定时器的工作方式为方式2,自动重装8位数据 TH1=0XFD; //波特率9600的初始值 TL1=0XFD; //波特率9600的初始值 SCON=0X50; //设置串口的模式为方式1并置为REN使串口工作 TR1=1; //启动定时器工作 EA=1; //开启总中断 ES=1; //开启串口中断 DE = 0; RE = 0; //允许接收,禁止发送数据 }
void main() { init(); //调用初始化子函数 //delay(50); while(1) //死循环 { if(TEMP==1) //判断是否接收完数据 { DE = 1; RE = 1; //允许发送,禁止接收数据 delay(50); EA=0; //关闭串口中断 TEMP=0; //变量TEMP清0 SBUF = a; //把a的值送到发送SBUF中去,注意此SBUF不同中断函数里面的接收SBUF while(!TI) ; //等待数据发送完毕 TI = 0; //发送完数据后清0 delay(50); EA=1; //开启串口中断 DE = 0; RE = 0; //允许接收,禁止发送数据 delay(50); } } }
void ser() interrupt 4 { RI=0; //接收完数据后软件清除中断标志位 a = SBUF; //把他放进变量A中为了读取返回 TEMP=1; //置位TEMP }
该程序如果去掉延时,用在RS232芯片上,通信一切正常,请各位高手帮我分析一下,是程序出现了问题,还是电路问题,谢谢大家!
|