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

📄 master485.lst

📁 单片机智能产品c语言设计实例详解程序
💻 LST
字号:
C51 COMPILER V7.06   MASTER485                                                             03/28/2005 13:08:45 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE MASTER485
OBJECT MODULE PLACED IN master485.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE master485.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          //-----------------------函数声明,变量定义---------------------
   2          #include <reg51.h>
   3          sbit RE_DE=P1^0;
   4          #define COUNT 10                   // 定义接收缓冲区大小 
   5          #define Slaver_NUM 10
   6          
   7          unsigned char bdata flag;          //在可位寻址去定义一个标志变量
   8          sbit time_over_flag =flag^0;       //接收超时标志
   9          
  10          unsigned char buffer[COUNT];       //定义缓冲区
  11          unsigned char point;               //定义缓冲区位置指示
  12          
  13          unsigned char Slave_AD[Slaver_NUM]; //定义有效地址存放区 
  14          unsigned char ADD_num;               //有效地址个数
  15          
  16          unsigned char idata count_10ms;    //用于表示有多少次10ms中断
  17          
  18          unsigned char idata send_data[7]={
  19          0x31,0x32,0x33,0x34,0x35,0x36,0x37}; //与定义发送数据,共7位
  20          
  21          void UART_init();                  //串口初始化函数
  22          void COM_send(void);               //串口接收函数
  23          unsigned char CLU_checkdata(void); //计算校验位函数
  24          
  25          //---------------------------------------------------------------
  26          // 函数名称: UART_init()串口初始化函数
  27          // 函数功能: 在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s
  28          //            串口接收中断允许,发送中断禁止,设定定时器中断允许
  29          //---------------------------------------------------------------
  30          void UART_init()
  31          {
  32   1      //初始化串行设置 
  33   1      SCON =0x58;          //选择串口工作方式为1,打开接收允许,TB8=1
  34   1      TMOD =0x21;          //定时器1工作在方式2,定时器0工作在方式1
  35   1      TR1 =1;              //启动定时器T1
  36   1      ES=1;                //允许串行口中断
  37   1      PS=1;                //设计串行口中断优先级
  38   1      //初始化定时器1
  39   1      TH1 =0xfd;           //实现波特率9600(系统时钟11.0592MHZ)
  40   1      ET1 =0;                          //定时器1中断禁止
  41   1      }
  42          //---------------------------------------------------------------
  43          // 函数名称: timer0_init()初始化定时器0
  44          // 函数功能: 设置timer0工作模式 
  45          //---------------------------------------------------------------
  46          void timer0_init()
  47          {
  48   1      time_over_flag=0;
  49   1      count_10ms=0;
  50   1      ADD_num=0;
  51   1      TL0=0x0F0;            //T0用于产生10ms的中断
  52   1      TH0=0x0D8;                        //50次T0中断产生1次超时溢出
  53   1      ET0=1;                    //允许定时器0中断
  54   1      }
  55          //---------------------------------------------------------------
C51 COMPILER V7.06   MASTER485                                                             03/28/2005 13:08:45 PAGE 2   

  56          // 函数名称: system_init()系统初始化
  57          // 函数功能: 调用串口、定时器初始化函数,完成系统初始化
  58          //---------------------------------------------------------------
  59          void system_init(void)
  60          {
  61   1      //系统总设置
  62   1      UART_init();
  63   1      timer0_init();
  64   1      EA =1;                //单片机中断允许
  65   1      }
  66          //---------------------------------------------------------------
  67          // 函数名称: com_interrup()串口接收中断处理函数
  68          // 函数功能: 接收包括起始位"S"在内的十位数据到数据缓冲区
  69          //---------------------------------------------------------------
  70          com_interrupt(void) interrupt 4 using 3
  71          {
  72   1        unsigned char RECEIVR_buffer;
  73   1        if(RI)                              //处理接收中断
  74   1        {RI=0;                               //清除中断标志位
  75   2        RECEIVR_buffer=SBUF;                    //接收串口数据
  76   2      if(point==0)                                              //如果还没有接收到起始位
  77   2              {
  78   3              if(RECEIVR_buffer==0xFE)        //判断是否起始标志位
  79   3                   {
  80   4                               buffer[point++]=RECEIVR_buffer;//把接收到的数据放入接收缓存区
  81   4                               }
  82   3                      else
  83   3                           point=0;                                    //不是,继续等待起始位
  84   3                              } 
  85   2      else if(point>0&&point<10)                               //判断是否接收够十位数据
  86   2               buffer[point++]=RECEIVR_buffer;         //不够,把接收到的数据放入接收缓存区
  87   2      else if(point==10)
  88   2            {
  89   3              if(RECEIVR_buffer==0xEF)        //判断结束标志位是否正确
  90   3                {
  91   4                        buffer[point]=RECEIVR_buffer; //把接收到的数据放入接收缓存区
  92   4                        Slave_AD[ADD_num++]=buffer[2]; //把接收到的地址放到地址存储器
  93   4                                                      //表示该地址有有效设备
  94   4                         }
  95   3                      else
  96   3                           point=0;                                    //不是,继续等待起始位
  97   3                              } 
  98   2       else point=0;                                   //缓冲区已满,清除缓存区内数据重新接收
  99   2      }
 100   1      if(TI)                                   //串口发送中断
 101   1      {
 102   2       TI=0;                                   //清除发送中断
 103   2       }
 104   1      }
 105          //---------------------------------------------------------------
 106          // 函数名称: timer0_interrup()
 107          // 函数功能:定时器T0中断服务程序
 108          // 函数说明:T0枚10ms中断一次,连续中断50次置time_over_flag=1;
 109          //---------------------------------------------------------------
 110          timer0_interrupt(void) interrupt 1 using 2
 111          {  
 112   1        count_10ms++;
 113   1        if(count_10ms==50)
 114   1        {
 115   2        ET0=0;           //关闭定时器T0中断
 116   2        TR0=0;           //停止定时器T0
 117   2        time_over_flag=1;//设置接收超时标志
C51 COMPILER V7.06   MASTER485                                                             03/28/2005 13:08:45 PAGE 3   

 118   2        count_10ms=0x00; //10ms计数器复位
 119   2        }
 120   1        else
 121   1        {
 122   2        TL0=0x0F0;            //重装定时器初始值
 123   2        TH0=0x0D8;            
 124   2        }
 125   1      }
 126          
 127          //---------------------------------------------------------------
 128          // 函数名称: COM_send()串口发送函数
 129          // 函数功能: 把数据缓冲区的十位数据发送出去
 130          //---------------------------------------------------------------
 131          void COM_send(void)
 132          {
 133   1       RE_DE=1;                                //设置MAX483进入发送状态
 134   1       for(point=0;point<=10,TI=1;point++)     //连续发送十位数据
 135   1                                               //把缓存区的数据都发送到串口
 136   1        {
 137   2         SBUF=buffer[point];
 138   2         TI=0;
 139   2         }
 140   1          RE_DE=0;                                //设置MAX483进入接收状态
 141   1      
 142   1      }
 143          //---------------------------------------------------------------
 144          // 函数名称: write_buffer()
 145          // 函数功能: 写发送缓冲区十位数据
 146          //---------------------------------------------------------------
 147          void write_buffer(unsigned char slaver_add)
 148          {
 149   1        unsigned char i;
 150   1        TB8=1;                                  //打开多机通信方式
 151   1        buffer[0]=0xFE;
 152   1        buffer[1]=slaver_add;
 153   1        for(i=2;i<9;i++)               //连续发送十位数据
 154   1                                               //把缓存区的数据都发送到串口
 155   1        {
 156   2         buffer[i]=send_data[i-2];
 157   2         }
 158   1         buffer[9]=0xEF;
 159   1       }
 160          
 161          //---------------------------------------------------------------
 162          // 函数名称: 主函数
 163          // 函数功能: 调度个子函数,完成通信过程
 164          //---------------------------------------------------------------
 165           void main(void)
 166           {
 167   1       unsigned char i=0;
 168   1       system_init();            //系统初始化
 169   1       do{                               //查旬0到10好地址有没有对应设备 
 170   2       write_buffer(i++);        //写查询第i号设备的发送信息
 171   2       COM_send();               //调用发送函数,完成发送
 172   2       timer0_init();            //完成一次查询,重新初始定时器0,准备下一次查询
 173   2       }
 174   1       while(time_over_flag&&i<10);
 175   1       }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    252    ----
C51 COMPILER V7.06   MASTER485                                                             03/28/2005 13:08:45 PAGE 4   

   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     23    ----
   IDATA SIZE       =      8    ----
   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 + -