m_18b20.lst

来自「郑州远博公司生产的单片机B型实验板电路原理图及配套源程序代码」· LST 代码 · 共 231 行

LST
231
字号
C51 COMPILER V7.20   M_18B20                                                               04/01/2005 20:23:54 PAGE 1   


C51 COMPILER V7.20, COMPILATION OF MODULE M_18B20
OBJECT MODULE PLACED IN m_18b20.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE m_18b20.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /**************************************************************************
   2          YB-51-B  DS18B20数字温度模块演示程序
   3          来源: 郑州远博科技   王兴民
   4          0371-66949037  0371-67256036 13949105551
   5          ***************************************************************************/
   6          
   7          #include <config.h>
   8          #define BUZZ  P3_6
   9          #define JDQ   P3_7
  10          #define LEDPOWER P2_7
  11          void d_convert(Uchar  dd);
  12          void rw24c02(void);
  13          void testfmq(void);
  14          void testjdq(void);
  15          void testsmg(void);
  16          void testled(void);
  17          void enint0(void);
  18          
  19          code char examp1[]="K1 be pressed!";
  20          code char examp2[]="K2 be pressed!";
  21          code char examp3[]="K3 be pressed!";
  22          code char examp4[]="K4 be pressed!";
  23          code char examp5[]="   INT0  TEST";
  24          
  25          data Uchar yjdispbuff[32];    //液晶屏显示缓冲区
  26          data Uchar displaybuff[]={0x0a,0x0a,0x0a,0x0a,0x0a,0x0a}; //数码管显示缓冲区,初始化全灭
  27          
  28          data Uchar clockdata2[7];     //时钟数据缓冲区 for ds1302
  29          data Uchar *clockdatain;
  30          data Uchar *clockdataout;
  31          data Uchar cmddata;
  32          data Uchar indata,outdata;
  33          data Uchar houtdatal,houtdatah,moutdatal,moutdatah,soutdatal,soutdatah; //时、分、秒
  34          data Uchar noutdatal,noutdatah,youtdatal,youtdatah,routdatal,routdatah; //年、月、日
  35          data Uchar woutdatal, woutdatah;
  36          
  37          data Uchar hdata=0xfe;     //for 18b20                                     
  38          data Uchar ldata=0x05;
  39          data Uchar databuff[9];
  40          
  41          data Uchar keyvalue;
  42          
  43          
  44          data Uchar CH0=0X02;              //ADC0832通道0被选中
  45          
  46          void main(void)           {  
  47   1      Uchar j,temp;
  48   1      Delayms(500);
  49   1      Lcdreset();
  50   1      testfmq();
  51   1      testjdq();
  52   1      testled();
  53   1      testsmg();
  54   1      rw24c02();
  55   1      enint0();   //允许中断
C51 COMPILER V7.20   M_18B20                                                               04/01/2005 20:23:54 PAGE 2   

  56   1      
  57   1      
  58   1      for(j=0;j<32;j++)  {      //液晶屏显示缓冲区全部填充为空格
  59   2       yjdispbuff[j]=32;
  60   2                          }
  61   1      for(j=0;j<6;j++)    {    //数码管显示缓冲区全部填充为不显示
  62   2      displaybuff[j]=0x0a;
  63   2                          }
  64   1      cmddata=0x8e;
  65   1      indata=0x00;
  66   1      v_W1302(cmddata, indata); //init
  67   1      cmddata=0x80;
  68   1      indata=0x00;
  69   1      v_W1302(cmddata, indata);//秒
  70   1      cmddata=0x82;
  71   1      indata=0x00;
  72   1      v_W1302(cmddata, indata);//分
  73   1      cmddata=0x84;
  74   1      indata=0x00;
  75   1      v_W1302(cmddata, indata);//小时
  76   1      cmddata=0x86;
  77   1      indata=0x31;
  78   1      v_W1302(cmddata, indata);//日
  79   1      cmddata=0x88;
  80   1      indata=0x03;
  81   1      v_W1302(cmddata, indata);//月
  82   1      cmddata=0x8A;
  83   1      indata=0x03;
  84   1      v_W1302(cmddata, indata);//星期
  85   1      cmddata=0x8C;
  86   1      indata=0x05;
  87   1      v_W1302(cmddata, indata);//年 
  88   1      Init_18b20();
  89   1      Skip();
  90   1      Write_18b20(0x4e);    //写缓存命令
  91   1      Write_18b20(hdata);   //写地址2  (TH温度触发器)
  92   1      Write_18b20(ldata);   //写地址3  (TL温度触发器)
  93   1      Write_18b20(0x7f);    //12位分辨率
  94   1      Init_18b20();
  95   1      Skip();
  96   1      Write_18b20(0x48);    //复制暂存存储器
  97   1      Init_18b20();
  98   1      Skip();
  99   1      
 100   1      
 101   1      while(1)   {
 102   2      temp=Adconvert(CH0);       //18B20转换数据
 103   2      Display(displaybuff); 
 104   2      displaybuff[2]=temp/100;
 105   2      displaybuff[1]=(temp-displaybuff[2]*100)/10;
 106   2      displaybuff[0]=temp-(displaybuff[2]*100+displaybuff[1]*10);
 107   2      Display(displaybuff);           //在数码管上显示转换的数据
 108   2      Init_18b20();
 109   2      Skip();
 110   2      Convert();             //温度转换
 111   2      Display(displaybuff); 
 112   2      Display(displaybuff); 
 113   2      Display(displaybuff); 
 114   2      Display(displaybuff); 
 115   2      //Display(displaybuff); 
 116   2                      keyvalue=Key_s(); //读取键值
 117   2                      if(keyvalue==0x7f)
C51 COMPILER V7.20   M_18B20                                                               04/01/2005 20:23:54 PAGE 3   

 118   2                        {while(Key_s()==0x7f)
 119   3                            {Lcdreset();Eputstr(0,2,examp1); P3_6=0;}  //P3_6是蜂鸣器的接口
 120   3                        }
 121   2                      if(keyvalue==0xbf)
 122   2                        {while(Key_s()==0xbf)
 123   3                            {Lcdreset();Eputstr(0,2,examp2); P3_6=0;}  //P3_6是蜂鸣器的接口
 124   3                        }
 125   2                      if(keyvalue==0xdf)
 126   2                        {while(Key_s()==0xdf)
 127   3                            {Lcdreset();Eputstr(0,2,examp3); P3_6=0;}  //P3_6是蜂鸣器的接口
 128   3                        }
 129   2      
 130   2                       if(keyvalue==0xef)
 131   2                        {while(Key_s()==0xef)
 132   3                            {Lcdreset();Eputstr(0,2,examp4); P3_6=0;}  //P3_6是蜂鸣器的接口
 133   3                        }               
 134   2                       if(keyvalue==0xff) { P3_6=1;}
 135   2      Init_18b20();
 136   2      Skip();
 137   2      Read_scrat();       //读18b20 scratchpad   存储器
 138   2      for(j=0;j<9;j++)
 139   2       {
 140   3        databuff[j]=Read_18b20();
 141   3        Display(displaybuff); 
 142   3      
 143   3       }
 144   2      databuff[0]=databuff[0]>>4;
 145   2      databuff[1]=databuff[1]<<4;
 146   2      databuff[0]=(databuff[0]|databuff[1])&0x7f;
 147   2      d_convert(databuff[0]);
 148   2                 clockdataout=&clockdata2;     
 149   2                 v_BurstR1302T(clockdataout);
 150   2                 soutdatal=clockdata2[0]&0x0f;
 151   2                 soutdatah=(clockdata2[0]>>4)&0x07;
 152   2                 moutdatal=clockdata2[1]&0x0f;
 153   2                 moutdatah=(clockdata2[1]>>4)&0x07;
 154   2                 houtdatal=clockdata2[2]&0x0f;
 155   2                 houtdatah=(clockdata2[2]>>4)&0x07; 
 156   2                 routdatal=clockdata2[3]&0x0f;
 157   2                 routdatah=(clockdata2[3]>>4)&0x07;
 158   2                 youtdatal=clockdata2[4]&0x0f;
 159   2                 youtdatah=(clockdata2[4]>>4)&0x07;
 160   2                 woutdatal=clockdata2[5]&0x0f;
 161   2                 woutdatah=(clockdata2[5]>>4)&0x07;
 162   2                 noutdatal=clockdata2[6]&0x0f;
 163   2                 noutdatah=(clockdata2[6]>>4)&0x07;
 164   2                 yjdispbuff[0]=50;          //50代表数字‘2’的ASC码,液晶屏是按照ASC码来显示字符的
 165   2                 yjdispbuff[1]=48;           //48代表数字‘0’的ASC码
 166   2                 yjdispbuff[2]=noutdatah+48; //48表示对应数字的实际值和相对应的ASC码的偏移量
 167   2                 yjdispbuff[3]=noutdatal+48;
 168   2                 yjdispbuff[5]=youtdatah+48;
 169   2                 yjdispbuff[6]=youtdatal+48;
 170   2                 yjdispbuff[8]=routdatah+48;
 171   2                 yjdispbuff[9]=routdatal+48;
 172   2                 yjdispbuff[13]=woutdatal+48;
 173   2                 yjdispbuff[17]=houtdatah+48;
 174   2                 yjdispbuff[18]=houtdatal+48;
 175   2                 yjdispbuff[20]=moutdatah+48;
 176   2                 yjdispbuff[21]=moutdatal+48;
 177   2                 yjdispbuff[23]=soutdatah+48;
 178   2                 yjdispbuff[24]=soutdatal+48;
 179   2                 yjdispbuff[4]=45;      //‘-’的ASC码
C51 COMPILER V7.20   M_18B20                                                               04/01/2005 20:23:54 PAGE 4   

 180   2                 yjdispbuff[7]=45;
 181   2                 yjdispbuff[10]=32;      //空格的ASC码
 182   2                 yjdispbuff[11]=32;
 183   2                 yjdispbuff[12]=32;
 184   2                 yjdispbuff[14]=32;
 185   2                 yjdispbuff[15]=32;
 186   2                 yjdispbuff[16]=32;
 187   2                 yjdispbuff[19]=45;
 188   2                 yjdispbuff[22]=45;
 189   2            
 190   2                 yjdispbuff[30]=96;
 191   2                 yjdispbuff[31]=67;
 192   2      
 193   2                 for(j=0;j<32;j++) 
 194   2                    {
 195   3                     Disponechar(0,j,yjdispbuff[j]);
 196   3      
 197   3                    }
 198   2                   }
 199   1                                                               }
 200            
 201          
 202          
 203          void d_convert(Uchar  dd) {            //16进制数据转换为10进制
 204   1      Uchar bw,sw,gw;
 205   1      bw=dd/100;
 206   1      sw=(dd%100)/10;
 207   1      gw=dd%10;
 208   1      yjdispbuff[28]=sw+48;
 209   1      yjdispbuff[29]=gw+48;         }
 210          
 211          
 212          
 213          void rw24c02(void)                           {
 214   1              Uchar data1[6]={0x04,0x02,0x02,0x00,0x04,0x02};
 215   1          Uchar j;                              
 216   1              Uchar *Pdata1=data1,Romadd=0x00,counter=6,*Pdata2=data1;                                  //延时足够时间

⌨️ 快捷键说明

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