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

📄 rs232_com.lst

📁 自己调试通过的无线解码程序!支持各种无线传感器
💻 LST
字号:
C51 COMPILER V7.09   RS232_COM                                                             12/12/2008 17:08:55 PAGE 1   


C51 COMPILER V7.09, COMPILATION OF MODULE RS232_COM
OBJECT MODULE PLACED IN RS232_com.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE RS232_com.C BROWSE DEBUG OBJECTEXTEND

line level    source

   1          
   2          //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
   3          //描述:
   4          //      该程序INT0按键程序+显示程序+RS232通讯                                  &
   5          //      按键计数显示在数码管1-2(从右至左),并且发送该数据。                  &
   6          //      接收到的数据在数码管3-4上显示。                                        &
   7          //      通讯波特率:19200                                                       &
   8          //      每次收发一个字节                                                       &
   9          
  10          //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
  11          //【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息!                   &
  12          //【声明】 作者: PIAE小组                                                      &
  13          
  14          #include <reg52.h>
  15          #include <intrins.h>
  16          #include <RS232_def.h>
  17          
  18          
  19          void INT0_Counter( void ) interrupt 0 using 1
  20          {//INT0按键为计数按键
  21   1          EA = 0;
  22   1          Show_TX_Data++; //计数单元加1
  23   1          TXD_flag = 1;//置要发送标志位
  24   1          EA = 1;
  25   1      }
  26          
  27          
  28          void RS232_RXD( void ) interrupt 4   using 1
  29          {//接收数据函数,在中断服务程序中调用
  30   1          EA = 0;//关闭所有中断
  31   1          ES = 0;//关闭串口
  32   1          if(RI==1)
  33   1          {
  34   2              RI = 0;
  35   2              RX_data = SBUF;
  36   2              RXD_flag = 1;//置接收到数据标志
  37   2          }
  38   1          _nop_();
  39   1          ES = 1;//打开串口
  40   1          EA = 1;//打开中断
  41   1      }
  42          //*******************************************************
  43          void delay_ms(void)                         //毫秒延时  
  44           {     
  45   1           unsigned int i; 
  46   1           for (i=0;i<140;i++)  
  47   1                { 
  48   2                } 
  49   1       } 
  50          
  51          void delay_nms(unsigned int n)              //延时周期 
  52           { 
  53   1           unsigned int i; 
  54   1           for (i=0;i<n;i++) 
  55   1                { 
C51 COMPILER V7.09   RS232_COM                                                             12/12/2008 17:08:55 PAGE 2   

  56   2                 delay_ms(); 
  57   2                } 
  58   1       } 
  59            
  60            
  61          unsigned long decode(void)                 //无线解码 
  62           { 
  63   1           unsigned long DATA;                    //记录数据 
  64   1           unsigned char count;                 //暂时计数 
  65   1           unsigned int  i;     
  66   1          
  67   1           DATA=0; i=0; 
  68   1           while(1)
  69   1           {
  70   2                                           //   
  71   2              if(!RFBIT)           //低位计数 
  72   2              {        
  73   3                 NOPS;           // 
  74   3                 i++;                  //计数增加  
  75   3              }
  76   2                      else
  77   2                      { if (i>700) break;
  78   3                        else i=0; }
  79   2                   
  80   2            }          
  81   1           
  82   1           
  83   1                                              
  84   1              
  85   1           for (count=0;count<24;count++)         //开始收集 
  86   1           { 
  87   2                  
  88   2             /*测量高电平宽度*/         
  89   2             i=0;                                 //宽度计数 
  90   2             while (RFBIT)           //高位计数 
  91   2               {        
  92   3                       NOPS;           // 
  93   3                       i++;                  //计数增加  
  94   3                       //if (i>192) goto end;  //限时解码 
  95   3                }                                    
  96   2            
  97   2      /*分辨出电平高低*/                 
  98   2              
  99   2                DATA*=2;                       //数据左移 
 100   2                        
 101   2               if (i<64)                             //分辨高低  
 102   2                 {     
 103   3                  if (!((56>i)&(i>20))) goto end;     //电平合法                                 
 104   3                  DATA+=0;                            //记低电平 
 105   3                 } 
 106   2               else 
 107   2                 {      
 108   3                  if (!((200>i)&(i>72))) goto end;    //电平合法                                 
 109   3                  DATA+=1;                            //记高电平 
 110   3                 } 
 111   2                  
 112   2      /*测量低电平宽度*/         
 113   2          
 114   2                 while (!(RFBIT) )              //低位计数 
 115   2                  {        
 116   3                       NOPS;                     // 
 117   3                       i++;                        //计数增加  
C51 COMPILER V7.09   RS232_COM                                                             12/12/2008 17:08:55 PAGE 3   

 118   3                       if (i>300) goto end;        //限时解码 
 119   3                  }           
 120   2                       
 121   2      /*低电平是否过窄*/                 
 122   2                 //if (i<96) goto end;                  //对比宽度                                  
 123   2            } 
 124   1      /*解码成功返结果*/         
 125   1            return  DATA;                          //成功返回  
 126   1         
 127   1                
 128   1      /*有误码结束解码*/          
 129   1                
 130   1           end:          
 131   1               return 0;                              //误码结束 
 132   1       }   
 133          
 134          
 135          void main(void)
 136          {
 137   1          unsigned long DATA,i; 
 138   1              uchar temp,temp1;
 139   1          
 140   1              
 141   1          CPU_init();
 142   1          _nop_();
 143   1              led_seg7(1,1);
 144   1          led_seg7(3,1);
 145   1          DATA = 0;
 146   1          i = 0;
 147   1          while(1)
 148   1          {
 149   2              //NOPS;
 150   2              
 151   2                              //解码程序 
 152   2              temp = (unsigned char) (DATA);
 153   2                  temp1 = (unsigned char) (DATA>>8);
 154   2                      if(DATA > 0)
 155   2                      {          
 156   3                         led_seg7(1,temp);
 157   3                 led_seg7(3,temp1);
 158   3                         if(i>2000)
 159   3                         {
 160   4                           DATA = 0;
 161   4                               i = 0;
 162   4                         }
 163   3                         else
 164   3                           i++;
 165   3                      }
 166   2                      else
 167   2                        DATA = decode();  
 168   2                 
 169   2               
 170   2            
 171   2      ///////////////////////数码管显示程序/////////////////////////////////
 172   2      
 173   2          }//while 结束
 174   1      }//main结束
 175          
 176          
 177          void Delay(uchar delay_time)
 178          {//延时程序
 179   1          while(delay_time--)
C51 COMPILER V7.09   RS232_COM                                                             12/12/2008 17:08:55 PAGE 4   

 180   1          {}
 181   1      }
 182          
 183          
 184          void CPU_init(void)
 185          {//初始化CPU
 186   1          SCON = 0x50; //串口方式1
 187   1          PCON = 0x80; //串口波特率加速
 188   1          TMOD = 0x21;
 189   1          TH1=0xFD; //19200bps
 190   1          TL1=0xFD;
 191   1          TR1 = 1;
 192   1          TI = 0;
 193   1          RI = 0;
 194   1          PS = 1;      //串口中断的优先级设为最高
 195   1      
 196   1          IT0 = 1;//外部中断0负边沿触发
 197   1          EX0 = 1;//打开外部中断0
 198   1      
 199   1          ES  = 0;//关闭串口中断
 200   1          EA = 0; //关闭总中断
 201   1          SJA1000_CS = 1;//片选无效
 202   1      }
 203          
 204          void RS232_TXD( void )
 205          {
 206   1          EA = 0;//关闭所有中断
 207   1          ES = 0;//关闭串口中断,采用查询发送方式
 208   1          TI = 1;
 209   1          while(TI)
 210   1          {
 211   2              TI = 0;//一字节发送完后清除标志位
 212   2              SBUF = TX_data;
 213   2              while(!TI)
 214   2              {}//等待发送
 215   2              TI = 0;
 216   2          }
 217   1          _nop_();
 218   1          ES = 1;//打开串口中断
 219   1          EA = 1;//打开中断
 220   1      }
 221          
 222          void led_seg7(uchar from,uchar number)  //from(1_4):数码管显示起始位置(从右到左),number:显示的数
 223          {
 224   1          uchar digit,temp_l;
 225   1          uchar temp_h=0x7f;
 226   1          temp_h = _cror_(temp_h,from-1);   //确定从哪一位开始显示,即确定高四位
 227   1          temp_h = temp_h & 0xf0;           //取高四位
 228   1          temp_l = P2 & 0x0f;               //取P2的低四位
 229   1          P2 = temp_h | temp_l;             //设定P2口
 230   1      
 231   1          if(number==0)
 232   1          {
 233   2              P0 = led[0];
 234   2              Delay(5);
 235   2              P0 = 0xff;
 236   2          }
 237   1          else
 238   1          {
 239   2              while(number)
 240   2              {
 241   3                  digit = number%10 ;
C51 COMPILER V7.09   RS232_COM                                                             12/12/2008 17:08:55 PAGE 5   

 242   3                  number /= 10;
 243   3                  P0 = led[digit] ;
 244   3                  Delay(5);
 245   3                  temp_h = P2 & 0xf0;               //取P2的高四位
 246   3                  temp_h = temp_h | 0x0f;           //拼装 temp_h,进行位选
 247   3                  temp_h = _cror_(temp_h,1);
 248   3                  temp_h = temp_h & 0xf0;           //取高四位
 249   3                  temp_l = P2 & 0x0f;               //取P2的低四位
 250   3                  P0 = 0xff;
 251   3                  P2 = temp_h | temp_l;             //设定P2口
 252   3              }//while结束
 253   2          }//else结束
 254   1      
 255   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    618    ----
   CONSTANT SIZE    =     11    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      4      15
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      2    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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