標(biāo)題: 求助,STC單片機(jī)TTL端口可以主從通訊,用了485芯片就不能通訊了,求大佬指點(diǎn)迷津��! [打印本頁(yè)]

作者: suqianfu    時(shí)間: 2021-1-8 19:54
標(biāo)題: 求助,STC單片機(jī)TTL端口可以主從通訊,用了485芯片就不能通訊了,求大佬指點(diǎn)迷津啊!
主機(jī)代碼:
#include <STC15.h>
#include <INTRINS.H>
#define uint unsigned int   //宏命令,聲明uint替代unsignde int
#define uchar unsigned char        //宏命令,聲明uchar替代unsigned char

sbit a=P1^0;
sbit b=P1^1;
sbit c=P1^2;
sbit d=P1^3;
sbit e=P1^4;
sbit f1=P1^5;
sbit ss=P1^6;
sbit xx=P1^7;
sbit rs485=P5^5; //485方向控制腳
sbit s1=P2^0;
sbit s2=P2^0;
sbit s3=P2^0;
sbit s4=P2^0;
sbit s5=P2^0;
sbit s6=P2^0;
sbit s7=P2^0;
sbit s8=P2^0;
sbit s9=P2^0;
sbit s10=P2^0;

uchar shuxian,run,as1,as2,as3,as4,as5,as6,as7,as8,as9,as10,ast,ads;//數(shù)顯及按鍵指令
uchar sdat[4];   //串口接收到的數(shù)組
uchar fdat[4];         //串口要發(fā)送的數(shù)組
uchar fadd,sadd,add;                      //廣播地址碼,接收地址碼,主機(jī)地址碼。
uchar key,cnt;                                               //握手信號(hào),送數(shù)計(jì)量。
uint clt;                                 //定時(shí)變量最大值65536即65秒。

void ysms(uint xms)
{
uint i,j,k;
  for(i=xms;i>0;i--)
        for(j=50;j>0;j--)
        for(k=1;k>0;k--);  
}

/* 串口配置函數(shù),baud-通信波特率 */
void ConfigUART()
{
    SCON = 0x50;                //8位數(shù)據(jù),可變波特率
        AUXR |= 0x01;                //串口1選擇定時(shí)器2為波特率發(fā)生器
        AUXR |= 0x04;                //定時(shí)器2時(shí)鐘為Fosc,即1T
        T2L = 0xE0;                //設(shè)定定時(shí)初值
        T2H = 0xFE;                //設(shè)定定時(shí)初值
        AUXR |= 0x10;                //啟動(dòng)定時(shí)器2
        TH0 = 0xfc;    // 設(shè)置定時(shí)器0高8位初值         11.0592Mhz主頻下該參數(shù)溢出一次約0.001秒
    TL0 = 0x66;     //設(shè)置定時(shí)器0低8位
    TR1 = 1;       //啟動(dòng)T1
        ET0=1;                   //關(guān)閉T1中斷使能
        EA=1;                   //總中斷開關(guān)
    ES=1;       //使能串口1中斷
}

void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
    P6M0 = 0x00;
    P6M1 = 0x00;
    P7M0 = 0x00;
    P7M1 = 0x00;                                                          
        key=1;                                                                                  //初始允許廣播握手
        cnt=0;
    ConfigUART();  //配置波特率為9600
        TI=0;RI=0;
        shuxian = 11;
        run     = 12;
        fadd    = 1;
    cnt=0;
    while (1)
    {
       
        fdat[0]=fadd;                         //發(fā)送數(shù)組0字節(jié)為讀取fadd變量
        fdat[1]=255;
        fdat[2]=255;
        fdat[3]=255;

          
          if(key==1)
          {
            rs485=1;         //設(shè)置485為發(fā)送方向
                ET0=0;                 //
                TR0=0;
                clt=0;
                REN=0;
                for(cnt=0;cnt<4;cnt++)        //FOR循環(huán)送4個(gè)字節(jié)
                {
                 SBUF=fdat[cnt];
                 while(!TI);
                 TI=0;                                  //清零發(fā)送完畢標(biāo)記
                }
                rs485=0;                         //設(shè)置485為接收方向
                TR0=1;
                ET0=1;
                clt=0;
                fadd++;                                 //廣播地址值+1
                if(fadd>=8){fadd=1;}  //如果廣播地址超過或等于8.則重新置為1;
                key=0;                                  //握手信號(hào)清零
                }
    }
}
/* T0中斷服務(wù)函數(shù),完成LED掃描 */
void InterruptTimer0() interrupt 1
{
    TH0 = 0xfc;  //重新加載重載值
    TL0 = 0x66;
        clt++;
        if(clt>=500){key=1;clt=0;}           //定時(shí)超過0.5秒后,重新發(fā)起握手信號(hào)
}
/* UART中斷服務(wù)函數(shù) */
void InterruptUART() interrupt 4
{
        if(RI)                                                   //此主機(jī)暫不接收任何數(shù)據(jù)這部分不用理會(huì)
        {
        sdat[cnt] = SBUF;
        cnt++;
        RI=0;
        }
       
}



從機(jī)代碼
#include <stc15.h>
#define uint unsigned int   //宏命令,聲明uint替代unsignde int
#define uchar unsigned char        //宏命令,聲明uchar替代unsigned char

#define S1_S0 0x40              //P_SW1.6
#define S1_S1 0x80              //P_SW1.7

sbit xxd=P1^0;
sbit ssd=P1^1;
sbit a=P1^2;
sbit b=P1^3;
sbit c=P1^4;
sbit rs485=P1^5;
sbit jxd=P1^6;
sbit fd=P1^7;
sbit wha=P5^4;
sbit ds=P5^5;

uchar shuxian = 0;
uchar as,jt,ss,xx,addr,cnt,fadd,key;
uchar sdat[4];  //串口接收到的數(shù)組
uchar fdat[4];         //串口發(fā)送的數(shù)組
uchar t;
uint clt;

void ysms(uint xms)
{
uint i,j,k;
  for(i=xms;i>0;i--)
        for(j=50;j>0;j--)
        for(k=1;k>0;k--);  
}

/* 串口配置函數(shù),baud-通信波特率 */
void ConfigUART()
{
    SCON = 0x50;                //8位數(shù)據(jù),可變波特率
        AUXR |= 0x01;                //串口1選擇定時(shí)器2為波特率發(fā)生器
        AUXR |= 0x04;                //定時(shí)器2時(shí)鐘為Fosc,即1T
        T2L = 0xE0;                //設(shè)定定時(shí)初值
        T2H = 0xFE;                //設(shè)定定時(shí)初值
        AUXR |= 0x10;                //啟動(dòng)定時(shí)器2
        EA=1;                   //總中斷開關(guān)
    ES=1;       //使能串口1中斷
}

void main()
{       

        P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
    P6M0 = 0x00;
    P6M1 = 0x00;
    P7M0 = 0x00;
    P7M1 = 0x00;

           a=0;b=0;c=0;ssd=0;xxd=0;jxd=0;fd=0;
        cnt=0;
           ConfigUART();
        TI=0;RI=0;
        shuxian=1;
    while (1)
    {           
           rs485=0;
           shuxian=sdat[0];
          switch(shuxian)                                //數(shù)組0字節(jié)顯示函數(shù)
          {
          case 1 : a=1;b=0;c=0; break;
          case 2 : a=0;b=1;c=0; break;
          case 3 : a=1;b=1;c=0; break;
          case 4 : a=0;b=0;c=1; break;
          case 5 : a=1;b=0;c=1; break;
          case 6 : a=0;b=1;c=1; break;
          case 7 : a=1;b=1;c=1; break;
          }   
            
    }
}

/* UART中斷服務(wù)函數(shù) */
void InterruptUART() interrupt 4
{
          

       RI = 0;            
           sdat[cnt] = SBUF;
           cnt++;
           if(cnt>=4){cnt=0;}
}





作者: suqianfu    時(shí)間: 2021-1-8 19:56
現(xiàn)在直接用單片機(jī)腳TTL電平是可以主從通訊的。就是經(jīng)過485芯片后完全沒反應(yīng)....
作者: 人人學(xué)會(huì)單片機(jī)    時(shí)間: 2021-1-8 20:41

可以使用490芯片 代替485芯片

作者: csmyldl    時(shí)間: 2021-1-8 21:11
是一端用了485還是兩端用了485,如果是前者肯定不能通信
作者: suqianfu    時(shí)間: 2021-1-8 22:05
csmyldl 發(fā)表于 2021-1-8 21:11
是一端用了485還是兩端用了485,如果是前者肯定不能通信

兩頭都是用485芯片呀。
作者: 正是河豚    時(shí)間: 2021-1-9 11:41
RS485芯片是有使能控制引腳的,該引腳決定接收和發(fā)送,所以RS485通信是半雙工,UART是全雙工,一定注意。
作者: munuc_w    時(shí)間: 2021-1-9 13:08
6樓說的很明白了,485通信是主從結(jié)構(gòu),一主多從,從機(jī)平時(shí)一定是接收狀態(tài),根據(jù)主機(jī)的命令再確定自己的收發(fā)狀態(tài)。切記�。。�!
作者: suqianfu    時(shí)間: 2021-1-9 14:24
munuc_w 發(fā)表于 2021-1-9 13:08
6樓說的很明白了,485通信是主從結(jié)構(gòu),一主多從,從機(jī)平時(shí)一定是接收狀態(tài),根據(jù)主機(jī)的命令再確定自己的收發(fā) ...

是的啊,我從機(jī)485方向RE.DE一直是拉低的。就是一直通訊不能。
作者: suqianfu    時(shí)間: 2021-1-9 21:11
已經(jīng)解決了,原來是因?yàn)?85芯片不支持熱拔插,燒毀了,  換了個(gè)芯片就可以正常通訊了。還有485芯片貌似是CMOS工藝,如果單片機(jī)上電瞬間是高阻狀態(tài)的話,建議485芯片引腳還是加上上拉電阻之類的,不然 造成引腳懸空容易燒毀,AB腳1K上下拉,AB腳間120歐。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1