|
10積分
最近用STC12C5202AD芯片,實現主機與從機通信功能,用的是RS485協議,上面是RS485電路圖,現在的情況是只能收發一個數據,無論主機發送多少個數據,從機也只能收發一個數據,調試了整天也沒有找到原因,下面是我編寫的程序:
#include
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芯片上,通信一切正常,請各位高手幫我分析一下,是程序出現了問題,還是電路問題,謝謝大家! |
|