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

📄 main.lst

📁 ds18b20在stc89c58rd+下使用C语言调试通过
💻 LST
字号:
C51 COMPILER V8.02   MAIN                                                                  07/24/2007 14:50:26 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: d:\program files\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <P8XC5X2.H>
   2           #include <intrins.H>
   3          #include "sja_bcanconf.h"
   4          #include "X5045.h"
   5          sbit io=P2^6;
   6          /*CAN通信定义*/
   7          volatile unsigned char bdata flag_init;         //保存中断寄存器值
   8          sbit rcv_flag=flag_init^0;              //接收中断标志
   9          sbit err_flag=flag_init^2;              //错误中断标志
  10          unsigned char SendBuf[6];               //CAN发送缓冲区
  11          unsigned char SampleHVal[8],SampleLVal[8];  //模拟量采集结果
  12          #define         BaseID                  0
  13          #define         RTR                             0
  14          #define         DLC                             4
  15          
  16          #define V_T1s           255             //1秒
  17          #define V_T1m           20
  18          #define V_T50ms         10              //100ms
  19          #define V_TH0           0xEA    /*10ms ,!notice: crystal 24MHz */
  20          #define V_TL0           0x00
  21          
  22          #define TERMINAL        0x00            //主机命令CAN通信标识兼功能码 
  23          
  24          volatile unsigned char CanID;                         //当前CAN节点的标识
  25          void LedTest()
  26          {
  27   1              static char led=1;
  28   1              led=!led;
  29   1              io=led; 
  30   1      }
  31          void InitWtd()
  32          {
  33   1              wren_dog();                             //看门狗写使能
  34   1              wrsr_dog(0x03);                 //看门狗周期1.4秒
  35   1              wrdi_dog();                             //看门狗写禁止  
  36   1      }
  37          void FeedDog()
  38          {
  39   1               rest_dog();    
  40   1      } 
  41          void delayUs()
  42          {
  43   1          _nop_();
  44   1      }
  45          
  46          void delayMs(unsigned char a)
  47          {
  48   1          unsigned char i, j;
  49   1          for(i = a; i > 0; i--)
  50   1              for(j = 100; j > 0; j--);
  51   1      }
  52          
  53          /**//*****************************DS18B20*******************************/
  54          sbit ds = P1^0;
  55          //初始化DS18B20
C51 COMPILER V8.02   MAIN                                                                  07/24/2007 14:50:26 PAGE 2   

  56          //让DS18B20一段相对长时间低电平, 然后一段相对非常短时间高电平, 即可启动
  57          void dsInit()
  58          {
  59   1          //对于11.0592MHz时钟, unsigned int型的i, 作一个i++操作的时间大于为8us
  60   1          unsigned char i;  
  61   1          ds = 0;
  62   1          i = 100;   //拉低约800us, 符合协议要求的480us以上
  63   1          while(i>0) i--;
  64   1          ds = 1;    //产生一个上升沿, 进入等待应答状态
  65   1          i = 5;
  66   1          while(i>0) i--;
  67   1      }
  68          
  69          void dsWait()
  70          {
  71   1            unsigned char i;
  72   1            while(ds)FeedDog(); 
  73   1            while(~ds)FeedDog();  //检测到应答脉冲
  74   1                //LedTest();
  75   1                i = 4;
  76   1            while(i > 0) i--;
  77   1      }
  78          
  79          //向DS18B20读取一位数据
  80          //读一位, 让DS18B20一小周期低电平, 然后两小周期高电平, 
  81          //之后DS18B20则会输出持续一段时间的一位数据
  82          bit readBit()
  83          {
  84   1          unsigned char i;
  85   1          bit b;
  86   1          ds = 0;
  87   1          i++;   //延时约8us, 符合协议要求至少保持1us
  88   1          ds = 1; 
  89   1          i++; i++; //延时约16us, 符合协议要求的至少延时15us以上
  90   1          b = ds;
  91   1          i = 10; 
  92   1          while(i>0) i--;  //延时约64us, 符合读时隙不低于60us要求
  93   1          return b;
  94   1      }
  95          
  96          //读取一字节数据, 通过调用readBit()来实现
  97          unsigned char readByte()
  98          {
  99   1          unsigned char i;
 100   1          unsigned char j, dat;
 101   1          dat = 0;
 102   1          for(i=0; i<8; i++)
 103   1          {
 104   2              j = readBit();
 105   2              //最先读出的是最低位数据
 106   2              dat = (j << 7) | (dat >> 1);
 107   2          }
 108   1          return dat;
 109   1      }
 110          
 111          //向DS18B20写入一字节数据
 112          void writeByte(unsigned char dat)
 113          {
 114   1          unsigned char i;
 115   1          unsigned char j;
 116   1          bit b;
 117   1          for(j = 0; j < 8; j++)
C51 COMPILER V8.02   MAIN                                                                  07/24/2007 14:50:26 PAGE 3   

 118   1          {
 119   2              b = dat & 0x01;
 120   2              dat >>= 1;
 121   2              //写"1", 将DQ拉低15us后, 在15us~60us内将DQ拉高, 即完成写1
 122   2              if(b)   
 123   2              {
 124   3                  ds = 0;
 125   3                  i++; i++; i++; //拉低约16us, 符号要求15~60us内
 126   3                  ds = 1;    
 127   3                  i = 10; while(i>0) i--;  //延时约64us, 符合写时隙不低于60us要求
 128   3              }
 129   2              else  //写"0", 将DQ拉低60us~120us
 130   2              {
 131   3                  ds = 0;
 132   3                  i = 10; while(i>0) i--;  //拉低约64us, 符号要求
 133   3                  ds = 1;
 134   3                  i++; i++;  //整个写0时隙过程已经超过60us, 这里就不用像写1那样, 再延时64us了
 135   3              }
 136   2          }
 137   1      }
 138          
 139          //向DS18B20发送温度转换命令
 140          void sendChangeCmd()
 141          {
 142   1          dsInit();   //初始化DS18B20, 无论什么命令, 首先都要发起初始化
 143   1          dsWait();   //等待DS18B20应答
 144   1          delayMs(1); //延时1ms, 因为DS18B20会拉低DQ 60~240us作为应答信号
 145   1          writeByte(0xcc); //写入跳过序列号命令字 Skip Rom
 146   1          writeByte(0x44); //写入温度转换命令字 Convert T
 147   1      }
 148          
 149          //向DS18B20发送读取数据命令
 150          void sendReadCmd()
 151          {
 152   1          dsInit();
 153   1          dsWait();
 154   1          delayMs(1);
 155   1          writeByte(0xcc); //写入跳过序列号命令字 Skip Rom
 156   1          writeByte(0xbe); //写入读取数据令字 Read Scratchpad
 157   1      }
 158          
 159          //获取当前温度值
 160          void getTmpValue()
 161          {
 162   1          sendReadCmd();
 163   1          //连续读取两个字节数据 
 164   1          SampleLVal[0] = readByte(); 
 165   1          SampleHVal[0] = readByte();
 166   1              //if(SampleHVal[0]==0xFF)LedTest();
 167   1      }
 168          /**//*****************************DS18B20*******************************/
 169          void InitCPU()
 170          {
 171   1              EX0     =1;
 172   1              PX0     =1;
 173   1      }
 174          void CheckCan()
 175          {
 176   1              if(rcv_flag)                                //if there is receive charerrupt
 177   1          {                                   
 178   2              }                       
 179   1              if(err_flag)
C51 COMPILER V8.02   MAIN                                                                  07/24/2007 14:50:26 PAGE 4   

 180   1              {
 181   2                       EA=0;
 182   2                       err_flag=0;                            //错误标志位清零
 183   2               Config_SJA();                          //初始化SJA
 184   2                       EA=1;          
 185   2              }       
 186   1      }
 187          void SendByCan()
 188          {
 189   1              SendBuf[0]=TERMINAL;            //主机标识
 190   1              SendBuf[1]=0x00|DLC;            //标识低3位和RTR以及请求数据位数
 191   1              SendBuf[2]=CanID;                       //本地CAN标识
 192   1              SendBuf[3]=0;                           //第i路遥测值
 193   1              SendBuf[4]=SampleLVal[0];       //遥测低字节值
 194   1              SendBuf[5]=SampleHVal[0];       //遥测高字节值
 195   1              BCAN_DATA_WRITE(SendBuf);
 196   1              BCAN_CMD_PRG(TR_CMD);                   
 197   1      }
 198          void InitCanID()
 199          {
 200   1              //读入P2口状态,其中0~3为跳线设置
 201   1              CanID=~P2;
 202   1              CanID&=0x0f;
 203   1              CanID|=0x80;
 204   1      }
 205          
 206          void main()
 207          {
 208   1              InitCanID();                    //计算当前节点的CAN标识
 209   1              Config_SJA();                   //CAN初始化,SJA1000配置
 210   1              InitCPU();                              //CPU初始化     
 211   1              P3_4=0;
 212   1              P1=0;
 213   1              InitWtd();                              //看门狗电路初始化
 214   1              sendChangeCmd();
 215   1          while(1)
 216   1          {
 217   2                      CheckCan();
 218   2              delayMs(255); //温度转换时间需要750ms以上
 219   2                      FeedDog();
 220   2                      delayMs(255);
 221   2                      delayMs(255);
 222   2                      FeedDog();
 223   2                      delayMs(255);
 224   2                      delayMs(255);
 225   2                      FeedDog();
 226   2                      delayMs(255);
 227   2                      delayMs(255);
 228   2              getTmpValue();
 229   2                      SendByCan();
 230   2                      //LedTest();
 231   2              sendChangeCmd();
 232   2                      FeedDog();
 233   2          }
 234   1      }
 235          void SJA_INTR() interrupt 0 using 1
 236          {
 237   1              SJA_BCANAdr=REG_INTERRUPT;                                      //指针指向中断寄存器
 238   1              flag_init=*SJA_BCANAdr;                                         //保持中断寄存器值
 239   1      }


C51 COMPILER V8.02   MAIN                                                                  07/24/2007 14:50:26 PAGE 5   

MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    375    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     25    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----       2
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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