搜索
bottom↓
回复: 0

51多机通讯

[复制链接]

出0入0汤圆

发表于 2012-2-23 12:58:23 | 显示全部楼层 |阅读模式
共享一个多机通讯的程序

点击此处下载 ourdev_721440KOTURK.rar(文件大小:31K) (原文件名:多机通讯(成功的).rar)

主机

#include<reg52.h>
#include<LCD1602.h>
#define uchar unsigned char
#define uint unsigned int

#define    DW    16      //&#182;¨ò&#229;êy&#190;Y&#214;&#161;&#191;í&#182;è

uchar KEY=0;
uchar K,SUM=0,PP=0;
uchar R_buf[2][DW];                //&#189;óê&#213;μ&#189;μ&#196;êy&#190;Y′&#230;óú′&#203;êy×é
bit FLAG,RIGHT=0;                //RIGHT&#206;aê&#213;μ&#189;êy&#190;YoíD£&#209;é&#213;yè·±ê&#214;&#190;&#206;&#187;
bit RUN=0;                                //&#214;÷&#187;ú3ìDò&#214;′DD&#191;&#216;&#214;&#198;&#206;&#187;
uchar slave;                        //′ó&#187;úμ&#216;&#214;·&#214;D&#188;&#228;±&#228;á&#191;

///////////////////&#209;óê±oˉêy//////////////////////////////
/*
void delay(uint k)
{
        uint x,y;
        for(x=k;x>0;x--)
                for(y=110;y>0;y--);
}*/

/////////////////////3&#245;ê&#188;&#187;ˉ/////////////////////////

void init()
{       
        TMOD=0x20;
        PCON=0x00;
        TH1=0xfd;
        TL1=0xfd;                                  //2¨ì&#216;&#194;ê9600
        TR1=1;
        SM0=1;
        SM1=1;
        SM2=1;
        EA=1;
        ES=1;                                         //&#191;a′&#174;&#191;ú&#214;D&#182;&#207;
        EX0=1;                                         //&#191;aía2&#191;&#214;D&#182;&#207;0
        IT0=1;                                         //′¥·¢·&#189;ê&#189;
        REN=1;
}


////////////////&#207;ò&#196;3ò&#187;′ó&#187;ú·¢&#203;í&#195;üá&#238;////////////////////////

void send(uchar add,uchar cmd)
{
        //REN=0;       

        TB8=1;
        SBUF=add;           //·¢&#203;íμ&#216;&#214;·
        while(!TI);
        TI=0;

        TB8=0;
        SBUF=cmd;           //·¢&#203;í&#195;üá&#238;
        while(!TI);
        TI=0;

        //REN=1;
}

///////////////////&#214;÷oˉêy///////////////////////////

void main()
{
        uchar num=0;
        uchar m,a,b,shifen,ge,shi,bai;
        int k;
        init();
        LCD_init();
        delay(100);

        while(1)
        {
                while(RIGHT)
                {
                        /*P1=R_buf[num++];
                        delay(300);
                        if(num==8)
                                num=0;*/
                        if(RUN)
                        {
                       
                                a=R_buf[slave][1]<<4;
                                b=R_buf[slave][0]>>4;
                       
                                if(R_buf[slave][1]&0x80)
                                {
                                        k=(int)R_buf[slave][1];
                                        k=(k<<8)|(int)(R_buf[slave][0]);
                                        k=~(k-1);
                                        a=(uchar)(k>>8);
                                        b=(uchar)k;
                                        a=a<<4;
                                        b=b>>4;
                                }

       
                                m=a|b;
                                bai=m/100;
                                shi=m%100/10;
                                ge=m%100%10;
                                shifen=(R_buf[slave][0]&0x0f)*6.25/10;

                                if(slave==0x00)
                                {
                                        if(R_buf[slave][1]&0x80)
                                                dspchar(1,1,'-');
                                        else
                                                dspchar(1,1,bai+0x30);       
                                        dspchar(2,1,shi+0x30);
                                        dspchar(3,1,ge+0x30);
                                        dspchar(4,1,'.');
                                        dspchar(5,1,shifen+0x30);
                                        dspchar(7,1,R_buf[slave][2]);
                                        dspchar(8,1,R_buf[slave][3]);
                                        dspchar(9,1,R_buf[slave][4]);
                                }
                                if(slave==0x01)
                                {
                                        if(R_buf[slave][1]&0x80)
                                                dspchar(1,2,'-');
                                        else
                                                dspchar(1,2,bai+0x30);
                                        dspchar(2,2,shi+0x30);
                                        dspchar(3,2,ge+0x30);
                                        dspchar(4,2,'.');
                                        dspchar(5,2,shifen+0x30);
                                        dspchar(7,2,R_buf[slave][2]);
                                        dspchar(8,2,R_buf[slave][3]);
                                        dspchar(9,2,R_buf[slave][4]);
                                }
                                 RUN=0;
                        }       
                }
        }
}

/////////////////&#214;D&#182;&#207;·t&#206;&#241;3ìDò///////////////////////////

void ser() interrupt 4
{
        uchar add;
        REN=0;                                                      //1&#216;±&#213;&#189;óê&#213;êy&#190;Yê1&#196;ü
        RI=0;
        if( (RB8==1)&&(FLAG==0) )                  //&#197;D&#182;&#207;′ó&#187;ú·¢à′μ&#196;ê&#199;·&#241;&#206;aμ&#216;&#214;·
        {
                add=SBUF;                     //è&#161;′ó&#187;úμ&#216;&#214;·
                SUM=0;
                PP=0;
                K=0;
                SM2=0;                                  //&#184;&#196;&#206;a&#214;±í¨·&#189;ê&#189;£&#172;ò&#212;±&#227;&#189;óê&#213;&#189;&#171;òa·¢à′μ&#196;êy&#190;Y
        }

        if(RB8==0)
        {
                R_buf[slave][K]=SBUF;                              //è&#161;êy&#190;Y
                SUM+=R_buf[slave][K];                                  //&#199;óoíò&#212;×÷oíD£&#209;é
                K++;
                FLAG=1;                                                  //ê&#213;μ&#189;μúò&#187;&#184;&#246;êy&#190;Yê±&#214;&#195;1,ò&#212;±&#227;&#199;&#248;·&#214;μ&#216;&#214;·&#214;&#161;ó&#235;D£&#209;é&#214;&#161;

                if(K==DW)                                          //K′&#239;μ&#189;êy&#190;Y&#214;&#161;3¤&#182;è£&#172;±í&#195;÷êy&#190;Y&#189;óê&#213;íê
                {
                        SM2=1;                                      //&#184;&#196;&#187;&#216;&#182;à&#187;úí¨&#209;&#182;&#196;£ê&#189;
                       
                }

        }

        if( (RB8==1)&&(FLAG==1) )              //±íê&#190;ê&#213;μ&#189;μ&#196;ê&#199;D£&#209;é&#214;μ
        {
                FLAG=0;
                PP=SBUF;                      //è&#161;D£&#209;éoí
                if(PP==SUM)                                          //è&#231;1&#251;oíD£&#209;é&#207;àμè£&#172;&#212;ò&#213;yè·
                {                                          
                        RIGHT=1;                  //μèóú1±íê&#190;ê&#213;μ&#189;μ&#196;êy&#190;Y&#213;yè·

                        send(slave,0x00);                  //·¢&#203;í0x00,±íê&#190;ê&#213;μ&#189;μ&#196;êy&#190;Y&#213;yè·

                }
                else
                {
                        RIGHT=0;
                        send(slave,0xff);                  //·¢&#203;í0xff,±íê&#190;ê&#213;μ&#189;μ&#196;êy&#190;YóD&#206;ó
                }
        }
       
        REN=1;       
}

void exter0() interrupt 0
{
       
        RUN=1;
        switch(KEY)
        {
                case 0: slave=0x00;break;
                case 1: slave=0x01;break;
                default: break;
        }

        KEY=(KEY+1)%2;               
        send(slave,0xff);              //&#207;ò′ó&#187;ú·¢&#203;í′í&#206;óD&#197;o&#197;ò&#212;è&#195;&#198;&#228;·¢&#203;íêy&#190;Y       
}


从机

#include <reg52.h>
#include<DS18B20.h>
#define uchar unsigned char
#define uint unsigned int
#define   DW    16       //&#182;¨ò&#229;êy&#190;Y&#214;&#161;&#191;í&#182;è,ó|ó&#235;&#214;÷&#187;úò&#187;&#214;&#194;

#define ADDR  0x00            //±&#190;&#187;úμ&#216;&#214;·

bit WRONG=0;                    //·¢&#203;íμ&#196;êy&#190;Yó&#235;&#214;÷&#187;úê&#213;μ&#189;μ&#196;êy&#190;YD£&#209;é2&#187;ò&#187;&#214;&#194;′í&#206;ó±ê&#214;&#190;&#206;&#187;,&#206;a1ê±&#206;a′í


uchar T_buf[DW];           //μè′y·¢&#203;íμ&#196;êy&#190;Y

///////////////////&#209;óê±oˉêy//////////////////////////////

void delay(uint k)
{
        uint x,y;
        for(x=k;x>0;x--)
                for(y=110;y>0;y--);
}
////////////////////3&#245;ê&#188;&#187;ˉ/////////////////////////////
void init()
{               

        TMOD=0x20;
        PCON=0x00;
        TH1=0xfd;
        TL1=0xfd;                        //2¨ì&#216;&#194;ê9600
        TR1=1;
        SM0=1;
        SM1=1;
        SM2=1;
        EA=1;
        ES=1;
        REN=1;                           //&#213;aò&#187;&#190;&#228;2&#187;&#196;ü·&#197;&#212;ú&#199;°&#195;&#230;
}

////////////////////·¢&#203;í&#182;à×&#214;&#189;úêy&#190;Y////////////////////////
void send()
{
        uchar i,sum=0;

        TB8=1;
        SBUF=ADDR;
        while(!TI);
                TI=0;

        for(i=0;i<DW;i++)
        {
                TB8=0;
                SBUF=T_buf;                        //&#189;&#171;êy×é&#214;Dμ&#196;êy&#190;Y·¢&#203;í3&#246;è¥
                while(!TI);
                        TI=0;
                sum+=T_buf;                        //&#199;óoí£&#172;ò&#212;±&#227;&#189;&#248;DDoíD£&#209;é
        }
        TB8=1;
        SBUF=sum;                                        //·¢&#203;íD£&#209;é&#214;μ
        while(!TI);
                TI=0;

}

////////////////////////&#214;÷oˉêy//////////////////////////////
void main()
{
        init();
        T_buf[2]='S';
        T_buf[3]='L';
        T_buf[4]='1';

        while(1)
        {
                readtemp();
                T_buf[0]=t_lsb;
                T_buf[1]=t_msb;
                while(WRONG)
                {
                        send();
                }
        }
}

///////////////////////&#214;D&#182;&#207;·t&#206;&#241;3ìDò///////////////////
void ser() interrupt 4
{
        uchar add;

        REN=0;                                   //1&#216;±&#213;&#189;óê&#213;êy&#190;Yê1&#196;ü
        RI=0;
        add=SBUF;

        if(add==ADDR)              //±è&#189;&#207;μ&#216;&#214;·
        {
                SM2=0;                           //è&#244;μ&#216;&#214;·&#198;¥&#197;&#228;£&#172;&#184;&#196;&#206;a&#214;±í¨·&#189;ê&#189;
        }


                       
        if(RB8==0)
        {
                if(SBUF==0x00)                        //ê&#213;μ&#189;&#214;÷&#187;úD£&#209;é&#213;yè·D&#197;o&#197;
                        WRONG=0;
                if(SBUF==0xff)                        //ê&#213;μ&#189;&#214;÷&#187;úD£&#209;é′í&#206;óD&#197;o&#197;
                        WRONG=1;

                SM2=1;                                        //&#184;&#196;&#187;&#216;&#182;à&#187;ú&#196;£ê&#189;
        }

        REN=1;       
}


DS18B20

/***************************************************
&#212;ú±àD′3ìDòê±£&#172;&#189;&#171;±&#190;í·&#206;&#196;&#188;t°üo&#172;&#214;á&#198;&#228;&#214;D£&#172;&#214;±&#189;ó°′&#203;3Dòμ÷ó&#195;
readtempoítemp_to_stringoˉêy&#189;&#171;μ&#195;μ&#189;&#191;éó&#195;óú1602òo&#190;§&#207;&#212;
ê&#190;μ&#196;×&#214;·&#251;êy×é temp[].
è&#171;&#190;&#214;±&#228;á&#191;£ot_lsb,t_msb,temp[],DQ.
ê1ó&#195;&#182;&#203;&#191;ú£oP3^7.
×¢£o±&#190;oˉêyò&#209;&#182;¨ò&#229;μ&#196;è&#171;&#190;&#214;±&#228;á&#191;°üà¨oˉêy&#195;&#251;2&#187;&#196;ü&#212;úí&#172;ò&#187;1¤3ì
&#214;D&#198;&#228;&#203;&#251;&#206;&#196;&#188;t&#214;D3&#246;&#207;&#214;&#214;&#216;&#195;&#251;£&#172;è&#244;óD±&#216;òa£&#172;&#199;&#235;×&#195;&#199;é&#184;ü&#184;&#196;£&#161;
****************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define   NOP   _nop_()
sbit DQ = P3^7;
uchar t_lsb,t_msb;
//uchar temp[9];


////////////////11us&#209;óê±///////////////////////////
void delay_DS18B20(uint z)
{
        for(;z>0;z--);
}

//////////////////////DS18B20&#184;′&#206;&#187;///////////////////////
void DS18B20_init()
{
        bit stat=1;
        while(stat)
        {
                while(stat)
                {
                        DQ=1;
                        NOP;NOP;
                        DQ=0;
                        delay_DS18B20(50);
                        DQ=1;
                        delay_DS18B20(6);
                        stat=DQ;
                }
                delay_DS18B20(45);
                stat=~DQ;
        }
        DQ=1;
}
////////////////////////&#207;òDS18B20D′ò&#187;&#184;&#246;×&#214;&#189;ú///////////////////////
void writebyte(uchar com)
{
        uchar i;
        for(i=8;i>0;i--)
        {
                DQ=1;
                NOP;NOP;
                DQ=0;
                NOP;NOP;NOP;NOP;NOP;
                if(com&0x01)
                        DQ=1;
                else
                        DQ=0;

                delay_DS18B20(6);
                com>>=1;
        }
        DQ=1;
        delay_DS18B20(1);
}
//////////////////////////&#182;á18B20ò&#187;&#184;&#246;×&#214;&#189;ú///////////////////////
uchar readbyte()
{
        uchar i;
        uchar dat=0;
        for(i=8;i>0;i--)
        {
                DQ=1;
                NOP;NOP;
                dat>>=1;
                DQ=0;
                NOP;NOP;NOP;NOP;
                DQ=1;
                NOP;NOP;NOP;NOP;
                if(DQ){dat|=0x80;}
                delay_DS18B20(6);
        }
        DQ=1;
        return dat;
}
////////////////////////&#182;á&#206;&#194;&#182;è///////////////////////////////
void readtemp()
{
        DS18B20_init();
        writebyte(0xcc);     
        writebyte(0x44);
        delay_DS18B20(60);
        DS18B20_init();
        writebyte(0xcc);
        writebyte(0xbe);         
        t_lsb=readbyte();  
        t_msb=readbyte();          
}
///////////////////////&#206;&#194;&#182;è×a&#187;&#187;&#206;aòo&#190;§×&#214;·&#251;///////////////////////////////////
/*void temp_to_string()
{
        uchar m,a,b,shifen,ge,shi,bai;
        int k;

        a=t_msb<<4;
        b=t_lsb>>4;

        if(t_msb&0x80)
        {
                k=(int)(t_msb<<8)|(int)(t_lsb);
                k=~(k-1);
                a=(uchar)(k>>8);
                b=(uchar)k;
                a=a<<4;
                b=b>>4;
        }

       
        m=a|b;
        bai=m/100;
        shi=m%100/10;
        ge=m%100%10;
        shifen=(uchar)((t_lsb&0x0f)*6.25/10);
        switch(t_msb&0x80)
        {
///////////////////////////////////////////////////////////////////////////               
                case 0:
                {
                        if(bai==0&&shi==0)
                        {
                                temp[0]=ge+0x30;
                                temp[1]='.';
                                temp[2]=shifen+0x30;
                                temp[3]=0xdf; //&#182;è
                                temp[4]='C';
                                temp[5]='\0';
                        }
                        if(bai==0&&shi!=0)
                        {
                                temp[0]=shi+0x30;
                                temp[1]=ge+0x30;
                                temp[2]='.';
                                temp[3]=shifen+0x30;
                                temp[4]=0xdf;
                                temp[5]='C';
                                temp[6]='\0';
                        }
                        if(bai==1)
                        {
                                temp[0]=bai+0x30;
                                temp[1]=shi+0x30;
                                temp[2]=ge+0x30;
                                temp[3]='.';
                                temp[4]=shifen+0x30;
                                temp[5]=0xdf;
                                temp[6]='C';
                                temp[7]='\0';
                        }
                }break;
////////////////////////////////////////////////////////////////////////////
                case 1:
                {
                         if(bai==0&&shi==0)
                        {
                                temp[0]=0x2d; //&#184;oo&#197;
                                temp[1]=ge+0x30;
                                temp[2]='.';
                                temp[3]=shifen+0x30;
                                temp[4]=0xdf; //&#182;è
                                temp[5]='C';
                                temp[5]='\0';
                        }
                        if(bai==0&&shi!=0)
                        {
                                temp[0]=0x2d;
                                temp[1]=shi+0x30;
                                temp[2]=ge+0x30;
                                temp[3]='.';
                                temp[4]=shifen+0x30;
                                temp[5]=0xdf;
                                temp[6]='C';
                                temp[7]='\0';
                        }
                        if(bai==1)
                        {
                                temp[0]=0x2d;
                                temp[1]=bai+0x30;
                                temp[2]=shi+0x30;
                                temp[3]=ge+0x30;
                                temp[4]='.';
                                temp[5]=shifen+0x30;
                                temp[6]=0xdf;
                                temp[7]='C';
                                temp[8]='\0';
                        }
                }break;
        }
}*/



1602


/**************************************************************
ê1ó&#195;1602òo&#190;§£&#172;òa°üo&#172;±&#190;í·&#206;&#196;&#188;t&#161;£ê×&#207;èòaμ÷ó&#195;LCD_init()
&#189;&#171;òo&#190;§3&#245;ê&#188;&#187;ˉ£&#172;è&#187;oó&#191;é&#214;±&#189;óê1ó&#195;dspchar()oídspstring()á&#189;&#184;&#246;oˉêy
ê1ó&#195;&#182;&#203;&#191;ú£oP0 ,P2^0 , P2^1 , P2^2 .
è&#171;&#190;&#214;±&#228;á&#191;£oRS,RW,EN,DATA.
×¢£o±&#190;oˉêyò&#209;&#182;¨ò&#229;μ&#196;è&#171;&#190;&#214;±&#228;á&#191;°üà¨oˉêy&#195;&#251;2&#187;&#196;ü&#212;úí&#172;ò&#187;1¤3ì
&#214;D&#198;&#228;&#203;&#251;&#206;&#196;&#188;t&#214;D3&#246;&#207;&#214;&#214;&#216;&#195;&#251;£&#172;è&#244;óD±&#216;òa£&#172;&#199;&#235;×&#195;&#199;é&#184;ü&#184;&#196;£&#161;
**************************************************************/

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define  DAT  P0

sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;

//////////////////////////&#209;óê±oˉêy/////////////////////////////

void delay(uint k)
{
        uint x,y;
        for(x=k;x>0;x--)
                for(y=110;y>0;y--);
}


////////////////////////////D′è&#235;êy&#190;Y///////////////////////////

void write_data(uchar dat)
{       
        RS=1;
        RW=0;
        DAT=dat;
        EN=1;
        delay(1);               
        EN=0;
}
///////////////////////////D′è&#235;&#195;üá&#238;////////////////////////////

void write_com(uchar com)
{
        RS=0;
        RW=0;
        DAT=com;
        EN=1;
        delay(1);               
        EN=0;
}


///////////////////////////°′×&#248;±ê&#207;&#212;ê&#190;ò&#187;&#184;&#246;×&#214;·&#251;///////////////////////////

///////////&#198;&#228;&#214;D X &#206;aoá×&#248;±ê£&#172;Y &#206;a×Y×&#248;±ê £&#172;DA&#206;a&#203;ùòa&#207;&#212;ê&#190;×&#214;·&#251;//////////////
void dspchar(uchar X, uchar Y, uchar DA)
{
        uchar ADD;

        if(Y==1)
                ADD=0x80+(X-1);
        if(Y==2)
                ADD=0x80+0x40+(X-1);         //&#199;ó3&#246;ó&#235;×&#248;±ê&#182;&#212;ó|μ&#196;1602μ&#216;&#214;·

        write_com(ADD);
        write_data(DA);

}

////////////////////////&#184;ù&#190;Y&#198;eê&#188;&#206;&#187;&#214;&#195;&#207;&#212;ê&#190;×&#214;·&#251;′&#174;///////////////////////////

///////&#198;&#228;&#214;D X &#206;aoá×&#248;±ê£&#172;Y &#206;a×Y×&#248;±ê £&#172;×&#214;·&#251;′&#174;&#189;&#171;′ó′&#203;μ&#227;&#191;aê&#188;&#203;3Dò&#207;&#212;ê&#190;///////////
void dspstring(uchar X, uchar Y, uchar *str)
{       
        uchar *pstr;
        pstr=str;
        while( (*pstr)!='\0' )
        {
                dspchar( X,Y,*pstr );
                pstr++;
                X++;
        }
}

/////////////////////////////òo&#190;§&#198;á3&#245;ê&#188;&#187;ˉ////////////////////////////////

void LCD_init()
{
        EN=0;
        RW=0;
        write_com(0x38); //éè&#214;&#195;16*2,5*7μ&#227;&#213;ó,8&#206;&#187;êy&#190;Y&#189;ó&#191;ú&#207;&#212;ê&#190;&#196;£ê&#189;
        write_com(0x0c); //&#191;a&#207;&#212;ê&#190;£&#172;2&#187;&#207;&#212;ê&#190;1a±ê£&#172;2&#187; 1a±êéá&#203;&#184;
        write_com(0x01); //êy&#190;Y&#214;&#184;&#213;&#235;oí&#203;ùóD&#207;&#212;ê&#190;&#199;&#229;á&#227;
        dspchar(1,1,' '); //±&#216;±&#184;£&#172;&#199;&#229;3y&#214;&#184;&#213;&#235;&#187;ì&#194;ò×′ì&#172;
        //write_com(0x06); //&#182;áD′ò&#187;&#184;&#246;×&#214;·&#251;oóμ&#216;&#214;·oí&#214;&#184;&#213;&#235;&#188;óò&#187;£&#172;2¢&#199;ò&#213;&#251;&#198;á2&#187;ò&#198;&#182;ˉ
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 04:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表