|
10積分
最近用STC12C5202AD芯片,實現(xiàn)主機與從機通信功能,用的是RS485協(xié)議,上面是RS485電路圖,現(xiàn)在的情況是只能收發(fā)一個數(shù)據(jù),無論主機發(fā)送多少個數(shù)據(jù),從機也只能收發(fā)一個數(shù)據(jù),調(diào)試了整天也沒有找到原因,下面是我編寫的程序:
#include
unsigned char TEMP,a;
sbit RE = P1^2; //接收允許開關
sbit DE = P1^1; //發(fā)送允許開關
/**************************************
延時程序
**************************************/
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位數(shù)據(jù)
TH1=0XFD; //波特率9600的初始值
TL1=0XFD; //波特率9600的初始值
SCON=0X50; //設置串口的模式為方式1并置為REN使串口工作
TR1=1; //啟動定時器工作
EA=1; //開啟總中斷
ES=1; //開啟串口中斷
DE = 0;
RE = 0; //允許接收,禁止發(fā)送數(shù)據(jù)
}
void main()
{
init(); //調(diào)用初始化子函數(shù)
//delay(50);
while(1) //死循環(huán)
{
if(TEMP==1) //判斷是否接收完數(shù)據(jù)
{
DE = 1;
RE = 1; //允許發(fā)送,禁止接收數(shù)據(jù)
delay(50);
EA=0; //關閉串口中斷
TEMP=0; //變量TEMP清0
SBUF = a; //把a的值送到發(fā)送SBUF中去,注意此SBUF不同中斷函數(shù)里面的接收SBUF
while(!TI) ; //等待數(shù)據(jù)發(fā)送完畢
TI = 0; //發(fā)送完數(shù)據(jù)后清0
delay(50);
EA=1; //開啟串口中斷
DE = 0;
RE = 0; //允許接收,禁止發(fā)送數(shù)據(jù)
delay(50);
}
}
}
void ser() interrupt 4
{
RI=0; //接收完數(shù)據(jù)后軟件清除中斷標志位
a = SBUF; //把他放進變量A中為了讀取返回
TEMP=1; //置位TEMP
}
該程序如果去掉延時,用在RS232芯片上,通信一切正常,請各位高手幫我分析一下,是程序出現(xiàn)了問題,還是電路問題,謝謝大家! |
|