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

📄 io to uart.lst

📁 基于51的简单交通灯模拟,对那些刚刚入门的朋友可能有所帮助
💻 LST
📖 第 1 页 / 共 2 页
字号:
 182   1      }
 183          
 184          void soft_receive_init()               //监测起始位  
 185          {
 186   1          TCON_ENABLE_TIMER = 0;             //停止定时器  
 187   1          rs_timerH = rs_TEST_H;
 188   1          rs_timerL = rs_TEST_L;
 189   1          rs_shift_count = 0;
 190   1          TCON_ENABLE_TIMER = 1;             //启动定时器  
 191   1      }
 192          
 193          
 194          void soft_receive_enable()             //允许接收  
 195          {
 196   1          rs_f_RI_enable = 1;                //允许接收  
 197   1          rs_f_TI_enable = 0;                //禁止发送   
 198   1          soft_receive_init();               //监测起始位, RXD 下降沿触发接收字节过程.     
 199   1      }
 200          
 201          void soft_send_enable (void)        //允许发送  
 202          {
 203   1          TCON_ENABLE_TIMER = 0;             //停止定时器  
 204   1          rs_f_TI_enable = 1;                //允许发送  
 205   1          rs_f_RI_enable = 0;                //禁止接收  
 206   1      
 207   1          rs_shift_count = 0;                //清移位计数器  
 208   1          rs_f_TI   = 1;                     //发送一个字符完毕标志  
 209   1          TCON_ENABLE_TIMER = 1;             //启动定时器
 210   1      }
 211          
 212          void soft_rs232_interrupt( void )
 213          {
 214   1          /************************ 接收 ****************************/
 215   1          if (rs_f_RI_enable == 1)
 216   1          {
 217   2              if (rs_shift_count == 0)        //移位计数器==0, 表示检测到起始位的起点   
 218   2              {
 219   3                  if ( rs_RXD == 1 )
 220   3                  {
 221   4                      soft_receive_enable (); //起始位错, 从新开始   
 222   4                  }
 223   3                  else
 224   3                  {
 225   4                      //下次中断在数据位或停止位中的某时刻发生    
 226   4                      rs_timerL += rs_FULL_BIT_L + 0x10; 
 227   4                      rs_timerH = rs_FULL_BIT_H;
 228   4                      rs_shift_count++;              
 229   4                      rs_BUF = 0;             //清移位缓冲变量   
 230   4                  }
 231   3              }
 232   2              else
 233   2              {
 234   3                  rs_timerL += rs_FULL_BIT_L; //下次中断在数据位或停止位中发生    
 235   3                  rs_timerH = rs_FULL_BIT_H;
 236   3                                             
 237   3                  rs_shift_count++;           //2--9:数据位 10:停止位 
 238   3                                             
 239   3                  if ( rs_shift_count == 9)
 240   3                  {
C51 COMPILER V7.06   IO_TO_UART                                                            08/22/2008 23:17:02 PAGE 5   

 241   4                      rs_BUF = rs_BUF >> 1;   //接收第8位   
 242   4                      rs_BUF_bit7 = rs_RXD;
 243   4                      if( ReceivePoint < rs_RECEIVE_MAX)
 244   4                      {                       //保存收到的字节    
 245   5                          rs232buffer[ReceivePoint++] = rs_BUF;
 246   5                      }
 247   4                      else
 248   4                      {
 249   5                          rs_f_RI_enable = 0; //缓冲区满, 禁止接收   
 250   5                      }
 251   4                  }
 252   3                  else
 253   3                  {
 254   4                      if (rs_shift_count < 9 ) //收到的是数据位 1 -- 7  
 255   4                      {
 256   5                          rs_BUF = rs_BUF >> 1;
 257   5                          rs_BUF_bit7 = rs_RXD;
 258   5                      }
 259   4                      else
 260   4                      {   //收到停止位,继续检测 PC 机发出的下一个起始位    
 261   5                          soft_receive_init(); 
 262   5                      }
 263   4                  }
 264   3              }
 265   2              TCON_TFx = 0;                  //清定时器中断标志   
 266   2          }
 267   1          else
 268   1          {
 269   2              /************************ 发送 ****************************/  
 270   2              if (rs_f_TI_enable == 1)
 271   2              {
 272   3                  rs_timerL += rs_FULL_BIT_L;//下次中断在数据位的末尾时刻   
 273   3                  rs_timerH = rs_FULL_BIT_H;
 274   3      
 275   3                  rs_shift_count--;          //0:停止位末尾时刻到  
 276   3                                             //1:发送停止位  
 277   3                                             //2--9:发送数据位  
 278   3                  if (rs_shift_count > 9)    //错误状态  
 279   3                  {
 280   4                      rs_shift_count = 9;
 281   4                      rs_BUF = 0xFF;
 282   4                  }
 283   3      
 284   3                  if (rs_shift_count > 1)    //2--9:发送数据位  
 285   3                  {
 286   4                      ACC = rs_BUF;
 287   4                      ACC = ACC >> 1;
 288   4                      rs_TXD = CY;
 289   4                      rs_BUF = ACC;
 290   4                  }
 291   3                  else
 292   3                  {
 293   4                      if (rs_shift_count == 0) //0:停止位末尾时刻到  
 294   4                      {
 295   5                          rs_TXD = 1;
 296   5                          rs_f_TI = 1;       //已发送完毕一个字节  
 297   5                      }
 298   4                      else
 299   4                      {
 300   5                          rs_TXD = 1;        //1:发送停止位  
 301   5                      }
 302   4                  }
C51 COMPILER V7.06   IO_TO_UART                                                            08/22/2008 23:17:02 PAGE 6   

 303   3              }
 304   2          }
 305   1      }
 306          
 307          //由收转到发时,要先调用 soft_send_enable ()  
 308          void rs_send_byte(INT8U SendByte)      //发送一个字节  
 309          {
 310   1          while ( rs_f_TI == 0);             //等待发送完毕前一个字节  
 311   1          rs_TXD = 1;
 312   1          rs_timerL = rs_START_BIT_L;        //下次中断在起始位的末尾时刻   
 313   1          rs_timerH = rs_START_BIT_H;
 314   1          rs_BUF = SendByte;
 315   1          rs_shift_count = 10;
 316   1          rs_TXD = 0;                        //发送起始位  
 317   1          rs_f_TI = 0;                       //清已发送完毕一个字节的标志   
 318   1      }
 319          
 320          void initiate_MCU (void)               //系统初始化  
 321          {
 322   1          soft_rs232_init();                 //串口初始化  
 323   1          EA = 1;                            //开中断  
 324   1      }
 325          
 326          void main (void)
 327          {
 328   1      //首先发送 128 个字节 00H--7FH, 然后等待 PC 机发送的数据。当收到 128
 329   1      //个字节后,立刻将收到的 128 个数据回发送给 PC 机,然后继续等待下一个
 330   1      //数据块。
 331   1        
 332   1          INT8U i;
 333   1          initiate_MCU();                    //系统初始化  
 334   1      
 335   1          soft_send_enable ();               //允许发送,禁止接收  
 336   1          for (i=0; i < rs_RECEIVE_MAX; i++ )
 337   1          {
 338   2              rs_send_byte(i);
 339   2          }
 340   1          while ( rs_f_TI == 0)  ;           // 等待最后一个字节发送完毕   
 341   1      
 342   1          while(1)
 343   1          {
 344   2              soft_receive_enable ();        //启动并开始接收,禁止发送  
 345   2              while (ReceivePoint < rs_RECEIVE_MAX); // 等待接收缓冲区满  
 346   2      
 347   2              soft_send_enable ();           //允许发送,禁止接收  
 348   2              for (i=0; i < rs_RECEIVE_MAX; i++ )
 349   2              {
 350   3                  rs_send_byte(rs232buffer[i]);
 351   3              }
 352   2              while ( rs_f_TI == 0)  ;       //等待最后一个字节发送完毕
 353   2              ReceivePoint = 0;
 354   2          }
 355   1      }
 356           


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    369    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      5    ----
C51 COMPILER V7.06   IO_TO_UART                                                            08/22/2008 23:17:02 PAGE 7   

   IDATA SIZE       =    128    ----
   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 + -