#include "led.h" #include "delay.h" #include "sys.h" #include "stm32f10x.h" #include "adc.h" #include "stdio.h" #include "key.h" #include "usart.h" #include "stdio.h" #include "string.h" #define version 2 #define EN_INTERRUPT __enable_irq(); #define DI_INTERRUPT __disable_irq(); unsigned char LRC_Check(unsigned char* data, int data_len) { int i = 0; unsigned char lrc = 0; unsigned int sum=0; for (i = 0; i < data_len; i++) { sum+= data[i]; } lrc = (sum%256); lrc = ~lrc+1; return lrc; } #define KEY_GPIO_PROT GPIOA #define KEY1_GPIO_PIN GPIO_Pin_7 #define KEY2_GPIO_PIN GPIO_Pin_6 #define KEY3_GPIO_PIN GPIO_Pin_5 #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 KEY1_IN PCin(1) //#define KEY2_IN PCin(13) //#define KEY3_IN PCin(2) 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_Pin = GPIO_Pin_4; // 端口配置 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOC13 GPIO_ResetBits(GPIOA,GPIO_Pin_4); } uint32_t get_sys_time=0; uint16_t NO_val=0; uint16_t CO2_val=0; uint8_t no_changeflag=0; uint8_t co2_changeflag=0; uint16_t no_changeval=0; uint16_t co2_changeval=0; uint16_t no_tempval=0; uint16_t co2_tempval=0; long cnt_temp=0; //取数据指令 05 30 05 02 01 C3 //NO减 15% //CO2 加 15% 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) { //printf("k1\r\n");红色 #if (version==1) no_changeflag=1; no_changeval+=150; #elif (version==2) no_changeflag=1; no_changeval+=15; if(no_changeval>90)no_changeval=90; #endif // printf("k1\r\n"); }else if(KEY2_IN==0) { // printf("k2\r\n"); 黄色 #if (version==1) co2_changeflag=1; co2_changeval+=15; #elif (version==2) co2_changeflag=1; co2_changeval+=5; if(co2_changeval>90)co2_changeval=90; #endif // printf("k2\r\n"); } else if(KEY3_IN==0) { // printf("k3\r\n");//绿色 no_changeflag=0; no_changeval=0; co2_changeflag=0; co2_changeval=0; __set_FAULTMASK(1);//关闭总中断 NVIC_SystemReset();//请求单片机重启 } } }else { key_flag=0; } return 20; } /* 06H-30H-LB-02H-烟度计适配位-气路压力高位-气路压力低位-油温高位 -油温低位-转速高位-转速低位-NO高位-NO低位-CO2高位- CO2低位 -N 值高位-N 值低位-Ns 值高位-Ns 值低位-K 值高位 -K 值低位-烟气温度-校验码 */ void user_data_check(void) { if(user_uart_handle.uart2_sta) { if(user_uart_handle.uart2_len>0&&user_uart_handle.uart2_len0&&user_uart_handle.uart1_len>8; user_uart_handle.uart1_buff[12]=no_tempval; } if(co2_changeflag) { #if (version==1) cnt_temp = CO2_val + co2_changeval; #elif (version==2) cnt_temp = CO2_val + (co2_changeval*CO2_val)/100; #endif if(cnt_temp>2000)cnt_temp=2000; co2_tempval = cnt_temp; user_uart_handle.uart1_buff[13]=co2_tempval>>8; user_uart_handle.uart1_buff[14]=co2_tempval; } user_uart_handle.uart1_buff[user_uart_handle.uart1_len-1]=LRC_Check(user_uart_handle.uart1_buff,user_uart_handle.uart1_len-1); USART2_String(user_uart_handle.uart1_buff,user_uart_handle.uart1_len); } }else { USART2_String(user_uart_handle.uart1_buff,user_uart_handle.uart1_len); } } } } void TIM4_IRQHandler() //20ms 1次 { u8 st; st=TIM_GetFlagStatus(TIM4, TIM_IT_Update); if(st!=0) { TIM_ClearFlag(TIM4, TIM_IT_Update); get_sys_time++; key_Task(); } } void Timer4_init() //T4 20ms时钟 { // TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM4,ENABLE);//M TIM_TimeBaseStructure.TIM_Period = 20000-1; //计数个数 //20ms TIM_TimeBaseStructure.TIM_Prescaler =72-1;//分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //分割时钟 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数 TIM_DeInit(TIM4); TIM_TimeBaseInit(TIM4, & TIM_TimeBaseStructure); TIM_Cmd(TIM4, ENABLE); //使能定时器2 /*以下定时器4中断初始化*/ TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //向上计数溢出产生中断 NVIC_InitStructure.NVIC_IRQChannel =TIM4_IRQn;// TIM4_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init (&NVIC_InitStructure); } void IWDG_Init(u8 prer,u16 rlr) { IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); IWDG_SetPrescaler(prer); IWDG_SetReload(rlr); IWDG_ReloadCounter(); IWDG_Enable(); } void IWDG_Feed(void) { IWDG_ReloadCounter();//reload } //母头uart2接电脑 公头uart1接下位机 int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级 delay_init(); //延时函数初始化 LED_Init(); //初始化与LED连接的硬件接口 uart_init(9600);//串口初始化 uart2_init(9600); key_gpio_init(); Timer4_init();//初始化定时器 // printf("sys_init\r\n"); // USART2_String((u8*)"sys_init\r\n",10); IWDG_Init(4,625); //为1s while(1) { #if (version==1) if(get_sys_time>50) { get_sys_time=0; LED_OUT^=1; //USART2_String((u8*)"sys_init\r\n",10); // printf("sys_init\r\n"); } #elif (version==2) if(get_sys_time>100) { get_sys_time=0; LED_OUT^=1; //USART2_String((u8*)"sys_init\r\n",10); // printf("sys_init\r\n"); } #endif user_data_check(); IWDG_Feed(); } }