久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1843|回復: 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, 下載次數: 22)
PCB Project.7z (3.41 MB, 下載次數: 24)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费在线观看一区二区三区 | 欧美一级黄色免费 | 精品国产一区二区三区性色 | 国产精品久久久一区二区三区 | 一区二区在线不卡 | 久久不卡日韩美女 | 欧美国产视频一区二区 | 伊人无码高清 | 精品一区二区三区在线观看国产 | 国久久| 久久精品视频一区二区 | 狠狠av | 欧美韩一区二区三区 | 亚洲+变态+欧美+另类+精品 | 二区三区视频 | aaa在线 | 亚洲欧洲精品成人久久奇米网 | 日韩欧美二区 | 91久久久久 | 性色av网站 | 久久国产欧美一区二区三区精品 | 久久久www成人免费精品 | 中文字幕一区二区三 | 欧美一级艳情片免费观看 | 久久久91精品国产一区二区三区 | 国产精品国产三级国产aⅴ浪潮 | 蜜月aⅴ国产精品 | 国产欧美一级二级三级在线视频 | 欧美人妖网站 | 国产欧美日韩精品一区二区三区 | 亚洲国产区 | 欧美不卡视频 | 欧美在线天堂 | 国产精品欧美一区二区三区 | 日本人做爰大片免费观看一老师 | 国产高清一区二区三区 | 久久精品视频一区二区 | 精品动漫一区 | 亚洲精彩免费视频 | www.xxxx欧美 | 亚洲一区在线日韩在线深爱 |