永发信息网

基于rs-232单片机之间通信

答案:2  悬赏:50  手机版
解决时间 2021-05-05 16:34
  • 提问者网友:玫瑰园
  • 2021-05-05 12:26

我是一名初学者,遇到的问题很多,想寻问“三个单片机之间的通信,一主二从,电路图和程序”。那位高人帮个忙。

 

最佳答案
  • 五星知识达人网友:不想翻身的咸鱼
  • 2021-05-05 13:40
一块板三个单片机?这么复杂~~
全部回答
  • 1楼网友:玩家
  • 2021-05-05 14:10

//===================================================================== //    多机通讯主机程序 //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;    } }

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯