main.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "stm32f10x.h"
  5. #include "stdio.h"
  6. #include "key.h"
  7. #include "usart.h"
  8. #include "drive_dht11.h"
  9. #include "bh1750.h"
  10. #include "drive_lcd1602.h"
  11. #define KEY_GPIO_PROT GPIOA
  12. #define KEY1_GPIO_PIN GPIO_Pin_0
  13. #define KEY2_GPIO_PIN GPIO_Pin_1
  14. #define KEY3_GPIO_PIN GPIO_Pin_2
  15. //#define KEY4_GPIO_PIN GPIO_Pin_3
  16. //#define KEY5_GPIO_PIN GPIO_Pin_4
  17. #define KEY1_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY1_GPIO_PIN)
  18. #define KEY2_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY2_GPIO_PIN)
  19. #define KEY3_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY3_GPIO_PIN)
  20. //#define KEY4_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY4_GPIO_PIN)
  21. //#define KEY5_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY5_GPIO_PIN)
  22. void key_gpio_init(void)
  23. {
  24. GPIO_InitTypeDef GPIO_InitStructure;
  25. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);
  26. GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN|KEY2_GPIO_PIN|KEY3_GPIO_PIN;
  27. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  28. GPIO_Init(KEY_GPIO_PROT, &GPIO_InitStructure);
  29. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  30. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  31. GPIO_Init(GPIOA, &GPIO_InitStructure);
  32. }
  33. u8 humi=0;//湿度值
  34. u8 temp=0;//温度值
  35. u8 buffer[10]={0};
  36. u16 GzVal=0; //实际光照值
  37. char ShowBuf[16]={0};
  38. u8 set_flag=0;
  39. u8 set_temp=0;//设置值
  40. u8 set_humi=0;
  41. u16 set_gz=0;
  42. int key_Task(void)
  43. {
  44. static char key_flag=0;
  45. if(KEY1_IN==0|KEY2_IN==0|KEY3_IN==0)
  46. {
  47. if(key_flag==0)
  48. {
  49. key_flag=1;
  50. if(KEY1_IN==0)
  51. {
  52. if(++set_flag>3)set_flag=0;
  53. }
  54. else if(KEY2_IN==0)
  55. {
  56. switch(set_flag)
  57. {
  58. case 1:
  59. if(++set_temp>50)set_temp=0;
  60. break;
  61. case 2:
  62. if(++set_humi>95)set_humi=0;
  63. break;
  64. case 3:
  65. set_gz+=10;
  66. if(set_gz>5000)set_gz=0;
  67. break;
  68. }
  69. }
  70. else if(KEY3_IN==0)
  71. {
  72. switch(set_flag)
  73. {
  74. case 1:
  75. if(--set_temp==0)set_temp=50;
  76. break;
  77. case 2:
  78. if(--set_humi==0)set_humi=95;
  79. break;
  80. case 3:
  81. if(set_gz>10)set_gz-=10;
  82. break;
  83. }
  84. }
  85. }
  86. }else
  87. {
  88. key_flag=0;
  89. }
  90. return 20;
  91. }
  92. void TIMER3_Int_Init(u16 arr,u16 psc)
  93. {
  94. TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue;
  95. NVIC_InitTypeDef NVIC_InitStructure;
  96. TIM_TimeBaseInitStrue.TIM_Period=arr;
  97. TIM_TimeBaseInitStrue.TIM_Prescaler=psc;
  98. TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;
  99. TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CounterMode_Up;
  100. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
  101. TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStrue);
  102. TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//使能TIM3更新中断
  103. //中断优先级NVIC设置
  104. NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
  105. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
  106. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
  107. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
  108. NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
  109. TIM_Cmd(TIM3, ENABLE); //使能TIMx
  110. }
  111. u16 GetTimer=0;//采集时间计数器
  112. void TIM3_IRQHandler(void)//中断服务程序
  113. {
  114. if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)//SET为1
  115. {
  116. GetTimer++;//采集计数器
  117. TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除TIM3的更新中断标志
  118. key_Task();//扫描按键
  119. }
  120. }
  121. u8 GetFlag=0;
  122. uint8_t RecBuff[16]={0};
  123. int main(void)
  124. {
  125. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
  126. delay_init(); //延时函数初始化
  127. LED_Init(); //初始化与连接的硬件接口
  128. uart_init(115200);
  129. delay_ms(1000);
  130. TIMER3_Int_Init(10000,71);//定时器初始化 //10ms进一次中断
  131. key_gpio_init();
  132. Init_Lcd1602();
  133. while(1)
  134. {
  135. if(GetTimer>50)//500ms显示一次
  136. {
  137. GetTimer=0;//清零
  138. if(set_flag==0)
  139. {
  140. L1602_printf(0,0,"T:%2d H:%2d L:%4d",temp,humi,GzVal);//打印显示实际数据
  141. L1602_printf(0,1," %2d %2d %4d",set_temp,set_humi,set_gz);//打印显示设置数据
  142. if(temp>set_temp||humi>set_humi||GzVal>set_gz)
  143. {
  144. BUZZ_LED0^=1;//报警嘀嘀嘀
  145. }else
  146. {
  147. BUZZ_LED0=0;
  148. }
  149. }else
  150. {
  151. L1602_printf(0,1," %2d %2d %4d",set_temp,set_humi,set_gz);//打印显示设置数据
  152. }
  153. }
  154. }
  155. }