wup0624 发表于 2012-2-23 12:58:23

51多机通讯

共享一个多机通讯的程序

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

主机

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

#define    DW    16      //¶¨òåêy¾YÖ¡¿í¶è

uchar KEY=0;
uchar K,SUM=0,PP=0;
uchar R_buf;                //½óêÕμ½μÄêy¾Y′æóú′Ëêy×é
bit FLAG,RIGHT=0;                //RIGHTÎaêÕμ½êy¾YoíD£ÑéÕyè·±ê־λ
bit RUN=0;                                //Ö÷»ú3ìDòÖ′DD¿ØÖÆλ
uchar slave;                        //′ó»úμØÖ·ÖD¼ä±äá¿

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

/////////////////////3õê¼»ˉ/////////////////////////

void init()
{       
        TMOD=0x20;
        PCON=0x00;
        TH1=0xfd;
        TL1=0xfd;                                  //2¨ìØÂê9600
        TR1=1;
        SM0=1;
        SM1=1;
        SM2=1;
        EA=1;
        ES=1;                                       //¿a′®¿úÖD¶Ï
        EX0=1;                                       //¿aía2¿ÖD¶Ï0
        IT0=1;                                       //′¥·¢·½ê½
        REN=1;
}


////////////////ÏòÄ3ò»′ó»ú·¢ËíÃüáî////////////////////////

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

        TB8=1;
        SBUF=add;           //·¢ËíμØÖ·
        while(!TI);
        TI=0;

        TB8=0;
        SBUF=cmd;           //·¢ËíÃüáî
        while(!TI);
        TI=0;

        //REN=1;
}

///////////////////Ö÷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;
                        delay(300);
                        if(num==8)
                                num=0;*/
                        if(RUN)
                        {
                       
                                a=R_buf<<4;
                                b=R_buf>>4;
                       
                                if(R_buf&0x80)
                                {
                                        k=(int)R_buf;
                                        k=(k<<8)|(int)(R_buf);
                                        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&0x0f)*6.25/10;

                                if(slave==0x00)
                                {
                                        if(R_buf&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);
                                        dspchar(8,1,R_buf);
                                        dspchar(9,1,R_buf);
                                }
                                if(slave==0x01)
                                {
                                        if(R_buf&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);
                                        dspchar(8,2,R_buf);
                                        dspchar(9,2,R_buf);
                                }
                               RUN=0;
                        }       
                }
        }
}

/////////////////ÖD¶Ï·tÎñ3ìDò///////////////////////////

void ser() interrupt 4
{
        uchar add;
        REN=0;                                                    //1رսóêÕêy¾Yê1Äü
        RI=0;
        if( (RB8==1)&&(FLAG==0) )                  //ÅD¶Ï′ó»ú·¢à′μÄêÇ·ñÎaμØÖ·
        {
                add=SBUF;                     //è¡′ó»úμØÖ·
                SUM=0;
                PP=0;
                K=0;
                SM2=0;                                  //¸ÄÎaÖ±í¨·½ê½£¬òÔ±ã½óêÕ½«òa·¢à′μÄêy¾Y
        }

        if(RB8==0)
        {
                R_buf=SBUF;                              //è¡êy¾Y
                SUM+=R_buf;                                  //ÇóoíòÔ×÷oíD£Ñé
                K++;
                FLAG=1;                                                  //êÕμ½μúò»¸öêy¾Yê±ÖÃ1,òÔ±ãÇø·ÖμØÖ·Ö¡óëD£ÑéÖ¡

                if(K==DW)                                          //K′ïμ½êy¾YÖ¡3¤¶è£¬±íÃ÷êy¾Y½óêÕíê
                {
                        SM2=1;                                      //¸Ä»Ø¶à»úí¨Ñ¶Ä£ê½
                       
                }

        }

        if( (RB8==1)&&(FLAG==1) )              //±íê¾êÕμ½μÄêÇD£ÑéÖμ
        {
                FLAG=0;
                PP=SBUF;                      //è¡D£Ñéoí
                if(PP==SUM)                                          //èç1ûoíD£ÑéÏàμ裬ÔòÕyè·
                {                                          
                        RIGHT=1;                  //μèóú1±íê¾êÕμ½μÄêy¾YÕyè·

                        send(slave,0x00);                  //·¢Ëí0x00,±íê¾êÕμ½μÄêy¾YÕyè·

                }
                else
                {
                        RIGHT=0;
                        send(slave,0xff);                  //·¢Ëí0xff,±íê¾êÕμ½μÄêy¾YóDÎó
                }
        }
       
        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);            //Ïò′ó»ú·¢Ëí′íÎóDÅoÅòÔèÃÆä·¢Ëíêy¾Y       
}


从机

#include <reg52.h>
#include<DS18B20.h>
#define uchar unsigned char
#define uint unsigned int
#define   DW    16       //¶¨òåêy¾YÖ¡¿í¶è,ó|óëÖ÷»úò»ÖÂ

#define ADDR0x00          //±¾»úμØÖ·

bit WRONG=0;                  //·¢ËíμÄêy¾YóëÖ÷»úêÕμ½μÄêy¾YD£Ñé2»ò»ÖÂ′íÎó±ê־λ,Îa1ê±Îa′í


uchar T_buf;           //μè′y·¢ËíμÄêy¾Y

///////////////////Ñóê±oˉêy//////////////////////////////

void delay(uint k)
{
        uint x,y;
        for(x=k;x>0;x--)
                for(y=110;y>0;y--);
}
////////////////////3õê¼»ˉ/////////////////////////////
void init()
{               

        TMOD=0x20;
        PCON=0x00;
        TH1=0xfd;
        TL1=0xfd;                        //2¨ìØÂê9600
        TR1=1;
        SM0=1;
        SM1=1;
        SM2=1;
        EA=1;
        ES=1;
        REN=1;                           //Õaò»¾ä2»Äü·ÅÔúÇ°Ãæ
}

////////////////////·¢Ëí¶à×Ö½úêy¾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;                        //½«êy×éÖDμÄêy¾Y·¢Ëí3öè¥
                while(!TI);
                        TI=0;
                sum+=T_buf;                        //Çóoí£¬òÔ±ã½øDDoíD£Ñé
        }
        TB8=1;
        SBUF=sum;                                        //·¢ËíD£ÑéÖμ
        while(!TI);
                TI=0;

}

////////////////////////Ö÷oˉêy//////////////////////////////
void main()
{
        init();
        T_buf='S';
        T_buf='L';
        T_buf='1';

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

///////////////////////ÖD¶Ï·tÎñ3ìDò///////////////////
void ser() interrupt 4
{
        uchar add;

        REN=0;                                   //1رսóêÕêy¾Yê1Äü
        RI=0;
        add=SBUF;

        if(add==ADDR)            //±è½ÏμØÖ·
        {
                SM2=0;                           //èôμØÖ·Æ¥Å䣬¸ÄÎaÖ±í¨·½ê½
        }


                       
        if(RB8==0)
        {
                if(SBUF==0x00)                        //êÕμ½Ö÷»úD£ÑéÕyè·DÅoÅ
                        WRONG=0;
                if(SBUF==0xff)                        //êÕμ½Ö÷»úD£Ñé′íÎóDÅoÅ
                        WRONG=1;

                SM2=1;                                        //¸Ä»Ø¶à»úÄ£ê½
        }

        REN=1;       
}


DS18B20

/***************************************************
Ôú±àD′3ìDòê±£¬½«±¾í·Îļt°üo¬ÖáÆäÖD£¬Ö±½ó°′Ë3Dòμ÷óÃ
readtempoítemp_to_stringoˉêy½«μÃμ½¿éóÃóú1602òo¾§ÏÔ
ê¾μÄ×Ö·ûêy×é temp[].
諾ֱäá¿£ot_lsb,t_msb,temp[],DQ.
ê1óö˿ú£oP3^7.
×¢£o±¾oˉêyòѶ¨òåμÄ諾ֱäá¿°üà¨oˉêyÃû2»ÄüÔúí¬ò»1¤3ì
ÖDÆäËûÎļtÖD3öÏÖÖØÃû£¬èôóD±Øòa£¬Çë×ÃÇé¸ü¸Ä£¡
****************************************************/
#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;


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

//////////////////////DS18B20¸′λ///////////////////////
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;
}
////////////////////////ÏòDS18B20D′ò»¸ö×Ö½ú///////////////////////
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);
}
//////////////////////////¶á18B20ò»¸ö×Ö½ú///////////////////////
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;
}
////////////////////////¶áζè///////////////////////////////
void readtemp()
{
        DS18B20_init();
        writebyte(0xcc);   
        writebyte(0x44);
        delay_DS18B20(60);
        DS18B20_init();
        writebyte(0xcc);
        writebyte(0xbe);       
        t_lsb=readbyte();
        t_msb=readbyte();          
}
///////////////////////ζè×a»»Îaòo¾§×Ö·û///////////////////////////////////
/*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=ge+0x30;
                                temp='.';
                                temp=shifen+0x30;
                                temp=0xdf; //¶è
                                temp='C';
                                temp='\0';
                        }
                        if(bai==0&&shi!=0)
                        {
                                temp=shi+0x30;
                                temp=ge+0x30;
                                temp='.';
                                temp=shifen+0x30;
                                temp=0xdf;
                                temp='C';
                                temp='\0';
                        }
                        if(bai==1)
                        {
                                temp=bai+0x30;
                                temp=shi+0x30;
                                temp=ge+0x30;
                                temp='.';
                                temp=shifen+0x30;
                                temp=0xdf;
                                temp='C';
                                temp='\0';
                        }
                }break;
////////////////////////////////////////////////////////////////////////////
                case 1:
                {
                       if(bai==0&&shi==0)
                        {
                                temp=0x2d; //¸ooÅ
                                temp=ge+0x30;
                                temp='.';
                                temp=shifen+0x30;
                                temp=0xdf; //¶è
                                temp='C';
                                temp='\0';
                        }
                        if(bai==0&&shi!=0)
                        {
                                temp=0x2d;
                                temp=shi+0x30;
                                temp=ge+0x30;
                                temp='.';
                                temp=shifen+0x30;
                                temp=0xdf;
                                temp='C';
                                temp='\0';
                        }
                        if(bai==1)
                        {
                                temp=0x2d;
                                temp=bai+0x30;
                                temp=shi+0x30;
                                temp=ge+0x30;
                                temp='.';
                                temp=shifen+0x30;
                                temp=0xdf;
                                temp='C';
                                temp='\0';
                        }
                }break;
        }
}*/



1602


/**************************************************************
ê1óÃ1602òo¾§£¬òa°üo¬±¾í·Îļt¡£ê×Ïèòaμ÷óÃLCD_init()
½«òo¾§3õê¼»ˉ£¬è»oó¿éÖ±½óê1óÃdspchar()oídspstring()ὸöoˉêy
ê1óö˿ú£oP0 ,P2^0 , P2^1 , P2^2 .
諾ֱäá¿£oRS,RW,EN,DATA.
×¢£o±¾oˉêyòѶ¨òåμÄ諾ֱäá¿°üà¨oˉêyÃû2»ÄüÔúí¬ò»1¤3ì
ÖDÆäËûÎļtÖD3öÏÖÖØÃû£¬èôóD±Øòa£¬Çë×ÃÇé¸ü¸Ä£¡
**************************************************************/

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

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

//////////////////////////Ñóê±oˉêy/////////////////////////////

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


////////////////////////////D′èëêy¾Y///////////////////////////

void write_data(uchar dat)
{       
        RS=1;
        RW=0;
        DAT=dat;
        EN=1;
        delay(1);               
        EN=0;
}
///////////////////////////D′èëÃüáî////////////////////////////

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


///////////////////////////°′×ø±êÏÔê¾ò»¸ö×Ö·û///////////////////////////

///////////ÆäÖD X Îaoá×ø±ê£¬Y Îa×Y×ø±ê £¬DAÎaËùòaÏÔê¾×Ö·û//////////////
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);       //Çó3öóë×ø±ê¶Ôó|μÄ1602μØÖ·

        write_com(ADD);
        write_data(DA);

}

////////////////////////¸ù¾YÆeê¼Î»ÖÃÏÔê¾×Ö·û′®///////////////////////////

///////ÆäÖD X Îaoá×ø±ê£¬Y Îa×Y×ø±ê £¬×Ö·û′®½«′ó′Ëμã¿aê¼Ë3DòÏÔê¾///////////
void dspstring(uchar X, uchar Y, uchar *str)
{       
        uchar *pstr;
        pstr=str;
        while( (*pstr)!='\0' )
        {
                dspchar( X,Y,*pstr );
                pstr++;
                X++;
        }
}

/////////////////////////////òo¾§Æá3õê¼»ˉ////////////////////////////////

void LCD_init()
{
        EN=0;
        RW=0;
        write_com(0x38); //éèÖÃ16*2,5*7μãÕó,8λêy¾Y½ó¿úÏÔê¾Ä£ê½
        write_com(0x0c); //¿aÏÔê¾£¬2»ÏÔê¾1a±ê£¬2» 1a±êéá˸
        write_com(0x01); //êy¾YÖ¸ÕëoíËùóDÏÔê¾Çåáã
        dspchar(1,1,' '); //±Ø±¸£¬Çå3yÖ¸Õë»ìÂò×′ì¬
        //write_com(0x06); //¶áD′ò»¸ö×Ö·ûoóμØÖ·oíÖ¸Õë¼óò»£¬2¢ÇòÕûÆá2»òƶˉ
}
页: [1]
查看完整版本: 51多机通讯