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

📄 ds18b20.lst

📁 通过单片机实现电子钟功能
💻 LST
字号:
C51 COMPILER V8.08   DS18B20                                                               04/01/2009 22:08:33 PAGE 1   


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

line level    source

   1          #include  <reg52.h> 
   2          #include  <LCD1602.h> 
   3          #include  <DS18B20.h> 
   4          #include  <DS1308.h>
   5          
   6          sbit P1_4=P1^4;
   7          sbit P1_5=P1^5;
   8          sbit P1_6=P1^6;
   9          sbit P1_7=P1^7;
  10          uchar tem_data   []= {""};
  11          uchar time_data[21]= {""};
  12          uchar x;
  13          
  14          
  15          uchar code week1[]= {"Monday"};
  16          uchar code week2[]= {"Tuesday"};
  17          uchar code week3[]= {"Wednesday"};
  18          uchar code week4[]= {"Thursday"};
  19          uchar code week5[]= {"Friday"};
  20          uchar code week6[]= {"Saturday"};
  21          uchar code week7[]= {"Sunday"};
  22          
  23          
  24          void  Temdata_pro(uchar t)
  25          {
  26   1        if(Tflag==1)
  27   1          tem_data[0]='+';
  28   1        else
  29   1         tem_data[0]='-';
  30   1         tem_data[1]=t/10+'0';
  31   1         tem_data[2]=t%10+'0';
  32   1         tem_data[3]='.';
  33   1         tem_data[4]='0';
  34   1         tem_data[5]='\0';
  35   1      }
  36          
  37          void  data_pro()
  38          {
  39   1         time_data[0]='2';
  40   1         time_data[1]='0';
  41   1         time_data[2]=((ys>>4)&0x0f)+'0';
  42   1         time_data[3]=( ys&0x0f)+'0';
  43   1         time_data[4]='-';
  44   1         time_data[5]=((mn>>4)&0x01)+'0';
  45   1         time_data[6]=( mn&0x0f)+'0';
  46   1         time_data[7]='-';
  47   1         time_data[8]=((day>>4)&0x03)+'0';
  48   1         time_data[9]=( day&0x0f)+'0';
  49   1         time_data[10]=' ';
  50   1         time_data[11]=' ';
  51   1         time_data[12]=((hr>>4)&0x09)+'0';
  52   1         time_data[13]=( hr&0x0f)+'0';
  53   1         time_data[14]=':';
  54   1         time_data[15]=((min>>4)&0x0f)+'0';
  55   1         time_data[16]=( min&0x0f)+'0';
C51 COMPILER V8.08   DS18B20                                                               04/01/2009 22:08:33 PAGE 2   

  56   1         time_data[17]=':';
  57   1         time_data[18]=((sec>>4)&0x0f)+'0';
  58   1         time_data[19]=( sec&0x0f)+'0';
  59   1         time_data[20]='\0';
  60   1         x=we&0x07;
  61   1      }
  62          
  63          
  64          
  65          uchar key_san()
  66          {
  67   1         P1=0xfe;
  68   1         if(!P1_4)return  (10);
  69   1         if(!P1_5)return  (0);
  70   1         if(!P1_6)return  (11);
  71   1         if(!P1_7)return  (12);
  72   1         P1=0xfd;
  73   1         if(!P1_4)return  (1);
  74   1         if(!P1_5)return  (2);
  75   1         if(!P1_6)return  (3);
  76   1         if(!P1_7)return  (13);
  77   1         P1=0xfb;
  78   1         if(!P1_4)return  (4);
  79   1         if(!P1_5)return  (5);
  80   1         if(!P1_6)return  (6);
  81   1         if(!P1_7)return  (14);
  82   1         P1=0xf7;
  83   1         if(!P1_4)return  (7);
  84   1         if(!P1_5)return  (8);
  85   1         if(!P1_6)return  (9);
  86   1         if(!P1_7)return  (15);
  87   1      
  88   1      }
  89          
  90          uchar CaculateWeekDay(uchar y,uchar m, uchar d)
  91           { uchar weekday;
  92   1         uchar c=21;    //世纪数
  93   1         if(m==1) {m=13; y--;}
  94   1         if(m==2) {m=14; y--;}
  95   1         weekday=y+y/4+c/4-2*c+26*(m+1)/10+d-1; //蔡勒(Zeller)公式
  96   1         return  weekday;
  97   1      }
  98          
  99          void set_time()
 100          {
 101   1        uchar key_code,kk=0;
 102   1        uchar comH,comL;
 103   1        uchar y,m,d,week;
 104   1        uchar initime[]= {"2009-01-01 00:00:00"};
 105   1        WriteCommand(0x01);             //清屏
 106   1        WriteCommand(0x0f);             //开光标
 107   1        display_string(0,0,initime);
 108   1        WriteCommand(0x02);             //光标复位
 109   1        do
 110   1        {
 111   2              P1=0xf0;
 112   2          if(P1!=0xf0)
 113   2            {
 114   3                      delayms(5);
 115   3                      if(P1!=0xf0)
 116   3                  key_code=key_san();
 117   3                      initime[kk]=key_code+'0';       //键值转换
C51 COMPILER V8.08   DS18B20                                                               04/01/2009 22:08:33 PAGE 3   

 118   3                      P1=0xf0;
 119   3                  while(P1!=0xf0);               //等待按键释放
 120   3                      display_onechar(0,kk,initime[kk]);      //显示更改后的时间
 121   3                      kk++;
 122   3                      if(kk==4)  { kk++; display_onechar(0,kk-1,initime[kk-1]);}        //跳过分隔符
 123   3                      if(kk==7)  { kk++; display_onechar(0,kk-1,initime[kk-1]);}
 124   3                      if(kk==10) { kk++; display_onechar(0,kk-1,initime[kk-1]);}
 125   3                      if(kk==13) { kk++; display_onechar(0,kk-1,initime[kk-1]);}
 126   3                      if(kk==16) { kk++; display_onechar(0,kk-1,initime[kk-1]);}
 127   3                } 
 128   2        
 129   2        }
 130   1        while( key_code!=11) ;   //设置完毕,退出
 131   1        kk=0;
 132   1        WriteCommand(0x0c);             //关光标
 133   1      
 134   1        comH=initime[2]-'0';            //向DS1308写入新数据
 135   1        comL=initime[3]-'0';
 136   1        y=(comH<<4)|comL;
 137   1        WriteYs(y);
 138   1        comH=initime[5]-'0';
 139   1        comL=initime[6]-'0';
 140   1        m=(comH<<4)|comL;
 141   1        WriteMn(m);
 142   1        comH=initime[8]-'0';
 143   1        comL=initime[9]-'0';
 144   1        d=(comH<<4)|comL;
 145   1        WriteDay(d);
 146   1        comH=initime[11]-'0';
 147   1        comL=initime[12]-'0';
 148   1        WriteHr(((comH<<4)|comL));
 149   1        comH=initime[14]-'0';
 150   1        comL=initime[15]-'0';
 151   1        WriteMin(((comH<<4)|comL));
 152   1        comH=initime[17]-'0';
 153   1        comL=initime[18]-'0';
 154   1        WriteSec(((comH<<4)|comL));
 155   1        week=CaculateWeekDay(y,m,d);
 156   1        WriteWe(week);
 157   1        
 158   1       
 159   1      }
 160          /***************************************************************************/
 161          void main (void)
 162           {
 163   1          uchar i;
 164   1          uchar T;
 165   1              uchar  key_code;
 166   1              lcd_init();
 167   1              DS1308_init();                                                  
 168   1              Write_CGRAM(LcdBuf);                     //向CGRAM写入自定义的摄氏度符号
 169   1              for(i=0;i<2;i++)
 170   1           display_onechar(1,i+17,i);    //显示自定义的摄氏度符号
 171   1          while(1)
 172   1              {       
 173   2                      read_DS1308();                   //读取时间和日期
 174   2                      data_pro();                             //时间和日期数据处理
 175   2                      switch (x)                              //显示星期
 176   2               {
 177   3                    case 1: display_string(1,0,week1); break;
 178   3                        case 2: display_string(1,0,week2); break;
 179   3                        case 3: display_string(1,0,week3); break;
C51 COMPILER V8.08   DS18B20                                                               04/01/2009 22:08:33 PAGE 4   

 180   3                        case 4: display_string(1,0,week4); break;
 181   3                        case 5: display_string(1,0,week5); break;
 182   3                        case 6: display_string(1,0,week6); break;
 183   3                        case 7: display_string(1,0,week7); break;
 184   3                } 
 185   2                      display_string(0,0,time_data);
 186   2                              
 187   2                      tmstart();                      // ds1820开始转换
 188   2                      dmsec(2);    
 189   2                      T=tmrtemp();            // 读取温度     
 190   2                      Temdata_pro(T);    //温度数据处理
 191   2                      display_string(1,12,tem_data);
 192   2      
 193   2              P1=0xf0;
 194   2              while(P1!=0xf0)
 195   2               {
 196   3                         delayms(5);
 197   3                         if(P1!=0xf0)
 198   3                        key_code=key_san();
 199   3                     P1=0xf0;
 200   3                     while(P1!=0xf0);
 201   3                         if(key_code==10)
 202   3                          set_time();
 203   3               }
 204   2      
 205   2      
 206   2              } 
 207   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1690    ----
   CONSTANT SIZE    =     93    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     30      36
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1       3
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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