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

📄 rs485_com.lst

📁 主要是can工业总线方面的应用程序
💻 LST
字号:
C51 COMPILER V7.06   RS485_COM                                                             12/15/2007 21:20:16 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE RS485_COM
OBJECT MODULE PLACED IN C:\VW\CANV2\BASIC_~1\RS485\RS485_COM.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE C:\VW\CANV2\BASIC_~1\RS485\RS485_COM.C DB SB OE

stmt level    source

   1          
   2          //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
   3          //描述:
   4          //      该程序INT0按键程序+显示程序+RS485通讯                                  &
   5          //      每按一次,数码管1-2(自右向左)显示加1,并且发送数据到485节点2;       &
   6          //      接收到485节点2的数据在数码管3-4(自右向左)                            &
   7          //      485总线是半双工的                                                      &
   8          //      通讯波特率:19200                                                       &
   9          //      每次收发一个字节                                                       &
  10          
  11          //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
  12          //【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息!                   &
  13          //【声明】 作者: PIAE小组                                                      &
  14          
  15          #include <reg52.h>
  16          #include <intrins.h>
  17          #include <RS485_def.h>
  18          
  19          void INT0_Counter( void ) interrupt 0 using 1
  20          {//INT0按键为计数按键
  21   1          EA = 0;
  22   1          TX_data++; //按键计数单元加1,将给数据发送
  23   1          TXD_flag = 1;
  24   1          EA = 1;
  25   1      }
  26          
  27          
  28          void RS485_RXD( void ) interrupt 4   using 1
  29          {//接收数据函数,在中断服务程序中调用
  30   1          uchar temp;
  31   1          EA = 0;//关闭所有中断
  32   1          ES = 0;//关闭串口
  33   1          if(RI==1)
  34   1          {//在调试中发送,会收到一个多于的数据0,这可能是MAX483的性能决定的,
  35   2          //所以采取了滤波的方法
  36   2              RI = 0;
  37   2              temp = SBUF;
  38   2              if( temp == 0)
  39   2              {
  40   3                  if(RX_data == 0)
  41   3                  {
  42   4                      RX_data = 0;
  43   4                  }
  44   3              }
  45   2              else
  46   2              {
  47   3                  RX_data = temp;
  48   3              }
  49   2      
  50   2              RXD_flag = 1;//置接收到数据标志
  51   2          }
  52   1          _nop_();
  53   1          ES = 1;//打开串口
  54   1          EA = 1;//打开中断
  55   1      }
C51 COMPILER V7.06   RS485_COM                                                             12/15/2007 21:20:16 PAGE 2   

  56          
  57          void main(void)
  58          {
  59   1          CPU_init();
  60   1          _nop_();
  61   1          while(1)
  62   1          {
  63   2              NOPS;
  64   2        /////////////////////// 接收处理程序/////////////////////////////////
  65   2              if( RXD_flag )
  66   2              {
  67   3                  EA = 0;//关闭CPU中断
  68   3                  LED_RED = !LED_RED;//指示灯状态变化
  69   3                  RXD_flag = 0;//清楚标志
  70   3                  RX_data = RX_data;//接收对方发送的数据
  71   3                  if(RX_data>99)
  72   3                  {
  73   4                      RX_data = 0;
  74   4                  }
  75   3                  EA = 1;
  76   3              }
  77   2      ///////////////////////发送处理程序/////////////////////////////////
  78   2              if( TXD_flag )
  79   2              {
  80   3                  EA = 0;
  81   3                  LED_GRE = !LED_GRE;//指示灯状态变化
  82   3                  TXD_flag = 0;
  83   3                  TX_data  = TX_data;//
  84   3                  if(TX_data>99)
  85   3                  {
  86   4                      TX_data = 0;
  87   4                  }
  88   3                  RS485_wren = 1;//变为发送状态
  89   3                  RS485_TXD();
  90   3                  _nop_();
  91   3                  RS485_wren = 0;//返回到接收状态
  92   3                  _nop_();
  93   3                  _nop_();
  94   3                  EA = 1;
  95   3              }
  96   2      ///////////////////////数码管显示程序/////////////////////////////////
  97   2              led_seg7(1,TX_data);
  98   2              led_seg7(3,RX_data);
  99   2      
 100   2      ///////////////////////数码管显示程序/////////////////////////////////
 101   2          }//while 结束
 102   1      }//main结束
 103          
 104          
 105          void Delay(uchar delay_time)
 106          {//延时程序
 107   1          while(delay_time--)
 108   1          {}
 109   1      }
 110          
 111          
 112          void CPU_init(void)
 113          {//初始化CPU
 114   1          RS485_wren = 0;//RS485初始化为接收模式
 115   1          SCON = 0x50; //串口方式1
 116   1          PCON = 0x80; //串口波特率加速
 117   1          TMOD = 0x21;
C51 COMPILER V7.06   RS485_COM                                                             12/15/2007 21:20:16 PAGE 3   

 118   1          TH1=0xFD; //19200bps
 119   1          TL1=0xFD;
 120   1          TR1 = 1;
 121   1          TI = 0;
 122   1          RI = 0;
 123   1          PS = 1;      //串口中断的优先级设为最高
 124   1      
 125   1          IT0 = 1;//外部中断0负边沿触发
 126   1          EX0 = 1;//打开外部中断0
 127   1          ES  = 1;//打开串口中断
 128   1          EA = 1; //打开总中断
 129   1          SJA1000_CS = 1;//片选无效
 130   1      }
 131          
 132          void RS485_TXD( void )
 133          {
 134   1          uchar k = 200;
 135   1          TI = 1;
 136   1          while(TI)
 137   1          {
 138   2              RS485_wren = 1;//RS485处于发送状态
 139   2              TI = 0;//一字节发送完后清除标志位
 140   2              SBUF = TX_data;
 141   2              while(!TI)
 142   2              {}//等待发送
 143   2              TI = 0;
 144   2          }
 145   1          _nop_();
 146   1      
 147   1          while( k-- )
 148   1          {//这段代码时候了延时,确保485线上数据发送完毕
 149   2              led_seg7(1,TX_data);
 150   2              led_seg7(3,RX_data);
 151   2          }
 152   1      }
 153          
 154          void led_seg7(uchar from,uchar number)
 155          {//from(1_4):数码管显示起始位置(从右到左),number:显示的数
 156   1          uchar digit,temp_l;
 157   1          uchar temp_h=0x7f;
 158   1          temp_h = _cror_(temp_h,from-1);   //确定从哪一位开始显示,即确定高四位
 159   1          temp_h = temp_h & 0xf0;           //取高四位
 160   1          temp_l = P2 & 0x0f;               //取P2的低四位
 161   1          P2 = temp_h | temp_l;             //设定P2口
 162   1      
 163   1          if(number==0)
 164   1          {
 165   2              P0 = led[0];
 166   2              Delay(5);
 167   2              P0 = 0xff;
 168   2          }
 169   1          else
 170   1          {
 171   2              while(number)
 172   2              {
 173   3                  digit = number%10 ;
 174   3                  number /= 10;
 175   3                  P0 = led[digit] ;
 176   3                  Delay(5);
 177   3                  temp_h = P2 & 0xf0;               //取P2的高四位
 178   3                  temp_h = temp_h | 0x0f;           //拼装 temp_h,进行位选
 179   3                  temp_h = _cror_(temp_h,1);
C51 COMPILER V7.06   RS485_COM                                                             12/15/2007 21:20:16 PAGE 4   

 180   3                  temp_h = temp_h & 0xf0;           //取高四位
 181   3                  temp_l = P2 & 0x0f;               //取P2的低四位
 182   3                  P0 = 0xff;
 183   3                  P2 = temp_h | temp_l;             //设定P2口
 184   3              }//while结束
 185   2          }//else结束
 186   1      
 187   1      }
C51 COMPILER V7.06   RS485_COM                                                             12/15/2007 21:20:16 PAGE 5   

NAME                                    CLASS   MSPACE  TYPE    OFFSET  SIZE
====                                    =====   ======  ====    ======  ====


CPU_init . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
P0 . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0080H  1
P1 . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0090H  1
P2 . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00A0H  1
P3 . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00B0H  1
EA . . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      00AFH  1
IE . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00A8H  1
LED_RED. . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      00A1H  1
LED_GRE. . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      00A2H  1
RS485_RXD. . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  temp . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   000FH  1
SJA1000_CS . . . . . . . . . . . . . .  ABSBIT   -----  BIT      00A0H  1
ES . . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      00ACH  1
RS485_TXD. . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  k. . . . . . . . . . . . . . . . . .  AUTO     DATA   U_CHAR   0000H  1
IP . . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00B8H  1
RI . . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      0098H  1
TI . . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      0099H  1
PS . . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      00BCH  1
main . . . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
RX_data. . . . . . . . . . . . . . . .  PUBLIC   DATA   U_CHAR   0000H  1
TX_data. . . . . . . . . . . . . . . .  PUBLIC   DATA   U_CHAR   0001H  1
SBUF . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0099H  1
PCON . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0087H  1
SCON . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0098H  1
TMOD . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0089H  1
TCON . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   0088H  1
led. . . . . . . . . . . . . . . . . .  PUBLIC   CODE   ARRAY    0000H  11
EX0. . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      00A8H  1
IT0. . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      0088H  1
TH1. . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   008DH  1
_Delay . . . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0008H  -----
  delay_time . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0007H  1
TL1. . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   008BH  1
TR1. . . . . . . . . . . . . . . . . .  ABSBIT   -----  BIT      008EH  1
INT0_Counter . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
RS485_wren . . . . . . . . . . . . . .  ABSBIT   -----  BIT      00A3H  1
T2CON. . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00C8H  1
RXD_flag . . . . . . . . . . . . . . .  PUBLIC   DATA   BIT      0000H  1
TXD_flag . . . . . . . . . . . . . . .  PUBLIC   DATA   BIT      0001H  1
_led_seg7. . . . . . . . . . . . . . .  PUBLIC   CODE   PROC     0000H  -----
  from . . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0007H  1
  number . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0005H  1
  digit. . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0004H  1
  temp_l . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0007H  1
  temp_h . . . . . . . . . . . . . . .  * REG *  DATA   U_CHAR   0006H  1
PSW. . . . . . . . . . . . . . . . . .  SFR      DATA   U_CHAR   00D0H  1


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

C51 COMPILER V7.06   RS485_COM                                                             12/15/2007 21:20:16 PAGE 6   


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

⌨️ 快捷键说明

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