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

📄 main.lst

📁 51单片机项目集
💻 LST
字号:
C51 COMPILER V8.02   MAIN                                                                  07/05/2010 20:48:16 PAGE 1   


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

line level    source

   1          /********该程序主要是利用DS18B20采集温度,然后通过数码管显示温度*************/
   2          /*当程序收到上位机发送的命令之后,该程序会将当时的温度值通过串口发送给上位机*/
   3          #include<reg51.h>
   4          #define uchar unsigned char
   5          #define uint unsigned int
   6          sbit DQ = P1^0;         //定义DS18B20的信号线端口
   7          uchar i,j;
   8          uchar dis_buffer[4];//定义数据缓冲数组
   9          uchar bit_ser[]={0xfe,0xfd,0xfb,0xf7}; //定义数码管片选数组
  10          uchar seven_seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  11                                                                                     //定义数码管段选数组
  12          /****************************延时函数*********************************/
  13          void delay(uint x)
  14          {
  15   1              while(x)   
  16   1              x--;
  17   1      }
  18          /*************************DS18B20初始化函数***************************/
  19          void Init_DS18B20(void)
  20          {
  21   1              unsigned char x=0;
  22   1              DQ = 1;         //DQ复位
  23   1              delay(8);       //稍做延时
  24   1              DQ = 0;             //单片机将DQ拉低
  25   1              delay(80);      //精确延时 大于 480us
  26   1              DQ = 1;         //拉高总线
  27   1              delay(14);
  28   1              x=DQ;               //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  29   1              delay(20);
  30   1      }
  31          /***************************从18B20中读一个字节************************/
  32          uchar ReadOneChar(void)
  33          {
  34   1              uchar i=0;
  35   1              uchar dat = 0;
  36   1              for (i=8;i>0;i--)
  37   1              {
  38   2                      DQ = 0;         // 给脉冲信号
  39   2                      dat>>=1;
  40   2                      DQ = 1;         // 给脉冲信号
  41   2                      if(DQ)
  42   2                      dat|=0x80;  
  43   2                      delay(8);
  44   2              }
  45   1              return(dat);
  46   1      }
  47          /***************************向18B20中写一个字节************************/
  48          Write_OneChar(uchar dat)
  49          {
  50   1              uchar i=0;
  51   1              for (i=8; i>0; i--)
  52   1              {
  53   2                      DQ = 0;   //给脉冲信号
  54   2                      DQ = dat & 0x01;
  55   2                      delay(5); 
C51 COMPILER V8.02   MAIN                                                                  07/05/2010 20:48:16 PAGE 2   

  56   2                      DQ = 1;   //给脉冲信号
  57   2                      dat >>= 1;
  58   2              }
  59   1              delay(4);
  60   1      }
  61          /**************************从18B20中读取一个字节***********************/
  62          int Read_Temperature(void)
  63          {
  64   1              uchar i = 0,t = 0,a,b;
  65   1              int temp;
  66   1              Init_DS18B20();
  67   1              Write_OneChar(0xcc);    // 跳过读序号列号的操作
  68   1              Write_OneChar(0x44);    // 启动温度转换
  69   1              Init_DS18B20();
  70   1              Write_OneChar(0xcc);    //跳过读序号列号的操作
  71   1              Write_OneChar(0xbe);    //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
  72   1              i = ReadOneChar();      //读取温度值低位
  73   1              t = ReadOneChar();      //读取温度值高位
  74   1              a = i & 0x0f;
  75   1              b = t;
  76   1              i = i >> 4;             //低位右移4位,舍弃小数部分
  77   1              t = t << 4;             //高位左移4位,舍弃符号位
  78   1              t = t | i;
  79   1              temp = (t + a * 0.0625) * 100; //得到一个比实际温度扩到100倍的值,主要是为了更好的显示和传输          
  80   1              return(temp);                   //返回温度值
  81   1      }
  82          
  83          /***************************初始化定时器0******************************/
  84          void timer0_init(void)                   //
  85          {
  86   1              TMOD = 0x21; //由于串口通信需要使用定时器1,因此TMOD的值是0x21
  87   1              TL0 = (65536-5000) % 256;
  88   1              TH0 = (65536-5000) / 256;
  89   1              EA = 1;
  90   1              ET0 = 1;
  91   1              TR0 = 1;
  92   1      }
  93          /*************************发送数据的函数********************************/
  94          void txd_data(char send_data)   
  95          {
  96   1              SBUF = send_data; //将需要发送的数据放入发送缓冲区
  97   1              while(!TI);               //等待发送数据
  98   1              TI = 0;
  99   1      }
 100          /********************T0中断处理函数,主要用于显示当前温度***************/
 101          void timer0_isr(void) interrupt 1
 102          {
 103   1              int temp; 
 104   1              TR0 = 0;
 105   1              TL0 = (65536-5000) % 256;
 106   1              TH0 = (65536-5000) / 256;
 107   1              TR0 = 1;
 108   1              switch(i)
 109   1              {
 110   2                      case 0:
 111   2                              P2 = bit_ser[0];
 112   2                              P0 = seven_seg[dis_buffer[0]];                          
 113   2                              break;
 114   2                      case 1:
 115   2                              P2 = bit_ser[1];
 116   2                              P0 =seven_seg[dis_buffer[1]] & 0x7f;
 117   2                              break;
C51 COMPILER V8.02   MAIN                                                                  07/05/2010 20:48:16 PAGE 3   

 118   2                      case 2:
 119   2                              P2 = bit_ser[2];
 120   2                              P0 =seven_seg[dis_buffer[2]];
 121   2                              break;
 122   2                      case 3:
 123   2                              P2 = bit_ser[3];
 124   2                              P0 =seven_seg[dis_buffer[3]];
 125   2                              break;
 126   2              } 
 127   1              i++;
 128   1              if(i >= 4) 
 129   1              {
 130   2                      i = 0;
 131   2                      j++;
 132   2                      if(j >= 10)     //如果到200ms就会读取一次温度,并将温度值放入显示缓冲区
 133   2                      {
 134   3                              j = 0;
 135   3                              temp = Read_Temperature();
 136   3                              dis_buffer[0] = temp / 1000;
 137   3                              dis_buffer[1] = temp % 1000 / 100;
 138   3                              dis_buffer[2] = temp % 100 / 10;
 139   3                              dis_buffer[3] = temp % 10;
 140   3                      }
 141   2              }
 142   1      }
 143          
 144          /***************************串口通信初始化函数***************************/
 145          void uart_init(void)
 146          { 
 147   1              SCON = 0x50;         //方式1,充许接收
 148   1              TMOD = 0x21;         //T1方式2定时,T0方式是1          
 149   1              TH1 = 0xFd;          //波特率9600,Fosc=11.0592MHz
 150   1              TL1 = 0xFd;
 151   1              TR1 = 1;
 152   1              ES = 1;                  // 打开串口中断
 153   1      }
 154          /**************************串口中断处理函数*****************************/
 155          void uart() interrupt 4                   
 156          {
 157   1              char y,i;
 158   1              while(!RI);
 159   1              y = SBUF;                        //读取接收的信息,然后判断是否为发送温度命令
 160   1              if(y == '0')             //如果为发送命令,就将当前数据缓冲数组内的数据发送给上位机
 161   1              {
 162   2                      for(i = 0;i <= 3;i++)
 163   2                      {
 164   3                              txd_data(dis_buffer[i] + 48);
 165   3                      }
 166   2              }
 167   1              RI = 0;         
 168   1      }
 169          /*******************************主函数*********************************/
 170          void main()
 171          {
 172   1              timer0_init();          //调用T0初始化函数
 173   1              uart_init();            //调用串口初始化函数
 174   1              while(1)
 175   1              {}
 176   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
C51 COMPILER V8.02   MAIN                                                                  07/05/2010 20:48:16 PAGE 4   

   CODE SIZE        =    556    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     20       2
   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 + -