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

📄 2.lst

📁 18b20数码管显示,C语言编写的
💻 LST
字号:
C51 COMPILER V8.08   2                                                                     08/29/2008 23:37:54 PAGE 1   


C51 COMPILER V8.08, COMPILATION OF MODULE 2
OBJECT MODULE PLACED IN 2.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE 2.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          //*********************************************       C程序    *******************************************
             -**********************************// 
   2          //*MCU:          AT89C51                          // 
   3          //*MCU-crystal:  12M                               // 
   4          //*Version:      01                                // 
   5          //*Last Updata:  2008-4-22                          // 
   6          //*Author:                                 // 
   7          //*Description:                                    // 
   8          //DS18B20的读写程序,数据脚P3.4                     // 
   9          //温度传感器汇编程序,采用器件默认的12位转化   // 
  10          //最大转化时间750微秒,显示温度-55到+125度,显示精度 // 
  11          //为0.1度,显示采用4位LED共阳显示测温值            // 
  12          //P1口为段码输入,P0~P3为位选                       // 
  13          //***************WAVE-E6000/T**********************// 
  14          #include "reg52.h" 
  15          #define uchar unsigned char 
  16          #define uint unsigned int 
  17          #define Disdata  P0         // 段码入口 
  18          sbit DQ=P3^5;               // 温度输入口 
  19          uint temp;                  // variable of temperature  定义一个变量 
  20          uchar flag1;                // 定义一个标志,标志温度是负还是正,1为负,0为正 
  21          sbit DIN=P0^7;              // 小数点控制  
  22          #define  discan  P2         //扫描口 
  23          uchar h;                    // 定义变量 
  24          //位选位定义 
  25          sbit DEC=P3^0;              // 小数 
  26          sbit POS=P3^1;              // 个位 
  27          sbit TEN=P3^2;              // 十位 
  28          sbit HUN=P3^3;              // 百位,符号位 
  29          
  30          unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};  
  31          //共阳数码管段码表           "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9" "灭"  "-" 
  32          unsigned char code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点的编码 
  33          //共阳数码管带小数点段码表    "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  
  34          uchar data temp_data[2]={0x00,0x00};//读出温度暂放 
  35          uchar data Dis_play[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据和一个运算暂用 
  36          uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}; 
  37          //小数部分对应十进制   "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "A"  "B"  "C"  "D"  "E"  "F" 
  38          uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7};    //列扫描控制字 
  39          /***************************************/ 
  40          /*        延时子程序                   */ 
  41          /***************************************/ 
  42           void delay(uint i)      //delay    
  43             { 
  44   1            while(i--); 
  45   1         } 
  46          /************************************************/ 
  47          /*          初始化ds18b2子函数*                 */ 
  48          /************************************************/ 
  49           Init_DS18B20(void) 
  50            { 
  51   1           uchar x=0; 
  52   1           DQ = 1;               //DQ复位 
  53   1           delay(8);             //稍做延时 
  54   1           DQ = 0;               //单片机将DQ拉低 
C51 COMPILER V8.08   2                                                                     08/29/2008 23:37:54 PAGE 2   

  55   1           delay(80);            //精确延时 大于 480us 
  56   1           DQ = 1;               //拉高总线 
  57   1           delay(14); 
  58   1           x=DQ;                 //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 
  59   1           delay(20); 
  60   1        } 
  61          
  62          /*************************************************/ 
  63          /*              读字节子函数                     */ 
  64          /*************************************************/ 
  65           ReadOneChar(void) 
  66            { 
  67   1           uchar i = 0; 
  68   1           uchar dat = 0; 
  69   1         for (i=8;i>0;i--) 
  70   1          { 
  71   2            DQ = 0;              // 给脉冲信号 
  72   2            dat>>=1;             // 数据右移一位 
  73   2            DQ = 1;              // 给脉冲信号 
  74   2            if(DQ)               // DQ为1 
  75   2            dat|=0x80;          // 读出数据 
  76   2            delay(4);            // 延时 
  77   2           } 
  78   1         return(dat); 
  79   1        } 
  80          /*************************************************/ 
  81          /*               写字节子函数                    */ 
  82          /*************************************************/ 
  83           WriteOneChar(unsigned char dat) 
  84            { 
  85   1          uchar i = 0; 
  86   1          for (i=8; i>0; i--) 
  87   1           { 
  88   2             DQ = 0; 
  89   2             DQ = dat&0x01;   //写入一位数据 
  90   2             delay(5); 
  91   2             DQ = 1; 
  92   2             dat>>=1;        //右移一位数据 
  93   2           } 
  94   1        } 
  95          /*************************************************/ 
  96          /*           DS18B20写命令函数                   */ 
  97          /*************************************************/ 
  98          /*void tmpwritebyte(uchar dat)   // write a byte to ds18b20  
  99            {                              // 给温度传感器写一个字节 
 100              uint i; 
 101              uchar j; 
 102              bit testb; 
 103              for(j=1;j<=8;j++) 
 104               { 
 105                  testb=dat&0x01; 
 106                  dat=dat>>1; 
 107                  if(testb)     //写入 1 
 108                    { 
 109                       DQ=0; 
 110                       i++;i++; 
 111                       DQ=1; 
 112                       i=8;while(i>0)i--; // 适当延时 
 113                    } 
 114                  else          //写入 0 
 115                    { 
 116                       DQ=0;        
C51 COMPILER V8.08   2                                                                     08/29/2008 23:37:54 PAGE 3   

 117                       i=8;while(i>0)i--; // 适当延时 
 118                       DQ=1; 
 119                       i++;i++; 
 120                    } 
 121                } 
 122            }*/ 
 123          /******************************************/ 
 124          /*         发送温度转换命令               */ 
 125          /******************************************/ 
 126          void tmpchange(void)          // DS18B20 begin change    
 127          { 
 128   1        Init_DS18B20();             // 初始化DS18B20 
 129   1        delay(200);                 // 延时 
 130   1        WriteOneChar(0xcc);         // 跳过序列号命令 
 131   1        WriteOneChar(0x44);         // 发送温度转换命令 
 132   1      } 
 133          /******************************************/ 
 134          /*            读出温度函数                */ 
 135          /******************************************/ 
 136          uint tmp()                    //get the temperature 
 137          { 
 138   1      //  float tt; 
 139   1        Init_DS18B20();             // 初始化ds18b2子函数  
 140   1        delay(1); 
 141   1        WriteOneChar(0xcc);         // 跳过ROM命令 
 142   1        WriteOneChar(0xbe);         // 发送读取数据命令 
 143   1        temp_data[0]=ReadOneChar(); // 连续读两个字节数据 
 144   1        temp_data[1]=ReadOneChar(); 
 145   1        temp=temp_data[1]; 
 146   1        temp<<=8;                                                
 147   1        temp=temp|temp_data[0];     // 两字节合成一个整型变量。 
 148   1      //  tt=temp*0.0625;           // 得到真实十进制温度值,因为DS18B20 
 149   1                                    // 可以精确到0.0625度,所以读回数据的最低位代表的是 
 150   1                                    // 0.0625度。 
 151   1      //  temp=tt*10+0.5;           // 放大十倍,这样做的目的将小数点后第一位 
 152   1                                    // 也转换为可显示数字,同时进行一个四舍五入操作。 
 153   1        return temp;                // 返回温度值 
 154   1      } 
 155          /******************************************/ 
 156          /*        读出序列号函数                  */ 
 157          /******************************************/ 
 158          /*void readrom()              // read the serial 读取温度传感器的序列号 
 159          {                             // 本程序中没有用到此函数 
 160            uchar sn1,sn2; 
 161            Init_DS18B20();             // DS18B20初始化 
 162            delay(1); 
 163            WriteOneChar(0x33);         // Read ROM 
 164            sn1=ReadOneChar();          // 8位系列编码 
 165            sn2=ReadOneChar();          // 8位CRC码 
 166          }*/ 
 167          /******************************************/ 
 168          /*       温度数据显示处理函数             */ 
 169          /******************************************/ 
 170          void tem_deal(uint tem) 
 171            { 
 172   1      /*************温度数据处理*****************/ 
 173   1         if(tem>6348)                       // 温度值正负判断 
 174   1           {tem=65536-tem;flag1=1;}         // 负温度求补码,标志位置1 
 175   1            Dis_play[4]=tem&0x0f;           // 取小数部分的值 
 176   1         Dis_play[0]=ditab[Dis_play[4]]; // 存入小数部分显示值 
 177   1            Dis_play[4]=tem>>4;             // 取中间八位,即整数部分的值 
 178   1         Dis_play[3]=Dis_play[4]/100;    // 取百位数据暂存 
C51 COMPILER V8.08   2                                                                     08/29/2008 23:37:54 PAGE 4   

 179   1         Dis_play[1]=Dis_play[4]%100;    // 取后两位数据暂存 
 180   1         Dis_play[2]=Dis_play[1]/10;     // 取十位数据暂存 
 181   1         Dis_play[1]=Dis_play[1]%10;     // 取个位数据暂存 
 182   1         if(!Dis_play[3])       // 最高位为0都不显示 
 183   1         { 
 184   2            Dis_play[3]=0x0a;   // 先判断百位是否为0 
 185   2          if(!Dis_play[2]) 
 186   2         { 
 187   3           Dis_play[2]=0x0a; // 再判断十位是否为0 
 188   3         } 
 189   2         } 
 190   1         if(flag1) 
 191   1         { 
 192   2            Dis_play[3]=0x0b;    // 为负数时,最高位显示 "-" 
 193   2         } 
 194   1        } 
 195          /******************温度数据显示********************/ 
 196          
 197           void display() 
 198            { 
 199   1        char k; 
 200   1           for(k=0;k<4;k++)                     //4位LED扫描控制 
 201   1        { 
 202   2         Disdata=table[Dis_play[k]];          //数据显示 
 203   2         if (k==1){DIN=0;}                   //小数点显示 
 204   2         discan=scan_con[k];                 //位选 
 205   2         delay(90);                          //延时 
 206   2         discan=0xff; 
 207   2        } 
 208   1        } 
 209          /******************************************/ 
 210          /*               主函数                   */ 
 211          /******************************************/ 
 212           void main() 
 213           { 
 214   1        Disdata=0xff;   //端口初始化 
 215   1        P3=0xff; 
 216   1      //开机显示"888.8";这段程序可以不要. 
 217   1          for(h=0; h<4; h++) 
 218   1           {   
 219   2                Dis_play[h]=8; 
 220   2           } 
 221   1          for(h=0; h<50; h++)  
 222   1           {        
 223   2             display();  //显示数据 
 224   2                delay(1000); //延时 
 225   2           } 
 226   1      //温度显示 
 227   1         do 
 228   1         { 
 229   2           tmpchange();      //温度转换 
 230   2           tem_deal(tmp());  //显示温度值 
 231   2           display(); 
 232   2         } 
 233   1           while(1); 
 234   1       } 


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    381    ----
   CONSTANT SIZE    =     42    ----
   XDATA SIZE       =   ----    ----
C51 COMPILER V8.08   2                                                                     08/29/2008 23:37:54 PAGE 5   

   PDATA SIZE       =   ----    ----
   DATA SIZE        =     11    ----
   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 + -