123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- #include "led.h"
- #include "delay.h"
- #include "sys.h"
- #include "stm32f10x.h"
- #include "stdio.h"
- #include "key.h"
- #include "usart.h"
- #include "drive_dht11.h"
- #include "bh1750.h"
- #include "drive_lcd1602.h"
- #define KEY_GPIO_PROT GPIOA
- #define KEY1_GPIO_PIN GPIO_Pin_0
- #define KEY2_GPIO_PIN GPIO_Pin_1
- #define KEY3_GPIO_PIN GPIO_Pin_2
- //#define KEY4_GPIO_PIN GPIO_Pin_3
- //#define KEY5_GPIO_PIN GPIO_Pin_4
- #define KEY1_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY1_GPIO_PIN)
- #define KEY2_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY2_GPIO_PIN)
- #define KEY3_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY3_GPIO_PIN)
- //#define KEY4_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY4_GPIO_PIN)
- //#define KEY5_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY5_GPIO_PIN)
- void key_gpio_init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);
- GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN|KEY2_GPIO_PIN|KEY3_GPIO_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
- GPIO_Init(KEY_GPIO_PROT, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- }
- u8 humi=0;//湿度值
- u8 temp=0;//温度值
- u8 buffer[10]={0};
- u16 GzVal=0; //实际光照值
- char ShowBuf[16]={0};
- u8 set_flag=0;
- u8 set_temp=0;//设置值
- u8 set_humi=0;
- u16 set_gz=0;
- int key_Task(void)
- {
- static char key_flag=0;
- if(KEY1_IN==0|KEY2_IN==0|KEY3_IN==0)
- {
- if(key_flag==0)
- {
- key_flag=1;
- if(KEY1_IN==0)
- {
- if(++set_flag>3)set_flag=0;
- }
- else if(KEY2_IN==0)
- {
- switch(set_flag)
- {
- case 1:
- if(++set_temp>50)set_temp=0;
- break;
-
- case 2:
- if(++set_humi>95)set_humi=0;
- break;
-
- case 3:
- set_gz+=10;
- if(set_gz>5000)set_gz=0;
- break;
- }
- }
- else if(KEY3_IN==0)
- {
- switch(set_flag)
- {
- case 1:
- if(--set_temp==0)set_temp=50;
- break;
-
- case 2:
- if(--set_humi==0)set_humi=95;
- break;
-
- case 3:
-
- if(set_gz>10)set_gz-=10;
- break;
- }
- }
- }
- }else
- {
- key_flag=0;
- }
- return 20;
- }
- void TIMER3_Int_Init(u16 arr,u16 psc)
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStrue;
- NVIC_InitTypeDef NVIC_InitStructure;
- TIM_TimeBaseInitStrue.TIM_Period=arr;
- TIM_TimeBaseInitStrue.TIM_Prescaler=psc;
- TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;
- TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CounterMode_Up;
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
- TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStrue);
-
- TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//使能TIM3更新中断
- //中断优先级NVIC设置
- NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
- NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
-
- TIM_Cmd(TIM3, ENABLE); //使能TIMx
- }
- u16 GetTimer=0;//采集时间计数器
- void TIM3_IRQHandler(void)//中断服务程序
- {
- if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)//SET为1
- {
- GetTimer++;//采集计数器
- TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除TIM3的更新中断标志
- key_Task();//扫描按键
-
- }
- }
- u8 GetFlag=0;
- uint8_t RecBuff[16]={0};
- int main(void)
- {
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
- delay_init(); //延时函数初始化
- LED_Init(); //初始化与连接的硬件接口
- uart_init(115200);
- delay_ms(1000);
- TIMER3_Int_Init(10000,71);//定时器初始化 //10ms进一次中断
- key_gpio_init();
- Init_Lcd1602();
- while(1)
- {
- if(GetTimer>50)//500ms显示一次
- {
- GetTimer=0;//清零
- if(set_flag==0)
- {
- L1602_printf(0,0,"T:%2d H:%2d L:%4d",temp,humi,GzVal);//打印显示实际数据
- L1602_printf(0,1," %2d %2d %4d",set_temp,set_humi,set_gz);//打印显示设置数据
-
- if(temp>set_temp||humi>set_humi||GzVal>set_gz)
- {
- BUZZ_LED0^=1;//报警嘀嘀嘀
- }else
- {
- BUZZ_LED0=0;
- }
- }else
- {
- L1602_printf(0,1," %2d %2d %4d",set_temp,set_humi,set_gz);//打印显示设置数据
- }
- }
- }
- }
|