123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310 |
- #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_len<Usart2ReadLen)
- {
- if(user_uart_handle.uart2_len==3&&user_uart_handle.uart2_buff[0]==0x88&&user_uart_handle.uart2_buff[1]==0x55&&user_uart_handle.uart2_buff[2]==0x99)
- {
- user_uart_handle.uart2_buff[0]=no_changeval<<8;
- user_uart_handle.uart2_buff[1]=no_changeval;
- user_uart_handle.uart2_buff[2]=co2_changeval<<8;
- user_uart_handle.uart2_buff[3]=co2_changeval;
- USART2_String(user_uart_handle.uart2_buff,4);
- }else
- {
- USART1_String(user_uart_handle.uart2_buff,user_uart_handle.uart2_len);
-
- }
- user_uart_handle.uart2_sta=0;
- }
- }
- if(user_uart_handle.uart1_sta)
- {
-
- user_uart_handle.uart1_sta=0;
-
- if(user_uart_handle.uart1_len>0&&user_uart_handle.uart1_len<Usart1ReadLen)
- {
- if(user_uart_handle.uart1_buff[0]==0x06
- &&user_uart_handle.uart1_buff[1]==0x30
- &&user_uart_handle.uart1_buff[2]==0x16
- &&user_uart_handle.uart1_buff[3]==0x02
- &&user_uart_handle.uart1_buff[4]==0x01
- )
- {
- if(LRC_Check(user_uart_handle.uart1_buff,user_uart_handle.uart1_len-1)==user_uart_handle.uart1_buff[user_uart_handle.uart1_len-1])
- {
- NO_val = user_uart_handle.uart1_buff[11]<<8|user_uart_handle.uart1_buff[12];
- CO2_val = user_uart_handle.uart1_buff[13]<<8|user_uart_handle.uart1_buff[14];
- if(no_changeflag)
- {
- #if (version==1)
- cnt_temp = NO_val - no_changeval;
- #elif (version==2)
- cnt_temp = NO_val - (no_changeval*NO_val)/100;
- #endif
- if(cnt_temp<1)cnt_temp=1;
- no_tempval = cnt_temp;
- user_uart_handle.uart1_buff[11]=no_tempval>>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();
- }
-
- }
|