每日速看!基于STM32设计的人体健康检测仪
当前文章介绍基于STM32设计的人体健康检测仪。设备采用STM32系列MCU作为主控芯片,配备血氧浓度传感器(使用MAX30102血氧浓度检测传感器)、OLED屏幕和电池供电等外设模块。设备可以广泛应用于医疗、健康等领域。可以帮助医生和病人更好地了解病情变化,提高治疗效果和生活质量。设备也可以用于健康管理、运动监测等场景,帮助用户了解自己的身体状况,保持健康的生活方式。
【资料图】
在项目中,使用了KEIL作为开发平台和工具,通过血氧模块采集人体的心跳和血氧浓度参数,并通过OLED屏幕显示现在的心跳和血氧浓度。同时,通过指标分析,提供采集到的数据与正常指标比对,分析被检测人员的健康状态。采集的数据可通过蓝牙或者WIFI传递给手机APP进行处理,方便用户随时了解自己的身体状况。
本设计采用STM32为主控芯片,搭配血氧浓度传感器和OLED屏幕,实现了人体健康数据的采集和展示,并对采集到的数据进行分析,判断被检测人员的健康状态。同时,设计使用蓝牙或WiFi将采集到的数据传递给手机APP进行处理。
二、项目设计思路2.1 硬件设计(1)主控芯片:STM32系列MCU,负责驱动其他外设模块;
(2)血氧浓度传感器:使用MAX30102血氧浓度检测传感器,用于采集人体的心跳和血氧浓度参数;
(3)OLED屏:用于显示现在的心跳和血氧浓度;
2.2 软件设计(1) 通过血氧模块采集人体的心跳和血氧浓度参数;
(2) 通过OLED屏显示现在的心跳和血氧浓度;
(3) 对采集到的数据进行指标分析,将采集到的数据与正常指标比对,分析被检测人员的健康状态;
(4) 采集的数据可通过蓝牙或WiFi传递给手机APP进行处理。
2.3 技术实现(1)设计采用AD8232心电图(ECG)模块和MAX30102血氧模块采集心跳和血氧浓度参数,并通过I2C接口连接主控芯片STM32。
(2)OLED屏使用I2C接口与主控芯片STM32连接。
(3)采集到的数据通过算法进行指标分析,将采集到的数据与正常指标比对,判断被检测人员的健康状态。
(4)设备通过蓝牙或WiFi将采集到的数据传递给手机APP进行处理。
三、代码设计3.1 MAX30102血氧模块代码I2C协议代码:
#define MAX30102_I2C_ADDR 0xAE void MAX30102_I2C_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; I2C_InitTypeDef I2C_InitStructure; /* Enable GPIOB clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); /* Enable I2C1 and I2C2 clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1 | RCC_APB1Periph_I2C2, ENABLE); // Configure I2C SCL and SDA pins GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; // Open-drain output GPIO_Init(GPIOB, &GPIO_InitStructure); // Configure I2C parametersI2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = 0x00; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = 100000; // 100KHz I2C_Init(I2C1, &I2C_InitStructure); // Enable I2C I2C_Cmd(I2C1, ENABLE); } void MAX30102_I2C_WriteReg(uint8_t reg, uint8_t value) { while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1, MAX30102_I2C_ADDR, I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); I2C_SendData(I2C1, reg); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_SendData(I2C1, value); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_GenerateSTOP(I2C1, ENABLE); } uint8_t MAX30102_I2C_ReadReg(uint8_t reg) { uint8_t value; while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1, MAX30102_I2C_ADDR, I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); I2C_SendData(I2C1, reg); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1, MAX30102_I2C_ADDR, I2C_Direction_Receiver); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); I2C_AcknowledgeConfig(I2C1, DISABLE); value = I2C_ReceiveData(I2C1); I2C_GenerateSTOP(I2C1, ENABLE); return value; } void MAX30102_I2C_ReadArray(uint8_t reg, uint8_t* data, uint8_t len) { while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1, MAX30102_I2C_ADDR, I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); I2C_SendData(I2C1, reg); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1, MAX30102_I2C_ADDR, I2C_Direction_Receiver); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); while(len > 1) { I2C_AcknowledgeConfig(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); *data++ = I2C_ReceiveData(I2C1); len--; } I2C_AcknowledgeConfig(I2C1, DISABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); *data++ = I2C_ReceiveData(I2C1); I2C_GenerateSTOP(I2C1, ENABLE); }
MAX30102的初始化函数和数据获取函数:
void MAX30102_Init(void) { MAX30102_I2C_Init(); // Reset the device MAX30102_I2C_WriteReg(0x09, 0x40); HAL_Delay(100); MAX30102_I2C_WriteReg(0x09, 0x00); // Set FIFO average to 4 samples MAX30102_I2C_WriteReg(0x08, 0x03); // Set LED pulse amplitude MAX30102_I2C_WriteReg(0x0C, 0x1F); MAX30102_I2C_WriteReg(0x0D, 0x1F); // Set sample rate to 100Hz MAX30102_I2C_WriteReg(0x0F, 0x04); // Enable the red LED only MAX30102_I2C_WriteReg(0x11, 0x02); // Read the temperature value to start a reading MAX30102_I2C_ReadReg(0x1F); } uint32_t MAX30102_GetHeartRate(void) { uint8_t buffer[MAX30102_FIFO_DEPTH*4]; MAX30102_Data sensor_data = {0}; uint16_t ir_value; uint16_t red_value; uint8_t byte_count, fifo_overflow; // Check if any data is available in FIFO byte_count = MAX30102_I2C_ReadReg(0x06) - MAX30102_I2C_ReadReg(0x04); if(byte_count > 0) { fifo_overflow = MAX30102_I2C_ReadReg(0x09) & 0x80; // Read the data from FIFO MAX30102_I2C_ReadArray(0x07, buffer, byte_count); // Parse the data for(int i=0; i< byte_count; i+=4) { ir_value = ((uint16_t)buffer[i] < < 8) | buffer[i+1]; red_value = ((uint16_t)buffer[i+2] < < 8) | buffer[i+3]; // Update the sensor data MAX30102_UpdateData(&sensor_data, ir_value, red_value); } if(!fifo_overflow && MAX30102_CheckForBeat(sensor_data.IR_AC_Signal_Current)) { return MAX30102_HeartRate(sensor_data.IR_AC_Signal_Previous, 16); } } return 0; }
数据处理函数:
void MAX30102_UpdateData(MAX30102_Data* data, uint16_t ir_value, uint16_t red_value) { int32_t ir_val_diff = ir_value - data- >IR_AC_Signal_Current; int32_t red_val_diff = red_value - data- >Red_AC_Signal_Current; // Update IR AC and DCsignals data- >IR_AC_Signal_Current = (ir_val_diff + (7 * data- >IR_AC_Signal_Previous)) / 8; data- >IR_DC_Signal_Current = (ir_value + data- >IR_AC_Signal_Current + (2 * data- >IR_DC_Signal_Current)) / 4; data- >IR_AC_Signal_Previous = data- >IR_AC_Signal_Current; // Update Red AC and DC signals data- >Red_AC_Signal_Current = (red_val_diff + (7 * data- >Red_AC_Signal_Previous)) / 8; data- >Red_DC_Signal_Current = (red_value + data- >Red_AC_Signal_Current + (2 * data- >Red_DC_Signal_Current)) / 4; data- >Red_AC_Signal_Previous = data- >Red_AC_Signal_Current; // Update IR and Red AC signal peak-to-peak values if(data- >IR_AC_Signal_Current > data- >IR_AC_Max) data- >IR_AC_Max = data- >IR_AC_Signal_Current; else if(data- >IR_AC_Signal_Current < data- >IR_AC_Min) data- >IR_AC_Min = data- >IR_AC_Signal_Current; if(data- >Red_AC_Signal_Current > data- >Red_AC_Max) data- >Red_AC_Max = data- >Red_AC_Signal_Current; else if(data- >Red_AC_Signal_Current < data- >Red_AC_Min) data- >Red_AC_Min = data- >Red_AC_Signal_Current; } uint8_t MAX30102_CheckForBeat(int32_t ir_val) { staticuint8_t beat_detection_enabled = 1; static uint32_t last_beat_time = 0; static int32_t threshold = 0x7FFFFF; uint32_t delta_time; int32_t beat_amplitude; if(beat_detection_enabled) { // Increment the beat counter MAX30102_beat_counter++; // Calculate the threshold value threshold += (ir_val - threshold) / 8; // Check if a beat has occurred if(ir_val > threshold && MAX30102_beat_counter > 20) { delta_time = micros() - last_beat_time; last_beat_time = micros(); beat_amplitude = ir_val - threshold; if(delta_time < 1000 || delta_time > 2000 || beat_amplitude < 20 || beat_amplitude > 1000) { return 0; } // Reset the beat counter and set the threshold value MAX30102_beat_counter = 0; threshold = ir_val; return 1; } } return 0; } uint32_t MAX30102_HeartRate(int32_t ir_val, uint8_t samples) { int32_t ir_val_sum = 0; // Calculate the sum of IR values for(int i=0; i< samples; i++) { ir_val_sum += MAX30102_IR_Sample_Buffer[i]; } // Calculate the average IR value ir_val_sum /= samples; // Calculate the heart rate return (uint32_t)(60 * MAX30102_SAMPLING_FREQUENCY / (ir_val - ir_val_sum)); }
3.2 OLED显示屏驱动代码I2C协议代码:
#define SSD1306_I2C_ADDR 0x78 void SSD1306_I2C_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; I2C_InitTypeDef I2C_InitStructure; /* Enable GPIOB clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); /* Enable I2C1 and I2C2 clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1 | RCC_APB1Periph_I2C2, ENABLE); // Configure I2C SCL and SDA pins GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; // Open-drain output GPIO_Init(GPIOB, &GPIO_InitStructure); // Configure I2C parameters I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = 0x00; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = 100000; // 100KHz I2C_Init(I2C1, &I2C_InitStructure); // Enable I2C I2C_Cmd(I2C1, ENABLE); } void SSD1306_I2C_WriteReg(uint8_t reg, uint8_t value) { while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1, SSD1306_I2C_ADDR, I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); I2C_SendData(I2C1, 0x00); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_SendData(I2C1, reg); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_SendData(I2C1, value); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_GenerateSTOP(I2C1, ENABLE); } void SSD1306_I2C_WriteArray(uint8_t* data, uint16_t len) { while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); I2C_Send7bitAddress(I2C1, SSD1306_I2C_ADDR, I2C_Direction_Transmitter); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); while(len--) { I2C_SendData(I2C1, *data++); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); } I2C_GenerateSTOP(I2C1, ENABLE); }
SSD1306的初始化函数和数据更新函数:
#define SSD1306_WIDTH 128 #define SSD1306_HEIGHT 64 #define SSD1306_BUFFER_SIZE (SSD1306_WIDTH*SSD1306_HEIGHT/8) uint8_t SSD1306_Buffer[SSD1306_BUFFER_SIZE]; void SSD1306_Init(void) { SSD1306_I2C_Init(); // Turn display off SSD1306_DisplayOff(); // Set the clock to a high value for faster data transfer SSD1306_I2C_WriteReg(0x0F, 0x80); // Set multiplex ratio to default value (63) SSD1306_I2C_WriteReg(0xA8, 0x3F); // Set the display offset to 0 SSD1306_I2C_WriteReg(0xD3, 0x00); // Display start line is 0 SSD1306_I2C_WriteReg(0x40, 0x00); // Set segment remap to inverted SSD1306_I2C_WriteReg(0xA1, 0xC0); // Set COM output scandirection to inverted SSD1306_I2C_WriteReg(0xC8, 0xC0); // Disable display offset shift SSD1306_I2C_WriteReg(0xD7, 0x9F); // Set display clock divide ratio/oscillator frequency to default value (8/0xF0) SSD1306_I2C_WriteReg(0xD5, 0xF0); // Enable charge pump regulator SSD1306_I2C_WriteReg(0x8D, 0x14); // Set memory addressing mode // Set the display to normal mode (not inverted) SSD1306_I2C_WriteReg(0xA6, 0xA6); // Set the contrast to a default value of 127 SSD1306_I2C_WriteReg(0x81, 0x7F); // Turn the display back on SSD1306_DisplayOn(); // Clear the display buffer SSD1306_ClearBuffer(); // Update the display with the cleared buffer SSD1306_UpdateDisplay(); } void SSD1306_UpdateDisplay(void) { uint8_t column, page; }for(page=0; page< 8; page++) { SSD1306_I2C_WriteReg(0xB0+page, 0x00); SSD1306_I2C_WriteReg(0x10, 0x00); SSD1306_I2C_WriteReg(0x00, 0x00); for(column=0; column< SSD1306_WIDTH; column++) { SSD1306_I2C_WriteArray(&SSD1306_Buffer[column + page*SSD1306_WIDTH], 1); } } } void SSD1306_ClearBuffer(void) { memset(SSD1306_Buffer, 0x00, sizeof(SSD1306_Buffer)); } void SSD1306_SetPixel(uint8_t x, uint8_t y, uint8_t color) { if(x >= SSD1306_WIDTH || y >= SSD1306_HEIGHT) { return; } }if(color) { SSD1306_Buffer[x + (y/8)*SSD1306_WIDTH] |= (1 < < (y%8)); } else { SSD1306_Buffer[x + (y/8)*SSD1306_WIDTH] &= ~(1 < < (y%8)); } }
四、总结本设计采用STM32为主控芯片,配合血氧浓度传感器和OLED屏幕,实现了人体健康数据的采集和展示,并通过算法对采集到的数据进行分析,判断被检测人员的健康状态。同时,设计使用蓝牙或WiFi将采集到的数据传递给手机APP进行处理。设计基本满足了人体健康检测仪的技术要求和环境要求。
标签:
-
2022-02-07 14:57:45
奇迹!绝杀!女足亚洲杯逆转夺冠!<
刚刚,中国女足上演逆转绝杀奇迹!她们在亚洲杯决赛中3:2力克韩国队,时隔16年再夺亚洲杯冠军!
-
2022-02-07 14:57:45
中国政府与阿根廷共和国政府签署共建“一带一路”谅解备忘录<
新华社北京2月6日电(记者安蓓)国家发展改革委6日称,国家发展改革委主任何立峰与阿根廷外交、国际贸易和宗教事
-
2022-02-07 14:57:43
中华人民共和国和阿根廷共和国关于深化中阿全面战略伙伴关系的联合声明(全文)<
新华社北京2月6日电中华人民共和国和阿根廷共和国关于深化中阿全面战略伙伴关系的联合声明一、应中方邀请,阿根廷
-
2022-02-07 14:57:40
春节假期国内旅游出游2.51亿人次<
春节遇冬奥,旅游年味浓。根据文化和旅游部数据中心测算,2022年春节假期7天,全国国内旅游出游2 51亿人次,同比
-
2022-02-07 14:57:40
中吉签署关于经典著作互译出版的备忘录 开启两国人文交流互鉴新阶段<
新华社北京2月6日电(记者史竞男)国家主席习近平6日会见来华出席北京2022年冬奥会开幕式的吉尔吉斯斯坦总统扎帕
-
2023-06-23 13:01:38
每日速看!基于STM32设计的人体健康检测仪
本设计采用STM32为主控芯片,配合血氧浓度传感器和OLED屏幕,实现了人
-
2023-06-23 12:01:59
天天热头条丨深潜器发生“灾难性内爆”,《泰坦尼克号》导演卡梅隆:两起悲剧相似令人震惊
据英国《卫报》报道,电影《泰坦尼克号》导演詹姆斯·卡梅隆在22日接受
-
2023-06-23 11:01:48
知网如何引用文献 如何引用文献 天天观热点
1、参考文献是论文的一个构成部分,其引用原则是,用你自己的语言来总
-
2023-06-23 10:25:16
世界热讯:花呗协商还款电话是多少?会上信用吗?
随着互联网金融的发展,越来越多的人开始使用花呗等消费信贷服务。但是
-
2023-06-23 09:57:14
当前热门:新路由_关于新路由简介
1、新路由是百度与联想联手打造的路由产品,2014年9月18日10:00正式发
-
2023-06-23 08:40:14
“深海一号”二期工程油气管道铺设完工
6月22日中午,在海南陵水海域,随着终止封头入水,“深海一号”大气田
-
2023-06-23 07:57:54
环球即时看!山东985大学有几所_山东985大学
1、山东大学不是最差的985。2、山东大学是一所历史悠久、学科齐全、实
-
2023-06-23 06:35:26
OceanGate发布声明 认为泰坦尼克潜艇五名乘客已经死亡|世界热点评
推出泰坦尼克号残骸观光业务公司OceanGate声明称,我们认为泰坦尼克潜
-
2023-06-23 05:02:04
2023百舟竞渡迎端午集中展演在夹江举行
2023年6月21日,安逸在四川瓷都过端午2023年四川省百舟竞渡迎端午集中
-
2023-06-23 02:16:13
天天精选!电脑颜色校准完又变回来_电脑颜色校准
1、如果是win7,win8就非常简单啦,vista好像也有这个功能,右键点桌面
-
2023-06-23 00:42:18
【全球新视野】nergy Transfer以13.5亿美元收购SemGroup宣布新的管道
9月16日(路透社)-石油和天然气管道公司EnergyTransferLP周一表示将以13
-
2023-06-22 22:08:47
小流域综合治理显成效,黄石夏浴湖再现“西塞山前白鹭飞”
小流域综合治理显成效,黄石夏浴湖再现“西塞山前白鹭飞”“西塞山前白
-
2023-06-22 20:59:06
汽车启动电源什么牌子好(电源什么牌子好)|天天滚动
来为大家解答以上问题,汽车启动电源什么牌子好,电源什么牌子好很多人
-
2023-06-22 20:00:28
就读方式怎么填?_就读方式怎么填
1、入学方式填就近入学,就读方式填走读。2、入学方式填普通入学或转入
-
2023-06-22 18:50:02
丙类仓库货架_丙类仓库
1、甲类:1闪点小于28℃的液体2爆炸下限小于10%的气体3常温下能自行分
-
2023-06-22 17:17:55
万宁买房子养老划算吗?首创芭蕾雨逸景PK海云轩养老环境对比!
万宁买房子养老划算吗?首创芭蕾雨逸景PK海云轩养老环境对比!万宁房价
-
2023-06-22 16:19:11
环球新消息丨潍坊市召开2023年跨境人民币暨贸易便利化政策宣讲会
为全面贯彻落实稳外资稳外贸工作部署和要求,推进全市跨境人民币及外汇
-
2023-06-22 15:15:09
世界热文:海南长臂猿数量攀升彰显中国雨林生态保护成效
新华社海口6月22日电(记者陈子薇)37岁的刘辉勤至今记得第一次看到海
-
2023-06-22 14:50:21
电影《消失的她》实时票房破亿-当前速递
每经AI快讯,据灯塔专业版实时数据,截至6月22日13时45分,影片《消失
-
2023-06-22 13:44:23
焦点快播:美炮舰过航台湾海峡,中国海警局回应
长沙晚报掌上长沙6月22日讯据中国海警微博消息中国海警局新闻发言人甘
-
2023-06-22 12:53:55
【当前独家】把诗词画在中华大地上丨一览与“粽”不同的诗画端午
现代快报网是由凤凰出版传媒集团旗下的现代快报倾力打造的江苏新闻门户
-
2023-06-22 11:51:42
世界报道:司机分神开车冲入羊群:撞死20只羊
司机分神开车冲入羊群:撞死20只羊
-
2023-06-22 10:57:55
哪吒闹海捕鱼_哪吒闹海捕鱼电影
1、闹:吵,扰乱,搅乱。2、哪吒闹海就是哪吒搅乱水晶宫,闹得天翻地覆
-
2023-06-22 09:55:28
今日精选:返古纵绤(返古基因)
古纵绤,返古基因这个问题很多朋友还不知道,来为大家解答以上的问题,
-
2023-06-22 09:35:39
这个医院的特色专科又有大动作!-天天微速讯
健康中国行动提出了关注全人群、全生命周期医疗卫生和健康服务的要求。
-
2023-06-22 09:02:22
2023年镍钴矿板块概念股有哪些?(6月22日)
2023年镍钴矿板块概念股有哪些?(6月22日),南方财富网为您整理的2023
-
2023-06-22 07:55:36
红米手机是王一博代言的吗
RedmiK60是红米今年的爆款,相对比之前的机型,很多方面都是有了一定升
-
2023-06-22 07:05:59
兆威机电(003021):6月21日北向资金增持8.99万股-环球要闻
6月21日北向资金增持8 99万股兆威机电。近5个交易日中,获北向资金减持
-
2023-06-22 05:46:05
环球快报:广州华林国际怎么走
1、从广州火车站到广州华林国际机场的路线如下:2、第一条路线:3、从
-
2023-06-22 05:04:24
【世界播资讯】自动确认收货是几天
快递的话只有10天,平邮20天。如果到了期限还没收到话,你可以向卖家提
-
每日速看!基于STM32设计的人体健康检测仪
2023-06-23 13:01:38 -
天天热头条丨深潜器发生“灾难性内爆”,《泰坦尼克号》导演卡梅隆:两起悲剧相似令人震惊
2023-06-23 12:01:59 -
知网如何引用文献 如何引用文献 天天观热点
2023-06-23 11:01:48 -
世界热讯:花呗协商还款电话是多少?会上信用吗?
2023-06-23 10:25:16 -
当前热门:新路由_关于新路由简介
2023-06-23 09:57:14 -
“深海一号”二期工程油气管道铺设完工
2023-06-23 08:40:14 -
环球即时看!山东985大学有几所_山东985大学
2023-06-23 07:57:54