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

📄 dpramcomm.lst

📁 包含电路图及c语言程序
💻 LST
字号:
C51 COMPILER V7.02b   DPRAMCOMM                                                            12/10/2005 20:55:25 PAGE 1   


C51 COMPILER V7.02b, COMPILATION OF MODULE DPRAMCOMM
OBJECT MODULE PLACED IN DPRamComm.OBJ
COMPILER INVOKED BY: E:\EDATOOLS\KEILC7.0\C51\BIN\C51.EXE DPRamComm.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /*****************************************/
   2          /* Copyright (c) 2005, 通信工程学院      */
   3          /* All rights reserved.                  */
   4          /* 作    者:戴 佳                                       */
   5          /*****************************************/
   6          
   7          #include "DPRamComm.h"
   8          
   9          /* 40ms定时中断服务子程序:
  10             定期更新左端单片机的状态信息,查询右端单片机的状态信息*/
  11          void timer0_int() interrupt 1 using 1
  12          {
  13   1              TR0 = 0;                                                // 关闭T0
  14   1              TH0 = 0x70;                                             // 重置40ms定时器的计数初值
  15   1              TL0 = 0x00; 
  16   1              FillState();                                    // 定期更新左端单片机状态让右端单片机可查询
  17   1              GetState();                                             // 定期查询右端单片机的状态信息   
  18   1      }
  19          
  20          /* 外部中断0服务子程序:
  21             设置中断标志位int0flag,读清中断*/
  22          void out_int0() interrupt 0 using 1
  23          {
  24   1              uchar ch;
  25   1              int0flag = 1;                                   // 表示外部中断0,实际是双口RAM产生的中断
  26   1        
  27   1              get_sem(&INTL_SEM);                             // 申请并获得左中断旗语
  28   1              ch = DPRAM_INTR;                        // 读清中断
  29   1              INTL_SEM = 0x01;                                // 释放左中断旗语
  30   1      }       
  31          
  32          /* 主程序 */
  33          void main()
  34          { 
  35   1              int0flag = 0;
  36   1              rdyflag = 0;
  37   1              ProvTimes = 0;
  38   1      
  39   1              LpStateRamAddr = 0x2000;
  40   1              LpProvRamAddr = 0x2400;
  41   1              RpStateRamAddr = 0x3000;
  42   1              RpProvRamAddr = 0x3400;
  43   1      
  44   1      
  45   1              /* 等待右端单片机准备就绪 */
  46   1              while(rdyflag!=1)
  47   1              {
  48   2                      get_sem(&RP_STT_SEM);           // 申请并获得右端状态旗语
  49   2                      if (*RpStateRamAddr == READY)   
  50   2                              rdyflag = 1;                    // 右端单片机准备就绪标志置1
  51   2                      RP_STT_SEM = 0x01;                      // 释放右端状态旗语
  52   2              }
  53   1      
  54   1              /* 对右端单片机进行初始配置 */
  55   1              InitProvRP();   
C51 COMPILER V7.02b   DPRAMCOMM                                                            12/10/2005 20:55:25 PAGE 2   

  56   1              
  57   1              /* 通过向左端状态空间的第一地址单元写READY向右端表示左端准备就绪 */
  58   1              get_sem(&LP_STT_SEM);                   // 申请并获得左端状态旗语
  59   1              *LpStateRamAddr = READY;                // 左端单片机准备就绪
  60   1              LP_STT_SEM = 0x01;                              // 释放左端状态旗语
  61   1      
  62   1              ProvTimes++;                                    // 对右端口的配置次数加1                
  63   1      
  64   1              EA = 1;                                                 // 开CPU中断
  65   1              EX0 = 1;                                                // 开外部中断0 
  66   1              ET0 =1;                                                 // 开T/C0中断
  67   1              PX0     = 0;                                            // 外部中断低优先级
  68   1              PT0 = 1;                                                // 计数器高优先级
  69   1              TMOD = 0x01;                                    // T/C0工作在方式1
  70   1              TH0 = 0x70;                                             // 预置40ms定时器的计数初值
  71   1              TL0 = 0x00;
  72   1              TR0 = 0;                                                // 不启动T0
  73   1      
  74   1              /* 右端单片机接收左端对其的初始化配置,运行正常后触发双口RAM的
  75   1              左端中断,左端单片机受中断触发后对右端单片机作第二次配置,并启
  76   1              动40ms定时器,开始定期更新本机的状态信息并监测右端单片机的状态 */
  77   1          while(int0flag==1)
  78   1              {
  79   2                      if (ProvTimes==1)
  80   2                      {
  81   3                              ProvTimes++;                    // 对右端口的配置次数加1
  82   3                              Prov();                                 // 对右端口单片机二次配置
  83   3                              
  84   3                              /* 通过出发右端中断,通知右端单片机接受二次配置*/
  85   3                              get_sem(&INTR_SEM);             // 申请并获得右中断旗语
  86   3                              DPRAM_INTL = 0xFF;      // ITNR脚为低,出发右端单片机中断
  87   3                              INTR_SEM = 0x01;                // 释放右中断旗语
  88   3                      }
  89   2      
  90   2                      TR0 = 1;                                        // 启动40ms定时器T0             
  91   2              }       
  92   1      }
  93          
  94          /* 申请并获得旗语函数 */
  95          bit get_sem(uchar *sem_type)            
  96          {
  97   1              *sem_type = 0x00;                               // 申请旗语
  98   1              while((*sem_type!=0x00));               // 无限循环直至获得旗语    
  99   1              return(1);
 100   1      }
 101          
 102          
 103          /* 对右端单片机的初始化配置函数:为简化起见,通过向左端的配置
 104             空间2500H~25FFH全写0x22,表示对右端单片机的初始配置命令  */
 105          void InitProvRP(void)
 106          {
 107   1              uchar i;
 108   1              get_sem(&LP_PRO_SEM);                   // 申请左端配置旗语     
 109   1              for (i=0;i++;i<=255)
 110   1                      *(LpProvRamAddr+i) = 0x22; 
 111   1              LP_PRO_SEM = 0x01;                              // 释放左端配置旗语             
 112   1      }
 113          
 114          /* 对右端单片机的二次配置函数:为简化起见,通过向左端的配置
 115             空间2500H~25FFH全写0x33,表示对右端单片机的初始配置命令  */
 116          void Prov(void)
 117          {
C51 COMPILER V7.02b   DPRAMCOMM                                                            12/10/2005 20:55:25 PAGE 3   

 118   1              uchar i;
 119   1              get_sem(&LP_PRO_SEM);                   // 申请左端配置旗语     
 120   1              for (i=0;i++;i<=255)
 121   1                      *(LpProvRamAddr+i) = 0x33; 
 122   1              LP_PRO_SEM = 0x01;                              // 释放左端配置旗语
 123   1      }
 124          
 125          
 126          /* 更新本机状态函数:为了简化起见,此函数表示为向左端状态空
 127             间第一地址单元(存放设备就绪信息)以后的254字节全写0x44  */
 128          void FillState(void)
 129          {
 130   1              uchar i;
 131   1              get_sem(&LP_STT_SEM);                   // 申请并获得左端状态旗语
 132   1              for (i=0;i++;i<=254)
 133   1                      *(LpStateRamAddr+i+1) = 0x44;
 134   1              LP_STT_SEM = 0x01;                              // 释放左端状态旗语
 135   1      }
 136          
 137          /* 查询另一端单片机状态函数:为简化起见,此函数表示为用数组
 138             ArrayState存取右端状态空间第一地址单元(存放设备就绪信息)
 139             以后的254字节(3001H~30FFH)包含的状态信息          */ 
 140          void GetState(void)
 141          {
 142   1              uchar i;
 143   1              get_sem(&RP_STT_SEM);                   // 申请并获得右端状态旗语
 144   1              for (i=0;i++;i<=254)
 145   1                      ArrayState[i] = *(RpStateRamAddr+i+1);
 146   1              RP_STT_SEM = 0x01;                              // 释放右端状态旗语
 147   1      }
 148          
 149          
 150          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    413    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =    254    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     11       1
   IDATA SIZE       =   ----    ----
   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 + -