找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 196|回复: 0
打印 上一主题 下一主题
收起左侧

基于stm32单片机的智能血压计软件硬件设计 程序原理图PCB

[复制链接]
跳转到指定楼层
楼主
自己diy的一个小项目,还有很多可以开发!
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:
  1. /* Includes ------------------------------------------------------------------*/
  2. #include "main.h"
  3. #include "adc.h"
  4. #include "i2c.h"
  5. #include "rtc.h"
  6. #include "tim.h"
  7. #include "usart.h"
  8. #include "gpio.h"

  9. /* Private includes ----------------------------------------------------------*/
  10. /* USER CODE BEGIN Includes */
  11. #include "oled.h"        // OLED显示屏头文件
  12. #include "stdio.h"       // 标准输入输出头文件
  13. #include "rtc.h"         // 实时时钟头文件
  14. #include "led.h"         // LED控制头文件
  15. #include "key.h"         // 按键控制头文件
  16. #include "ds18B20.h"     // DS18B20温度传感器头文件
  17. #include "eeprom.h"      // EEPROM存储器头文件
  18. //#include "adc0832.h"     // ADC0832模数转换器头文件
  19. #include "string.h"      // 字符串处理头文件
  20. /* USER CODE END Includes */

  21. /* Private typedef -----------------------------------------------------------*/
  22. /* USER CODE BEGIN PTD */

  23. /* USER CODE END PTD */

  24. /* Private define ------------------------------------------------------------*/
  25. /* USER CODE BEGIN PD */
  26. #define SAMPLE_COUNT 20 // 采样次数,调整此值以改变采样率
  27. uint8_t screen = 0; // 当前显示的界面:0表示第一个界面,1表示第二个界面,2表示第三个界面
  28. /* USER CODE END PD */

  29. /* Private macro -------------------------------------------------------------*/
  30. /* USER CODE BEGIN PM */

  31. /* USER CODE END PM */

  32. /* Private variables ---------------------------------------------------------*/

  33. /* USER CODE BEGIN PV */
  34. RTC_DateTypeDef GetData;  // 获取日期结构体
  35. RTC_TimeTypeDef GetTime;  // 获取时间结构体
  36. uint32_t key_Tick;        // 按键时间标志
  37. uint16_t adc_value;       // ADC读取值

  38. uint8_t saveEEPROM = 0;          // 保存EEPROM标志
  39. uint8_t showEEPROM = 0;          // 显示EEPROM标志
  40. uint8_t eepromDisplayed = 0; // 新增变量,用于标记EEPROM值是否已显示
  41. uint8_t measureInProgress = 0;   // 测量进行中的标志
  42. uint16_t highPressure = 0;       // 高压值
  43. uint16_t lowPressure = 0;        // 低压值
  44. uint16_t adc_values[SAMPLE_COUNT];  // ADC采集的值数组
  45. /* USER CODE END PV */

  46. /* Private function prototypes -----------------------------------------------*/
  47. void SystemClock_Config(void);
  48. /* USER CODE BEGIN PFP */

  49. /* USER CODE END PFP */

  50. /* Private user code ---------------------------------------------------------*/
  51. /* USER CODE BEGIN 0 */
  52. void KEY_Process() // 按键功能处理函数
  53. {
  54.     if (uwTick - key_Tick < 20) return; // 防抖处理,避免误触发
  55.     key_Tick = uwTick; // 记录当前时间
  56.     Key_Read(); // 读取按键状态
  57.     if (Trg & 0x01) // 按键1按下
  58.     {
  59.                 HAL_UART_Transmit(&huart3, (uint8_t*)"B", 1, 50); // 通过串口发送字符'B',语音播报:测量中,不要移动和说话
  60.                 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);
  61.         screen = 1; // 切换到第2个界面
  62.         measureInProgress = 1; // 开始测量
  63.         eepromDisplayed = 0; // 重置EEPROM显示标记
  64.     }
  65.     if (Trg & 0x02) // 按键2按下
  66.     {
  67.         screen = 2; // 切换到第3个界面
  68.                 HAL_UART_Transmit(&huart3, (uint8_t*)"C", 1, 50);
  69.         showEEPROM = 1; // 设置显示EEPROM标志
  70.         eepromDisplayed = 0; // 重置EEPROM显示标记
  71.     }
  72.     if (Trg & 0x04) // 按键3按下
  73.     {
  74.         OLED_Clear();
  75.         screen = 0; // 切换到第1个界面   
  76.                 HAL_UART_Transmit(&huart3, (uint8_t*)"A", 1, 50); // 通过串口发送字符'A',语音播报:欢迎使用便携式电子血压计
  77.     }
  78.             if (Trg & 0x08) // 按键4按下
  79.     {
  80.                 OLED_Clear();
  81.         screen = 3; // 切换到第1个界面
  82.                 HAL_UART_Transmit(&huart3, (uint8_t*)"F", 1, 50); // 通过串口发送字符'F',语音播报:时间播报
  83.     }
  84. }

  85. void ADC_Process(uint8_t is_high_pressure)
  86. {
  87.     uint32_t adc_sum = 0;
  88.     uint16_t max_value = 0;
  89.     uint16_t min_value = 0xFFFF;

  90.     for (int i = 0; i < SAMPLE_COUNT; i++) // 采样SAMPLE_COUNT次
  91.     {
  92.         HAL_ADC_Start(&hadc1); // 启动ADC
  93.         HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY); // 等待转换完成
  94.         uint16_t value = HAL_ADC_GetValue(&hadc1); // 获取ADC值
  95.         adc_values[i] = value; // 存储ADC值
  96.         adc_sum += value; // 累加ADC值
  97.         if (value > max_value) max_value = value; // 更新最大值
  98.         if (value < min_value) min_value = value; // 更新最小值
  99.         HAL_ADC_Stop(&hadc1); // 停止ADC
  100.         HAL_Delay(100); // 100ms延时
  101.                
  102. //                Count++;
  103. //                if(Count >= 80)
  104. //                {
  105. //                        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_RESET);//气阀开始放气
  106. //                        Count = 0;
  107. //                }
  108.     }
  109.    
  110.     // 使用去掉最大值和最小值后的均值
  111.     adc_sum -= max_value + min_value;
  112.     uint16_t average_value = adc_sum / (SAMPLE_COUNT - 2);
  113.         
  114. //        float voltage  = average_value * 3.3 / 4095.0;
  115.         float voltage  = average_value * 3.3 / 1150.0;
  116.         float pressure = ((voltage - 0.5) * 300.0) / 4.0;

  117.     if (is_high_pressure)
  118.     {
  119.         highPressure = (int)(pressure * 1.2); // 保存高压值
  120. //                highPressure = average_value; // 保存高压值
  121.     }
  122.     else
  123.     {
  124.         lowPressure = (int)(pressure * 0.8); // 保存低压值
  125. //                lowPressure = average_value; // 保存低压值
  126.     }
  127. }
  128. /*
  129. void Measure_Pressure()
  130. {
  131.     measureInProgress = 1; // 开始测量
  132.         
  133.         if(measureInProgress == 1)
  134.         {
  135.                 HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET);//气阀开始充气
  136.                
  137.                 for (int i = 0; i < 5; i++) // 总共采集5次数据
  138.                 {
  139.                         if (i < 3) // 前3次采集低压值
  140.                         {
  141.                                 ADC_Process(0);
  142.                         }
  143.                         else // 后2次采集高压值
  144.                         {        
  145.                                 ADC_Process(1);        
  146.                         }
  147.                 }
  148.                 measureInProgress = 0; // 测量完成
  149.         }
  150. //        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET);//气阀开始充气
  151.         
  152. //    for (int i = 0; i < 5; i++) // 总共采集5次数据
  153. //    {
  154. //        if (i < 3) // 前3次采集低压值
  155. //        {
  156. //            ADC_Process(0);
  157. //        }
  158. //        else // 后2次采集高压值
  159. //        {
  160. //                        
  161. //            ADC_Process(1);
  162. //                        
  163. //        }
  164. //    }

  165. //    measureInProgress = 0; // 测量完成
  166.         if(measureInProgress == 0)
  167.         {
  168.                         HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_RESET);//气阀开始放气
  169.                         HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET);
  170.                         if((highPressure >= 85) && (highPressure <= 130) && (lowPressure >= 60) && (lowPressure <= 85))
  171.                         {
  172.                                 HAL_UART_Transmit(&huart1, (uint8_t*)"D", 1, 50);
  173.                         }
  174.                         else
  175.                         {
  176.                                 HAL_UART_Transmit(&huart1, (uint8_t*)"E", 1, 50);
  177.                         }
  178.         }
  179. }
  180. */

  181. void Measure_Pressure()
  182. {
  183.     measureInProgress = 1; // 开始测量
  184.     uint32_t startTick = HAL_GetTick(); // 记录开始时间
  185.     int lowPressureSamples = 0; // 低压样本计数
  186.     int highPressureSamples = 0; // 高压样本计数

  187.     // 前6秒充气
  188.     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET); // 开始充气
  189.     while ((HAL_GetTick() - startTick) < 6000) // 在7秒内
  190.     {
  191.         if (lowPressureSamples < 3) // 前3次采集低压值
  192.         {
  193.             ADC_Process(0);
  194.             lowPressureSamples++;
  195.         }
  196.         else if (highPressureSamples < 2) // 后2次采集高压值
  197.         {
  198.             ADC_Process(1);
  199.             highPressureSamples++;
  200.         }
  201.     }

  202.     // 停止充气
  203.     HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_RESET);

  204.     // 如果6秒内没有采集到足够的数据,继续采集直到满足条件
  205.     while (lowPressureSamples < 3 || highPressureSamples < 2)
  206.     {
  207.         if (lowPressureSamples < 3) // 前3次采集低压值
  208.         {
  209.             ADC_Process(0);
  210.             lowPressureSamples++;
  211.         }
  212.         else if (highPressureSamples < 2) // 后2次采集高压值
  213.         {
  214.             ADC_Process(1);
  215.             highPressureSamples++;
  216.         }
  217.     }

  218.     // 等待最后2秒放气
  219.     while ((HAL_GetTick() - startTick) < 7000) // 总共6秒
  220.     {
  221.         // 等待
  222.     }

  223.     // 最后2秒放气
  224.     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // 开始放气

  225.     // 等待测量完成
  226.     while ((HAL_GetTick() - startTick) < 10000) // 总共10秒
  227.     {
  228.         // 等待
  229.     }

  230.     measureInProgress = 0; // 测量完成

  231.     // 检查血压值并发送相应的串口消息
  232.     if((highPressure >= 85) && (highPressure <= 130) && (lowPressure >= 60) && (lowPressure <= 85))
  233.     {
  234.         HAL_UART_Transmit(&huart3, (uint8_t*)"D", 1, 50);
  235.                 LED1_Off();
  236.                 LED2_Off();
  237.                 LED3_On();
  238.     }
  239.     else
  240.     {
  241.         HAL_UART_Transmit(&huart3, (uint8_t*)"E", 1, 50);
  242.                 LED1_Off();
  243.                 LED2_On();
  244.                 LED3_Off();
  245.     }
  246. }

  247. void Save_Pressure_To_EEPROM()
  248. {
  249.     uint8_t highPressureLow = highPressure & 0xFF;
  250.     uint8_t highPressureHigh = (highPressure >> 8) & 0xFF;
  251.     At24c02_Write_Byte(0x00, &highPressureLow);
  252.     At24c02_Write_Byte(0x01, &highPressureHigh);

  253.     uint8_t lowPressureLow = lowPressure & 0xFF;
  254.     uint8_t lowPressureHigh = (lowPressure >> 8) & 0xFF;
  255.     At24c02_Write_Byte(0x02, &lowPressureLow);
  256.     At24c02_Write_Byte(0x03, &lowPressureHigh);

  257.     saveEEPROM = 0;
  258. }

  259. void Show_EEPROM_On_OLED()
  260. {
  261.     uint8_t highPressureLow = 0, highPressureHigh = 0;
  262.     uint8_t lowPressureLow = 0, lowPressureHigh = 0;

  263.     At24c02_Read_Byte(0x00, &highPressureLow);
  264.     At24c02_Read_Byte(0x01, &highPressureHigh);
  265.     uint16_t savedHighPressure = (highPressureHigh << 8) | highPressureLow;

  266.     At24c02_Read_Byte(0x02, &lowPressureLow);
  267.     At24c02_Read_Byte(0x03, &lowPressureHigh);
  268.     uint16_t savedLowPressure = (lowPressureHigh << 8) | lowPressureLow;

  269.     char highPressureString[20];
  270.     char lowPressureString[20];
  271.     snprintf(highPressureString, sizeof(highPressureString), "High: %u mmHg", savedHighPressure);
  272.     snprintf(lowPressureString, sizeof(lowPressureString), "Low : %u mmHg", savedLowPressure);

  273.     OLED_ShowString(2, 2, highPressureString, 16, 0);
  274.     OLED_ShowString(2, 4, lowPressureString, 16, 0);

  275.     showEEPROM = 0;
  276. }

  277. //串口重定义函数
  278. int fputc(int ch, FILE *f)
  279. {
  280.   HAL_UART_Transmit(&huart3, (unsigned char*)ch, 1, 50); // 通过串口发送字符
  281.   return ch; // 返回字符
  282. }

  283. /* USER CODE END 0 */

  284. /**
  285.   * @brief  The application entry point.
  286.   * @retval int
  287.   */
  288. int main(void)
  289. {

  290.   /* USER CODE BEGIN 1 */
  291.                
  292.   /* USER CODE END 1 */

  293.   /* MCU Configuration--------------------------------------------------------*/

  294.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  295.   HAL_Init();

  296.   /* USER CODE BEGIN Init */

  297.   /* USER CODE END Init */

  298.   /* Configure the system clock */
  299.   SystemClock_Config();

  300.   /* USER CODE BEGIN SysInit */

  301.   /* USER CODE END SysInit */

  302.   /* Initialize all configured peripherals */
  303.   MX_GPIO_Init();
  304.   MX_I2C1_Init();
  305.   MX_RTC_Init();
  306.   MX_TIM1_Init();
  307.   MX_TIM6_Init();
  308.   MX_USART3_UART_Init();
  309.   MX_ADC1_Init();
  310.   /* USER CODE BEGIN 2 */
  311.   OLED_Init(); // 初始化OLED显示屏
  312.   LED_Init(); // 初始化LED
  313.   DS18B20_Init(); // 初始化DS18B20温度传感器
  314.   
  315.     /* 设置RTC时间 */
  316.   RTC_set_time(24, 6, 15, 16, 22, 00, RTC_FORMAT_BIN);
  317.   
  318.   HAL_UART_Transmit(&huart3, (uint8_t*)"A", 1, 50); // 通过串口发送字符'A',语音播报:欢迎使用便携式电子血压计
  319.   
  320.   /* USER CODE END 2 */

  321.   /* Infinite loop */
  322.   /* USER CODE BEGIN WHILE */
  323.   while (1)
  324.   {
  325.     /* USER CODE END WHILE */

  326.     /* USER CODE BEGIN 3 */
  327.            if (HAL_GetTick() % 300 == 0) // 每300ms执行一次
  328.     {
  329.       if (screen == 0) // 显示时间和日期的界面
  330.       {
  331. //        HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN); // 获取日期
  332. //        HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN); // 获取时间

  333. //        char timeString[20];
  334. //        snprintf(timeString, sizeof(timeString), "Time: %02d:%02d:%02d", GetTime.Hours, GetTime.Minutes, GetTime.Seconds); // 格式化时间字符串

  335. //        char dateString[20];
  336. //        snprintf(dateString, sizeof(dateString), "Date: %02d-%02d-%02d", GetData.Year, GetData.Month, GetData.Date); // 格式化日期字符串

  337.          // 第一行显示12x12大小的汉字
  338.                 OLED_ShowCHinese(2, 0, 0, 12, 0);   // 显示汉字"欢"
  339.                 OLED_ShowCHinese(14, 0, 1, 12, 0);  // 显示汉字"迎"
  340.                 OLED_ShowCHinese(26, 0, 2, 12, 0);  // 显示汉字"使"
  341.                 OLED_ShowCHinese(38, 0, 3, 12, 0);  // 显示汉字"用"
  342.                 OLED_ShowCHinese(50, 0, 4, 12, 0);  // 显示汉字"便"
  343.                 OLED_ShowCHinese(62, 0, 5, 12, 0);  // 显示汉字"携"
  344.                 OLED_ShowCHinese(74, 0, 6, 12, 0);  // 显示汉字"式"
  345.                 OLED_ShowCHinese(86, 0, 7, 12, 0);  // 显示汉字"血"
  346.                 OLED_ShowCHinese(98, 0, 8, 12, 0);  // 显示汉字"压"
  347.                 OLED_ShowCHinese(110, 0, 9, 12, 0); // 显示汉字"计"

  348.                          // 第二行显示16x16大小的汉字
  349.                 OLED_ShowCHinese(2, 2, 0, 16, 0);   // 显示汉字"温"
  350.                 OLED_ShowCHinese(18, 2, 1, 16, 0);  // 显示汉字"度"
  351.                 OLED_ShowCHinese(34, 2, 2, 16, 0);  // 显示汉字"值"
  352.                 OLED_ShowCHinese(98, 2, 3, 16, 0);  // 显示汉字"℃"

  353.         float temperature = DS18B20_Get_Temperature(); // 获取温度
  354.         char tempString[20];
  355.         snprintf(tempString, sizeof(tempString), ":%.2f", temperature); // 格式化温度字符串

  356.         OLED_ShowString(50, 2, tempString, 16, 0); // 显示温度

  357.         char pressureString[20];
  358.         snprintf(pressureString, sizeof(pressureString), "000mmHg");
  359.         OLED_ShowString(2, 4, pressureString, 16, 0); // 显示默认的血压值
  360.       }
  361.       else if (screen == 1) // 显示测量血压的界面
  362.       {
  363.         if (measureInProgress) // 测量进行中
  364.         {
  365.                   LED1_On();
  366.                   HAL_Delay(200);
  367.                   LED1_Off();
  368.                   HAL_Delay(200);
  369.                   HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_7);                        
  370.           OLED_Clear();
  371.           OLED_ShowCHinese(40, 2, 4, 16, 0); // 显示"测量中"的中文字符
  372.           OLED_ShowCHinese(56, 2, 5, 16, 0);
  373.           OLED_ShowCHinese(72, 2, 6, 16, 0);

  374.                   
  375.                         
  376.           Measure_Pressure(); // 调用测量血压函数,一直等待测量,测量完才进行下列代码

  377.           OLED_Clear();
  378.           OLED_ShowCHinese(2, 2, 7, 16, 0); // 显示高压和低压的中文字符
  379.           OLED_ShowCHinese(18, 2, 8, 16, 0);
  380.           OLED_ShowCHinese(2, 4, 9, 16, 0);
  381.           OLED_ShowCHinese(18, 4, 10, 16, 0);

  382.           char highPressureString[20];
  383.           snprintf(highPressureString, sizeof(highPressureString), ": %u mmHg", highPressure); // 格式化高压字符串
  384.           OLED_ShowString(36, 2, highPressureString, 16, 0); // 显示高压

  385.           char lowPressureString[20];
  386.           snprintf(lowPressureString, sizeof(lowPressureString), ": %u mmHg", lowPressure); // 格式化低压字符串
  387.           OLED_ShowString(36, 4, lowPressureString, 16, 0); // 显示低压

  388.           Save_Pressure_To_EEPROM(); // 保存血压值到EEPROM
  389.           eepromDisplayed = 1; // 标记EEPROM已显示
  390.         }
  391.       }
  392.       else if (screen == 2) // 显示EEPROM数据的界面
  393.       {
  394.         if (!eepromDisplayed) // 如果EEPROM数据尚未显示
  395.         {
  396.           OLED_Clear();
  397.           Show_EEPROM_On_OLED(); // 显示EEPROM中的血压数据
  398.           eepromDisplayed = 1; // 标记EEPROM已显示
  399.         }
  400.       }
  401.           else if(screen == 3)
  402.           {
  403.                 HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN); // 获取当前日期
  404.                 HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN); // 获取当前时间
  405.                                 
  406.                 char timeString[20];
  407.                 snprintf(timeString, sizeof(timeString), "Time: %02d:%02d:%02d", GetTime.Hours, GetTime.Minutes, GetTime.Seconds); // 格式化时间字符串

  408.                 char dateString[20];
  409.                 snprintf(dateString, sizeof(dateString), "Date: %02d-%02d-%02d", GetData.Year, GetData.Month, GetData.Date); // 格式化日期字符串
  410.                                 
  411.                 /* 显示界面 */
  412.                 OLED_ShowCHinese(28, 0, 12, 16, 0);  // 显示“时”
  413.                 OLED_ShowCHinese(44, 0, 13, 16, 0);  // 显示“间”
  414.                 OLED_ShowCHinese(60, 0, 14, 16, 0);  // 显示“显”
  415.                 OLED_ShowCHinese(76, 0, 15, 16, 0);  // 显示“示”
  416.                 OLED_ShowString(5, 4, timeString, 16, 0);  // 显示时间
  417.                 OLED_ShowString(5, 2, dateString, 16, 0);  // 显示日期         
  418.           }
  419.     }

  420.     KEY_Process(); // 按键处理
  421.   }
  422.   /* USER CODE END 3 */
  423. }

  424. /**
  425.   * @brief System Clock Configuration
  426.   * @retval None
  427.   */
  428. void SystemClock_Config(void)
  429. {
  430.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  431.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  432.   RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  433.   /** Initializes the RCC Oscillators according to the specified parameters
  434.   * in the RCC_OscInitTypeDef structure.
  435.   */
  436.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_LSE;
  437.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  438.   RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  439.   RCC_OscInitStruct.LSEState = RCC_LSE_ON;
  440.   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  441.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  442.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  443.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  444.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  445.   {
  446. ……………………

  447. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

资料51hei附件下载:
程序源码.7z (436.66 KB, 下载次数: 10)
PCB Project.7z (3.41 MB, 下载次数: 11)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表