久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

PC機與多個51單片機串口通訊

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:51090 發(fā)表于 2014-10-13 15:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
最近需要用PC機與多個51單片機通過RS232進行通訊。
在多機通訊中,要保證主機與所選擇的從機實現(xiàn)可靠的通信,
必須保證串口具有識別的功能。在串行口控制寄存器SCON中
有一位叫做SM2,就是為了多機通訊而設(shè)置的控制位。多機通
訊的過程可以如下:1 首先從機初始化,開中斷,讓其以方式
2或3接收(9位異步通訊方式),置位SM2,REN位,允許接
收,那么當(dāng)SM2=1的時候,只有當(dāng)接收到的第9位數(shù)據(jù)(RB8)
等于1(接收到的為地址幀)的時候,前8位數(shù)據(jù)送入接收SBUF
,置位RI,產(chǎn)生中斷。如果接收到的第9位數(shù)據(jù)位0,則將接收
到的數(shù)據(jù)幀丟棄。2 此時主機可以先將從機地址發(fā)送給各個從機
系統(tǒng),各個從機的串口接收到第9位數(shù)據(jù)RB8為1,由于SM2=1
,置位RI,各個從機相應(yīng)中斷,在中斷服務(wù)程序中判斷主機送來的
地址是否與本機地址相符合(這個地址是由軟件編寫人員自行設(shè)
定的),若相符,則清零SM2,準(zhǔn)備接收數(shù)據(jù)。若不符,則保持
SM2=1. 3 第三步主機開始發(fā)送數(shù)據(jù)幀,此時前面地址相符合的
從機,SM2=0,主機發(fā)送的數(shù)據(jù)RB8=0,這樣只有SM2=0的
相符的從機可以產(chǎn)生接收數(shù)據(jù)中斷,激活中斷標(biāo)志位RI,進入中
斷服務(wù)程序,去接收數(shù)據(jù)。其他的從機因SM2=1,又RB8=0,
不能激活中斷標(biāo)志RI,不能進入中斷,則把接收到的數(shù)據(jù)丟失不
做處理。從而保證了這個數(shù)據(jù)通信的正確性。
  上面這個過程就是51單片機通過串行口進行多機通訊的完整過程。
  但是現(xiàn)在我需要PC機與多個51單片機進行通訊,而PC機上面是
無法實現(xiàn)這個RB8的設(shè)置,因為我是用串口調(diào)試助手來調(diào)試程序。
那么我
  所幸不用上面的多機通信的方法。而是自己來規(guī)定一個一個信息頭
,一個信息尾。比如F0,A5,然后跟著地址信息。之所以加這么一個
信息頭,是為了防止數(shù)據(jù)與地址的值相同,造成從機誤接收。這個
信息頭設(shè)置的越復(fù)雜一些,避免誤接收的效果就越好,這是很簡單
的道理。
  這樣只有從機接收到這個代表地址信息的信息頭,而且后面跟著的
地址與自己的地址相符合,才跳轉(zhuǎn)到接受數(shù)據(jù)的程序段。而其他從機
則是不斷的在接收這些數(shù)據(jù),無論是地址,還是數(shù)據(jù),但是全部丟棄
他們。這樣就從軟件上解決了這個PC機與多個51單片機多機通訊調(diào)
試程序時的一個缺陷。當(dāng)然可以考慮自己通過VC編寫一個小的上位機
軟件,來處理這個事情,不知道微軟的API是否也有這個RB8的機制,
自己才疏學(xué)淺,并不知曉。
  下面將自己編寫的簡單程序段放在這里,方便日后參考:
view plaincopy to clipboardprint?
#include <reg52.h>   
  
#define uchar unsigned char   
#define uint  unsigned int   
#define __MAX_LEN_ 64     
  
sbit FMQ=P3^7;   
  
uchar addr,s=0,i=0,tmp=0xff;   
uchar buf[__MAX_LEN_];   
  
void init_serial()   
{   
     TMOD = 0x20;   
     TH1 = 250;     
     TL1 = 250;   
     TR1 = 1;      
     PCON = 0x80;      
     SCON = 0xd0;   
}   
   
void delay(uint k)   
{   
     uint i,j;   
     for(i=0;i<k;i++)   
          for(j=0;j<110;j++);   
}   
  
void Beep_ok()   
{   
    FMQ=0;   
    delay(200);   
    FMQ=1;   
    delay(200);   
   
    FMQ=0;   
    delay(200);   
    FMQ=1;   
    delay(200);   
}   
  
void Beep_Addr_OK()   
{   
    FMQ=0;   
    delay(1000);   
    FMQ=1;   
}   
  
uchar rec_uart(uchar *buf)   
{   
    uchar DATA;   
    RI = 0;   
    while(!RI);   
    DATA=SBUF;   
    P2 = 0xff;   
    addr = P2;   
    if(DATA==addr)   
       return 0xfe;   
   
    buf[s] = SBUF;   
    s++;   
    if(s==__MAX_LEN_)   
   {   
       s=0;   
    }   
   
    P0=SBUF;   
    Beep_ok();   
    return 0xff;   
}   
  
  
void main()   
{   
    init_serial();     
    EA = 0;      
    while(1)   
   {   
   
loop:  P2 = 0xff;   
          addr = P2;   
          SM2 = 0;     
          tmp = addr-1;   
  
          while(tmp != addr)   
         {   
              RI = 0;   
              while(!RI);   
              tmp = SBUF;   
              P1=tmp;   
              RI = 0;   
          }   
         Beep_Addr_OK();   
  
        TI = 0;   
        TB8 = 0;      
        SBUF = addr;   
        while(!TI);   
        TI = 0;   
       SM2 = 0;      
       tmp = 0xff;   
       while(1)   
       {   
           while(tmp == 0xff)      
          {   
                tmp = rec_uart(buf);      
           }     
  
           if(tmp == 0xfe)      
          {   
                Beep_Addr_OK();   
               goto loop;   
           }   
        }   
  
    }   
}  
#include <reg52.h>
#define uchar unsigned char
#define uint  unsigned int
#define __MAX_LEN_ 64  
sbit FMQ=P3^7;
uchar addr,s=0,i=0,tmp=0xff;
uchar buf[__MAX_LEN_];
void init_serial()
{
     TMOD = 0x20;
     TH1 = 250;  
     TL1 = 250;
     TR1 = 1;   
     PCON = 0x80;   
     SCON = 0xd0;
}

void delay(uint k)
{
     uint i,j;
     for(i=0;i<k;i++)
          for(j=0;j<110;j++);
}
void Beep_ok()
{
    FMQ=0;
    delay(200);
    FMQ=1;
    delay(200);

    FMQ=0;
    delay(200);
    FMQ=1;
    delay(200);
}
void Beep_Addr_OK()
{
    FMQ=0;
    delay(1000);
    FMQ=1;
}
uchar rec_uart(uchar *buf)
{
    uchar DATA;
    RI = 0;
    while(!RI);
    DATA=SBUF;
    P2 = 0xff;
    addr = P2;
    if(DATA==addr)
       return 0xfe;

    buf[s] = SBUF;
    s++;
    if(s==__MAX_LEN_)
   {
       s=0;
    }

    P0=SBUF;
    Beep_ok();
    return 0xff;
}

void main()
{
    init_serial();  
    EA = 0;   
    while(1)
   {

loop:  P2 = 0xff;
          addr = P2;
          SM2 = 0;  
          tmp = addr-1;
          while(tmp != addr)
         {
              RI = 0;
              while(!RI);
              tmp = SBUF;
              P1=tmp;
              RI = 0;
          }
         Beep_Addr_OK();
        TI = 0;
        TB8 = 0;   
        SBUF = addr;
        while(!TI);
        TI = 0;
       SM2 = 0;   
       tmp = 0xff;
       while(1)
       {
           while(tmp == 0xff)   
          {
                tmp = rec_uart(buf);   
           }  
           if(tmp == 0xfe)   
          {
                Beep_Addr_OK();
               goto loop;
           }
        }
    }
}

程序中,并沒有使用這個信息頭,當(dāng)然很容易就可以加上,這個只是個
簡單的測試,蜂鳴器的響聲,也是調(diào)試程序中使用,另外程序中使用了
goto,破壞了程序的結(jié)構(gòu),以后具體應(yīng)用中再具體編寫合適的程序。

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

使用道具 舉報

沙發(fā)
ID:195884 發(fā)表于 2017-6-18 13:48 | 只看該作者
這是一個好貼
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 伊人久久在线 | 在线免费观看成人 | 国产成人精品一区二区三区视频 | www.狠狠操 | 精品国产伦一区二区三区观看体验 | 国产一区二区毛片 | 成人h电影在线观看 | 国产精品黄视频 | 成人不卡视频 | 一区二区三区视频在线观看 | 亚洲综合小视频 | 久久成人国产 | 91av在线免费播放 | 欧美成人第一页 | 国产高清视频在线 | 日韩欧美在线观看视频 | 中文字幕日韩av | 国产日韩欧美一区二区 | 欧美精品一区二区三区四区 | 亚洲色片网站 | 精品国产乱码久久久久久a丨 | 国产精品二区三区在线观看 | 日韩av黄色| 老外黄色一级片 | 91精品国产麻豆 | 日韩av资源站 | 中文字幕一区在线观看视频 | 看av在线| 久久亚洲一区 | 亚洲成人观看 | 亚洲在线视频 | 欧美日韩综合视频 | 狠狠亚洲 | 在线成人 | 国产日韩一区二区三区 | 日本在线你懂的 | 成年人网站在线观看视频 | 国产精品免费高清 | 二区视频| www.婷婷 | 亚洲一区二区电影在线观看 |