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

📄 netgapuart.lst

📁 双串口于单片机通讯
💻 LST
字号:
C51 COMPILER V8.08   NETGAPUART                                                            12/12/2008 11:27:51 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE NETGAPUART
OBJECT MODULE PLACED IN netgapuart.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE netgapuart.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include<reg51.h>
   2          #include<intrins.h>
   3          #include<absacc.h>
   4          #include "netgapuart.h"
   5          
   6          #define uint unsigned int
   7          #define uchar unsigned char
   8          #define WAIT 160
   9          #define WAITFLICK 40
  10          bit bdata bUart0RFlag, bUart1RFlag, bUart2RFlag, bUartRFlag;
  11          /** receiving memory of upper machine, read data while Uart0RFlag=1 */
  12          uchar idata Uart0RBuf,Uart1RBuf,Uart2RBuf;
  13          uchar idata OldUart0RBuf,OldUart1RBuf,OldUart2RBuf;
  14          /** upper machine sends state flag, '1' means com port 'busy'
  15           * (sending data to sub com port, just sending new data to sending buffer of 
  16           * sub comport. '0' means idle, user application should set 'TI=1' to launch
  17           * data sending of sub comport
  18           */
  19          bit bdata bUartBusy;            
  20          /* upper request flag of sending instruction. Before sending upper machine must 
  21           * put instruction to be transmitted into 'InstructBuf'. Then set this flag to 
  22           * '1', after this flag being changed to '0', this process could be done again
  23          */                                                      
  24          bit bdata bInstructFlag;        
  25          
  26          uchar idata InstructBuf;        //指令缓冲(用户可将设置SP2328/SP2338的指令放入
  27                                                                  //该寄存器,由驱动程序自动完成指令发送)
  28          uchar idata UartPointer;        //子串口发送数据指针,中断服务程序通过该指针轮询
  29                                                                  //发送数据到各子串口,保证各子串口的数据不丢失
  30          
  31          uchar idata Uart0Tbuf[8];       /* sub Uart 0 data sending buffer*/
  32          uchar idata Uart1TBuf[8];       /* sub Uart 1 data sending buffer*/
  33          uchar idata Uart2TBuf[8];       /* sub Uart 2 data sending buffer*/
  34          //uchar idata Uart0RBuf,Uart1RBuf,Uart2RBuf;    //上位机接收子串口数据缓
  35                                                                  //冲存储器,上位机通过判断"bUart0RFlag"等标志
  36                                                                  //是否为"1",来决定是否读取该寄存器的数据
  37          uchar idata Uart0TNum,Uart1TNum,Uart2TNum;      //等待发送到各
  38                                                                  //子串口的字节数,"0"表示相应子串口发送缓冲区"空"
  39                                                                  //主程序可以通过判断该标志是否为"0"来决定是否向
  40                                                                  //相应子串口发送后续数据
  41          sbit    AdrOut0=P1^2;           
  42          sbit    AdrOut1=P1^3;
  43          sbit    AdrIn0 =P1^0;   
  44          sbit    AdrIn1 =P1^1;           
  45                  
  46          uint data pcstate0 = 0;                                                 
  47          uint data pcstate1 = 0;
  48          uint data localstate0 = UNINIT; //local single chip state
  49          uint data localstate1 = UNINIT;
  50          
  51          uint data buffer0=0;  //定时器计数变量
  52          uint data buffer1=0;
  53          uint data bufferdelay=0 ;
  54          
  55          sbit green0=P1^4;           
C51 COMPILER V8.08   NETGAPUART                                                            12/12/2008 11:27:51 PAGE 2   

  56          sbit red0=P1^5;
  57          sbit green1=P1^6;           
  58          sbit red1=P1^7;
  59          
  60          void delay(uint i)
  61          {
  62   1              bufferdelay=0;
  63   1              while(bufferdelay<i);           
  64   1      }
  65          
  66          
  67          /*串口服务子程序*/
  68          serial () interrupt 4
  69          {
  70   1              if(RI)
  71   1              {
  72   2                      RI=0;                   //准备解析刚接收到的数据来自于哪个子串口
  73   2                      bUartRFlag=1;           //产生串口中断标志位
  74   2                      if(AdrIn1){                             //子串口2接收到一个字节(未用)
  75   3                              Uart2RBuf=SBUF;         //缓存子串口2收到的数据,以便接收后续数据
  76   3                              bUart2RFlag=1;          //置子串口2收到数据标志,便于主程序查询
  77   3                      } else if(AdrIn0){              //子串口1接收到一个字节
  78   3                              Uart1RBuf=SBUF;         //缓存子串口1收到的数据,以便接收后续数据
  79   3                              pcstate1 = (Uart1RBuf & 0xc0)>>6;
  80   3                              bUart1RFlag=1;          //置子串口1收到数据标志,便于主程序查询
  81   3                              buffer1 = 1;
  82   3                      } else {                                        //子串口0接收到一个字节
  83   3                              Uart0RBuf=SBUF;         //缓存子串口0收到的数据,以便接收后续数据
  84   3                              pcstate0 = (Uart0RBuf & 0xc0)>>6;
  85   3                              bUart0RFlag=1;          //置子串口0收到数据标志,便于主程序查询
  86   3                              buffer0 = 0;
  87   3                      }
  88   2              }
  89   1              if(TI)
  90   1              {
  91   2              //      TI=0;                                                   //已经产生发送中断,准备解析下一个需要发送的数据
  92   2              //      AdrOut0 = 0;
  93   2              //      AdrOut1 = 0;
  94   2              //      SBUF = 'x';
  95   2              /*      switch(UartPointer){                    //判断即将向哪个子串口发送数据?
  96   2                              case 0:{                                        //准备向子串口0发送数据
  97   2                                      AdrOut0=0;                      //有数据需要发送,则选通子串口0的地址
  98   2                                      AdrOut1=0;
  99   2                                      SBUF=Uart1RBuf;         //将串口0发送缓存中的一个字节
 100   2                                      break;                          //由子串口0发送到下位机
 101   2                              }
 102   2                              case 1:{                                //准备向子串口1发送数据
 103   2                                      AdrOut0=1;                      //有数据需要发送,则选通子串口1的地址
 104   2                                      AdrOut1=0;
 105   2                                      SBUF=Uart0RBuf;         //将串口1发送缓存中的一个字节
 106   2                                      break;                          //由子串口1发送到下位机
 107   2                              }                                               //而只能够发送一条空指令用于时序配合
 108   2                              case 2:{                        //准备向子串口2发送数据
 109   2                                      AdrOut0=0;                      //有数据需要发送,则选通子串口2的地址
 110   2                                      AdrOut1=1;
 111   2                                      SBUF=Uart0TBuf; //将串口2发送缓存中的一个字节
 112   2                                      break;                                          //由子串口2发送到下位机
 113   2                              }                                                               //而只能够发送一条空指令用于时序配合
 114   2      
 115   2                              default:{
 116   2                                      else {bUartBusy=0;break;}//若所有子串口数据都已经发送完毕,则立即
 117   2                              }       //清除"串口忙"标志(主程序将根据该标志来决定是否执行"TI=1"这条指令)
C51 COMPILER V8.08   NETGAPUART                                                            12/12/2008 11:27:51 PAGE 3   

 118   2                              bUartBusy=0;
 119   2                      }*/
 120   2      
 121   2      /*              switch(UartPointer){                    //判断即将向哪个子串口发送数据?
 122   2                              case 0:{                                        //准备向子串口0发送数据
 123   2                                      UartPointer++;                  //下一次发送中断准备向子串口1发送数据
 124   2                                      if(Uart0TNum){                  //串口0发送缓存区是否有数据需要发送?
 125   2                                              AdrOut0=0;                      //有数据需要发送,则选通子串口0的地址
 126   2                                              AdrOut1=0;
 127   2                                              SBUF=Uart0Tbuf[--Uart0TNum];//将串口0发送缓存中的一个字节
 128   2                                              break;                                          //由子串口0发送到下位机
 129   2                                      }
 130   2                                      else goto T_NopInstruction;     //若子串口0没有数据发送则准备发送空指令
 131   2                              }
 132   2      
 133   2                              case 1:{                                        //准备向子串口1发送数据
 134   2                                      UartPointer++;                  //下一次发送中断准备向串口2发送数据
 135   2                                      if(Uart1TNum){                  //串口1发送缓存区是否有数据需要发送?
 136   2                                              AdrOut0=1;                      //有数据需要发送,则选通子串口1的地址
 137   2                                              AdrOut1=0;
 138   2                                              SBUF=Uart1TBuf[--Uart1TNum];//将串口1发送缓存中的一个字节
 139   2                                              break;                                          //由子串口1发送到下位机
 140   2                                      }
 141   2                                      else goto T_NopInstruction;     //若子串口1没有数据发送则准备发送空指令
 142   2                              }                                                               //而只能够发送一条空指令用于时序配合
 143   2      
 144   2                              case 2:{                        //准备向子串口2发送数据
 145   2                                      UartPointer++;  //下一次发送中断准备发送空指令
 146   2                                      if(Uart2TNum){                  //串口2发送缓存区是否有数据需要发送?
 147   2                                              AdrOut0=0;                      //有数据需要发送,则选通子串口2的地址
 148   2                                              AdrOut1=1;
 149   2                                              SBUF=Uart2TBuf[--Uart2TNum];//将串口2发送缓存中的一个字节
 150   2                                              break;                                          //由子串口2发送到下位机
 151   2                                      }
 152   2                                      else goto T_NopInstruction;     //若子串口2没有数据发送则准备发送空指令
 153   2                              }                                                               //而只能够发送一条空指令用于时序配合
 154   2      
 155   2                              default:{
 156   2                                      UartPointer=0;                  //下一次发送中断准备向串口0发送数据
 157   2      T_NopInstruction:
 158   2                                      AdrOut0=1;                              //选通目串口准备发送空指令或者其他指令
 159   2                                      AdrOut1=1;
 160   2                                      if(bInstructFlag){              //判断是否需要发送其他指令?
 161   2                                              bInstructFlag=0;        //清除指令发送标志
 162   2                                              SBUF=InstructBuf;       //将需要发送的指令发送到串口扩展IC
 163   2                                              break;
 164   2                                      }
 165   2                                      else if(Uart0TNum|Uart1TNum|Uart2TNum){//判断所有子串口的数据是否
 166   2                                              SBUF=0;                         //都已经全部发送完毕

⌨️ 快捷键说明

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