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