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

📄 tx433.lst

📁 24e1根据接收字节判断的无线发送程序
💻 LST
字号:
C51 COMPILER V7.50   TX433                                                                 10/21/2008 13:28:16 PAGE 1   


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

line level    source

   1          /*******************************************
   2          无线接收的发送收端程序:
   3          将从串口接收到的字符发送出去。
   4          
   5          ******************************************/
   6          
   7          #include <Nordic\reg24e1.h>
   8          
   9          struct RFConfig
  10          {
  11                  unsigned char n;
  12                  unsigned char buf[15];
  13          };
  14          
  15          typedef struct RFConfig RFConfig;
  16          
  17          #define ADDR_INDEX  8   // Index to address bytes in RFConfig.buf
  18          #define ADDR_COUNT  4   // Number of address bytes
  19          
  20          #define    UART_BUFFER_SIZE    4                   //定义串口接收缓冲区大小 8 bytes,最大为31
  21          
  22          unsigned char  UART_BUFFER[UART_BUFFER_SIZE+1];      //定义串口接收数据缓冲区
  23          unsigned char  countt=0;                           //
  24          bit    Overtime_Flag=0;
  25          
  26          unsigned int  Tnum=2000;
  27          
  28          const RFConfig txconf =
  29          {
  30              15,
  31              0x28, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  32              0x12, 0x34, 0x56, 0x78, 0x83, 0x6c, 0x04
  33          };
  34          
  35          /*
  36          0x28   :通道2数据接收包的位数(此处为40bit即5个字节)  
  37          
  38          0x28   :通道1数据接收包的位数
  39          
  40          0x00, 0x00, 0x00, 0x00, 0x00:CH2地址
  41          发射地址在发射时再设置。
  42          0x00, 0x12, 0x34, 0x56, 0x78:CH1地址(高于设定的地址宽度补0,即本行的第一个字节)
  43          
  44          0x83=100000 11        前6位:四个字节(32位)地址宽度(CH1及CH2);
  45                                                后2位:CRC使能且为16bit
  46          
  47          0x6C=0 1 1 011 00     B7最高位:0表示一通道(1表示2通道)
  48                                                    B6      :1表示收发子系统处于ShockBurst模式(0表示直接模式)
  49                                                    B5      :1表示1Mbps(0为250kbps)
  50                                B4-B2   :011表示外部的晶振为16M
  51                                                    B1-B0   :00表示发射功率为-20dBm
  52          
  53          0x04=0000010  0       B7-B1   :表示发射频率 和 CH1接收频率
  54                                B0          :0表示发射模式(1为接收模式)  
  55          */      
C51 COMPILER V7.50   TX433                                                                 10/21/2008 13:28:16 PAGE 2   

  56          
  57          
  58          const RFConfig rxconf =
  59          {
  60              15,
  61              0x28, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  62              0x87, 0x65, 0x43, 0x21, 0x83, 0x6c, 0x05
  63          };
  64          
  65          
  66          //延时函数
  67          void Delay100us(volatile unsigned char n)
  68          {
  69   1          unsigned char i;
  70   1          while(n--)
  71   1              for(i=0;i<35;i++)
  72   1                  ;
  73   1      }
  74          
  75          
  76          unsigned char SpiReadWrite(unsigned char b)
  77          {
  78   1          EXIF &= ~0x20;                  // Clear SPI interrupt
  79   1          SPI_DATA = b;                   // Move byte to send to SPI data register
  80   1          while((EXIF & 0x20) == 0x00)    // Wait until SPI hs finished transmitting
  81   1                 ;
  82   1          return SPI_DATA;
  83   1      }
  84          
  85          
  86          void Transmitter(unsigned char *str,unsigned char strlen)
  87          {
  88   1          unsigned char i;
  89   1      
  90   1          CE = 1;                  
  91   1              Delay100us(0);  
  92   1          for(i=0;i<ADDR_COUNT;i++)           // Start with the address of the receiver:
  93   1              SpiReadWrite(rxconf.buf[ADDR_INDEX+i]);
  94   1              for(i=0;i<strlen;i++)
  95   1              SpiReadWrite(*(str + i)); 
  96   1          CE = 0;             
  97   1              T1 = ~T1;                                               //发送闪烁
  98   1              Delay100us(3);                          // Wait ~300us  
  99   1      }
 100          
 101          //超时计时定时器T0初始化
 102          void Time0_Init(void)
 103          {
 104   1          TMOD &= 0xF0;          //定时器/计数器T0为定时器,工作于方式2,以TR0启动定时器
 105   1          TMOD |= 0x02;
 106   1          CKCON |= 0x08;         // T0M=1 (/4 timer clock)
 107   1          TL0=0x38;              //16MHz下定时时间为50us
 108   1          TH0=0x38;           
 109   1          Overtime_Flag=0;       //清除超时标志
 110   1      }
 111          
 112          //2401子系统初始化
 113          void Init(void)
 114          {    
 115   1              unsigned char j;
 116   1      //    P0_ALT |= 0x06;                      // Select alternate functions on pins P0.1 and P0.2
 117   1      //    P0_DIR = 0xA2;                 // 方向要设对,P0.1(RxD) ,P0.5,P0.7为输入,P0.4,P0.6为输出
C51 COMPILER V7.50   TX433                                                                 10/21/2008 13:28:16 PAGE 3   

 118   1              PWR_UP=1;
 119   1          Delay100us(30);                // Wait > 3ms 
 120   1      
 121   1          SPICLK = 0;                 // Max SPI clock (XTAL/8)
 122   1          SPI_CTRL = 0x02;               // Connect internal SPI controller to Radio
 123   1      
 124   1          CE = 0;                        // Configure Radio:
 125   1          CS = 1;
 126   1          Delay100us(0);
 127   1          for(j=0;j<txconf.n;j++)
 128   1          {
 129   2              SpiReadWrite(txconf.buf[j]);
 130   2          }
 131   1          CS = 0;
 132   1      }
 133          //串口初始化
 134          void Uart_init(void)
 135          {
 136   1          TH1 = 0xE6;                      // 9600@16MHz (when T1M=1 and SMOD=1)
 137   1          CKCON |= 0x10;                  // T1M=1 (/4 timer clock)
 138   1          PCON = 0x80;                    // SMOD=1 (double baud rate)
 139   1          SCON = 0x50;                    // Serial mode1, enable receiver
 140   1          TMOD = 0x20;                    // Timer1 8bit auto reload 
 141   1          TR1 = 1;                        // Start timer1
 142   1          P0_ALT |= 0x06;                             // Select alternate functions on pins P0.1 and P0.2
 143   1          P0_DIR  = 0xA2;                             // P0.1 (RxD) is an input
 144   1      }
 145          
 146          
 147          void main(void)
 148          {
 149   1          Init();
 150   1              Uart_init();            
 151   1              Time0_Init();                   //超时定时器T0初始化
 152   1          EA=1;
 153   1          ES=1;
 154   1          ET0=1;                  //允许定时器T0中断
 155   1              TR0=1;                  //启动超时定时器T0
 156   1              //PT0=1;                                //定时器T0为高优先级 
 157   1              while(1)
 158   1              {  
 159   2          if(Overtime_Flag)       //如果取数标志已置位,就将读到的数无线发送
 160   2              {
 161   3                              ES=0;
 162   3                  Overtime_Flag=0;   //取数标志清0
 163   3                              if(countt != 0) 
 164   3                      Transmitter(UART_BUFFER,(UART_BUFFER[0]+1));
 165   3      
 166   3                  countt=0;
 167   3                              Tnum=2000;
 168   3                              TL0=0x38;              //16MHz下定时时间为50us
 169   3                              TR0=1;
 170   3                              ES=1;
 171   3              }         
 172   2           
 173   2              }
 174   1      }
 175          
 176          //定时器T0中断服务子程序
 177          void Timer0_ISR (void) interrupt 1
 178          {
 179   1           Tnum--;                 //计时100ms(中断次数计数),实际需34ms
C51 COMPILER V7.50   TX433                                                                 10/21/2008 13:28:16 PAGE 4   

 180   1           if(Tnum == 0)             //超时?
 181   1            {
 182   2                      TR0 = 0;               //关闭定时器T0
 183   2              Overtime_Flag = 1;     //置位超时标志,开始发送
 184   2                  INT1 = ~INT1;                  //超时闪烁
 185   2            }
 186   1      }
 187          
 188          //串口接收中断函数 
 189          void serial_ISR (void) interrupt 4
 190          {
 191   1          if(RI)
 192   1            {
 193   2                unsigned char ch;          
 194   2                RI = 0;
 195   2                ch = SBUF;
 196   2                        //TR0=1;
 197   2                if(Overtime_Flag==0)                //未超时就接收
 198   2                 {
 199   3                    if(countt==UART_BUFFER_SIZE)
 200   3                                        countt=0;
 201   3                    countt++;  
 202   3                    UART_BUFFER[countt]=ch;
 203   3                    UART_BUFFER[0]=countt;
 204   3                 }  
 205   2            }
 206   1          if(TI) 
 207   1          {
 208   2      //      TI=0;
 209   2                      return;
 210   2          }
 211   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    316    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     40       5
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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