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

📄 main.lst

📁 此程序是RS485从机通讯
💻 LST
📖 第 1 页 / 共 2 页
字号:
 189   2              *(s+i)=RecByte();
 190   2              CS+=*(s+i);
 191   2              }
 192   1              if(RecByte()!=0x68) /*是数据帧头吗?*/
 193   1              return 0;
 194   1              CS+=0x68;
 195   1              CS+=(*(s+6)=RecByte()); /*接收通讯命令*/
 196   1              j=*(s+7)=RecByte(); /*接收通讯数据长度*/
 197   1              CS+=j;
 198   1              for(i=0;i<=(j-1);i++) /*接收N个数据*/
 199   1              {
 200   2              CS+=(*(s+i+8)=RecByte());
 201   2              *(s+i+8)-=0x33;
 202   2              }
 203   1              if(CS!=RecByte()) /*校验正确吗?*/
 204   1              return 0;
 205   1              if(RecByte()!=0x16) /*是帧尾吗?*/
 206   1              return 0;
 207   1              ES=0;
 208   1              return 1;
 209   1      }
 210          
 211          /********************************************************************
 212          串口接收中断服务程序
 213          功能:接收数据
 214          ********************************************************************/
 215          void RXD_Int(void) interrupt 4
 216          {
 217   1              CY=RecFrame(Serial_buf);
 218   1              if(CY)
 219   1              Command_status1|=0x04; /*一帧接收成功,通知主程序进行通讯处理*/
 220   1      } 
 221          
 222          /********************************************************************
 223          串口发送一个字节
 224          功能:发送一个字节数据
 225          入口参数:发送数据
 226          出口参数:无
 227          ********************************************************************/   
 228          void SendByte(uchar Serial_data)
 229          {
 230   1              ACC=Serial_data;
 231   1              TB8=P;TI=0;
 232   1              SBUF=Serial_data;
 233   1              while(!TI);
 234   1              TI=0; /*发送一个字节,并进行偶校验*/
 235   1      }
 236           
 237          /********************************************************************
 238          发送一帧数据函数
 239          原型:void TXD_Int(uchar *s);
 240          功能:发送一帧数据
 241          入口参数:发送数据帧地址指针
C51 COMPILER V8.02   MAIN                                                                  12/19/2006 09:36:14 PAGE 5   

 242          出口参数:无
 243          ********************************************************************/
 244          void TXD_Int(uchar *s)
 245          {
 246   1              uchar CS=0x68;
 247   1              char i,j;
 248   1      
 249   1              CTRL485=0;       /*RS485通讯,切换为发送状态*/
 250   1              Delay(1);
 251   1              TI=0;
 252   1              SendByte(0xfe); /*发送2个前到字节*/
 253   1              SendByte(0xfe);
 254   1              SendByte(0x68); /*发送帧头*/
 255   1              for(i=0;i<=3;i++) /*发送通讯地址*/
 256   1              {CS+=*(s+i);SendByte(*(s+i));}
 257   1              CS+=0x68;SendByte(0x68); /*发送数据帧头*/
 258   1              CS+=*(s+6);SendByte(*(s+6)); /*发送帧命令*/
 259   1              CS+=*(s+7);j=*(s+7);SendByte(j); /*发送数据长度*/
 260   1              for(i=0;i<=j-1;i++) /*发送数据*/
 261   1              {
 262   2              (*(s+i+8))+=0x33;
 263   2              SendByte(*(s+i+8));CS+=(*(s+i+8));
 264   2              }
 265   1              SendByte(CS); /*发送校验字节*/
 266   1              SendByte(0x16); /*发送帧尾*/
 267   1              RI=0;TI=0;
 268   1              Delay(1);
 269   1              CTRL485=1; /*一帧发送完毕,恢复信道切换功能*/
 270   1              
 271   1      }
 272          
 273          /********************************************************************
 274          通讯地址判断函数
 275          原型:uchar Serial_Address(uchar *);
 276          功能:通讯地址判断
 277          全局变量:
 278          入口参数:s1指向从通讯地址
 279          出口参数:0x00错误,0x01正确,0x02广播地址
 280          ********************************************************************/
 281          uchar Serial_Address(uchar *s1)
 282          {
 283   1              uchar i,a[4];
 284   1              a[0]=P20; /*读取通讯地址*/
 285   1              a[1]=P21;
 286   1              a[2]=P22;
 287   1              a[3]=P23;
 288   1              for(i=0;i<=3;i++)
 289   1              {
 290   2              if((*(s1+i))!=0x99)
 291   2              break; /*不是广播地址*/
 292   2              if(i==5)
 293   2              return(0x02); /*是广播地址*/
 294   2              }
 295   1              for(i=0;i<=3;i++)
 296   1              {
 297   2              if((*(s1+i))!=a[i])
 298   2              return(0x00); /*地址不相同*/
 299   2              }
 300   1              return(0x01); /*地址相同*/
 301   1      }
 302          
 303          /********************************************************************
C51 COMPILER V8.02   MAIN                                                                  12/19/2006 09:36:14 PAGE 6   

 304          通讯执行函数
 305          原型:bit Serial_Command_Run(uchar *);
 306          功能:执行通讯命令
 307          入口参数:帧地址
 308          出口参数:是否正确及是否完毕,0为错误和通讯没有完成,1为正确和通讯完成
 309          ********************************************************************/
 310          bit Serial_Command_Run(uchar *s)
 311          {
 312   1              switch(Serial_Address(s)) /*判断地址是否正确*/
 313   1              {
 314   2              case 0x02: /*广播地址99999999H*/
 315   2              break;
 316   2              case 0x01: /*正常地址*/
 317   2              switch(*(s+4))
 318   2              {                       
 319   3              (*(s+6))|=0x80;(*(s+7))=0x04; /*存入命令码及长度字节*/
 320   3              TXD_Int(s); /*发送一帧数据*/
 321   3              break;
 322   3              case 0x01: /*读数据*/
 323   3              break;
 324   3              case 0x04: /*写数据*/
 325   3              break;
 326   3              default: /*其他命令*/
 327   3              break;
 328   3              }
 329   2              break;
 330   2              case 0x00: /*地址错误*/
 331   2              return 0;
 332   2              break;
 333   2              }
 334   1              return 1; /*帧执行正确,返回*/
 335   1      
 336   1      }
 337          /********************************************************************
 338          通讯主函数
 339          原型:void Serial_Command();
 340          功能:执行通讯命令
 341          入口参数:无
 342          出口参数:无
 343          ********************************************************************/
 344          void Serial_Command()
 345          {
 346   1              if(Command_status1&0x04) /*通讯事件发送*/
 347   1              {
 348   2              if(~Serial_Command_Run(Serial_buf)) /*帧执行*/
 349   2              {ES=1;Command_status1&=0xfb;return;} /*帧错误,恢复信道功能*/
 350   2              ES=1; /*恢复信道功能*/
 351   2              Command_status1&=0xfb; /*j清除通讯处理事件*/
 352   2              }
 353   1      }
 354          
 355          /********************************************************************
 356          主函数
 357          原型:void main();
 358          功能:完成通讯主流程
 359          入口参数:无
 360          出口参数:无
 361          ********************************************************************/
 362          void main()
 363          {
 364   1              InitializeSystem(); /*对CPU各个部件初始化*/             
 365   1              while(1)
C51 COMPILER V8.02   MAIN                                                                  12/19/2006 09:36:14 PAGE 7   

 366   1              {
 367   2                      Serial_Command();
 368   2              }
 369   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1014    ----
   CONSTANT SIZE    =    152    ----
   XDATA SIZE       =     15      20
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     94    ----
   IDATA SIZE       =     36    ----
   BIT SIZE         =      4    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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