C51 COMPILER V9.60.0.0 MAIN 02/21/2022 21:12:48 PAGE 1 C51 COMPILER V9.60.0.0, COMPILATION OF MODULE MAIN OBJECT MODULE PLACED IN .\Objects\main.obj COMPILER INVOKED BY: D:\Keil_v5\C51\BIN\C51.EXE main.c OPTIMIZE(8,SPEED) BROWSE DEBUG OBJECTEXTEND PRINT(.\Listings\main -.lst) TABS(2) OBJECT(.\Objects\main.obj) line level source 1 #include "drive_1602.h" 2 #include "string.h" 3 #include "stdio.h" 4 #include "dht11.h" 5 6 #define uint unsigned int 7 #define uchar unsigned char 8 9 /* 10 按键实现人机交互的主要方式,温湿度传感器可以感测环境温度湿度, 11 并且采集电信号至单片机,供电模块给单片机提供电能保证系统能够正常运行, 12 水位传感器能够检测水田水位保证一定的水位。 13 显示屏可以显示温湿度信息和水位信息, 14 蓝牙传输模块能够将采集的信号都传输至手机APP,并实现图形化显示。 15 实现的功能: 16 1、通过蓝牙能够检测到水田的水位、温度、湿度。 17 2、通过USB +5V 供电 18 3、能够具有阈值报警的功能 19 4、阈值可以进行调节。 20 5、实现APP的温湿度信息监测,可在APP端图形化实时监测温度湿度变化。 21 */ 22 sbit SW1=P3^7; 23 sbit SW2=P3^6; 24 sbit SW3=P3^5; 25 sbit SW4=P3^4; 26 27 sbit JR_LED=P2^2; 28 sbit JW_LED=P2^4; 29 30 sbit buzz=P3^3; 31 32 uchar temp,humi; 33 int sw_val=0; 34 35 void delay_xms(int xms) 36 { 37 1 char ix=0; 38 1 for(;xms>0;xms--) 39 1 for(ix=110;ix>0;ix--); 40 1 } 41 uchar SET=0; 42 char WdL=10; 43 char WdH=30; 44 45 char SdL=30; 46 char SdH=80; 47 48 char SWL=2; 49 char SWH=6; 50 51 char keyflag=0; 52 uchar bj_flag=0; 53 uchar Bj_CNt=0; 54 uchar JCount=0; C51 COMPILER V9.60.0.0 MAIN 02/21/2022 21:12:48 PAGE 2 55 56 uchar clear_flag=0; 57 58 uchar bj_clear=0; 59 uint clear_cnt=0; 60 61 void KeyRead(void) 62 { 63 1 if(!SW1) 64 1 { 65 2 if(!SW1&&keyflag==0) 66 2 { 67 3 keyflag=1; 68 3 if(++SET>6)SET=0; 69 3 while(!SW1); 70 3 } 71 2 } 72 1 else if(!SW2) 73 1 { 74 2 if(!SW2&&keyflag==0) 75 2 { 76 3 keyflag=1; 77 3 switch(SET) 78 3 { 79 4 case 1: 80 4 if(++WdH>50)WdH=0; 81 4 break; 82 4 83 4 case 2: 84 4 if(++WdL>50)WdL=0; 85 4 break; 86 4 87 4 88 4 case 3: 89 4 if(++SdH>90)SdH=0; 90 4 break; 91 4 92 4 case 4: 93 4 if(++SdL>90)SdH=0; 94 4 break; 95 4 96 4 case 5: 97 4 if(++SWH>8)SWH=0; 98 4 break; 99 4 100 4 case 6: 101 4 if(++SWL>8)SWL=0; 102 4 break; 103 4 } 104 3 while(!SW2); 105 3 } 106 2 } 107 1 108 1 else if(!SW3) 109 1 { 110 2 if(!SW3&&keyflag==0) 111 2 { 112 3 keyflag=1; 113 3 switch(SET) 114 3 { 115 4 case 1: 116 4 if(--WdH<0)WdH=50; C51 COMPILER V9.60.0.0 MAIN 02/21/2022 21:12:48 PAGE 3 117 4 break; 118 4 119 4 case 2: 120 4 if(--WdL<0)WdL=50; 121 4 break; 122 4 123 4 case 3: 124 4 if(--SdH<0)SdH=90; 125 4 break; 126 4 127 4 case 4: 128 4 if(--SdL<0)SdL=90; 129 4 break; 130 4 131 4 case 5: 132 4 if(--SWH<0)SWH=8; 133 4 break; 134 4 135 4 case 6: 136 4 if(--SWL<0)SWL=8; 137 4 break; 138 4 139 4 } 140 3 while(!SW3); 141 3 } 142 2 } 143 1 else if(!SW4) 144 1 { 145 2 if(!SW4&&keyflag==0) 146 2 { 147 3 148 3 bj_clear^=1; 149 3 150 3 151 3 while(!SW4); 152 3 } 153 2 } 154 1 else 155 1 { 156 2 keyflag=0; 157 2 clear_cnt=0; 158 2 } 159 1 160 1 161 1 } 162 163 void Timer0Init(void) //10毫秒@11.0592MHz 164 { 165 1 166 1 TMOD &= 0xF0; //设置定时器模式 167 1 TMOD |= 0x01; //设置定时器模式 168 1 TL0 = 0x00; //设置定时初值 169 1 TH0 = 0xDC; //设置定时初值 170 1 TF0 = 0; //清除TF0标志 171 1 ET0=1; 172 1 TR0 = 1; //定时器0开始计时 173 1 EA=1; 174 1 175 1 } 176 177 void TimeISR()interrupt 1 178 { C51 COMPILER V9.60.0.0 MAIN 02/21/2022 21:12:48 PAGE 4 179 1 TL0 = 0x00; //设置定时初值 180 1 TH0 = 0xDC; //设置定时初值 181 1 KeyRead(); 182 1 if((bj_flag==1)&&(bj_clear==0)) 183 1 { 184 2 if(++Bj_CNt>30) 185 2 { 186 3 Bj_CNt=0; 187 3 buzz=~buzz; 188 3 } 189 2 }else 190 1 { 191 2 buzz=1; Bj_CNt=0; 192 2 } 193 1 JCount++; 194 1 } 195 196 void UartInit(void) //9600bps@11.0592MHz 197 { 198 1 PCON &= 0x7F; //波特率不倍速 199 1 SCON = 0x50; //8位数据,可变波特率 200 1 TMOD &= 0x0F; //清除定时器1模式位 201 1 TMOD |= 0x20; //设定定时器1为8位自动重装方式 202 1 TL1 = 0xFD; //设定定时初值 203 1 TH1 = 0xFD; //设定定时器重装值 204 1 ET1 = 0; //禁止定时器1中断 205 1 TR1 = 1; //启动定时器1 206 1 EA=1; 207 1 ES=0; 208 1 } 209 210 211 void sendData(char *p,unsigned char n) 212 { 213 1 if( p == 0) return ; 214 1 ES = 0; 215 1 if(n > 0) 216 1 { 217 2 while(n --) 218 2 { 219 3 SBUF = *p++ ; 220 3 while(!TI) ; 221 3 TI = 0 ; 222 3 } 223 2 } 224 1 // ES = 1; 225 1 } 226 227 228 229 // 往串口发送字符串 230 void sendString(char *p) 231 { 232 1 if(p == 0) return ; 233 1 sendData(p,strlen(p)); 234 1 } 235 // 接收中断函数 236 void usart() interrupt 4 237 { 238 1 if(RI == 1) 239 1 { 240 2 // setUsartRxData(SBUF); C51 COMPILER V9.60.0.0 MAIN 02/21/2022 21:12:48 PAGE 5 241 2 } 242 1 RI = 0; 243 1 TI = 0; 244 1 } 245 246 //char xdata showbuff[16]={0}; 247 char data send_buff[17]={0}; 248 249 sbit IN_PL = P2^0; //SHIFT/!LOA引脚 250 sbit IN_Data = P2^2; // QH数据输出引脚 251 sbit SCK = P2^1; //CLOCK引脚 252 253 unsigned char Read74HC165(void) 254 { 255 1 unsigned char indata; 256 1 unsigned char i; 257 1 IN_PL = 0;//装载8位并行数据 258 1 _nop_(); 259 1 IN_PL = 1;//转换8位并行数据为串行数据 260 1 _nop_(); 261 1 262 1 indata = 0; 263 1 for(i = 0; i < 8; i ++) //将8个串行数据存入数组indata中 264 1 { 265 2 indata = indata << 1;//开始时,indata数组先左移一位,以后每个循环左移一次 266 2 SCK = 0;//时钟低电平到来后,并行数据开始转换串行数据 267 2 _nop_(); 268 2 269 2 indata |= IN_Data; //将转换完成的串行数据一位位存入数组 270 2 SCK = 1; //时钟变为高电平,再次变为低电平时,开始传出下一位串行数据 271 2 } 272 1 return indata; 273 1 } 274 275 276 char find_bit(unsigned char dat) 277 { 278 1 char i=0; 279 1 char cnt=0; 280 1 for(i=0;i<8;i++) 281 1 { 282 2 if(!(dat&0x01)) 283 2 { 284 3 cnt++; 285 3 } 286 2 dat>>=1; 287 2 } 288 1 return cnt; 289 1 } 290 void main() 291 { 292 1 lcd1602_init(); 293 1 UartInit(); 294 1 dht11_value(&temp,&humi,DHT11_UINT8); 295 1 buzz=1; 296 1 delay_xms(200); 297 1 dht11_value(&temp,&humi,DHT11_UINT8); 298 1 Timer0Init(); 299 1 while(1) 300 1 { 301 2 302 2 if(JCount>50)//500ms采集一次 C51 COMPILER V9.60.0.0 MAIN 02/21/2022 21:12:48 PAGE 6 303 2 { 304 3 JCount=0; 305 3 if(SET==0) 306 3 { 307 4 if(clear_flag==1) 308 4 { 309 5 clear_flag=0; 310 5 311 5 Write_1602_com(0x01);//清显示 312 5 delay_1ms(100); 313 5 } 314 4 sw_val = find_bit(Read74HC165()); 315 4 dht11_value(&temp,&humi,DHT11_UINT8); 316 4 L1602_printf(0,0,"temp:%2d",(int)temp); 317 4 L1602_printf(0,1,"humi:%2d",(int)humi); 318 4 L1602_printf(12,0,"%s","SW"); 319 4 L1602_printf(12,1,"%2dcm",(int)sw_val); 320 4 if((tempWdH)||(humiSdH)||(sw_valSWH)) 321 4 { 322 5 bj_flag=1; 323 5 }else 324 4 { 325 5 bj_flag=0; 326 5 } 327 4 sprintf(send_buff,"X%dH%dD%dZ\r\n",(int)temp,(int)humi,(int)sw_val); 328 4 sendString(send_buff); 329 4 } 330 3 else 331 3 { 332 4 if(clear_flag==0) 333 4 { 334 5 clear_flag=1; 335 5 336 5 Write_1602_com(0x01);//清显示 337 5 delay_1ms(100); 338 5 } 339 4 switch(SET) 340 4 { 341 5 case 1: 342 5 case 2: 343 5 WriteLcd1602_String(0,0,"Set temp"); 344 5 L1602_printf(0,1,"H:%2d L:%2d",(int)WdH,(int)WdL); 345 5 break; 346 5 347 5 case 3: 348 5 case 4: 349 5 WriteLcd1602_String(0,0,"Set humi"); 350 5 L1602_printf(0,1,"H:%2d L:%2d",(int)SdH,(int)SdL); 351 5 break; 352 5 353 5 case 5: 354 5 case 6: 355 5 WriteLcd1602_String(0,0,"Set SW "); 356 5 L1602_printf(0,1,"H:%2d L:%2d",(int)SWH,(int)SWL); 357 5 break; 358 5 } 359 4 360 4 } 361 3 } 362 2 363 2 } 364 1 C51 COMPILER V9.60.0.0 MAIN 02/21/2022 21:12:48 PAGE 7 365 1 } MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 1351 ---- CONSTANT SIZE = 83 ---- XDATA SIZE = ---- ---- PDATA SIZE = ---- ---- DATA SIZE = 36 6 IDATA SIZE = ---- ---- BIT SIZE = ---- ---- END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)