新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機232多機通信

        51單片機232多機通信

        作者: 時間:2016-11-25 來源:網絡 收藏
        自己寫的簡單的程序,實在是很簡單,不過我可是菜鳥,為了記下自己的點點進步,所以貼到博客上。

        具體實現的功能就是主機發送命令,相應的從機給主機回送數據(數字),主機通過數碼管顯示。

        本文引用地址:http://www.104case.com/article/201611/321472.htm

        通信協議比較簡單,需要加上對地址應答部分和數據校驗。

        //主機加按鍵命令,發送命令,查詢方式,從機受到命令后發送數據,主機顯示
        #include
        #include
        #define uchar unsigned char
        #define uint unsigned int
        sbit key1=P1^0;//按鍵命令
        sbit key2=P1^1;
        sbit key3=P1^2;

        uchar temp1=0x01,temp2=0x02,temp3=0x03;//從機各位驗證地址
        void delay(uchar N) //1ms延時
        {
        uint i,j;
        for(i=0;i for(j=0;j<110;j++);
        }
        void init_serial()
        {
        TMOD = 0x20; //定時器T1使用工作方式2
        TH1 = 253; // 設置初值
        TL1 = 253;
        TR1 = 1; // 開始計時
        PCON = 0; // SMOD = 0
        SCON = 0x50; //工作方式1,波特率9600bps,允許接收

        }

        void main(void)
        {uchar tmp1,tmp2,tmp3;//
        init_serial(); //初始化
        P1=0; //P1口清零
        while(1)
        {

        while(key1)// 1號從機函數
        {
        delay(10);
        while(key1)//按鍵去抖動
        while(1) //接收循環
        {

        P2=temp1;
        SBUF = temp1;
        while(!TI);
        TI=0; //發送地址

        // delay(100);
        while(!RI);
        RI = 0;
        tmp1 = SBUF;
        P0=tmp1;//接收從機1回送的數據;并把數據給P0
        if(key2||key3)
        {
        delay(1);
        if(key2||key3)
        break;
        }//如果其他按鍵按下則跳出本函數執行相應按鍵的發送地址函數

        }
        }
        while(key2) // 2號從機函數
        {
        delay(10);
        while(key2)
        while(1)
        {

        P2=temp2;
        SBUF = 0x02;
        while(!TI);
        TI=0;

        //delay(100);
        while(!RI);
        RI = 0;
        tmp2 = SBUF;
        P0=tmp2;
        RI=0;
        if(key1||key3)
        {
        delay(1);
        if(key1||key3)
        break;
        }

        }
        }
        while(key3) // 3號從機函數
        {
        delay(10);
        if(key3)
        while(1)
        {
        P2=temp3;
        SBUF = 0x03;
        while(!TI);
        TI=0;

        //delay(100);
        while(!RI);
        RI = 0;
        tmp3 = SBUF;
        P0=tmp3;
        RI=0;
        if(key2||key1)
        {
        delay(1);
        if(key2||key1)
        break;
        }

        }


        }
        }

        從機程序:

        #include
        #include
        #define uchar unsigned char
        #define uint unsigned int

        uchar aa = 0x20; //起始數據
        uchar temp;
        sbit P10=P1^0;//接收數據成功指示

        void delay(uchar N) //1ms延時
        {
        uint i,j;
        for(i=0;i for(j=0;j<110;j++);
        }
        void init_serial()
        {
        TMOD = 0x20; //定時器T1使用工作方式2
        TH1 = 253; // 設置初值
        TL1 = 253;
        TR1 = 1; // 開始計時
        PCON = 0; // SMOD = 0
        SCON = 0x50; //工作方式1,波特率9600bps,允許接收
        EA=1;
        ES=1;
        }
        void intrr() interrupt 4 //串口中斷函數
        {
        while(!RI); //接收地址
        RI = 0;



        if(SBUF==0x01) //1號機地址
        {

        temp = SBUF;
        P10=~P10;
        P2=temp;//把地址給P2口


        RI=0;
        delay(1000); //發送數據延時


        SBUF=aa; //發送起始數據
        while(!TI);
        TI=0;
        aa++; //數據循環
        if(aa>0x29)
        aa=0x20;
        P0=aa; //同時把數據給P0口顯示
        delay(100);
        }
        }
        void main(void)//主函數
        {


        init_serial(); //初始化
        P1=0xff;
        delay(1000);

        while(1) //循環
        {
        ;
        }

        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 斗六市| 浪卡子县| 乳源| 新巴尔虎左旗| 荆门市| 定南县| 榆树市| 井冈山市| 延安市| 阿图什市| 长岭县| 温州市| 宝清县| 金山区| 广德县| 本溪市| 高邮市| 洪洞县| 灌南县| 金山区| 青海省| 清涧县| 遂溪县| 睢宁县| 彝良县| 夏津县| 连山| 汪清县| 中西区| 永新县| 定州市| 平潭县| 会东县| 板桥市| 霞浦县| 栖霞市| 保康县| 蒙阴县| 上思县| 周口市| 怀集县|