main.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "sys.h"
  4. #include "stm32f10x.h"
  5. #include "adc.h"
  6. #include "stdio.h"
  7. #include "key.h"
  8. #include "usart.h"
  9. #include "stdio.h"
  10. #include "string.h"
  11. #define version 2
  12. #define EN_INTERRUPT __enable_irq();
  13. #define DI_INTERRUPT __disable_irq();
  14. unsigned char LRC_Check(unsigned char* data, int data_len)
  15. {
  16. int i = 0;
  17. unsigned char lrc = 0;
  18. unsigned int sum=0;
  19. for (i = 0; i < data_len; i++)
  20. {
  21. sum+= data[i];
  22. }
  23. lrc = (sum%256);
  24. lrc = ~lrc+1;
  25. return lrc;
  26. }
  27. #define KEY_GPIO_PROT GPIOA
  28. #define KEY1_GPIO_PIN GPIO_Pin_7
  29. #define KEY2_GPIO_PIN GPIO_Pin_6
  30. #define KEY3_GPIO_PIN GPIO_Pin_5
  31. #define KEY1_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY1_GPIO_PIN)
  32. #define KEY2_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY2_GPIO_PIN)
  33. #define KEY3_IN GPIO_ReadInputDataBit(KEY_GPIO_PROT,KEY3_GPIO_PIN)
  34. //#define KEY1_IN PCin(1)
  35. //#define KEY2_IN PCin(13)
  36. //#define KEY3_IN PCin(2)
  37. void key_gpio_init(void)
  38. {
  39. GPIO_InitTypeDef GPIO_InitStructure;
  40. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);
  41. GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN|KEY2_GPIO_PIN|KEY3_GPIO_PIN;
  42. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
  43. GPIO_Init(KEY_GPIO_PROT, &GPIO_InitStructure);
  44. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // 端口配置
  45. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
  46. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
  47. GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOC13
  48. GPIO_ResetBits(GPIOA,GPIO_Pin_4);
  49. }
  50. uint32_t get_sys_time=0;
  51. uint16_t NO_val=0;
  52. uint16_t CO2_val=0;
  53. uint8_t no_changeflag=0;
  54. uint8_t co2_changeflag=0;
  55. uint16_t no_changeval=0;
  56. uint16_t co2_changeval=0;
  57. uint16_t no_tempval=0;
  58. uint16_t co2_tempval=0;
  59. long cnt_temp=0;
  60. //取数据指令 05 30 05 02 01 C3
  61. //NO减 15%
  62. //CO2 加 15%
  63. int key_Task(void)
  64. {
  65. static char key_flag=0;
  66. if(KEY1_IN==0||KEY2_IN==0||KEY3_IN==0)
  67. {
  68. if(key_flag==0)
  69. {
  70. key_flag=1;
  71. if(KEY1_IN==0)
  72. {
  73. //printf("k1\r\n");红色
  74. #if (version==1)
  75. no_changeflag=1;
  76. no_changeval+=150;
  77. #elif (version==2)
  78. no_changeflag=1;
  79. no_changeval+=15;
  80. if(no_changeval>90)no_changeval=90;
  81. #endif
  82. // printf("k1\r\n");
  83. }else if(KEY2_IN==0)
  84. {
  85. // printf("k2\r\n"); 黄色
  86. #if (version==1)
  87. co2_changeflag=1;
  88. co2_changeval+=15;
  89. #elif (version==2)
  90. co2_changeflag=1;
  91. co2_changeval+=5;
  92. if(co2_changeval>90)co2_changeval=90;
  93. #endif
  94. // printf("k2\r\n");
  95. }
  96. else if(KEY3_IN==0)
  97. {
  98. // printf("k3\r\n");//绿色
  99. no_changeflag=0;
  100. no_changeval=0;
  101. co2_changeflag=0;
  102. co2_changeval=0;
  103. __set_FAULTMASK(1);//关闭总中断
  104. NVIC_SystemReset();//请求单片机重启
  105. }
  106. }
  107. }else
  108. {
  109. key_flag=0;
  110. }
  111. return 20;
  112. }
  113. /*
  114. 06H-30H-LB-02H-烟度计适配位-气路压力高位-气路压力低位-油温高位
  115. -油温低位-转速高位-转速低位-NO高位-NO低位-CO2高位- CO2低位
  116. -N 值高位-N 值低位-Ns 值高位-Ns 值低位-K 值高位
  117. -K 值低位-烟气温度-校验码
  118. */
  119. void user_data_check(void)
  120. {
  121. if(user_uart_handle.uart2_sta)
  122. {
  123. if(user_uart_handle.uart2_len>0&&user_uart_handle.uart2_len<Usart2ReadLen)
  124. {
  125. 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)
  126. {
  127. user_uart_handle.uart2_buff[0]=no_changeval<<8;
  128. user_uart_handle.uart2_buff[1]=no_changeval;
  129. user_uart_handle.uart2_buff[2]=co2_changeval<<8;
  130. user_uart_handle.uart2_buff[3]=co2_changeval;
  131. USART2_String(user_uart_handle.uart2_buff,4);
  132. }else
  133. {
  134. USART1_String(user_uart_handle.uart2_buff,user_uart_handle.uart2_len);
  135. }
  136. user_uart_handle.uart2_sta=0;
  137. }
  138. }
  139. if(user_uart_handle.uart1_sta)
  140. {
  141. user_uart_handle.uart1_sta=0;
  142. if(user_uart_handle.uart1_len>0&&user_uart_handle.uart1_len<Usart1ReadLen)
  143. {
  144. if(user_uart_handle.uart1_buff[0]==0x06
  145. &&user_uart_handle.uart1_buff[1]==0x30
  146. &&user_uart_handle.uart1_buff[2]==0x16
  147. &&user_uart_handle.uart1_buff[3]==0x02
  148. &&user_uart_handle.uart1_buff[4]==0x01
  149. )
  150. {
  151. 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])
  152. {
  153. NO_val = user_uart_handle.uart1_buff[11]<<8|user_uart_handle.uart1_buff[12];
  154. CO2_val = user_uart_handle.uart1_buff[13]<<8|user_uart_handle.uart1_buff[14];
  155. if(no_changeflag)
  156. {
  157. #if (version==1)
  158. cnt_temp = NO_val - no_changeval;
  159. #elif (version==2)
  160. cnt_temp = NO_val - (no_changeval*NO_val)/100;
  161. #endif
  162. if(cnt_temp<1)cnt_temp=1;
  163. no_tempval = cnt_temp;
  164. user_uart_handle.uart1_buff[11]=no_tempval>>8;
  165. user_uart_handle.uart1_buff[12]=no_tempval;
  166. }
  167. if(co2_changeflag)
  168. {
  169. #if (version==1)
  170. cnt_temp = CO2_val + co2_changeval;
  171. #elif (version==2)
  172. cnt_temp = CO2_val + (co2_changeval*CO2_val)/100;
  173. #endif
  174. if(cnt_temp>2000)cnt_temp=2000;
  175. co2_tempval = cnt_temp;
  176. user_uart_handle.uart1_buff[13]=co2_tempval>>8;
  177. user_uart_handle.uart1_buff[14]=co2_tempval;
  178. }
  179. user_uart_handle.uart1_buff[user_uart_handle.uart1_len-1]=LRC_Check(user_uart_handle.uart1_buff,user_uart_handle.uart1_len-1);
  180. USART2_String(user_uart_handle.uart1_buff,user_uart_handle.uart1_len);
  181. }
  182. }else
  183. {
  184. USART2_String(user_uart_handle.uart1_buff,user_uart_handle.uart1_len);
  185. }
  186. }
  187. }
  188. }
  189. void TIM4_IRQHandler() //20ms 1次
  190. {
  191. u8 st;
  192. st=TIM_GetFlagStatus(TIM4, TIM_IT_Update);
  193. if(st!=0)
  194. {
  195. TIM_ClearFlag(TIM4, TIM_IT_Update);
  196. get_sys_time++;
  197. key_Task();
  198. }
  199. }
  200. void Timer4_init() //T4 20ms时钟
  201. {
  202. //
  203. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  204. NVIC_InitTypeDef NVIC_InitStructure;
  205. RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM4,ENABLE);//M
  206. TIM_TimeBaseStructure.TIM_Period = 20000-1; //计数个数 //20ms
  207. TIM_TimeBaseStructure.TIM_Prescaler =72-1;//分频值
  208. TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //分割时钟
  209. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
  210. TIM_DeInit(TIM4);
  211. TIM_TimeBaseInit(TIM4, & TIM_TimeBaseStructure);
  212. TIM_Cmd(TIM4, ENABLE); //使能定时器2
  213. /*以下定时器4中断初始化*/
  214. TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //向上计数溢出产生中断
  215. NVIC_InitStructure.NVIC_IRQChannel =TIM4_IRQn;// TIM4_IRQChannel;
  216. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  217. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  218. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  219. NVIC_Init (&NVIC_InitStructure);
  220. }
  221. void IWDG_Init(u8 prer,u16 rlr)
  222. {
  223. IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
  224. IWDG_SetPrescaler(prer);
  225. IWDG_SetReload(rlr);
  226. IWDG_ReloadCounter();
  227. IWDG_Enable();
  228. }
  229. void IWDG_Feed(void)
  230. {
  231. IWDG_ReloadCounter();//reload
  232. }
  233. //母头uart2接电脑 公头uart1接下位机
  234. int main(void)
  235. {
  236. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
  237. delay_init(); //延时函数初始化
  238. LED_Init(); //初始化与LED连接的硬件接口
  239. uart_init(9600);//串口初始化
  240. uart2_init(9600);
  241. key_gpio_init();
  242. Timer4_init();//初始化定时器
  243. // printf("sys_init\r\n");
  244. // USART2_String((u8*)"sys_init\r\n",10);
  245. IWDG_Init(4,625); //为1s
  246. while(1)
  247. {
  248. #if (version==1)
  249. if(get_sys_time>50)
  250. {
  251. get_sys_time=0;
  252. LED_OUT^=1;
  253. //USART2_String((u8*)"sys_init\r\n",10);
  254. // printf("sys_init\r\n");
  255. }
  256. #elif (version==2)
  257. if(get_sys_time>100)
  258. {
  259. get_sys_time=0;
  260. LED_OUT^=1;
  261. //USART2_String((u8*)"sys_init\r\n",10);
  262. // printf("sys_init\r\n");
  263. }
  264. #endif
  265. user_data_check();
  266. IWDG_Feed();
  267. }
  268. }