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

📄 text1.lst

📁 数码管显示温度与时间
💻 LST
字号:
C51 COMPILER V8.17   TEXT1                                                                 02/22/2009 16:39:38 PAGE 1   


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

line level    source

   1          #include <at89x52.h>
   2          #include <intrins.h>
   3          
   4          unsigned char code LED_DATA[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0~9数字数据
   5          unsigned char code TEM_DATA[11]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x46}; //加有小数点的数
             -据
   6          unsigned char time[2],dis_buff[4],temp[4];
   7          unsigned int i,b,ti,F;
   8          unsigned char set;
   9          static unsigned int tr0,tr1; //定时器定时变量
  10          char tdata;
  11          bit S;   //标志当前是否显示的是温度
  12          sbit k1=P1^0;   //调整模式              
  13          sbit k2=P1^1;   //+按钮
  14          sbit k3=P1^2;   //-按钮
  15          sbit k4=P1^3;  //(未使用)
  16          sbit SLED=P3^3;  //秒指示灯
  17          sbit PLED=P3^1;  //显示温度时作小数点 (显示时间时作点)
  18          sbit di1=P3^4;
  19          sbit di2=P3^5;
  20          sbit di3=P3^6;
  21          sbit di4=P3^7;
  22          void w_1302 (unsigned char add,unsigned char dat);  //对指定的寄存器写数据,add寄存器地址,dat数据
  23          unsigned char r_1302 (unsigned char add);  //读指定的寄存器数据,返回值为十进制数
  24          void init_ds1302 (void); 
  25          get_18b20 (void);
  26          
  27          void init_key (void)
  28          {
  29   1      set=1;
  30   1       k1=1;
  31   1       k2=1;
  32   1       k3=1;
  33   1      }
  34          
  35          
  36          
  37          void get_time ()
  38          {
  39   1       time[0]=r_1302 (0x83);//读秒
  40   1       time[1]=r_1302 (0x85);//读分
  41   1      
  42   1      }
  43          
  44          void time_updata ()
  45          {
  46   1       dis_buff[0]=LED_DATA[time[1]/10];
  47   1       if (dis_buff[0]==LED_DATA[0]) dis_buff[0]=0xff;        //时间第一位是0的话,就不显示
  48   1       dis_buff[1]=LED_DATA[time[1]%10];
  49   1       dis_buff[2]=LED_DATA[time[0]/10];
  50   1       dis_buff[3]=LED_DATA[time[0]%10];
  51   1      }
  52          
  53          void get_temp ()
  54          {
C51 COMPILER V8.17   TEXT1                                                                 02/22/2009 16:39:38 PAGE 2   

  55   1        F=get_18b20 ();
  56   1        temp[0]=F/1000;//温度十位值
  57   1        temp[1]=(F%1000)/100;//温度个位值
  58   1        temp[2]=((F%1000)%100)/10;//温度小数位值
  59   1      }
  60          
  61          void temp_updata ()
  62          { 
  63   1       dis_buff[0]=LED_DATA[temp[0]];
  64   1       if (dis_buff[0]==LED_DATA[0]) dis_buff[0]=0xff; //温度第一位是0的话,就不显示
  65   1       dis_buff[1]=LED_DATA[temp[1]];
  66   1       dis_buff[2]=LED_DATA[temp[2]];
  67   1       dis_buff[3]=TEM_DATA[10]; //显示℃符号
  68   1      }
  69          
  70          void displayscanf (void) interrupt 1 using 0            //定时器0中断服务程序,用于数码管动态显示扫描
  71          {                 
  72   1        tr0++;
  73   1        TH0=0xcd; //刷新周新6.5ms
  74   1         TL0=0x38;
  75   1        if (tr0==77) {SLED=~SLED;PLED=SLED;tr0=0;} //LED每秒闪一次
  76   1        if (set!=0)  //判断当前是否是调时模式
  77   1        {
  78   2         if (set==1) {SLED=0;PLED=1;} //调整小时时,SLED灯亮
  79   2         if (set==2) {SLED=1;PLED=0;}//调整分钟时,PROT灯亮
  80   2         }
  81   1         if (S==1) {SLED=1;PLED=0;}    //判断当前是否显示的是温度
  82   1         i++;
  83   1                if (i==4) i=0; //扫描完一圈后,从新开始!
  84   1               if (i==0) {P0=dis_buff[0];di1=0;}
  85   1               if (i!=0) di1=1;
  86   1               
  87   1               if (i==1) {P0=dis_buff[1];di2=0;}
  88   1               if (i!=1) di2=1;
  89   1               
  90   1               if (i==2) {P0=dis_buff[2];di3=0;}
  91   1               if (i!=2) di3=1;
  92   1               
  93   1               if (i==3) {P0=dis_buff[3];di4=0;}
  94   1               if (i!=3) di4=1;
  95   1      }
  96          
  97          void dis_other (void) interrupt 3 using 0  //控制分时显示
  98          {
  99   1        tr1++;
 100   1        TH1=0x00;     //定时最大值32.76ms
 101   1        TL1=0x00;
 102   1        if (tr1>1000) tr1=0;
 103   1        if ((tr1>610)&&(tr1<1000))    //每20秒显示一次温度
 104   1          {
 105   2                S=1;
 106   2                temp_updata ();
 107   2              }
 108   1               else 
 109   1                 {
 110   2                  time_updata ();
 111   2                  S=0;
 112   2                      }
 113   1      } 
 114          
 115          
 116          
C51 COMPILER V8.17   TEXT1                                                                 02/22/2009 16:39:38 PAGE 3   

 117          void key_delay (unsigned int m)  //按键消抖动
 118          {
 119   1         unsigned char t;
 120   1         t=10;
 121   1         while (m--)
 122   1          {
 123   2              while (t--); 
 124   2               }
 125   1      }
 126          
 127          void set_time (void)     //调整时间函数
 128          {
 129   1        if (k1==0)
 130   1         {
 131   2              key_delay (500);
 132   2               if  (k1==0)
 133   2                {
 134   3                 set++;
 135   3                 if (set!=0) TR1=0; //停止显示温度
 136   3                 if (set==3) 
 137   3                 {
 138   4                  set=0; //退出时间调整模式
 139   4                      TR1=1; //恢复每30秒显示一次温度
 140   4                      w_1302 (0x8e,0x00); //禁止写保护
 141   4                      w_1302 (0x80,0x00); //将秒复位
 142   4                      w_1302 (0x8e,0x80);//允许写保护
 143   4                      }
 144   3                 while(!k1);   //等待热键释放
 145   3            }
 146   2         }
 147   1      
 148   1         if (set!=0)
 149   1           {
 150   2                 if (k2==0)
 151   2                  {
 152   3                        key_delay (20);
 153   3                         if (k2==0)
 154   3                           {
 155   4                                 while (k2==0);
 156   4                               if (set==1)    //调时
 157   4                                 {
 158   5                                      tdata=r_1302 (0x85);
 159   5                                      tdata++;
 160   5                                      if (tdata>23) tdata=0;
 161   5                                      tdata=(tdata/10)*16+tdata%10;  //把十进制数转换为BCD码准备写入DS1302    
 162   5                                      w_1302 (0x8e,0x00); //禁止写保护
 163   5                                      w_1302 (0x84,tdata); //将调整后的数据写入DS1302
 164   5                                      time[1]=r_1302 (0x85);//重新读时
 165   5                                      time_updata ();
 166   5                                      w_1302 (0x8e,0x80);     //允许写保护
 167   5                                      }
 168   4                      if (set==2)     //调分
 169   4                                 {
 170   5                                      tdata=r_1302 (0x83);
 171   5                                      tdata++;
 172   5                                      if (tdata>59) tdata=0;
 173   5                                      tdata=(tdata/10)*16+tdata%10;  //把十进制数转换为BCD码准备写入DS1302    
 174   5                                      w_1302 (0x8e,0x00); //禁止写保护
 175   5                                      w_1302 (0x82,tdata); //将调整后的数据写入DS1302
 176   5                                      time[0]=r_1302 (0x83);//重新读时
 177   5                                      time_updata ();
 178   5                                      w_1302 (0x8e,0x80);     //允许写保护
C51 COMPILER V8.17   TEXT1                                                                 02/22/2009 16:39:38 PAGE 4   

 179   5                                      }
 180   4                               }
 181   3                      }
 182   2              }
 183   1                 if (k3==0)
 184   1                  {
 185   2                        key_delay (20);
 186   2                         if (k3==0)
 187   2                           {
 188   3                                 while (k3==0);
 189   3                               if (set==1)    //调时
 190   3                                 {
 191   4                                      tdata=r_1302 (0x85);
 192   4                                      tdata--;
 193   4                                      if (tdata<0) tdata=23;
 194   4                                      tdata=(tdata/10)*16+tdata%10;  //把十进制数转换为BCD码准备写入DS1302    
 195   4                                      w_1302 (0x8e,0x00); //禁止写保护
 196   4                                      w_1302 (0x84,tdata); //将调整后的数据写入DS1302
 197   4                                      time[1]=r_1302 (0x85);//重新读时
 198   4                                      time_updata ();
 199   4                                      w_1302 (0x8e,0x80);     //允许写保护
 200   4                                      }
 201   3                      if (set==2)     //调分
 202   3                                 {
 203   4                                      tdata=r_1302 (0x83);
 204   4                                      tdata--;
 205   4                                      if (tdata<0) tdata=59;
 206   4                                      tdata=(tdata/10)*16+tdata%10;  //把十进制数转换为BCD码准备写入DS1302    
 207   4                                      w_1302 (0x8e,0x00); //禁止写保护
 208   4                                      w_1302 (0x82,tdata); //将调整后的数据写入DS1302
 209   4                                      time[0]=r_1302 (0x83);//重新读时
 210   4                                      time_updata ();
 211   4                                      w_1302 (0x8e,0x80);     //允许写保护
 212   4                                      }
 213   3                               }
 214   2                      }
 215   1      }
 216          
 217          main ()
 218          {
 219   1       P0=0X00;  //第一次上电时做测试数码管用
 220   1       P3=0X00;
 221   1       key_delay (300); //延时
 222   1       P0=0xff;
 223   1       P3=0xff;
 224   1       init_key (); // 按键初始化(全出高电平)
 225   1       init_ds1302 (); //时间芯片初始化
 226   1       TMOD=0x11;
 227   1       TH0=0xcd; //定时6.5ms
 228   1       TL0=0x38; 
 229   1       TH1=0x00; //定时最大值
 230   1       TL1=0x00;
 231   1       EA=1;
 232   1       ET0=1;
 233   1       ET1=1;
 234   1       TR0=1;
 235   1       TR1=1;
 236   1       P3=0XFF;  //关闭显示
 237   1        i=0;
 238   1        set=0;
 239   1       while (1)
 240   1        {
C51 COMPILER V8.17   TEXT1                                                                 02/22/2009 16:39:38 PAGE 5   

 241   2         get_time();
 242   2         get_temp ();
 243   2         set_time ();
 244   2        }
 245   1      }
 246          
 247          
 248          
 249          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    978    ----
   CONSTANT SIZE    =     21    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     24    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      1    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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