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

📄 sp23x8 demo.lst

📁 串口扩展芯片SP2338的举例程序
💻 LST
字号:
C51 COMPILER V7.20   SP23X8_DEMO                                                           03/09/2006 09:34:04 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE SP23X8_DEMO
OBJECT MODULE PLACED IN SP23x8 demo.OBJ
COMPILER INVOKED BY: C:\Program Files\Keil 7.20\C51\BIN\C51.EXE SP23x8 demo.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!申    明!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//
   2          //本驱动程序属于成都视普科技公司所有,仅允许免费用于本公司销售的产品中,未  //
   3          //经书面许可任何单位或个人不可将本程序用于其它用途,否则将追究其法律责任   //
   4          //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   5          /***************************************************************************
   6           SP23x8 demo.c source file SP2328/SP2338 serial communication
   7           example for MCS-51 MCU  (oscillating crystal: 11.0592MHz)
   8           Author: Wen hua, 2005-07-18 
   9          ***************************************************************************/
  10          /********************************上位机资源占用*****************************
  11          ****** RAM:8(BYTE,不含子串口发送缓冲)+5(BIT),ROM:200BYTE(内核部分)   ******
  12          ****** 接收一个字节耗用15条指令(MAX),发送一个字节耗用45条指令(MAX)******
  13          ***************************************************************************/
  14          
  15          #include <reg52.h>
  16          #define uchar unsigned char
  17          #define uint  unsigned int
  18          
  19          bit bdata bUartBusy;            //上位机串口发送状态标志,"1"表示上位机串口"忙"(正发送数据
  20                                                                  //到子串口,新数据只需送入子串口发送缓冲区即可,"0"表示上位
  21                                                                  //机串口"空闲",需用户程序将"TI=1"来启动子串口数据发送
  22          
  23          bit bdata bInstructFlag;        //上位机发送指令请求标志,上位机需要发送指令时必须
  24                                                                  //先将待发发送指令放到"InstructBuf",之后将该
  25                                                                  //标志设置为"1"即可.标志变为"0"后可继续发送指令
  26          
  27          bit bdata bUart0RFlag,bUart1RFlag,bUart2RFlag;  //上位机接收到子串口数据
  28                                                                  //标志,"1"表示上位机接收到相应子串口数据,主程序可通过查询
  29                                                                  //该标志的方式判断相应子串口是否接收到新数据(主程序取走刚
  30                                                                  //收到的新数据后,必须将该标志清"0",以便识别下一个新数据)
  31          
  32          uchar idata Uart0Tbuf[8];       //子串口0数据发送缓冲区(大小可由用户随意配置)
  33          uchar idata Uart1TBuf[8];       //子串口1数据发送缓冲区(大小可由用户随意配置)
  34          uchar idata Uart2TBuf[8];       //子串口2数据发送缓冲区(大小可由用户随意配置)
  35          
  36          uchar idata Uart0RBuf,Uart1RBuf,Uart2RBuf;      //上位机接收子串口数据缓
  37                                                                  //冲存储器,上位机通过判断"bUart0RFlag"等标志
  38                                                                  //是否为"1",来决定是否读取该寄存器的数据
  39          
  40          uchar idata UartPointer;        //子串口发送数据指针,中断服务程序通过该指针轮询
  41                                                                  //发送数据到各子串口,保证各子串口的数据不丢失
  42          
  43          uchar idata InstructBuf;        //指令缓冲(用户可将设置SP2328/SP2338的指令放入
  44                                                                  //该寄存器,由驱动程序自动完成指令发送)
  45          
  46          uchar idata Uart0TNum,Uart1TNum,Uart2TNum;      //等待发送到各
  47                                                                  //子串口的字节数,"0"表示相应子串口发送缓冲区"空"
  48                                                                  //主程序可以通过判断该标志是否为"0"来决定是否向
  49                                                                  //相应子串口发送后续数据
  50          /*****************************************************************************
  51          功能:设定SP2328/SP2338输入、输出地址,可根据实际电路修改
  52          *****************************************************************************/
  53          sbit    AdrIn0 =P1^0;           /* 连接到SP2328/SP2338的PIN0 (ADRO0)*/
  54          sbit    AdrIn1 =P1^1;           /* 连接到SP2328/SP2338的PIN1 (ADRO1)*/
  55          sbit    AdrOut0=P1^2;           /* 连接到SP2328/SP2338的PIN18(ADRI0)*/
C51 COMPILER V7.20   SP23X8_DEMO                                                           03/09/2006 09:34:04 PAGE 2   

  56          sbit    AdrOut1=P1^3;           /* 连接到SP2328/SP2338的PIN17(ADRI1)*/
  57          
  58          #define _DEBUG_SUB_MODULE
  59          /****************************************************************************
  60          功能:上位机串口中断服务函数,自动完成子串口数据发送(自动发送数据包)和数据接收
  61                   (单字节接收并缓存)以及自动发送上位机配置指令等
  62          输入:Uart0TNum,Uart1TNum,Uart2TNum,bInstructFlag,InstructBuf,bUartBusy
  63                   Uart0Tbuf[???],Uart1TBuf[???],Uart2TBuf[???]    
  64          输出:bUart0RFlag,bUart1RFlag,bUart2RFlag,Uart0RBuf,Uart1RBuf,Uart2RBuf,bUartBusy 
  65          *****************************************************************************/
  66          serial () interrupt 4 {
  67   1              if(RI){
  68   2                      RI=0;                                   //准备解析刚接收到的数据来自于哪个子串口
  69   2                      if(AdrIn1){                             //子串口2接收到一个字节
  70   3                              Uart2RBuf=SBUF;         //缓存子串口2收到的数据,以便接收后续数据
  71   3                              bUart2RFlag=1;          //置子串口2收到数据标志,便于主程序查询
  72   3                      }
  73   2                      else if(AdrIn0){                //子串口1接收到一个字节
  74   3                              Uart1RBuf=SBUF;         //缓存子串口1收到的数据,以便接收后续数据
  75   3                              bUart1RFlag=1;          //置子串口1收到数据标志,便于主程序查询
  76   3                      }
  77   2                      else {                                  //子串口0接收到一个字节
  78   3                              Uart0RBuf=SBUF;         //缓存子串口0收到的数据,以便接收后续数据
  79   3                              bUart0RFlag=1;          //置子串口0收到数据标志,便于主程序查询
  80   3                      }
  81   2              }
  82   1              
  83   1              else{
  84   2                      TI=0;                                                   //已经产生发送中断,准备解析下一个需要发送的数据
  85   2                      switch(UartPointer){                    //判断即将向哪个子串口发送数据?
  86   3                              case 0:{                                        //准备向子串口0发送数据
  87   4                                      UartPointer++;                  //下一次发送中断准备向子串口1发送数据
  88   4                                      if(Uart0TNum){                  //串口0发送缓存区是否有数据需要发送?
  89   5                                              AdrOut0=0;                      //有数据需要发送,则选通子串口0的地址
  90   5                                              AdrOut1=0;
  91   5                                              SBUF=Uart0Tbuf[--Uart0TNum];//将串口0发送缓存中的一个字节
  92   5                                              break;                                          //由子串口0发送到下位机
  93   5                                      }
  94   4                                      else goto T_NopInstruction;     //若子串口0没有数据发送则准备发送空指令
  95   4                              }
  96   3      
  97   3                              case 1:{                                        //准备向子串口1发送数据
  98   4                                      UartPointer++;                  //下一次发送中断准备向串口2发送数据
  99   4                                      if(Uart1TNum){                  //串口1发送缓存区是否有数据需要发送?
 100   5                                              AdrOut0=1;                      //有数据需要发送,则选通子串口1的地址
 101   5                                              AdrOut1=0;
 102   5                                              SBUF=Uart1TBuf[--Uart1TNum];//将串口1发送缓存中的一个字节
 103   5                                              break;                                          //由子串口1发送到下位机
 104   5                                      }
 105   4                                      else goto T_NopInstruction;     //若子串口1没有数据发送则准备发送空指令
 106   4                              }                                                               //而只能够发送一条空指令用于时序配合
 107   3      
 108   3                              case 2:{                        //准备向子串口2发送数据
 109   4                                      UartPointer++;  //下一次发送中断准备发送空指令
 110   4                                      if(Uart2TNum){                  //串口2发送缓存区是否有数据需要发送?
 111   5                                              AdrOut0=0;                      //有数据需要发送,则选通子串口2的地址
 112   5                                              AdrOut1=1;
 113   5                                              SBUF=Uart2TBuf[--Uart2TNum];//将串口2发送缓存中的一个字节
 114   5                                              break;                                          //由子串口2发送到下位机
 115   5                                      }
 116   4                                      else goto T_NopInstruction;     //若子串口2没有数据发送则准备发送空指令
 117   4                              }                                                               //而只能够发送一条空指令用于时序配合
C51 COMPILER V7.20   SP23X8_DEMO                                                           03/09/2006 09:34:04 PAGE 3   

 118   3      
 119   3                              default:{
 120   4                                      UartPointer=0;                  //下一次发送中断准备向串口0发送数据
 121   4      T_NopInstruction:
 122   4                                      AdrOut0=1;                              //选通目串口准备发送空指令或者其他指令
 123   4                                      AdrOut1=1;
 124   4                                      if(bInstructFlag){              //判断是否需要发送其他指令?
 125   5                                              bInstructFlag=0;        //清除指令发送标志
 126   5                                              SBUF=InstructBuf;       //将需要发送的指令发送到串口扩展IC
 127   5                                              break;
 128   5                                      }
 129   4                                      else if(Uart0TNum|Uart1TNum|Uart2TNum){//判断所有子串口的数据是否
 130   5                                              SBUF=0;                         //都已经全部发送完毕

⌨️ 快捷键说明

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