main.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. #include "drive_1602.h"
  2. #include "string.h"
  3. #include "stdio.h"
  4. #include "dht11.h"
  5. #define uint unsigned int
  6. #define uchar unsigned char
  7. /*
  8. 按键实现人机交互的主要方式,温湿度传感器可以感测环境温度湿度,
  9. 并且采集电信号至单片机,供电模块给单片机提供电能保证系统能够正常运行,
  10. 水位传感器能够检测水田水位保证一定的水位。
  11. 显示屏可以显示温湿度信息和水位信息,
  12. 蓝牙传输模块能够将采集的信号都传输至手机APP,并实现图形化显示。
  13. 实现的功能:
  14. 1、通过蓝牙能够检测到水田的水位、温度、湿度。
  15. 2、通过USB +5V 供电
  16. 3、能够具有阈值报警的功能
  17. 4、阈值可以进行调节。
  18. 5、实现APP的温湿度信息监测,可在APP端图形化实时监测温度湿度变化。
  19. */
  20. sbit SW1=P3^7;
  21. sbit SW2=P3^6;
  22. sbit SW3=P3^5;
  23. sbit JR_LED=P2^2;
  24. sbit JW_LED=P2^4;
  25. sbit buzz=P2^1;
  26. sbit HY_IN=P2^3;
  27. uchar temp,humi;
  28. int sw_val=0;
  29. void delay_xms(int xms)
  30. {
  31. char ix=0;
  32. for(;xms>0;xms--)
  33. for(ix=110;ix>0;ix--);
  34. }
  35. uchar SET=0;
  36. char WdL=20;
  37. char WdH=30;
  38. char SdL=60;
  39. char SdH=80;
  40. char SWL=2;
  41. char SWH=6;
  42. char keyflag=0;
  43. void KeyRead(void)
  44. {
  45. if(!SW1)
  46. {
  47. if(!SW1&&keyflag==0)
  48. {
  49. keyflag=1;
  50. if(++SET>6)SET=0;
  51. while(!SW1);
  52. }
  53. }
  54. else if(!SW2)
  55. {
  56. if(!SW2&&keyflag==0)
  57. {
  58. keyflag=1;
  59. switch(SET)
  60. {
  61. case 1:
  62. if(++WdH>50)WdH=0;
  63. break;
  64. case 2:
  65. if(++WdL>50)WdL=0;
  66. break;
  67. case 3:
  68. if(++SdH>90)SdH=0;
  69. break;
  70. case 4:
  71. if(++SdL>90)SdH=0;
  72. break;
  73. case 5:
  74. if(++SWH>8)SWH=0;
  75. break;
  76. case 6:
  77. if(++SWL>8)SWL=0;
  78. break;
  79. }
  80. while(!SW2);
  81. }
  82. }
  83. else if(!SW3)
  84. {
  85. if(!SW3&&keyflag==0)
  86. {
  87. keyflag=1;
  88. switch(SET)
  89. {
  90. case 1:
  91. if(--WdH<0)WdH=50;
  92. break;
  93. case 2:
  94. if(--WdL<0)WdL=50;
  95. break;
  96. case 3:
  97. if(--SdH<0)SdH=90;
  98. break;
  99. case 4:
  100. if(--SdL<0)SdL=90;
  101. break;
  102. case 5:
  103. if(--SWH<0)SWH=8;
  104. break;
  105. case 6:
  106. if(--SWL<0)SWL=8;
  107. break;
  108. }
  109. while(!SW3);
  110. }
  111. }else
  112. {
  113. keyflag=0;
  114. }
  115. }
  116. void Timer0Init(void) //10毫秒@11.0592MHz
  117. {
  118. TMOD &= 0xF0; //设置定时器模式
  119. TMOD |= 0x01; //设置定时器模式
  120. TL0 = 0x00; //设置定时初值
  121. TH0 = 0xDC; //设置定时初值
  122. TF0 = 0; //清除TF0标志
  123. ET0=1;
  124. TR0 = 1; //定时器0开始计时
  125. EA=1;
  126. }
  127. bit bj_flag=0;
  128. uchar Bj_CNt=0;
  129. uchar JCount=0;
  130. void TimeISR()interrupt 1
  131. {
  132. TL0 = 0x00; //设置定时初值
  133. TH0 = 0xDC; //设置定时初值
  134. KeyRead();
  135. if(bj_flag)
  136. {
  137. if(++Bj_CNt>30)
  138. {
  139. Bj_CNt=0;
  140. buzz=~buzz;
  141. }
  142. }else
  143. {
  144. buzz=1;
  145. }
  146. JCount++;
  147. }
  148. void UartInit(void) //9600bps@11.0592MHz
  149. {
  150. PCON &= 0x7F; //波特率不倍速
  151. SCON = 0x50; //8位数据,可变波特率
  152. TMOD &= 0x0F; //清除定时器1模式位
  153. TMOD |= 0x20; //设定定时器1为8位自动重装方式
  154. TL1 = 0xFD; //设定定时初值
  155. TH1 = 0xFD; //设定定时器重装值
  156. ET1 = 0; //禁止定时器1中断
  157. TR1 = 1; //启动定时器1
  158. EA=1;
  159. ES=0;
  160. }
  161. void sendData(char *p,unsigned char n)
  162. {
  163. if( p == 0) return ;
  164. ES = 0;
  165. if(n > 0)
  166. {
  167. while(n --)
  168. {
  169. SBUF = *p++ ;
  170. while(!TI) ;
  171. TI = 0 ;
  172. }
  173. }
  174. // ES = 1;
  175. }
  176. // 往串口发送字符串
  177. void sendString(char *p)
  178. {
  179. if(p == 0) return ;
  180. sendData(p,strlen(p));
  181. }
  182. // 接收中断函数
  183. void usart() interrupt 4
  184. {
  185. if(RI == 1)
  186. {
  187. // setUsartRxData(SBUF);
  188. }
  189. RI = 0;
  190. TI = 0;
  191. }
  192. char data showbuff[16]={0};
  193. char data send_buff[16]={0};
  194. bit clear_flag=0;
  195. void main()
  196. {
  197. lcd1602_init();
  198. UartInit();
  199. dht11_value(&temp,&humi,DHT11_UINT8);
  200. buzz=1;
  201. delay_xms(200);
  202. dht11_value(&temp,&humi,DHT11_UINT8);
  203. Timer0Init();
  204. while(1)
  205. {
  206. if(JCount>50)//500ms采集一次
  207. {
  208. JCount=0;
  209. if(SET==0)
  210. {
  211. if(clear_flag==1)
  212. {
  213. clear_flag=0;
  214. Write_1602_com(0x01);//清显示
  215. delay_1ms(100);
  216. }
  217. dht11_value(&temp,&humi,DHT11_UINT8);
  218. L1602_printf(0,0,"temp:%2d",temp);
  219. L1602_printf(0,1,"humi:%2d",humi);
  220. L1602_printf(12,0,"%s","SW");
  221. L1602_printf(12,1,"%2dcm",sw_val);
  222. if((temp<WdL||temp>WdH)||(humi<SdL||humi>SdH)||(sw_val<SWL||sw_val>SWH))
  223. {
  224. bj_flag=1;
  225. }else
  226. {
  227. bj_flag=0;
  228. }
  229. sprintf(send_buff,"X%dH%dD%dZ\r\n",temp,humi,sw_val);
  230. sendString(send_buff);
  231. }
  232. else
  233. {
  234. if(clear_flag==0)
  235. {
  236. clear_flag=1;
  237. Write_1602_com(0x01);//清显示
  238. delay_1ms(100);
  239. }
  240. switch(SET)
  241. {
  242. case 1:
  243. case 2:
  244. WriteLcd1602_String(0,0,"Set temp");
  245. L1602_printf(0,1,"H:%2d L:%2d",WdH,WdL);
  246. break;
  247. case 3:
  248. case 4:
  249. WriteLcd1602_String(0,0,"Set humi");
  250. L1602_printf(0,1,"H:%2d L:%2d",SdH,SdL);
  251. break;
  252. case 5:
  253. case 6:
  254. WriteLcd1602_String(0,0,"Set SW ");
  255. L1602_printf(0,1,"H:%2d L:%2d",SWH,SWL);
  256. break;
  257. }
  258. }
  259. }
  260. }
  261. }