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

📄 main.lst

📁 基于DTH11+LCD温湿度采集
💻 LST
字号:
C51 COMPILER V9.00   MAIN                                                                  06/13/2013 18:10:17 PAGE 1   


C51 COMPILER V9.00, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: c:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          #include <reg51.h>
   2          
   3          #define LCD_DB P1 
   4          
   5          unsigned  char s1[5];
   6          unsigned char s2[5]; 
   7          sbit LCD_RS=P2^4;
   8          sbit LCD_RW=P2^5;
   9          sbit LCD_E=P2^6;
  10          sbit P2_0=P2^0;
  11          sbit moshi=P2^1;
  12          sbit INC=P2^2;
  13          sbit DEC=P2^3;
  14          sbit SPK=P2^7;
  15          /******定义函数****************/
  16          #define uchar unsigned char 
  17          #define uint unsigned int 
  18          typedef unsigned char U8;/*无符号8位整型变量*/
  19          typedef unsigned int U16;/* 无符号16位整型变量*/
  20          uchar count1=95,count2=35;
  21          uchar moshicount=0; uchar TD=0;//定时次数
  22          
  23          U8 U8FLAG; 
  24          U8 U8count,U8temp; 
  25          U8 U8T_data_H,U8T_data_L,U8RH_data_H, U8RH_data_L,U8checkdata; 
  26          U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  27          U8  U8comdata; 
  28          void LCD_init(void);//初始化函数 
  29          void LCD_write_command(uchar command);//写指令函数
  30          void LCD_write_data(uchar dat);
  31          
  32          //写数据函数
  33          void LCD_disp_char(uchar x, uchar y,uchar dat); //在某个屏幕位置上显示一个字符,X(0-16),y(1-2) 
  34          void delay_n40us(uint n);//延时函数
  35          
  36           /*******液晶初始化函数***************/
  37           void LCD_init(void)
  38          {
  39   1      LCD_write_command(0x38); //设置8位格式,2行,5x7
  40   1      LCD_write_command(0x0c);//整体显示,关光标,不闪烁
  41   1      LCD_write_command(0x06);//设定输入方式,增量不移位
  42   1      LCD_write_command(0x03);//清除屏幕显示
  43   1      delay_n40us(100);
  44   1      }
  45          
  46          /*******定时器初始化函数**********/
  47          void timerinit() 
  48          { 
  49   1       TMOD=0x01;
  50   1       TH0=-50000/256;
  51   1       TL0=-50000%256;
  52   1       EA=1;
  53   1       ET0=1;
  54   1       }
  55          
C51 COMPILER V9.00   MAIN                                                                  06/13/2013 18:10:17 PAGE 2   

  56          /********写指令函数************/
  57          void LCD_write_command(uchar  dat)
  58          { 
  59   1       LCD_DB=dat;
  60   1       LCD_RS=0;//指令
  61   1       LCD_RW=0;//写入
  62   1       LCD_E=1;//允许
  63   1       delay_n40us(1);
  64   1       LCD_E=0;
  65   1       delay_n40us(1);
  66   1       }
  67          /********写数据函数*************/
  68          void LCD_write_data(uchar  dat)
  69          { 
  70   1       LCD_DB=dat; 
  71   1       LCD_RS=1;//数据
  72   1       LCD_RW=0;//写入
  73   1       LCD_E=1;//允许
  74   1       delay_n40us(1);
  75   1       LCD_E=0;
  76   1       delay_n40us(1);
  77   1      }
  78          /*******显示一个字符函数*********/
  79          void LCD_disp_char(uchar x,uchar y,uchar dat)
  80          {
  81   1       uchar address;
  82   1         if(y==1)
  83   1            address=0x80+x;
  84   1           else
  85   1              address=0xc0+x;
  86   1         LCD_write_command(address);
  87   1         LCD_write_data(dat);
  88   1      }
  89          /********延时函数***************/
  90          
  91          void delay_n40us(uint n) 
  92          { 
  93   1       uint i; 
  94   1       uchar j;
  95   1       for(i=n;i>0;i--)
  96   1         for(j=0;j<2;j++);
  97   1       }
  98          void Delay_10us(void) 
  99          {
 100   1       U8 i; 
 101   1       i--;
 102   1       i--;
 103   1       i--;
 104   1       i--;
 105   1       i--;
 106   1       i--;
 107   1      }
 108          void Delay(U16 j) 
 109          {
 110   1      U8 i;
 111   1       for(;j>0;j--) 
 112   1         for(i=0;i<27;i++);
 113   1      } 
 114          /*******一字节数据传送函数*********/
 115          void COM(void)
 116          {
 117   1         U8 i; 
C51 COMPILER V9.00   MAIN                                                                  06/13/2013 18:10:17 PAGE 3   

 118   1           for(i=0;i<8;i++)
 119   1               {
 120   2             U8FLAG=2;
 121   2                 while((!P2_0)&&U8FLAG++);
 122   2                 Delay_10us();
 123   2                 Delay_10us();
 124   2                 Delay_10us();
 125   2                 U8temp=0;
 126   2             if(P2_0)U8temp=1;
 127   2                 U8FLAG=2;
 128   2                 while((P2_0)&&U8FLAG++);//超时则跳出for循环
 129   2                 if(U8FLAG==1)break;//判断数据位是0还是1,如果高电平高过预定0高电平值则数据位为1
 130   2             U8comdata<<=1;
 131   2                 U8comdata|=U8temp;
 132   2        }
 133   1      }
 134          /*******单片机与传感器通信函数*********/
 135           void RH(void)
 136                  {
 137   1                //主机拉低18ms 
 138   1             P2_0=0;
 139   1                 Delay(180);
 140   1                 P2_0=1;
 141   1               //总线由上拉电阻拉高 主机延时20us
 142   1                 Delay_10us();
 143   1                 Delay_10us();
 144   1                 Delay_10us();
 145   1                 Delay_10us();
 146   1               //主机设为输入 判断从机响应信号 
 147   1                 P2_0=1;
 148   1               //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行    
 149   1                 if(!P2_0)             //T !    
 150   1                 {
 151   2                 U8FLAG=2;
 152   2               //判断从机是否发出 80us 的低电平响应信号是否结束        
 153   2                 while((!P2_0)&&U8FLAG++);
 154   2                 U8FLAG=2;
 155   2               //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
 156   2                 while((P2_0)&&U8FLAG++);
 157   2               //数据接收状态          
 158   2                 COM();
 159   2                 U8RH_data_H_temp=U8comdata;            
 160   2                 COM();
 161   2                 U8RH_data_L_temp=U8comdata;
 162   2                COM();
 163   2                 U8T_data_H_temp=U8comdata;
 164   2                 COM();
 165   2                 U8T_data_L_temp=U8comdata;
 166   2                  COM();
 167   2                 U8checkdata_temp=U8comdata;
 168   2                 P2_0=1;
 169   2               //数据校验 
 170   2               
 171   2                 U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
 172   2                 if(U8temp==U8checkdata_temp)
 173   2                 {
 174   3                        U8RH_data_H=U8RH_data_H_temp;
 175   3                        U8RH_data_L=U8RH_data_L_temp;
 176   3                        U8T_data_H=U8T_data_H_temp;
 177   3                        U8T_data_L=U8T_data_L_temp;
 178   3                        U8checkdata=U8checkdata_temp;
 179   3                 }//fi
C51 COMPILER V9.00   MAIN                                                                  06/13/2013 18:10:17 PAGE 4   

 180   2      
 181   2         s1[0]=(char)(0X30+U8RH_data_H/10); //湿度整数部分
 182   2         s1[1]=(char)(0X30+U8RH_data_H%10);//湿度小数部分
 183   2         s1[2]=(char)(0X30+U8RH_data_L/10);//温度整数部分
 184   2         s2[0]=(char)(0X30+U8T_data_H/10);
 185   2         s2[1]=(char)(0X30+U8T_data_H%10);//温度小数部分
 186   2         s2[2]=(char)(0X30+U8T_data_L/10);
 187   2           }//fi
 188   1       }
 189          
 190          /***液晶显示函数***/
 191           void disp()
 192          {
 193   1          LCD_disp_char(0,1,'s');
 194   1          LCD_disp_char(1,1,'h');
 195   1              LCD_disp_char(2,1,'i');
 196   1              LCD_disp_char(3,1,'d');
 197   1              LCD_disp_char(4,1,'u');
 198   1              LCD_disp_char(5,1,':');
 199   1              LCD_disp_char(6,1,s1[0]);
 200   1              LCD_disp_char(7,1,s1[1]);
 201   1              LCD_disp_char(8,1,'.');
 202   1              LCD_disp_char(9,1,s1[2]);
 203   1              LCD_disp_char(10,1,'%');
 204   1              LCD_disp_char(11,1,'R');
 205   1              LCD_disp_char(12,1,'H');
 206   1              LCD_disp_char(14,1,s1[3]);
 207   1              LCD_disp_char(15,1,s1[4]);
 208   1          
 209   1              LCD_disp_char(0,2,'w');
 210   1              LCD_disp_char(1,2,'e');
 211   1              LCD_disp_char(2,2,'n'); 
 212   1              LCD_disp_char(3,2,'d');
 213   1              LCD_disp_char(4,2,'u');
 214   1              LCD_disp_char(5,2,':');
 215   1          LCD_disp_char(6,2,s2[0]);
 216   1              LCD_disp_char(7,2,s2[1]); 
 217   1              LCD_disp_char(8,2,'.');
 218   1              LCD_disp_char(9,2,s2[2]);
 219   1              LCD_disp_char(10,2,0xDF);
 220   1              LCD_disp_char(11,2,'C');
 221   1              LCD_disp_char(14,2,s2[3]);
 222   1              LCD_disp_char(15,2,s2[4]);
 223   1              }
 224          /*****阈值设置函数****/
 225          void shezhi() 
 226          {
 227   1          //初值
 228   1         s1[3]=(char)(0X30+count1/10);
 229   1         s1[4]=(char)(0X30+count1%10);
 230   1         //初值
 231   1          s2[3]=(char)(0X30+count2/10);
 232   1              s2[4]=(char)(0X30+count2%10);
 233   1              moshi=1;
 234   1              if(moshi==0)
 235   1              {
 236   2                 Delay_10us();
 237   2                 while(moshi==0);
 238   2                 moshicount++;
 239   2                }
 240   1          switch(moshicount)
 241   1              {  case 1: 
C51 COMPILER V9.00   MAIN                                                                  06/13/2013 18:10:17 PAGE 5   

 242   2              { INC=1;
 243   3                       DEC=1;
 244   3                        if(INC==0)
 245   3                      {     Delay_10us();
 246   4                                while(INC==0);
 247   4                                 count1++;
 248   4                                         }
 249   3             else if(DEC==0)
 250   3                 {  Delay_10us();
 251   4                    while(DEC==0); 
 252   4                        count1--; 
 253   4                      } 
 254   3           LCD_disp_char(14,1,s1[3]);
 255   3           LCD_disp_char(15,1,s1[4]);
 256   3           LCD_disp_char(14,2,s2[3]);
 257   3               LCD_disp_char(15,2,s2[4]);
 258   3               }break;
 259   2               case 2:
 260   2               {//moshicount=0;
 261   3               INC=1;DEC=1;
 262   3               if(INC==0)
 263   3               {  Delay_10us();
 264   4                  while(INC==0);
 265   4                  count2++;
 266   4                }
 267   3                else if(DEC==0)
 268   3                {
 269   4                Delay_10us();
 270   4                while(DEC==0);
 271   4                count2--;
 272   4                }
 273   3          LCD_disp_char(14,1,s1[3]);
 274   3          LCD_disp_char(15,1,s1[4]);
 275   3          LCD_disp_char(14,2,s2[3]);
 276   3          LCD_disp_char(15,2,s2[4]);
 277   3         }break;
 278   2         case 3: 
 279   2         { 
 280   3        moshicount=0; 
 281   3        LCD_disp_char(14,1,' ');
 282   3        LCD_disp_char(15,1,' ');
 283   3        LCD_disp_char(14,2,' ');
 284   3        LCD_disp_char(15,2,' ');
 285   3         }break;
 286   2       default :break; 
 287   2       }
 288   1      }  
 289          /*****蜂鸣器报警程序******/
 290          void laba() 
 291          {
 292   1        
 293   1       if((U8RH_data_H>=count1)||(U8T_data_H>=count2)) 
 294   1       SPK=1; 
 295   1       else SPK=0;
 296   1       }      
 297          /*****定时器0中断程序,每次定时50ms****/
 298          timer0() interrupt 1 
 299          { 
 300   1       TD++; 
 301   1       if(TD>=100)
 302   1       { TH0=-50000/256;
 303   2         TL0=-50000%256;
C51 COMPILER V9.00   MAIN                                                                  06/13/2013 18:10:17 PAGE 6   

 304   2         TR0=0;
 305   2         TD=0;
 306   2        }
 307   1         TH0=-50000/256; 
 308   1         TL0=-50000%256;
 309   1       }
 310          /*********主函数*****************/
 311          void  main(void)
 312          {  LCD_init();
 313   1         timerinit();
 314   1         Delay(4);
 315   1         while(1)
 316   1         {
 317   2            RH();
 318   2            disp();
 319   2            laba();
 320   2            TR0=1;
 321   2                while((TD>=1)&&(TD<=100))
 322   2           {shezhi();
 323   3            }
 324   2            
 325   2       }
 326   1      }


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