main.lst 13 KB

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