永发信息网

51单片机双机通信

答案:5  悬赏:20  手机版
解决时间 2021-05-04 09:57

求51单片机双击通信程序,两机晶振为11.0592MHZ

请高人赐教.....

最佳答案

//=====================================================================
//    多机通讯主机程序
//zhuji.c
//writer:谷雨 2008年3月22日于EDA实验室
//注:主机先发送地址,接收到应答后,再发送数据
//=====================================================================


#include<reg52.h>


#define   addr1    0x31   //从机1地址
#define   addr2    0x32   //从机2地址


unsigned char xx[10];
unsigned char p = 0;


void delay_1ms(unsigned int i)
{
   unsigned char j;
   while ((i--)!=0) {for (j=0;j<125;j++);}
}
void Uart_Init(void)
{
 TMOD = 0x20;    //定时器T1使用工作方式2
    TH1 = 0xF3;  TL1 = 0xF3;


    PCON  = 0x00;    //SMOD=1;
    SCON  = 0xf0;    //工作方式3,9位数据位,波特率9600bit/s,允许接收
 SM2  = 0;
 TR1   = 1;    //开始计时
 
 EA    = 1;   //中断允许
 ES    = 1;    //串行中断允许


}
void Serial_INT() interrupt 4
{
 if(!RI) return;


 ES = 0;
 RI = 0;
 xx[p] = SBUF;
 p++;
 ES = 1;
}
void send_addr(unsigned char addr)     //发送地址
{  
 p = 0;  
    TB8 = 1;    //发送地址帧
    SBUF=addr;    //发送地址
 while(!TI);    //等待发送完毕
 TI=0;    //软件复位TI
}
void send_data(unsigned char ddata)     //发送数据
{
    TB8=0;    //发送数据帧
    SBUF=ddata;    //发送数据
    while(!TI);
 TI=0;    //软件复位TI
}


void main()

    Uart_Init();
 delay_1ms(2000);
 while(1)
 {
 send_addr(addr1);    //向从机1发地址
 send_data(0x33); 
 send_data(0x01);


 delay_1ms(500);
  if(xx[9]=='0') P1=0xaa;


 delay_1ms(500);


   send_addr(addr2);    //向从机2发地址
   send_data(0x33);
 send_data(0x01);


 delay_1ms(500);
  if(xx[9]=='9') P1=0x55;


 delay_1ms(500);
 }
// while(1);
}


//=====================================================================
//    多机通讯从机1程序
//cong1.c
//writer:谷雨 2008年3月22日于EDA实验室
//注:
//=====================================================================



#include<reg52.h>
#define   addr    0x31   //从机1地址


unsigned char receive;
unsigned char xx[ ]={"1234567890"};


void Uart_Init(void)
{
 TMOD = 0x20;    //定时器T1使用工作方式2
    TH1 = 0xF3;  TL1 = 0xF3;


    PCON  = 0x00;    //SMOD=1;
    SCON  = 0xf0;    //工作方式3,9位数据位,波特率9600bit/s,允许接收


 TR1   = 1;    //开始计时
 
 EA    = 1;   //中断允许
 ES    = 1;    //串行中断允许


}


void Serial_INT() interrupt 4
{
 if(!RI) return;
 RI=0;
 if(RB8==1)
 {
  if(SBUF==addr) SM2=0;
   else SM2=1;
 }
 if(RB8==0) receive=SBUF;
}


void SendOneByte(unsigned char c)
{
 TB8=0; 
    SBUF = c;
    while(!TI);
    TI = 0;
}
void SendListChar(unsigned char *DData,unsigned char Ef)
{
 unsigned char L=0;


 if(Ef!=0)
 {
  for( ;L<Ef;L++)    //显示有效长度
    SendOneByte(DData[L]);    //发送单个字符
 }else
  while (DData[L]!='\0')    //发送至字串结束
  {
   SendOneByte(DData[L]);    //发送单个字符
   L++;    //下一个字符
  }    
}


void main()
{
 Uart_Init();
 
 while(1)
 {
     switch(receive)
     {
   case 0xff:
    break;
    case 0x01:   //在此可以写入要完成的动作,最多可完成256个动作
    SendListChar(xx,0);
    break;
    case 0x02:
    break;
    case 0x33:
    P1=!P1;    //为方便其间,赋值给P1口,测P1口电平来检测该程序
    break;   
    default:
    break;
  }
  receive=0xff;  
 }
}

全部回答
这些一上来就要源程序的都是为了完成任务,并不是想学习,而且还理直气壮,跟谁欠他样的!所以碰到这样的人,一般不用理。

等答案……

http://shipinkecheng.taobao.com/

有大量的各种单片机的学习视频资料

淘宝网最低价

帮你轻松入门提高单片机。

高薪不是梦 

想了解哪方面的问题其实双机通信很容易的设置好波特率写好接收发送中断就可以了基本上就这两方面.你想了解哪方面的
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
三星电脑显示器电源板能有万能模版改吗
蓝色烟圈英文中怎么写
我的n78格卡后图片拉回来了,缓冲数据好像不
手机里的安全设置
漳州职业技术学院怎么去啊,有知道地址的么
迟到的生日祝福怎么说,兄弟就要生日了,想在Q
沫小柒,陌小柒,暖小柒,3个名字哪个用做网名比
点击空间进入不了怎么办
伤感的网名谁有?
dota场上最多能出现多少个幽鬼的鬼影?
手机QQ怎么隐藏啊?
自由幻想刺客转职处不给转职任务是怎么一回事
7610s内存卡
宝贝甜蜜饯是什么意思,蜜饯掺是什么?
巴乐氏鲜奶吧怎么去啊,有知道地址的么
推荐资讯
步步高手机k302是智能手机吗?
IRIS17集什么时候出,什么时候能在网上看到?
请教一下高手,有关系统和驱动的问题?
如何学好微观经济学,女生学经济学专业怎么样?
时间过得快吗
一斤棉花和一斤铁哪个多
一个没什么浪漫细胞的男友,送他什么生日礼物
霸王别姬京剧全部台词,急求形容京剧的语句
会话聊天
梦幻诛仙的VIP新手卡是什么?
黄蓉跟赵敏哪位更聪明?
《上帝是个女孩》中文翻唱
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?