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

📄 dzsj.lst

📁 一个单片机有害气体检测系统的C语言程序。
💻 LST
字号:
C51 COMPILER V8.02   DZSJ                                                                  10/24/2008 15:27:10 PAGE 1   


C51 COMPILER V8.02, COMPILATION OF MODULE DZSJ
OBJECT MODULE PLACED IN dzsj.OBJ
COMPILER INVOKED BY: D:\Program Files\keil\C51\BIN\C51.EXE dzsj.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include<at89x51.h>
   2          #include<string.h>
   3          #include<math.h>
   4          #include<stdio.h>
   5          
   6          /*ADC0809数据采集*/
   7          unsigned char xdata *ADC;
   8          unsigned char ADCR[3];
   9          unsigned char I;
  10          unsigned char F=1;
  11          
  12          void int0() interrupt 2
  13          {
  14   1        unsigned char temp;
  15   1        EX0=1;
  16   1        temp=*(ADC+I);
  17   1        ADCR[I]=temp;
  18   1        F=1;
  19   1      }
  20          
  21          void StatADC0809(void)
  22          {  ADC=0xFE00;
  23   1         *(ADC+I)=I;
  24   1         F=0;
  25   1         EX0=1;
  26   1      }
  27          
  28          void ADC0809(void)
  29          { if(F)
  30   1         {I++;
  31   2          if(I>3)
  32   2          I=0;
  33   2          StatADC0809();
  34   2             }
  35   1          }
  36          
  37           /*LCD1601液晶显示屏驱动程序*/
  38          #define Data P0
  39          sbit RS=P1^7;
  40          sbit RW=P1^6;
  41          sbit E=P2^6;
  42          unsigned char code tab[4][8]={{"CO"},{"CH4"},{"SMOKE"},{"DANGER!!"}};
  43          
  44          void delay(unsigned int k) 
  45          { 
  46   1        unsigned int i,j; 
  47   1        for(i=k;i>0;i--) 
  48   1        for(j=50;j>0;j--) ; 
  49   1      }
  50          
  51          unsigned char ReadStatus(void)
  52          {
  53   1        Data=0xFF;
  54   1        RS=0;
  55   1        RW=1;   
C51 COMPILER V8.02   DZSJ                                                                  10/24/2008 15:27:10 PAGE 2   

  56   1        E=1;
  57   1        while(Data&0x80);
  58   1        return(Data);
  59   1        delay(2);
  60   1        E=0;
  61   1      }
  62          
  63          void wr_com(unsigned char com)
  64          {
  65   1        ReadStatus();
  66   1        Data=com;
  67   1        RS=0;
  68   1        RW=0;
  69   1        E=1;
  70   1        delay(2);
  71   1        E=0;
  72   1       }
  73          
  74          void wr_dat(unsigned char dat)
  75          {
  76   1        ReadStatus();
  77   1        Data=dat;
  78   1        RS=1;
  79   1        RW=0;
  80   1        E=1; 
  81   1        delay(2);
  82   1        E=0;
  83   1      }
  84          
  85          void LCD_Init(void)
  86          {
  87   1        Data=0x0;
  88   1        wr_com(0x38);
  89   1        delay(5);
  90   1        wr_com(0x38);
  91   1        delay(5);
  92   1        wr_com(0x38);
  93   1        delay(5);
  94   1        wr_com(0x38);
  95   1        wr_com(0x08);
  96   1        wr_com(0x01);
  97   1        wr_com(0x06);
  98   1        wr_com(0x0C);
  99   1      }
 100          
 101          void GotoY(unsigned char y)
 102          {
 103   1        y&=0x0F;
 104   1        wr_com(y);
 105   1        do{
 106   2            y=ReadStatus();
 107   2                }while((y&0x80)==0x80);
 108   1         }
 109          
 110          void disp(unsigned char y,unsigned char _char)
 111          {
 112   1        GotoY(y);
 113   1        wr_dat(_char);
 114   1        }
 115          
 116          /*按键扫描程序*/
 117          unsigned char K1,K2;
C51 COMPILER V8.02   DZSJ                                                                  10/24/2008 15:27:10 PAGE 3   

 118          sbit key1=P1^1;
 119          sbit key2=P1^2;
 120          unsigned char code table[]={'0','1','2','3','4','5','6','7','8','9'};
 121          
 122          void delay10ms(void)
 123          {unsigned char i,j;
 124   1       for(i=20;i>0;i--)
 125   1       for(j=248;j>0;j--);
 126   1       }
 127          
 128          void Key1(void)
 129          {if(key1==0)
 130   1         {delay10ms();
 131   2          if(key1==0)
 132   2            {K1++;
 133   3             if(K1==11)
 134   3              {K1=0;}
 135   3             while(key1==0);
 136   3            }
 137   2          }
 138   1        switch(K1)
 139   1      {
 140   2        case 0:
 141   2               GotoY(4);
 142   2               break;
 143   2        case 1:
 144   2               GotoY(5);
 145   2               break;
 146   2        case 2:
 147   2               GotoY(7);
 148   2               break;
 149   2        case 3:
 150   2               GotoY(8);
 151   2               break;
 152   2        case 4:
 153   2               GotoY(0xA);
 154   2               break;
 155   2        case 5:
 156   2               GotoY(0xB);
 157   2               break;
 158   2                       }
 159   1       }
 160          
 161          void Key2(void)
 162          { K2=0;
 163   1        while(1)
 164   1          {
 165   2            if(key2==0)
 166   2              {
 167   3                delay10ms();
 168   3                        delay10ms();
 169   3                if(key2==0)
 170   3                  {
 171   4                    K2++;
 172   4                    if(K2==10)K2=0;
 173   4                                Key1();
 174   4                    wr_dat(table[K2]);
 175   4                  }
 176   3              }
 177   2          }
 178   1      }
 179          
C51 COMPILER V8.02   DZSJ                                                                  10/24/2008 15:27:10 PAGE 4   

 180          
 181          /*用定时器T0每50ms中断一次*/
 182          unsigned char second=45,minute=58,hour=12,day=29,month=11,year=07;
 183          unsigned char n_50m_second;             /*多少个50毫秒的变量*/
 184          unsigned char days_of_month;            /*该月多少天的变量*/
 185          
 186          unsigned char calculate_days(void)      /*计算本月有多少天*/
 187          {
 188   1       unsigned int temp;
 189   1       switch (month)
 190   1        {
 191   2         case 1:
 192   2         case 3:
 193   2         case 5:
 194   2         case 7:
 195   2         case 8:
 196   2         case 10:
 197   2         case 12:
 198   2                 return 31;  /*1、3、5、7、8、10、12月为31天*/
 199   2                 break;
 200   2         case 4:
 201   2         case 6:
 202   2         case 9:
 203   2         case 11:            
 204   2                 return 30;  /*4、6、9、11月为30天*/
 205   2                 break;
 206   2         case 2:
 207   2                 temp=2000+year; /*因为year中保存的是年的最后两位,所以要加上2000*/
 208   2                 if((((temp%4)==0)&&((temp%100)!=0))||((temp%400)==0))
 209   2                  {
 210   3                   return 29;    /*闰年2月为29天*/
 211   3                  }
 212   2                   else
 213   2                  {
 214   3                   return 28;    /*平年2月为28天*/
 215   3                  }
 216   2           }
 217   1      }
 218          
 219          void timer0_isr(void) interrupt 1 using 1     /*定时器0中断处理函数*/
 220          {
 221   1       TL0=0xB9;
 222   1       TH0=0x3C;                             /*定时器重装。定时50mS中断一次*/
 223   1       n_50m_second++;
 224   1       if(n_50m_second>=20)                  /*1秒到*/
 225   1        {
 226   2         n_50m_second=0;                     /*清50毫秒计数*/
 227   2         second++;                           /*秒加1*/
 228   2         if(second==60)                      /*如果秒到60*/
 229   2          {
 230   3           second=0;                         /*秒清0*/
 231   3           minute++;                         /*分加1*/
 232   3           if(minute==60)                    /*如果分到60*/
 233   3            {
 234   4             minute=0;                       /*分清0*/
 235   4             hour++;                         /*小时加1*/
 236   4             if(hour==24)                    /*如果小时到24*/
 237   4              {
 238   5               hour=0;                       /*小时清零*/
 239   5               day++;                        /*天加1*/
 240   5               days_of_month=calculate_days();/*计算本月有多少天*/
 241   5               if(day>days_of_month)         /*如果天大于本月最后一天*/
C51 COMPILER V8.02   DZSJ                                                                  10/24/2008 15:27:10 PAGE 5   

 242   5                {
 243   6                 day=1;                      /*天置1*/
 244   6                 month++;                    /*月加1*/
 245   6                 if(month>12)                /*如果月大于12*/
 246   6                  {
 247   7                   month=1;                  /*月置1*/
 248   7                   year++;                   /*年加1*/
 249   7                   if(year>=100)             /*如果年大于100*/
 250   7                    {
 251   8                     year=0;                 /*年清零*/
 252   8                    }
 253   7                  }
 254   6                }
 255   5              }
 256   4            }
 257   3          }
 258   2       } 
 259   1      }
 260          
 261          void disp_timer(void)
 262          { 
 263   1        disp(4,hour/10+48);
 264   1        disp(5,hour%10+48);
 265   1        disp(6,':');
 266   1        disp(7,minute/10+48);
 267   1        disp(8,minute%10+48);
 268   1        disp(9,':');
 269   1        disp(0xA,second/10+48);
 270   1        disp(0xB,second%10+48);
 271   1        Key2();  
 272   1        }
 273          
 274          /*数据处理*/
 275          sbit fm=P1^0;
 276          unsigned char flag;
 277          unsigned char COSJ[3],CH4SJ[3],SmokeSJ[3];
 278          unsigned char _co,_ch4,_smoke;
 279          unsigned char co,ch4,smo;
 280          int a,b;
 281          
 282          void disp_wx(void)  /*lcd第二行中间显示"DANGER!!"*/
 283          { 
 284   1         disp(7,tab[3][0]);
 285   1         disp(8,tab[3][1]);
 286   1         disp(9,tab[3][2]);
 287   1         disp(0xA,tab[3][3]);
 288   1         disp(0xB,tab[3][4]);
 289   1         disp(0xC,tab[3][5]);
 290   1         disp(0xD,tab[3][6]);
 291   1         disp(0xE,tab[3][7]);  
 292   1         }
 293          
 294          void un_disp(unsigned int i)
 295          {
 296   1          switch(i)
 297   1         {case 0:
 298   2                  disp(3,tab[0][0]);
 299   2                  disp(4,tab[0][1]);/*lcd显示"CO"*/
 300   2                          disp_wx();
 301   2                  break;
 302   2              case 1:
 303   2                      disp(2,tab[1][0]);
C51 COMPILER V8.02   DZSJ                                                                  10/24/2008 15:27:10 PAGE 6   

 304   2                  disp(3,tab[1][1]);
 305   2                  disp(4,tab[1][2]);/*lcd显示"CH4"*/
 306   2                          disp_wx();
 307   2                  break;
 308   2              case 2:
 309   2                      disp(1,tab[2][0]);
 310   2                  disp(2,tab[2][1]);
 311   2                  disp(3,tab[2][2]);
 312   2                  disp(4,tab[2][3]);
 313   2                  disp(5,tab[2][4]);/*lcd显示"SMOKE"*/
 314   2                          disp_wx();
 315   2                  break;  
 316   2                 }
 317   1              }
 318          
 319          void delay02s(void)
 320          {
 321   1        unsigned char i;
 322   1        for(i=20;i>0;i++)
 323   1          {delay10ms();}
 324   1       }
 325          
 326          lag(unsigned char x,unsigned char y)
 327          {  int flag;
 328   1         if(x>y)  flag=1;
 329   1         else flag=0;
 330   1         return(flag);
 331   1      }
 332          
 333          void get_data()
 334          { 
 335   1        _co=0;_ch4=0;_smoke=0;//_humidity=0;
 336   1        for(a=0;a<3;a++)
 337   1         {
 338   2           COSJ[a]=ADCR[0];
 339   2           CH4SJ[a]=ADCR[1];
 340   2           SmokeSJ[a]=ADCR[2];
 341   2           //HumiditySJ[a]=ADCR[3];
 342   2           delay02s();
 343   2           delay02s();
 344   2           }
 345   1           for(b=0;b<3;b++)
 346   1            { 
 347   2                  _co=_co+COSJ[b];
 348   2              _ch4=_ch4+CH4SJ[b];
 349   2              _smoke=_smoke+SmokeSJ[b];
 350   2              //_humidity=_humidity+HumiditySJ[b];
 351   2             }
 352   1        }
 353                   
 354          void hand_data()
 355          { 
 356   1        unsigned char bz[3];//标准量
 357   1        get_data();
 358   1        co=_co/3;
 359   1        ch4=_ch4/3;
 360   1        smo=_smoke/3;
 361   1        //hum=_humidity/3;
 362   1        if(lag(bz[0],co)==1) 
 363   1         { fm=0;
 364   2           un_disp(0);}
 365   1        else if(lag(bz[1],ch4)==1) 
C51 COMPILER V8.02   DZSJ                                                                  10/24/2008 15:27:10 PAGE 7   

 366   1         { fm=0;
 367   2           un_disp(1);}
 368   1           else if(lag(bz[2],smo)==1) 
 369   1             { fm=0;
 370   2               un_disp(2);}
 371   1                       else { fm=0;
 372   2                              disp_timer();//显示时间
 373   2                                      }
 374   1                         }
 375          
 376          /*主函数*/
 377          void system_initial(void)   //系统初始化
 378          {
 379   1       TMOD=0x11;                 //定时器工作在模式1
 380   1       ET0=1;                     //开定时器0中断
 381   1       TR0=1;                     //启动定时器0
 382   1       EX0=1;
 383   1       IT0=0;
 384   1       EA=1;                      //开总中断                 
 385   1      }
 386          
 387          void main(void)         
 388          {
 389   1          system_initial();        
 390   1          LCD_Init(); 
 391   1          while(1)
 392   1        {
 393   2          ADC0809();
 394   2          hand_data();  
 395   2        }
 396   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1135    ----
   CONSTANT SIZE    =     42    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     37       3
   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 + -