单片机多机通信之变量初始化的重要性

发布者:caoxians4589最新更新时间:2015-12-24 来源: eefocus关键字:单片机  多机通信  变量初始化 手机看文章 扫描二维码
随时随地手机看文章

博文题目之所以要加上变量初始化的重要性,是因为我在调试单片机多机通信程序时,也就是下面将给出的程序,花了一整个晚上才发出,原来是有一个变量没有初始化,从而导致,多机通信不成功。主机程序中为红色的注释的变量一定要初始化,否则将失败。

仿真图如下:

单片机多机通信之变量初始化的重要性
主机程序:

单片机多机通讯

说明:该程序为多机通讯程序,最多可以挂255个从机。
          该程序主机发送端与多个从机的接收端相接,主机的接收端与多个从机的发送端相接。
          该程序主要的目的为给从机发送作为命令的数据。
          该程序调试成功,从机可正确接收。
 */
//=====================================================================
//                  多机通讯主机程序
//host.c
//writer:40  2011年8月06日于6#实验室
//注:主机先发送地址,接收到应答后,再发送数据
//=====================================================================

#include
#define unit unsigned int
#define uchar unsigned char

#define   addr1      0x31   //从机1地址
#define   addr2      0x32   //从机2地址
#define   addr3      0x33   //从机3地址
#define   addr4      0x34   //从机4地址
sbit led=P2^0;
void delay(unit MS)
{
   unit i,j;
   for(i=0;i    for(j=0;j<110;j++) ;

}
void Uart_Init(void)
{
   TMOD=0x20;    //定时器T1使用工作方式2
   TH1=253;
   TL1=253;
 
   PCON=0x0;     //SMOD=1;
   SCON=0xd0;     //工作方式3,9位数据位,波特率19200bit/s,允许接收 11.0592的晶振   Sm2=0;
   TI=0;
   RI=0;
     TR1=1;      //开始计时
 //  IE |= 0x90 ;
 

}
void send_addr(uchar addr)    //发送地址
{
    uchar tem=0xff;    //一定要初始化
    while(tem!=addr)    //如果发送的地址与从机应答的地址不一样,则一直发送地址
{
  
    TI=0;
    TB8=1;          //发送地址帧 v
    SBUF=addr;     //发送地址 
  while(!TI);     //等待发送完毕  
  TI=0;           //软件复位TI
 
  RI=0;
    while(!RI);    //等待接受完毕
    tem=SBUF;   //接收数据
    RI=0;
 
}
}

void send_data(uchar ddata)    //发送数据,但此处由于与从机的协议,禁止发送0xff
{
 
   TI=0;
   TB8=0;          //发送数据帧 
   SBUF=ddata;      //发送数据 
  while(!TI);   
   TI=0;           //软件复位TI  

}


void main()
{
 
   Uart_Init();
    delay(100) ;
   send_addr(addr1);    //向从机1发地址
   send_data(0x01);     //发数据
   send_addr(addr2);    //向从机1发地址  
   send_data(0x02);    //发数据

      
   send_addr(addr1);    //向从机2发地址
   send_data(0x02);      //发数据

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

  

   while(1)
   {
    led=!led;
    delay(100) ;
   }
}

从机1程序:

//=====================================================================
//                  多机通讯从机1程序
//slave_1.c
//writer:40 2011年8月06日于6#实验室
//注:从机先接收地址,然后与自己的地址比较,正确了再接收数据,修改地址可挂多个从机
//=====================================================================


#include
#define unit unsigned int
#define uchar unsigned char

#define   addr       0x31   //从机1地址
 void delay(unit MS)
{
   unit i,j;
   for(i=0;i    for(j=0;j<110;j++) ;

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

   PCON=0x0;     //SMOD=1;
   SCON=0xd0;     //工作方式3,9位数据位,波特率19200bit/s,允许接收 11.0592的晶振   Sm2=0;
   TI=0;
   RI=0;  
   TR1=1;      //开始计时
  // IE |= 0x90 ; 开中断入口
 

}

uchar recv_data(void) //接收数据
{
   uchar date;
   RI=0;
   while(!RI);    //等待接受完毕
  
   if(RB8==1)   //若当前接收为地址帧则返回0xff
       return 0xff;
   date=SBUF;
    RI=0;

   return date;
}

void main()
{
    uchar tem=0XFF,Data;
    Uart_Init();
while(1) 
tem=0XFF;
     SM2=1;    //只接收地址帧

    //如果接收到的地址帧不是本机地址,则继续等待
    while(tem!=addr)
   
     RI=0;
       while(!RI);
      tem=SBUF;
          RI=0;
    }

   TI=0;     //如果是本机地址,发送应答信号,并做好接受数据的准备
    TB8=0;   //主机不检测该位
 SBUF=addr;
    while(!TI);
    TI=0;

    SM2=0;    //允许接受数据信息 
  
    //接收数据
    Data=recv_data();

   if(Data==0xff)
       continue;
    switch(Data)
    {
      case 0x01:   //在此可以写入要完成的动作,最多可完成256个动作
    P1=0x15;    //为方便其间,赋值给P1口,测P1口电平来检测该程序
       break;
      case 0x02:
       P2=0x56;    //为方便其间,赋值给P2口,测P1口电平来检测该程序
       break;
         case 0x03:
       break;
         case 0x04:
       break;
         default:
       break;
     
}
}

从机2程序:

//=====================================================================
//                  多机通讯从机1程序
//slave_2.c
//writer:谷雨 2011年8月06日于6#实验室
//注:从机先接收地址,然后与自己的地址比较,正确了再接收数据,修改地址可挂多个从机
//=====================================================================


#include
#define unit unsigned int
#define uchar unsigned char

#define   addr  0x32   //从机2地址
 void delay(unit MS)
{
   unit i,j;
   for(i=0;i    for(j=0;j<110;j++) ;

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

   PCON=0x0;     //SMOD=1;
   SCON=0xd0;     //工作方式3,9位数据位,波特率19200bit/s,允许接收 11.0592的晶振   Sm2=0;
  TI=0;
  RI=0;  
     TR1=1;      //开始计时
  // IE |= 0x90 ;
 

}

//void send(uchar Data)     //发送数据程序
//{
//}

uchar recv_data(void) //接收数据
{
   uchar date;
   RI=0;
   while(!RI);    //等待接受完毕
  
   if(RB8==1)   //若当前接收为地址帧则返回0xff
       return 0xff;
   date=SBUF;
    RI=0;

   return date;
}

void main()
{
    uchar tem=0XFF,Data=0xff;
    Uart_Init();
while(1) 
tem=0XFF;
     SM2=1;    //只接收地址帧

    //如果接收到的地址帧不是本机地址,则继续等待
    while(tem!=addr)
   
     RI=0;
       while(!RI);
      tem=SBUF;
          RI=0;
    }

   TI=0;     //如果是本机地址,发送应答信号,并做好接受数据的准备
    TB8=0;   //主机不检测该位
 SBUF=addr;
    while(!TI);
    TI=0;

    SM2=0;    //允许接受数据信息 
  
    //接收数据
    Data=recv_data();

   if(Data==0xff)
       continue;
    switch(Data)
    {
      case 0x01:   //在此可以写入要完成的动作,最多可完成256个动作
    P1=0x90;    //为方便其间,赋值给P1口,测P1口电平来检测该程序
       break;
      case 0x02:
       P2=0xaa;    //为方便其间,赋值给P2口,测P1口电平来检测该程序
       break;
         case 0x03:
       break;
         case 0x04:
       break;
         default:
       break;
     
}
}

关键字:单片机  多机通信  变量初始化 引用地址:单片机多机通信之变量初始化的重要性

上一篇:STC12C5A60S2单片机的DS18B20的C程序
下一篇:C8051F单片机和PC机串口通讯程序

推荐阅读最新更新时间:2024-03-16 14:41

mcs51单片机加法指令(4条)有例子
算术运算 指令 共有24条,算术运算主要是执行加、减、乘、除法四则运算。另外MCS-51指令系统中有相当一部分是进行加、减1操作,BCD码的运算和调整,我们都归类为运算指令。虽然MCS-51单片机的算术逻辑单元ALU仅能对8位无符号整数进行运算,但利用进位标志C,则可进行多字节无符号整数的运算。同时利用溢出标志,还可以对带符号数进行补码运算。需要指出的是,除加、减1指令外,这类指令大多数都会对PSW(程序状态字)有影响。这在使用中应特别注意。 . 加法指令(4条) 这4条指令的作用是把立即数,直接地址、工作寄存器及间接地址内容与累加器A的内容相加,运算结果存在A中。 ADD A,#data ;(A)+#data→(A) 累加器
[单片机]
单片机 模糊控制 算法 c语言
1 #include reg52.h 2 //------------------------------------------------------------------------------------ 3 // 定义差距输入常量 4 #define GAP_ZERO 0x00 5 #define GAP_VSMALL 0x01 6 #define GAP_SMALL 0x02 7 #define GAP_MEDIUM 0x03 8 #define GAP_BIG 0x04 9 // 定义控制输出常量 10 #define TURN_ZERO 0x80 11 #define TU
[单片机]
飞思卡尔MCU创意大奖赛完美收官
(中国,深圳) 8 月 2 日下午,中电器材“ MCU 创意设计分享大会暨飞思卡尔 MCU 创意大奖赛”在深圳会展中心 2 号馆隆重举行,来自嵌入式领域的上百位工程师就嵌入式领域的应用创新进行了交流, MCU 创意设计分享大会特设的创新方案展示专区成为众多设计工程师交流创新心得的好去处。 中国电子器材深圳有限公司总经理刘迅, 飞思卡尔半导体亚太区 FAE 总监申宇 及部分选手代表 出席了大会。 会上,来自飞思卡尔、 ARM 中国及中电器材的专家发表了主题演讲,阐述了各家的市场策略;三位大赛选手分享了他们设计的技术解决方案。 演讲结束后,举行了隆重的颁奖典礼,为在“飞思卡尔 MCU 创意大奖赛”中获奖的选手进行了颁奖
[单片机]
ADC0832模数转换MSP430单片机程序+电路图
下面是电路图: ADC0832封装图 ADC0832与单片机连接图 ADC0832时序图 程序源码下载: #include msp430f2121.h #define DO (P1IN&BIT7) #define uchar unsigned char #define uint unsigned int /*********************************************** sbit cs=P2^0; sbit clk=P2^1; sbit DI=P2^2; sbit DO=P2^6; ***************************************
[单片机]
ADC0832模数转换MSP430<font color='red'>单片机</font>程序+电路图
基于MCS-51单片机的新型门禁控制器设计
随着我国现代化、城市化步伐加快,以及新技术新材料的不断出现,防盗门作为一种新型建筑材料和结构形式,走进了千家万户。然而现有的防盗门仍就依靠 传统钥匙打开门锁来实现开门这一动作,不仅开门繁琐,无报警功能,而且门锁最核心也最脆弱的位置是锁芯,利用机械钥匙的门锁,锁芯的位置就会一目了然,这 将会给不法分子带来可乘之机。 本项目实施的目的在于,在单片机的控制下,通过RF卡或语音识别或向GSM模块发送短信,来实现非陌生人开门这一动作,通过对讲机模块来实现门内主 人与门外到访人员的交流,并可一键开门,从而打破了只依靠钥匙开门这一固定模式,在安全方面,由于本门禁系统的 钥匙 与门锁之间是通过电信号进行通信 的,因此可将其隔离开,在外面无法确知锁的
[单片机]
基于MCS-51<font color='red'>单片机</font>的新型门禁控制器设计
51单片机—再论IIC—软件通用包(汇编、c语言)—03
感觉心有不甘,呵呵 ,小小整理一下。 我们知道51单片机中具有IIC总线接口的毕竟是少数(其实我就不知道那款~~)如果是是不带IIC总线的单片机,并不必扩展IIC总线接口,只是需要通过软件模拟,这无疑会给IIC总线的应用提供更广泛的空间。通常大多数的单片机应用系统中只有一个CPU,这种单主系统如果采用IIC总线技术,则总线上只有单片机对IIC总线从器件的访问,没有总线的竞争问题。这是后只需要模拟主发送和主接收时序。基于上述考虑,(这才是重点,呵呵 ),提供在这种使用情况下的时序模拟软件,使IIC总线的使用不受单片机必须带有IIC总线接口的限制。 下面的9个例子可以作为一个软件包,这个软件放入单片机系统的程序程序存储器中,以便用来
[单片机]
51<font color='red'>单片机</font>—再论IIC—软件通用包(汇编、c语言)—03
单片机对SD卡读写系列(三)
对SD卡的驱动主要有初始化、读、写、擦除等。 1、 初始化 步骤: (1) 延时至少74clock (2) 发送CMD0,需要返回0x01,进入Idle状态 (3) 循环发送CMD55+ACMD41,直到返回0x00,进入Ready状态。 如果是MMC,此步应发送CMD1。 2、 读 步骤: (1) 发送CMD17(单块)或CMD18(多块)读命令,返回0x00 (2) 接收数据开始令牌0xfe(或0xfc) + 正式数据512Bytes + CRC 校验2Bytes 默认正式传输的数据长度是512Bytes,可用CMD16设置。 3、 写 步骤: (1)
[单片机]
80c51单片机的基本配置有哪些 80c51单片机各个引脚及功能
  80c51单片机的基本配置有哪些   80C51单片机的基本配置包括:   CPU:80C51单片机的CPU由一个8位的ALU(算术逻辑单元)、一个8位的累加器、一个8位的B寄存器、一个16位的程序计数器和一个8位的状态寄存器组成。   存储器:80C51单片机的存储器包括程序存储器(ROM)、数据存储器(RAM)和特殊功能寄存器(SFR)。   时钟源:80C51单片机支持多种时钟源,包括外部晶体、外部时钟信号、内部振荡器等。   中断系统:80C51单片机支持多种中断源和中断优先级设置,可以灵活处理各种外部事件。   IO端口:80C51单片机的IO端口由多个可编程的输入输出引脚组成,可以连接各种外部设备。   通信接口:
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved