找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3754|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

求助,STC單片機(jī)TTL端口可以主從通訊,用了485芯片就不能通訊了,求大佬指點(diǎn)迷津啊!

[復(fù)制鏈接]
跳轉(zhuǎ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;                                               //握手信號,送數(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;                //啟動定時(shí)器2
        TH0 = 0xfc;    // 設(shè)置定時(shí)器0高8位初值         11.0592Mhz主頻下該參數(shù)溢出一次約0.001秒
    TL0 = 0x66;     //設(shè)置定時(shí)器0低8位
    TR1 = 1;       //啟動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;                                  //握手信號清零
                }
    }
}
/* T0中斷服務(wù)函數(shù),完成LED掃描 */
void InterruptTimer0() interrupt 1
{
    TH0 = 0xfc;  //重新加載重載值
    TL0 = 0x66;
        clt++;
        if(clt>=500){key=1;clt=0;}           //定時(shí)超過0.5秒后,重新發(fā)起握手信號
}
/* UART中斷服務(wù)函數(shù) */
void InterruptUART() interrupt 4
{
        if(RI)                                                   //此主機(jī)暫不接收任何數(shù)據(jù)這部分不用理會
        {
        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;                //啟動定時(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;}
}




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:718536 發(fā)表于 2021-1-8 19:56 | 只看該作者
現(xiàn)在直接用單片機(jī)腳TTL電平是可以主從通訊的。就是經(jīng)過485芯片后完全沒反應(yīng)....
回復(fù)

使用道具 舉報(bào)

板凳
ID:390416 發(fā)表于 2021-1-8 20:41 | 只看該作者

可以使用490芯片 代替485芯片
回復(fù)

使用道具 舉報(bào)

地板
ID:235200 發(fā)表于 2021-1-8 21:11 | 只看該作者
是一端用了485還是兩端用了485,如果是前者肯定不能通信
回復(fù)

使用道具 舉報(bào)

5#
ID:718536 發(fā)表于 2021-1-8 22:05 | 只看該作者
csmyldl 發(fā)表于 2021-1-8 21:11
是一端用了485還是兩端用了485,如果是前者肯定不能通信

兩頭都是用485芯片呀。
回復(fù)

使用道具 舉報(bào)

6#
ID:863432 發(fā)表于 2021-1-9 11:41 | 只看該作者
RS485芯片是有使能控制引腳的,該引腳決定接收和發(fā)送,所以RS485通信是半雙工,UART是全雙工,一定注意。
回復(fù)

使用道具 舉報(bào)

7#
ID:752974 發(fā)表于 2021-1-9 13:08 | 只看該作者
6樓說的很明白了,485通信是主從結(jié)構(gòu),一主多從,從機(jī)平時(shí)一定是接收狀態(tài),根據(jù)主機(jī)的命令再確定自己的收發(fā)狀態(tài)。切記。。!
回復(fù)

使用道具 舉報(bào)

8#
ID:718536 發(fā)表于 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一直是拉低的。就是一直通訊不能。
回復(fù)

使用道具 舉報(bào)

9#
ID:718536 發(fā)表于 2021-1-9 21:11 | 只看該作者
已經(jīng)解決了,原來是因?yàn)?85芯片不支持熱拔插,燒毀了,  換了個(gè)芯片就可以正常通訊了。還有485芯片貌似是CMOS工藝,如果單片機(jī)上電瞬間是高阻狀態(tài)的話,建議485芯片引腳還是加上上拉電阻之類的,不然 造成引腳懸空容易燒毀,AB腳1K上下拉,AB腳間120歐。
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表