main.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365
  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 SW4=P3^4;
  24. sbit JR_LED=P2^2;
  25. sbit JW_LED=P2^4;
  26. sbit buzz=P3^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=10;
  37. char WdH=30;
  38. char SdL=30;
  39. char SdH=80;
  40. char SWL=2;
  41. char SWH=6;
  42. char keyflag=0;
  43. uchar bj_flag=0;
  44. uchar Bj_CNt=0;
  45. uchar JCount=0;
  46. uchar clear_flag=0;
  47. uchar bj_clear=0;
  48. uint clear_cnt=0;
  49. void KeyRead(void)
  50. {
  51. if(!SW1)
  52. {
  53. if(!SW1&&keyflag==0)
  54. {
  55. keyflag=1;
  56. if(++SET>6)SET=0;
  57. while(!SW1);
  58. }
  59. }
  60. else if(!SW2)
  61. {
  62. if(!SW2&&keyflag==0)
  63. {
  64. keyflag=1;
  65. switch(SET)
  66. {
  67. case 1:
  68. if(++WdH>50)WdH=0;
  69. break;
  70. case 2:
  71. if(++WdL>50)WdL=0;
  72. break;
  73. case 3:
  74. if(++SdH>90)SdH=0;
  75. break;
  76. case 4:
  77. if(++SdL>90)SdH=0;
  78. break;
  79. case 5:
  80. if(++SWH>8)SWH=0;
  81. break;
  82. case 6:
  83. if(++SWL>8)SWL=0;
  84. break;
  85. }
  86. while(!SW2);
  87. }
  88. }
  89. else if(!SW3)
  90. {
  91. if(!SW3&&keyflag==0)
  92. {
  93. keyflag=1;
  94. switch(SET)
  95. {
  96. case 1:
  97. if(--WdH<0)WdH=50;
  98. break;
  99. case 2:
  100. if(--WdL<0)WdL=50;
  101. break;
  102. case 3:
  103. if(--SdH<0)SdH=90;
  104. break;
  105. case 4:
  106. if(--SdL<0)SdL=90;
  107. break;
  108. case 5:
  109. if(--SWH<0)SWH=8;
  110. break;
  111. case 6:
  112. if(--SWL<0)SWL=8;
  113. break;
  114. }
  115. while(!SW3);
  116. }
  117. }
  118. else if(!SW4)
  119. {
  120. if(!SW4&&keyflag==0)
  121. {
  122. bj_clear^=1;
  123. while(!SW4);
  124. }
  125. }
  126. else
  127. {
  128. keyflag=0;
  129. clear_cnt=0;
  130. }
  131. }
  132. void Timer0Init(void) //10毫秒@11.0592MHz
  133. {
  134. TMOD &= 0xF0; //设置定时器模式
  135. TMOD |= 0x01; //设置定时器模式
  136. TL0 = 0x00; //设置定时初值
  137. TH0 = 0xDC; //设置定时初值
  138. TF0 = 0; //清除TF0标志
  139. ET0=1;
  140. TR0 = 1; //定时器0开始计时
  141. EA=1;
  142. }
  143. void TimeISR()interrupt 1
  144. {
  145. TL0 = 0x00; //设置定时初值
  146. TH0 = 0xDC; //设置定时初值
  147. KeyRead();
  148. if((bj_flag==1)&&(bj_clear==0))
  149. {
  150. if(++Bj_CNt>30)
  151. {
  152. Bj_CNt=0;
  153. buzz=~buzz;
  154. }
  155. }else
  156. {
  157. buzz=1; Bj_CNt=0;
  158. }
  159. JCount++;
  160. }
  161. void UartInit(void) //9600bps@11.0592MHz
  162. {
  163. PCON &= 0x7F; //波特率不倍速
  164. SCON = 0x50; //8位数据,可变波特率
  165. TMOD &= 0x0F; //清除定时器1模式位
  166. TMOD |= 0x20; //设定定时器1为8位自动重装方式
  167. TL1 = 0xFD; //设定定时初值
  168. TH1 = 0xFD; //设定定时器重装值
  169. ET1 = 0; //禁止定时器1中断
  170. TR1 = 1; //启动定时器1
  171. EA=1;
  172. ES=0;
  173. }
  174. void sendData(char *p,unsigned char n)
  175. {
  176. if( p == 0) return ;
  177. ES = 0;
  178. if(n > 0)
  179. {
  180. while(n --)
  181. {
  182. SBUF = *p++ ;
  183. while(!TI) ;
  184. TI = 0 ;
  185. }
  186. }
  187. // ES = 1;
  188. }
  189. // 往串口发送字符串
  190. void sendString(char *p)
  191. {
  192. if(p == 0) return ;
  193. sendData(p,strlen(p));
  194. }
  195. // 接收中断函数
  196. void usart() interrupt 4
  197. {
  198. if(RI == 1)
  199. {
  200. // setUsartRxData(SBUF);
  201. }
  202. RI = 0;
  203. TI = 0;
  204. }
  205. //char xdata showbuff[16]={0};
  206. char data send_buff[17]={0};
  207. sbit IN_PL = P2^0; //SHIFT/!LOA引脚
  208. sbit IN_Data = P2^2; // QH数据输出引脚
  209. sbit SCK = P2^1; //CLOCK引脚
  210. unsigned char Read74HC165(void)
  211. {
  212. unsigned char indata;
  213. unsigned char i;
  214. IN_PL = 0;//装载8位并行数据
  215. _nop_();
  216. IN_PL = 1;//转换8位并行数据为串行数据
  217. _nop_();
  218. indata = 0;
  219. for(i = 0; i < 8; i ++) //将8个串行数据存入数组indata中
  220. {
  221. indata = indata << 1;//开始时,indata数组先左移一位,以后每个循环左移一次
  222. SCK = 0;//时钟低电平到来后,并行数据开始转换串行数据
  223. _nop_();
  224. indata |= IN_Data; //将转换完成的串行数据一位位存入数组
  225. SCK = 1; //时钟变为高电平,再次变为低电平时,开始传出下一位串行数据
  226. }
  227. return indata;
  228. }
  229. char find_bit(unsigned char dat)
  230. {
  231. char i=0;
  232. char cnt=0;
  233. for(i=0;i<8;i++)
  234. {
  235. if(!(dat&0x01))
  236. {
  237. cnt++;
  238. }
  239. dat>>=1;
  240. }
  241. return cnt;
  242. }
  243. void main()
  244. {
  245. lcd1602_init();
  246. UartInit();
  247. dht11_value(&temp,&humi,DHT11_UINT8);
  248. buzz=1;
  249. delay_xms(200);
  250. dht11_value(&temp,&humi,DHT11_UINT8);
  251. Timer0Init();
  252. while(1)
  253. {
  254. if(JCount>50)//500ms采集一次
  255. {
  256. JCount=0;
  257. if(SET==0)
  258. {
  259. if(clear_flag==1)
  260. {
  261. clear_flag=0;
  262. Write_1602_com(0x01);//清显示
  263. delay_1ms(100);
  264. }
  265. sw_val = find_bit(Read74HC165());
  266. dht11_value(&temp,&humi,DHT11_UINT8);
  267. L1602_printf(0,0,"temp:%2d",(int)temp);
  268. L1602_printf(0,1,"humi:%2d",(int)humi);
  269. L1602_printf(12,0,"%s","SW");
  270. L1602_printf(12,1,"%2dcm",(int)sw_val);
  271. if((temp<WdL||temp>WdH)||(humi<SdL||humi>SdH)||(sw_val<SWL||sw_val>SWH))
  272. {
  273. bj_flag=1;
  274. }else
  275. {
  276. bj_flag=0;
  277. }
  278. sprintf(send_buff,"X%dH%dD%dZ\r\n",(int)temp,(int)humi,(int)sw_val);
  279. sendString(send_buff);
  280. }
  281. else
  282. {
  283. if(clear_flag==0)
  284. {
  285. clear_flag=1;
  286. Write_1602_com(0x01);//清显示
  287. delay_1ms(100);
  288. }
  289. switch(SET)
  290. {
  291. case 1:
  292. case 2:
  293. WriteLcd1602_String(0,0,"Set temp");
  294. L1602_printf(0,1,"H:%2d L:%2d",(int)WdH,(int)WdL);
  295. break;
  296. case 3:
  297. case 4:
  298. WriteLcd1602_String(0,0,"Set humi");
  299. L1602_printf(0,1,"H:%2d L:%2d",(int)SdH,(int)SdL);
  300. break;
  301. case 5:
  302. case 6:
  303. WriteLcd1602_String(0,0,"Set SW ");
  304. L1602_printf(0,1,"H:%2d L:%2d",(int)SWH,(int)SWL);
  305. break;
  306. }
  307. }
  308. }
  309. }
  310. }