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

📄 程序.lst

📁 ds18b20测温系统+proteus仿真全套
💻 LST
字号:
C51 COMPILER V8.02   程序                                                                  05/20/2009 22:04:56 PAGE 1   


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

line level    source

   1          #include<reg52.h>
   2          
   3          #define uchar unsigned char
   4          #define uint  unsigned int
   5          /*******************************DS18B20模块****************************************/
   6          sbit DQ=P3^7;
   7          
   8          
   9          /***********ds18b20延迟子函数(晶振12MHz )*******/ 
  10          void delay_18B20(unsigned int i){
  11   1              while(i--);
  12   1      }
  13          
  14          /**********ds18b20初始化函数**********************/
  15          void reset() {
  16   1               uchar x=0;
  17   1               DQ = 1;          //DQ复位
  18   1               delay_18B20(8);  //稍做延时
  19   1               DQ = 0;          //单片机将DQ拉低
  20   1               delay_18B20(80); //精确延时 大于 480us
  21   1               DQ = 1;          //拉高总线
  22   1               delay_18B20(14);
  23   1               x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  24   1               delay_18B20(20);
  25   1      }
  26          
  27          /***********ds18b20读一个字节**************/    
  28          unsigned char rbyte(){
  29   1              uchar i=0;
  30   1              uchar dat = 0;
  31   1              for (i=8;i>0;i--){
  32   2                        DQ = 0; // 给脉冲信号
  33   2                        dat>>=1;
  34   2                        DQ = 1; // 给脉冲信号
  35   2                        if(DQ)
  36   2                           dat|=0x80;
  37   2                        delay_18B20(4);
  38   2              }
  39   1              return(dat);
  40   1      }
  41          
  42          /*************ds18b20写一个字节****************/  
  43          void wbyte(uchar dat){
  44   1              uchar i=0;
  45   1              for (i=8; i>0; i--){
  46   2                      DQ = 0;
  47   2                      DQ = dat&0x01;
  48   2              delay_18B20(5);
  49   2                      DQ = 1;
  50   2              dat>>=1;
  51   2       }
  52   1      }
  53          
  54          /**************读取ds18b20当前温度************/
  55          void rTempetuare(uchar tmp[]){
C51 COMPILER V8.02   程序                                                                  05/20/2009 22:04:56 PAGE 2   

  56   1                              uchar a=0,b=0,temp;
  57   1      
  58   1                              reset();
  59   1                              wbyte(0xCC); //跳过读序号列号的操作
  60   1                              wbyte(0x44); //启动温度转?
  61   1      
  62   1                              reset();
  63   1                              wbyte(0xCC); //跳过读序号列号的操作
  64   1                              wbyte(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
  65   1                              a=rbyte();   //读取温度值低位
  66   1                              b=rbyte();   //读取温度值高位
  67   1                              temp=b;
  68   1                              temp&=0xf0;
  69   1                              if(temp){               //负温
  70   2                                      if(a==0){
  71   3                                              a=~a+1;   //bit7向bit8位产生进位
  72   3                                              b=~b+1; 
  73   3                                      }
  74   2                                      else{                              
  75   3                                              a=~a+1;   
  76   3                                              b=~b;
  77   3                                      }
  78   2                                      tmp[0]='-';
  79   2                              }
  80   1                              else
  81   1                                      tmp[0]=' ';
  82   1      
  83   1                              temp=(b<<4)|(a>>4);           //组合
  84   1      
  85   1                       //tmp[0]=temp/100    | 0x30;     //取百位
  86   1                              tmp[1]=temp%100/10 | 0x30;   //取十位
  87   1                              tmp[2]=temp%100%10 | 0x30;  //取个位
  88   1                              tmp[3]=0x01;              //字符℃
  89   1                              tmp[4]='\0';
  90   1      }
  91          
  92          /************************************LCD1602模块**********************************************/
  93          sbit rs=P2^0;
  94          sbit rw=P2^1;
  95          sbit  e=P2^2;
  96          
  97          void delay_ms(uchar ms){
  98   1          uint i,j;
  99   1          for(i=0;i<ms;i++)
 100   1          for(j=0;j<120;j++); 
 101   1      }
 102          
 103          void lcd_wcmd(uchar cmd){        //写指令
 104   1              rs=0;rw=0;
 105   1              e=0;
 106   1              P0=cmd;
 107   1              e=1;
 108   1              e=0;
 109   1              delay_ms(5);
 110   1      }
 111          
 112          void lcd_wdat(uchar dat){        //写数据
 113   1              rs=1;rw=0;
 114   1              e=0;
 115   1              P0=dat;
 116   1              e=1;
 117   1              e=0;
C51 COMPILER V8.02   程序                                                                  05/20/2009 22:04:56 PAGE 3   

 118   1              delay_ms(5);    
 119   1      }
 120          
 121          void lcd_dis(uchar post,uchar *p){
 122   1              lcd_wcmd(0x80 | post);  //设置数据地址指针
 123   1              while(*p!='\0'){
 124   2                      lcd_wdat(*p++);
 125   2              }               
 126   1      }
 127          
 128          uchar code def_char0[]={0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00}; //字符℃
 129          void lcd_wcgram(uchar adress,uchar tmp[]){
 130   1              uchar i;
 131   1              for(i=0;i<8;i++){
 132   2                      lcd_wcmd(adress+i);
 133   2                      lcd_wdat(tmp[i]);
 134   2              }
 135   1      }
 136          
 137          void lcd_inti(){
 138   1              delay_ms(15);
 139   1              lcd_wcmd(0x38); //16X2字符,5X7点阵,8位数据接口
 140   1              lcd_wcmd(0x38); 
 141   1              lcd_wcmd(0x08); //关闭显示
 142   1              lcd_wcmd(0x01); //清屏
 143   1              lcd_wcmd(0x06); //设置光标工作方式
 144   1              lcd_wcmd(0x0c); //开显示,设置光标显示方式
 145   1      
 146   1              lcd_wcgram(0x48,def_char0);  //载入用户自定义字符
 147   1      }
 148          /*******************************************************************************************/
 149          
 150          void main(){
 151   1              uchar tmp[5];
 152   1                      
 153   1              lcd_inti();
 154   1      
 155   1              while(1){
 156   2                      rTempetuare(tmp);
 157   2                      lcd_dis(0x00,tmp);
 158   2              }
 159   1      }
 160          
 161          
 162          
 163          
 164          
 165          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    491    ----
   CONSTANT SIZE    =      8    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----      16
   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 + -