当前位置:   article > 正文

基于Lora实现的屋内火灾报警系统_(1)选择一种无线通信技术,实现火灾报警系统在室内的连接,说明理由并画出组网示意

(1)选择一种无线通信技术,实现火灾报警系统在室内的连接,说明理由并画出组网示意

1.功能设计

  本项目设计一种基于LORA无线通信的屋内火灾报警控制系统,采用DH11温湿度传感器跟MQ-2烟雾传感器作为火警安防系统,对房内温度,湿度,还有环境可燃气体,烟雾等实时检测,LORA通信为通信报警方法,LED跟蜂鸣器为声光报警,SG90舵机做为应急措施的开关。当温度湿度传感部分采集到超过限定温度值和低于限定湿度值时,会将信号发给相对应的传感检测部分,然后传感检测部分将信号发给核心处理器单片机,STM32F103RCT6核心处理单片机引脚电平转换,驱动声光报警系统和应急措施,同时启动LORA通信发送给业主和物业,让救援人员来时了解到大致情况做好充足准备。

 (1) 检测项目:当环境温度≥45℃,湿度≤10%就可被判定为火灾,或者可燃气体甲烷浓度≥5%也可被判定为火灾可能发生,实施报警,并且采取应急措施。烟雾浓度≥5%被认定为有毒害,实施报警。

 

(2) 报警方式:声光报警,小区物业报警,户主报警。

(3) 应急措施:通过舵机控制阻燃气体的发射。

2.硬件设计

  本系统由电源电路、主控制器、温度,湿度检测电路、烟雾可燃气体检测电路,LORA模块收发电路,应急措施电路,信息显示电路,声光报警电路等8个部分组成。

 

3.软件设计

 

 

其余介绍看,评论区报告链接,硬件设备工作流程图,以及步骤介绍等等。。。

程序分享

1.main.c

  1. #include "led.h"
  2. #include "sys.h"
  3. #include "usart.h"
  4. #include "lcd.h"
  5. #include "dh11.h"
  6. #include "adc.h"
  7. #include "sys.h"
  8. #include "delay.h"
  9. #include "pwm.h"
  10. #include "beep.h"
  11. #include "lora.h"
  12. #include "usart1.h"
  13. #include "usart3.h"
  14. char lora_tx_data[100];
  15. char lora_rx_data[100];
  16. int main(void)
  17. {
  18. u16 ADC_SHIDU ;
  19. u8 t=0;
  20. u8 temp;
  21. u8 humi;
  22. delay_init(); //延时函数初始化
  23. Adc_Init(); //延时函数初始化
  24. uart_init(115200); //串口初始化为9600
  25. LED_Init(); //初始化与LED连接的硬件接口
  26. LCD_Init();
  27. Beep_Init();//蜂鸣器初始化
  28. SystemInit(); //配置系统时钟为 72M
  29. USART1_Config();
  30. TIM3_PWM_Init(899,0);//不分频。PWM频率=72000/(899+1)=80Khz
  31. USART3_Config(115200); //USART3 配置
  32. LORA_Init();
  33. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
  34. POINT_COLOR=BLUE;//设置字体为蓝色
  35. LCD_ShowString(60,50,200,16,16,"GHB");
  36. LCD_ShowString(60,70,200,16,16,"GXW");
  37. LCD_ShowString(60,90,200,16,16,"LX");
  38. LCD_ShowString(60,110,200,16,16,"2021/12/6");
  39. LCD_ShowString(60,130,200,16,16,"DHT11 OK");
  40. LCD_ShowString(60,150,200,16,16,"QCM2 OK");
  41. POINT_COLOR=BLUE;//设置字体为蓝色
  42. LCD_ShowString(60,170,200,16,16,"Temp: . C");
  43. LCD_ShowString(60,190,200,16,16,"Humi: %");
  44. LCD_ShowString(60,210,200,16,16,"Qtzl: %");
  45. while(DHT11_Init()) //DHT11初始化
  46. {
  47. LCD_ShowString(60,130,200,16,16,"DHT11 Error");
  48. delay_ms(200);
  49. LCD_Fill(60,130,239,130+16,WHITE);
  50. delay_ms(200);
  51. }
  52. while(1)
  53. {
  54. ADC_SHIDU=ADC_Get_aveg(ADC_Channel_1,10);
  55. ADC_SHIDU = (float)(ADC_SHIDU/4096.0)*100;
  56. {
  57. DHT11_Read_Data(&temp,&humi); //读取温湿度值
  58. LCD_ShowNum(60+40+4,170,temp,2,16); //显示温度
  59. LCD_ShowNum(60+40+28,170,temp%10,1,16); //显示温度
  60. LCD_ShowNum(60+40+6,190,humi,2,16); //显示湿度
  61. LCD_ShowNum(60+40+6,210,ADC_SHIDU,2,16);
  62. delay_ms(100);
  63. }
  64. delay_ms(10);
  65. t++;
  66. if(t==20)
  67. {
  68. t=0;
  69. LED1=!LED1;
  70. }
  71. if(temp>30)
  72. {
  73. delay_ms(100);
  74. LED0=!LED0;
  75. delay_ms(100);
  76. LED1=!LED1;
  77. GPIO_ResetBits(GPIOA, GPIO_Pin_8);//输出低电平
  78. delay_ms(100);
  79. GPIO_SetBits(GPIOA, GPIO_Pin_8);//输出高电平
  80. delay_ms(100); //延时100毫秒
  81. TIM_SetCompare1(TIM3, 195);//0度
  82. delay_ms(100);
  83. TIM_SetCompare1(TIM3, 190);//45度
  84. delay_ms(100);
  85. sprintf((char*)lora_tx_data,"温度:%d‰\r\n烟雾:%d %$", temp, ADC_SHIDU);
  86. lora_transmit(lora_tx_data);
  87. delay_ms(100);
  88. }
  89. if(ADC_SHIDU>40)
  90. {
  91. delay_ms(100);
  92. LED0=!LED0;
  93. delay_ms(100);
  94. LED1=!LED1;
  95. GPIO_ResetBits(GPIOA, GPIO_Pin_8);//输出低电平
  96. delay_ms(100);
  97. GPIO_SetBits(GPIOA, GPIO_Pin_8);//输出高电平
  98. delay_ms(100); //延时100毫秒
  99. TIM_SetCompare1(TIM3, 195);//0度
  100. delay_ms(100);
  101. TIM_SetCompare1(TIM3, 190);//45度
  102. delay_ms(100);
  103. sprintf((char*)lora_tx_data,"温度:%d‰\r\n烟雾:%d %$", temp, ADC_SHIDU);
  104. lora_transmit(lora_tx_data);
  105. delay_ms(100);
  106. }
  107. }
  108. }

2. LORA.C

  1. #include "lora.h"
  2. //#include "usart.h"
  3. #include "usart1.h"
  4. #include "usart3.h"
  5. #include "delay.h"
  6. #include "led.h"
  7. void MD0_Config(void)
  8. {
  9. GPIO_InitTypeDef GPIO_InitStructure;
  10. RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE); // 使能PC端口时钟
  11. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //选择对应的引脚
  12. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  13. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  14. GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PC端口
  15. GPIO_ResetBits(GPIOA, GPIO_Pin_11 ); //拉低
  16. }
  17. void AUX_Config(void)
  18. {
  19. GPIO_InitTypeDef GPIO_InitStructure;
  20. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //开启按键端口PA的时钟
  21. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  22. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  23. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //端口配置为下拉输入
  24. GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化端口
  25. GPIO_ResetBits(GPIOA, GPIO_Pin_4 ); // 关闭所有LED
  26. }
  27. int AUX(void)
  28. {
  29. if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4) == 1)
  30. return 1;
  31. else
  32. return 0;
  33. }
  34. void lora_check(void)
  35. {
  36. int OK_state = 0;
  37. while(AUX())//检测模块是否在忙
  38. {
  39. UART1TX("Lora正忙1");
  40. delay_ms(500);
  41. }
  42. MD0(1);
  43. delay_ms(40);
  44. UART1TX("LORA检测中......");
  45. while(!OK_state)//模块检测成功
  46. {
  47. UART3TX("AT");
  48. UART3Test(&OK_state);
  49. }
  50. UART1TX("LORA检测成功");
  51. UART1TX(" ");
  52. }
  53. void lora_set(void)
  54. {
  55. /*#####设置地址#########*/
  56. int OK_state = 0;
  57. char addr[20] = {0};int t1 = 0,t2 = 0;
  58. unsigned char i = 0;
  59. while(AUX())//等待模块空闲
  60. {
  61. UART1TX("Lora正忙2");
  62. }
  63. MD0(1);
  64. delay_ms(40);
  65. while(!OK_state)//模块检测成功
  66. {
  67. UART3TX("AT+ADDR=00,00");
  68. UART3Test(&OK_state);
  69. UART1TX("地址设置中......");
  70. }
  71. UART1TX("地址为:");
  72. UART3TX("AT+ADDR?");
  73. while(1)
  74. {
  75. UART3GetByte(&i);
  76. if(i==':')
  77. {
  78. while(1)
  79. {
  80. if(UART3GetByte(&i) == 1 && i!='O')
  81. {
  82. addr[t1++]=i;
  83. }
  84. else if(i=='O')
  85. break;
  86. }
  87. while(1)
  88. {
  89. UART1SendByte(addr[t2++]);
  90. if(t1 == t2)
  91. break;
  92. }
  93. break;
  94. }
  95. }
  96. UART1TX(" ");
  97. /*#################设置信道和速率###############*/
  98. OK_state = 0;
  99. t1 = 0;
  100. t2 = 0;
  101. while(!OK_state)//模块检测成功
  102. {
  103. UART3TX("AT+WLRATE=23,5");
  104. UART3Test(&OK_state);
  105. UART1TX("信道速率设置中......");
  106. }
  107. UART1TX("信道,速率为:");
  108. UART3TX("AT+WLRATE?");
  109. while(1)
  110. {
  111. UART3GetByte(&i);
  112. if(i==':')
  113. {
  114. while(1)
  115. {
  116. if(UART3GetByte(&i) == 1 && i!='O')
  117. {
  118. addr[t1++]=i;
  119. }
  120. else if(i=='O')
  121. break;
  122. }
  123. while(1)
  124. {
  125. UART1SendByte(addr[t2++]);
  126. if(t1 == t2)
  127. break;
  128. }
  129. break;
  130. }
  131. }
  132. UART1TX(" ");
  133. /*#############发射功率##############*/
  134. OK_state = 0;
  135. t1 = 0;
  136. t2 = 0;
  137. while(!OK_state)//模块检测成功
  138. {
  139. UART3TX("AT+TPOWER=3");
  140. UART3Test(&OK_state);
  141. UART1TX("发射功率设置中......");
  142. }
  143. UART1TX("发射功率为:");
  144. UART3TX("AT+TPOWER?");
  145. while(1)
  146. {
  147. UART3GetByte(&i);
  148. if(i==':')
  149. {
  150. while(1)
  151. {
  152. if(UART3GetByte(&i) == 1 && i!='O')
  153. {
  154. addr[t1++]=i;
  155. }
  156. else if(i=='O')
  157. break;
  158. }
  159. while(1)
  160. {
  161. UART1SendByte(addr[t2++]);
  162. if(t1 == t2)
  163. break;
  164. }
  165. break;
  166. }
  167. }
  168. UART1TX(" ");
  169. /*#################工作模式###################*/
  170. OK_state = 0;
  171. t1 = 0;
  172. t2 = 0;
  173. while(!OK_state)//模块检测成功
  174. {
  175. UART3TX("AT+CWMODE=0");
  176. UART3Test(&OK_state);
  177. UART1TX("工作模式设置中......");
  178. }
  179. UART1TX("工作模式为:");
  180. UART3TX("AT+CWMODE?");
  181. while(1)
  182. {
  183. UART3GetByte(&i);
  184. if(i==':')
  185. {
  186. while(1)
  187. {
  188. if(UART3GetByte(&i) == 1 && i!='O')
  189. {
  190. addr[t1++]=i;
  191. }
  192. else if(i=='O')
  193. break;
  194. }
  195. while(1)
  196. {
  197. UART1SendByte(addr[t2++]);
  198. if(t1 == t2)
  199. break;
  200. }
  201. break;
  202. }
  203. }
  204. UART1TX(" ");
  205. /*#################发送状态#################*/
  206. OK_state = 0;
  207. t1 = 0;
  208. t2 = 0;
  209. while(!OK_state)//模块检测成功
  210. {
  211. UART3TX("AT+TMODE=0");//0:透明传输,1:定向传输
  212. UART3Test(&OK_state);
  213. UART1TX("发送状态设置中......");
  214. }
  215. UART1TX("发送状态为:");
  216. UART3TX("AT+TMODE?");
  217. while(1)
  218. {
  219. UART3GetByte(&i);
  220. if(i==':')
  221. {
  222. while(1)
  223. {
  224. if(UART3GetByte(&i) == 1 && i!='O')
  225. {
  226. addr[t1++]=i;
  227. }
  228. else if(i=='O')
  229. break;
  230. }
  231. while(1)
  232. {
  233. UART1SendByte(addr[t2++]);
  234. if(t1 == t2)
  235. break;
  236. }
  237. break;
  238. }
  239. }
  240. UART1TX(" ");
  241. /*#############睡眠时间#################*/
  242. OK_state = 0;
  243. t1 = 0;
  244. t2 = 0;
  245. while(!OK_state)//模块检测成功
  246. {
  247. UART3TX("AT+WLTIME=0");
  248. UART3Test(&OK_state);
  249. UART1TX("睡眠时间设置中......");
  250. }
  251. UART1TX("睡眠时间为:");
  252. UART3TX("AT+WLTIME?");
  253. while(1)
  254. {
  255. UART3GetByte(&i);
  256. if(i==':')
  257. {
  258. while(1)
  259. {
  260. if(UART3GetByte(&i) == 1 && i!='O')
  261. {
  262. addr[t1++]=i;
  263. }
  264. else if(i=='O')
  265. break;
  266. }
  267. while(1)
  268. {
  269. UART1SendByte(addr[t2++]);
  270. if(t1 == t2)
  271. break;
  272. }
  273. break;
  274. }
  275. }
  276. UART1TX(" ");
  277. /*################波特率,数据校验位####################*/
  278. OK_state = 0;
  279. t1 = 0;
  280. t2 = 0;
  281. while(!OK_state)//模块检测成功
  282. {
  283. UART3TX("AT+UART=3,0");
  284. UART3Test(&OK_state);
  285. UART1TX("波特率,数据校验位设置中......");
  286. }
  287. UART1TX("波特率,数据校验位为:");
  288. UART3TX("AT+UART?");
  289. while(1)
  290. {
  291. UART3GetByte(&i);
  292. if(i==':')
  293. {
  294. while(1)
  295. {
  296. if(UART3GetByte(&i) == 1 && i!='O')
  297. {
  298. addr[t1++]=i;
  299. }
  300. else if(i=='O')
  301. break;
  302. }
  303. while(1)
  304. {
  305. UART1SendByte(addr[t2++]);
  306. if(t1 == t2)
  307. break;
  308. }
  309. break;
  310. }
  311. }
  312. UART1TX(" ");
  313. MD0(0);
  314. delay_ms(40);
  315. while(AUX());
  316. USART3_Config(9600); //USART3 配置
  317. UART1TX("LORA配置完成######################");
  318. }
  319. void lora_transmit(char* a)
  320. {
  321. int i = 0;
  322. UART3SendByte('#');//起始符
  323. while(a[i] != '$')
  324. {
  325. UART3SendByte(a[i]);
  326. i++;
  327. }
  328. UART3SendByte('$');//结束符
  329. UART3SendByte('\r');
  330. UART3SendByte('\n');
  331. }
  332. void lora_receive(void)
  333. {
  334. unsigned char i = 0;
  335. extern unsigned char lora_rx_data[100];
  336. // extern char lora_rx_data[9];
  337. int t1 = 0,t2 = 0;
  338. while(1)
  339. {
  340. UART3GetByte(&i);
  341. if(i=='#')
  342. {
  343. while(1)
  344. {
  345. if(UART3GetByte(&i) == 1 && i!='$')
  346. {
  347. lora_rx_data[t1++]=i;
  348. }
  349. else if(i=='$')
  350. break;
  351. }
  352. while(1)
  353. {
  354. UART1SendByte(lora_rx_data[t2++]);
  355. if(t1 == t2)
  356. {
  357. UART1SendByte('\r');
  358. UART1SendByte('\n');
  359. break;
  360. }
  361. }
  362. break;
  363. }
  364. }
  365. }
  366. void LORA_Init(void)
  367. {
  368. MD0_Config(); //初始化MD0
  369. AUX_Config();
  370. // LED_Config();
  371. lora_check();
  372. lora_set(); //配置LORA
  373. }

3. DHC11.C

  1. #include "dh11.h"
  2. #include "delay.h"
  3. //复位DHT11
  4. void DHT11_Rst(void)
  5. {
  6. DHT11_IO_OUT(); //SET OUTPUT
  7. DHT11_DQ_OUT=0; //拉低DQ
  8. delay_ms(20); //拉低至少18ms
  9. DHT11_DQ_OUT=1; //DQ=1
  10. delay_us(50); //主机拉高20~40us
  11. }
  12. //等待DHT11的回应
  13. //返回1:未检测到DHT11的存在
  14. //返回0:存在
  15. u8 DHT11_Check(void)
  16. {
  17. u8 retry=0;
  18. DHT11_IO_IN();//SET INPUT
  19. while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us
  20. {
  21. retry++;
  22. delay_us(1);
  23. };
  24. if(retry>=100)return 1;
  25. else retry=0;
  26. while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us
  27. {
  28. retry++;
  29. delay_us(1);
  30. };
  31. if(retry>=100)return 1;
  32. return 0;
  33. }
  34. //从DHT11读取一个位
  35. //返回值:1/0
  36. u8 DHT11_Read_Bit(void)
  37. {
  38. u8 retry=0;
  39. while(DHT11_DQ_IN&&retry<100)//等待变为低电平
  40. {
  41. retry++;
  42. delay_us(1);
  43. }
  44. retry=0;
  45. while(!DHT11_DQ_IN&&retry<100)//等待变高电平
  46. {
  47. retry++;
  48. delay_us(1);
  49. }
  50. delay_us(40);//等待40us
  51. if(DHT11_DQ_IN)return 1;
  52. else return 0;
  53. }
  54. //从DHT11读取一个字节
  55. //返回值:读到的数据
  56. u8 DHT11_Read_Byte(void)
  57. {
  58. u8 i,dat;
  59. dat=0;
  60. for (i=0;i<8;i++)
  61. {
  62. dat<<=1;
  63. dat|=DHT11_Read_Bit();
  64. }
  65. return dat;
  66. }
  67. //从DHT11读取一次数据
  68. //temp:温度值(范围:0~50°)
  69. //humi:湿度值(范围:20%~90%)
  70. //返回值:0,正常;1,读取失败
  71. u8 DHT11_Read_Data(u8 *temp,u8 *humi)
  72. {
  73. u8 buf[5];
  74. u8 i;
  75. DHT11_Rst();
  76. if(DHT11_Check()==0)
  77. {
  78. for(i=0;i<5;i++)//读取40位数据
  79. {
  80. buf[i]=DHT11_Read_Byte();
  81. }
  82. if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
  83. {
  84. *humi=buf[0];
  85. *temp=buf[2];
  86. }
  87. }else return 1;
  88. return 0;
  89. }
  90. //初始化DHT11的IO口 DQ 同时检测DHT11的存在
  91. //返回1:不存在
  92. //返回0:存在
  93. u8 DHT11_Init(void)
  94. {
  95. DHT11_Rst(); //复位DHT11
  96. return DHT11_Check();//等待DHT11的回应
  97. }

4. PWM.C

  1. #include "pwm.h"
  2. //PWM输出初始化
  3. //arr:自动重装值
  4. //psc:时钟预分频数
  5. void TIM3_PWM_Init(u16 arr,u16 psc)
  6. {
  7. GPIO_InitTypeDef GPIO_InitStructure;
  8. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  9. TIM_OCInitTypeDef TIM_OCInitStructure;
  10. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//
  11. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能GPIO外设时钟使能
  12. //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
  13. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM_CH1
  14. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
  15. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  16. GPIO_Init(GPIOA, &GPIO_InitStructure);
  17. TIM_TimeBaseStructure.TIM_Period = 199; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 80K
  18. TIM_TimeBaseStructure.TIM_Prescaler =7199; //设置用来作为TIMx时钟频率除数的预分频值
  19. TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
  20. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
  21. TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
  22. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
  23. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  24. TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
  25. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  26. TIM_OC1Init(TIM3, &TIM_OCInitStructure); //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
  27. TIM_CtrlPWMOutputs(TIM3,ENABLE); //MOE 主输出使能
  28. TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //CH1预装载使能
  29. TIM_ARRPreloadConfig(TIM3, ENABLE); //使能TIMx在ARR上的预装载寄存器
  30. TIM_Cmd(TIM3, ENABLE); //使能TIM1
  31. }

5.ADC.C

  1. #include "adc.h"
  2. void Adc_Init(void)
  3. {
  4. ADC_InitTypeDef ADC_InitStructure;
  5. GPIO_InitTypeDef GPIO_InitStructure;
  6. RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOA, ENABLE);
  7. RCC_ADCCLKConfig(RCC_PCLK2_Div6);//12MHZ
  8. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  9. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  10. GPIO_Init(GPIOA, &GPIO_InitStructure);
  11. ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  12. ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  13. ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  14. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  15. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  16. ADC_InitStructure.ADC_NbrOfChannel = 1;
  17. ADC_Init(ADC1, &ADC_InitStructure);
  18. ADC_Cmd(ADC1, ENABLE);
  19. ADC_ResetCalibration(ADC1);
  20. while(ADC_GetResetCalibrationStatus(ADC1));
  21. ADC_StartCalibration(ADC1);
  22. while(ADC_GetCalibrationStatus(ADC1));
  23. }
  24. u16 Get_val(u8 ch)
  25. {
  26. u16 DataValue;
  27. ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5);
  28. ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  29. while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
  30. DataValue = ADC_GetConversionValue(ADC1);
  31. return DataValue;
  32. }
  33. u16 ADC_Get_aveg(u8 ch,u8 n)
  34. {
  35. u32 ad_sum = 0;
  36. u8 i;
  37. for(i=0;i<n;i++)
  38. {
  39. ad_sum += Get_val(ch);
  40. delay_ms(5);
  41. }
  42. return (ad_sum / n);
  43. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/673083
推荐阅读
相关标签
  

闽ICP备14008679号