⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 master.lst

📁 此程序能实现单片机与PC机的多机通信
💻 LST
字号:
C51 COMPILER V7.01  MASTER                                                                 04/17/2008 18:25:35 PAGE 1   


C51 COMPILER V7.01, COMPILATION OF MODULE MASTER
OBJECT MODULE PLACED IN master.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE master.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /*c8051f内置UART地址识别硬件,UART0的地址是通过串口地址寄存器
   2          SADDR0和串口地址允许寄存器SADEN0两个SFR进行编程的。
   3          
   4          设主机发送的地址联络信号00H,01H,02H为从机地址,地址FFH是命令
   5          各从机复位SM2=1的复位命令。
   6          
   7          主机的命令如下:
   8          01H  请求从机接收主机数据的命令
   9          02H  请求从机向主机发送数据的命令
  10          其他都按照从机向主机发送数据命令02H来执行
  11          
  12          从机的状态字格式如下:
  13          ERR  0  0  0  0  0  TRDY  RRDY
  14          ERR=1 表示从机接收到的命令是非法的
  15          TRDY=1  表示从机已经准备好向主机发送数据
  16          RRDY=1  表示从机已经准备好接收主机发送的数据
  17          
  18          通常从机以中断方式控制与主机的通信,程序分为主机程序和从机程序,
  19          约定一次传输的数据为16字节,下面以02H地址的从机为例。*/
  20          
  21          
  22          #include<c8051f020.h>
  23          #define uchar unsigned char
  24          #define SLAVE 0x02                                                              //从机地址
  25          #define BN 16
  26          uchar rbuf[16];
  27          uchar idata tbuf[16]={"master transmit"};
  28          
  29          void err(void)                                                                  //发复位FFH命令
  30          {       SBUF0=0xff;
  31   1              while(!TI0);
  32   1              TI0=0;
  33   1      }
  34          
  35          uchar master(uchar addr,uchar command)                  //主机函数
  36          {       
  37   1              uchar aa,i,p;
  38   1              while(1)
  39   1              {
  40   2                      SBUF0=SLAVE;                                                    //发呼叫地址
  41   2                      while(!TI0);TI0=0;
  42   2                      while(!RI0);RI0=0;                                              //等待从机地址答复
  43   2                      if(SBUF0!=addr) err();                                  //地址错,发复位命令
  44   2                      else
  45   2                      {
  46   3                              TB80=0;                                                         //清地址标志
  47   3                              SBUF0=command;                                          //发命令
  48   3                              while(!TI0);TI0=0;
  49   3                              while(!RI0);RI0=0;                                      //等待从机命令答复
  50   3                              aa=SBUF0;
  51   3                              if((aa&0x80)==0x80) {TB80=1;err();}     //命令出错,发复位命令
  52   3                              else
  53   3                              {
  54   4                                      if(command==0x01)                               //是发送命令
  55   4                                      {
C51 COMPILER V7.01  MASTER                                                                 04/17/2008 18:25:35 PAGE 2   

  56   5                                              if((aa&0x01)==0x01)
  57   5                                              {
  58   6                                                      do{
  59   7                                                              p=0;                            //清校验和
  60   7                                                              for(i=0;i<BN;i++)
  61   7                                                              {
  62   8                                                                      SBUF0=tbuf[i];  //发送一字节
  63   8                                                                      p+=tbuf[i];
  64   8                                                                      while(!TI0);TI0=0;
  65   8                                                              }
  66   7                                                              SBUF0=p;                        //发校验和
  67   7                                                              while(!TI0);TI0=0;
  68   7                                                              while(!RI0);RI0=0;      //等待校验和的应答
  69   7                                                        }while(SBUF0!=0);             //接收出错,重发。00h为正确,ffh为错误
  70   6                                                      TB80=1;                                 //接收正确,置地址标志
  71   6                                                      return(0);      
  72   6                                              }
  73   5                                      }
  74   4                                      else                                                    ////是接收命令
  75   4                                      {
  76   5                                              if((aa&0x01)==0x01)                     //从机准备好发送
  77   5                                              {
  78   6                                                      while(1)
  79   6                                                      {
  80   7                                                              p=0;
  81   7                                                              for(i=0;i<BN;i++)
  82   7                                                              {
  83   8                                                                      while(!RI0);RI0=0;
  84   8                                                                      rbuf[i]=SBUF0;
  85   8                                                                      p+=rbuf[i];
  86   8                                                              }
  87   7                                                              while(!RI0);RI0=0;
  88   7                                                              if(SBUF0==p)
  89   7                                                              {
  90   8                                                                      SBUF0=0x00;             //校验和相同,发00h
  91   8                                                                      while(!TI0);TI0=0;
  92   8                                                                      break;                  //推出
  93   8                                                              }
  94   7                                                              else
  95   7                                                              {
  96   8                                                                      SBUF0=0xff;
  97   8                                                                      while(!TI0);TI0=0;
  98   8                                                              }
  99   7                                                      }
 100   6                                                      TB80=1;                                 //置地址标志
 101   6                                                      return(0);
 102   6                                              }
 103   5                                      }
 104   4                              }
 105   3                      }
 106   2              }
 107   1      }
 108          
 109          
 110          
 111          void main()
 112          {       
 113   1              TMOD=0x20;                                                                      //T1方式2
 114   1              TH1=0xfd;
 115   1              TL1=0xfd;                                                                       /*传输波特率9600,设SYSDCLK=12Mhz
 116   1                                                                                                      T1M=0(按振荡器的12分频计数),SMOD0=0*/
 117   1              PCON=0x00;
C51 COMPILER V7.01  MASTER                                                                 04/17/2008 18:25:35 PAGE 3   

 118   1              TR1=1;
 119   1              SCON0=0xf8;                                                                     //UART0方式3,SM20=1,REN0=1,TB80=1
 120   1              master(SLAVE,0x01);
 121   1              master(SLAVE,0x02);
 122   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    200    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     16    ----
   IDATA SIZE       =     16    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -