[其他ST产品] 通行闸机2(HAL库)

[复制链接]
1687|42
 楼主| 原来是wjc 发表于 2023-6-29 20:34 | 显示全部楼层
HCSR04.h

  1. #ifndef __HCSR04_H
  2. #define __HCSR04_H
  3. #include "main.h"
  4. #include "tim.h"
  5. #include "stdio.h"



  6. //高电平
  7. #define TRIG1_H  HAL_GPIO_WritePin(HCSR04_TRIG1_GPIO_Port,HCSR04_TRIG1_Pin,GPIO_PIN_SET)
  8. //低电平
  9. #define TRIG1_L  HAL_GPIO_WritePin(HCSR04_TRIG1_GPIO_Port,HCSR04_TRIG1_Pin,GPIO_PIN_RESET)
  10. //高电平
  11. #define TRIG2_H  HAL_GPIO_WritePin(HCSR04_TRIG2_GPIO_Port,HCSR04_TRIG2_Pin,GPIO_PIN_SET)
  12. //低电平
  13. #define TRIG2_L  HAL_GPIO_WritePin(HCSR04_TRIG2_GPIO_Port,HCSR04_TRIG2_Pin,GPIO_PIN_RESET)

  14. void delay_us(uint32_t us);
  15. void SR04_GetData1(void);
  16. void SR04_GetData2(void);

  17. #endif

 楼主| 原来是wjc 发表于 2023-6-29 20:34 | 显示全部楼层
es08a舵机旋转 模拟开门关门代码
控制舵机的代码,我写在了main.c里面,main.c的代码,在最下面会给代码
34831649d7a598592d.png
 楼主| 原来是wjc 发表于 2023-6-29 20:34 | 显示全部楼层
红外遥控 代码
由于代码过于多,这里就直接给到大家,将下面的代码添加到HW_remote.c

(对于定时器输入捕获中断回调函数,我写到了main.c函数里面,最下面会给代码)
 楼主| 原来是wjc 发表于 2023-6-29 20:34 | 显示全部楼层
HW_remote.c

  1. #include "stm32f1xx_hal.h"
  2. #include "HW_remote.h"
  3. #include "main.h"
  4. #include "tim.h"
  5. //遥控器识别码为0
  6. #define REMOTE_ID 0

  7. //遥控器接收状态
  8. //[7]:收到了引导码标志
  9. //[6]:得到了一个按键的所有信息
  10. //[5]:保留       
  11. //[4]:标记上升沿是否已经被捕获                                                                  
  12. //[3:0]:溢出计时器
  13. uint8_t  RmtSta=0;                    
  14. uint16_t Dval;                //下降沿时计数器的值
  15. uint32_t RmtRec=0;        //红外接收到的数据                               
  16. uint8_t  RmtCnt=0;        //按键按下的次数         
  17. uint8_t  key;

  18. //定时器更新(溢出)中断回调函数
  19. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  20. {
  21. //   printf("over\r\n");
  22. if(htim->Instance==TIM1){
  23.                 if(RmtSta&0x80)//上次有数据被接收到了
  24.                 {       
  25.                         RmtSta&=~0X10;                                                //取消上升沿已经被捕获标记
  26.                         if((RmtSta&0X0F)==0X00)RmtSta|=1<<6;//标记已经完成一次按键的键值信息采集
  27.                         if((RmtSta&0X0F)<14)RmtSta++;
  28.                         else
  29.                         {
  30.                                 RmtSta&=~(1<<7);//清空引导标识
  31.                                 RmtSta&=0XF0;        //清空计数器       
  32.                         }                                                                   
  33.                 }       
  34. }
  35. }


  36. //处理红外键盘
  37. //返回值:
  38. //         0,没有任何按键按下
  39. //其他,按下的按键键值.
  40. uint8_t Remote_Scan(void)
  41. {        
  42.         uint8_t sta=0;      
  43.     uint8_t t1,t2;  
  44.         if(RmtSta&(1<<6))//得到一个按键的所有信息了
  45.         {
  46.             t1=RmtRec>>24;                        //得到地址码
  47.             t2=(RmtRec>>16)&0xff;        //得到地址反码
  48.             if((t1==(uint8_t)~t2)&&t1==REMOTE_ID)//检验遥控识别码(ID)及地址
  49.             {
  50.                 t1=RmtRec>>8;
  51.                 t2=RmtRec;        
  52.                 if(t1==(uint8_t)~t2)sta=t1;//键值正确         
  53.                 }   
  54.                 if((sta==0)||((RmtSta&0X80)==0))//按键数据错误/遥控已经没有按下了
  55.                 {
  56.                          RmtSta&=~(1<<6);//清除接收到有效按键标识
  57.                         RmtCnt=0;                //清除按键次数计数器
  58.                 }
  59.         }  
  60.     return sta;
  61. }

 楼主| 原来是wjc 发表于 2023-6-29 20:35 | 显示全部楼层
由于代码过于多,这里就直接给到大家,将下面的代码添加到HW_remote.h
 楼主| 原来是wjc 发表于 2023-6-29 20:35 | 显示全部楼层
HW_remote.h
  1. #ifndef __HW_REMOTE_H
  2. #define __HW_REMOTE_H
  3. #include "stm32f1xx_hal.h"



  4. uint8_t Remote_Scan(void);     //定义功能函数

  5. #endif

 楼主| 原来是wjc 发表于 2023-6-29 20:35 | 显示全部楼层
串口一,在usart.c文件中添加下面函数
(注意:一定要在USER CODE BEGIN-----USER CODE END 之间添加自己的代码,或者是预编译文件,只有写在该注释之间的代码,在使用STM32CubeMX生成代码时,才不会被清空。)

37065649d7a99d5a42.png
 楼主| 原来是wjc 发表于 2023-6-29 20:36 | 显示全部楼层
/*********************************************************
*
*重定义 fputc 函数,就可以使用printf函数打印输出了
*
*********************************************************/
int fputc(int ch,FILE *f)
{
        HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
        return ch;
}
 楼主| 原来是wjc 发表于 2023-6-29 20:36 | 显示全部楼层
最后,在给大家main.c的代码
(注意:一定要在USER CODE BEGIN-----USER CODE END 之间添加自己的代码,或者是预编译文件,只有写在该注释之间的代码,在使用STM32CubeMX生成代码时,才不会被清空。)
 楼主| 原来是wjc 发表于 2023-6-29 20:36 | 显示全部楼层
main.c
  1. /* USER CODE BEGIN Header */
  2. /**
  3.   ******************************************************************************
  4.   * [url=home.php?mod=space&uid=288409]@file[/url]           : main.c
  5.   * [url=home.php?mod=space&uid=247401]@brief[/url]          : Main program body
  6.   ******************************************************************************
  7.   * @attention
  8.   *
  9.   * Copyright (c) 2022 STMicroelectronics.
  10.   * All rights reserved.
  11.   *
  12.   * This software is licensed under terms that can be found in the LICENSE file
  13.   * in the root directory of this software component.
  14.   * If no LICENSE file comes with this software, it is provided AS-IS.
  15.   *
  16.   ******************************************************************************
  17.   */
  18. /* USER CODE END Header */
  19. /* Includes ------------------------------------------------------------------*/
  20. #include "main.h"
  21. #include "tim.h"
  22. #include "usart.h"
  23. #include "gpio.h"

  24. /* Private includes ----------------------------------------------------------*/
  25. /* USER CODE BEGIN Includes */
  26. #include "OLED.h"
  27. #include "hw.h"
  28. #include "HCSR04.h"
  29. #include "HW_remote.h"
  30. /* USER CODE END Includes */

  31. /* Private typedef -----------------------------------------------------------*/
  32. /* USER CODE BEGIN PTD */

  33. /* USER CODE END PTD */

  34. /* Private define ------------------------------------------------------------*/
  35. /* USER CODE BEGIN PD */
  36. /* USER CODE END PD */

  37. /* Private macro -------------------------------------------------------------*/
  38. /* USER CODE BEGIN PM */

  39. /* USER CODE END PM */

  40. /* Private variables ---------------------------------------------------------*/

  41. /* USER CODE BEGIN PV */

  42. /* USER CODE END PV */

  43. /* Private function prototypes -----------------------------------------------*/
  44. void SystemClock_Config(void);
  45. /* USER CODE BEGIN PFP */

  46. /* USER CODE END PFP */

  47. /* Private user code ---------------------------------------------------------*/
  48. /* USER CODE BEGIN 0 */
  49. extern float distant1;//超声波1测量距离
  50. extern float distant2;//超声波2测量距离
  51. extern uint8_t measure_Cnt1;//超声波1状态标志位
  52. extern uint32_t measure_Buf1[];//存放定时器计数值的数组
  53. extern uint8_t measure_Cnt2;//超声波2状态标志位
  54. extern uint32_t measure_Buf2[];//存放定时器计数值的数组
  55. extern uint16_t Dval;                //下降沿时计数器的值
  56. extern uint8_t RmtSta;       
  57. extern uint32_t RmtRec;        //红外接收到的数据                               
  58. extern uint8_t  RmtCnt;        //按键按下的次数



  59. uint8_t  key_num;
  60. //定时器输入捕获中断回调函数
  61. void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)//捕获中断发生时执行
  62. {
  63.        
  64.         if(TIM2 == htim->Instance)// 判断触发的中断的定时器为TIM2
  65.         {
  66.                 switch(measure_Cnt1){
  67.                         case 1:
  68.                                 measure_Buf1[0] = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);//获取当前的捕获值.
  69.                                 __HAL_TIM_SET_CAPTUREPOLARITY(&htim2,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);  //设置为下降沿捕获
  70.                                 measure_Cnt1++;                                            
  71.                                 break;              
  72.                         case 2:
  73.                                 measure_Buf1[1] = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);//获取当前的捕获值.
  74.                                 HAL_TIM_IC_Stop_IT(&htim2,TIM_CHANNEL_1); //停止捕获   或者: __HAL_TIM_DISABLE(&htim5);
  75.                                 measure_Cnt1++;  
  76.                         
  77.                 }
  78.        
  79.         }
  80.         if(TIM3 == htim->Instance)// 判断触发的中断的定时器为TIM3
  81.         {
  82.                 switch(measure_Cnt2){
  83.                         case 1:
  84.                                 measure_Buf2[0] = HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1);//获取当前的捕获值.
  85.                                 __HAL_TIM_SET_CAPTUREPOLARITY(&htim3,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);  //设置为下降沿捕获
  86.                                 measure_Cnt2++;                                            
  87.                                 break;              
  88.                         case 2:
  89.                                 measure_Buf2[1] = HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1);//获取当前的捕获值.
  90.                                 HAL_TIM_IC_Stop_IT(&htim3,TIM_CHANNEL_1); //停止捕获   或者: __HAL_TIM_DISABLE(&htim5);
  91.                                 measure_Cnt2++;  
  92.                         
  93.                 }
  94.        
  95.         }
  96.        
  97.         //红外遥控
  98. if(TIM1 == htim->Instance)
  99. {
  100. //         printf("ic\r\n");
  101.         if(HAL_GPIO_ReadPin(IRpa8_GPIO_Port,IRpa8_Pin))//上升沿捕获
  102.         {
  103.                 TIM_RESET_CAPTUREPOLARITY(&htim1,TIM_CHANNEL_1);   //一定要先清除原来的设置!!
  104.         TIM_SET_CAPTUREPOLARITY(&htim1,TIM_CHANNEL_1,TIM_ICPOLARITY_FALLING);//CC1P=1 设置为下降沿捕获
  105.         __HAL_TIM_SET_COUNTER(&htim1,0);  //清空定时器值             
  106.                           RmtSta|=0X10;                                        //标记上升沿已经被捕获
  107.         }else //下降沿捕获
  108.         {
  109.         Dval=HAL_TIM_ReadCapturedValue(&htim1,TIM_CHANNEL_1);//读取CCR1也可以清CC1IF标志位
  110.         TIM_RESET_CAPTUREPOLARITY(&htim1,TIM_CHANNEL_1);   //一定要先清除原来的设置!!
  111.         TIM_SET_CAPTUREPOLARITY(&htim1,TIM_CHANNEL_1,TIM_ICPOLARITY_RISING);//配置TIM5通道1上升沿捕获
  112.                 if(RmtSta&0X10)                                        //完成一次高电平捕获
  113.                 {
  114.                         if(RmtSta&0X80)//接收到了引导码
  115.                         {
  116.                                                
  117.                                 if(Dval>300&&Dval<800)                        //560为标准值,560us
  118.                                 {
  119.                                         RmtRec<<=1;        //左移一位.
  120.                                         RmtRec|=0;        //接收到0          
  121.                                 }else if(Dval>1400&&Dval<1800)        //1680为标准值,1680us
  122.                                 {
  123.                                         RmtRec<<=1;        //左移一位.
  124.                                         RmtRec|=1;        //接收到1
  125.                                 }else if(Dval>2200&&Dval<2600)        //得到按键键值增加的信息 2500为标准值2.5ms
  126.                                 {
  127.                                         RmtCnt++;                 //按键次数增加1次
  128.                                         RmtSta&=0XF0;        //清空计时器               
  129.                                 }
  130.                         }else if(Dval>4200&&Dval<4700)                //4500为标准值4.5ms
  131.                                 {
  132.                                         RmtSta|=1<<7;        //标记成功接收到了引导码
  133.                                         RmtCnt=0;                //清除按键次数计数器
  134.                                 }                                                 
  135.                         }
  136.                 RmtSta&=~(1<<4);
  137.                 }                                                                  
  138.         }
  139.        
  140.        
  141. }


  142. //PWM控制舵机
  143. // angle:角度值,500-1000-1500-2000-2500
  144. //角度
  145. uint16_t angle;
  146. void Servo_Control(angle)
  147. {
  148.         //设置默认的占空比值
  149. //   __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, (uint16_t )angle / 180 * 2000 + 500);
  150.         __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, angle);
  151. }
  152. /* USER CODE END 0 */

  153. /**
  154.   * @brief  The application entry point.
  155.   * @retval int
  156.   */
  157. int main(void)
  158. {
  159.   /* USER CODE BEGIN 1 */
  160.   //超声波设置距离
  161.   float jl;
  162.   /* USER CODE END 1 */

  163.   /* MCU Configuration--------------------------------------------------------*/

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

  166.   /* USER CODE BEGIN Init */

  167.   /* USER CODE END Init */

  168.   /* Configure the system clock */
  169.   SystemClock_Config();

  170.   /* USER CODE BEGIN SysInit */

  171.   /* USER CODE END SysInit */

  172.   /* Initialize all configured peripherals */
  173.   MX_GPIO_Init();
  174.   MX_TIM2_Init();
  175.   MX_USART1_UART_Init();
  176.   MX_TIM3_Init();
  177.   MX_TIM1_Init();
  178.   MX_TIM4_Init();
  179.   /* USER CODE BEGIN 2 */
  180.         HAL_TIM_Base_Start_IT(&htim1);
  181.   HAL_TIM_IC_Start_IT(&htim1,TIM_CHANNEL_1);
  182.         HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_1);

  183.         __HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_1, 500);
  184.   printf("test\r\n");
  185.        
  186.        
  187.   OLED_Init();
  188.        
  189.        
  190.         OLED_ShowCHinese(0, 0, 3);                                                        //人
  191.         OLED_ShowCHinese(0, 16, 4);                                                 //数
  192.   OLED_ShowCHinese(0, 32, 8);                                                        //:

  193.   OLED_ShowCHinese(2, 0, 0);                                                        //超
  194.         OLED_ShowCHinese(2, 16, 1);                                                 //声
  195.         OLED_ShowCHinese(2, 32, 2);                                                 //波
  196.         OLED_ShowCHinese(2, 48, 9);                                                 //1
  197.         OLED_ShowCHinese(2, 64, 8);                                                        //:
  198.         OLED_ShowCHinese(4, 0, 0);                                                        //超
  199.         OLED_ShowCHinese(4, 16, 1);                                                 //声
  200.         OLED_ShowCHinese(4, 32, 2);                                                 //波
  201.         OLED_ShowCHinese(4, 48, 10);                                                 //2
  202.         OLED_ShowCHinese(4, 64, 8);                                                        //:
  203.        
  204.         OLED_ShowCHinese(6, 0, 15);                                                 //键
  205.         OLED_ShowCHinese(6, 16, 16);                                                 //值
  206.         OLED_ShowCHinese(6, 32, 8);                                                        //:
  207.         OLED_ShowCHinese(6, 90, 13);                                                 //关
  208.         OLED_ShowCHinese(6, 106, 14);                                                 //闭
  209.        
  210. //        Servo_Control(0);
  211.   /* USER CODE END 2 */

  212.   /* Infinite loop */
  213.   /* USER CODE BEGIN WHILE */
  214.   while (1)
  215.   {
  216.                 //显示人数
  217.                 hw_git();//获取电平
  218.                 OLED_ShowNum(1,7,number,3);//显示无符号数
  219.                 //超声波1检测距离
  220.                 SR04_GetData1();
  221.                 OLED_ShowNum(2,10,distant1,2);
  222.                 OLED_ShowChar(2,12,'.');
  223.                 OLED_ShowNum(2,13,(uint16_t)(distant1*100)%100,2);
  224.                 if(distant1<=15)
  225.                 {
  226.                         angle= 2200;
  227.                         Servo_Control(angle);
  228.                         OLED_ShowCHinese(6, 90, 11);                                                 //打
  229.                         OLED_ShowCHinese(6, 106, 12);                                                 //开
  230.                         angle=500;
  231.                 }
  232.                 //超声波2检测距离
  233.                 SR04_GetData2();
  234.                 OLED_ShowNum(3,10,distant2,2);
  235.                 OLED_ShowChar(3,12,'.');
  236.                 OLED_ShowNum(3,13,(uint16_t)(distant2*100)%100,2);
  237.                 if(distant2<=10)
  238.                 {
  239.                         angle= 500;
  240.                         Servo_Control(angle);
  241.                         OLED_ShowCHinese(6, 90, 13);                                                 //关
  242.                         OLED_ShowCHinese(6, 106, 14);                                                 //闭
  243.                 }
  244.                 //提示
  245.                 key_num=Remote_Scan();
  246.                 if(key_num)
  247.                 {
  248.                         printf("键值:%d\r\n",key_num);
  249.                         OLED_ShowNum(4,6,key_num,3);
  250.                         switch (key_num)
  251.                         {
  252.                                 case 104:
  253.                                         angle= 2200;
  254.                                         OLED_ShowCHinese(6, 90, 11);                                                 //打
  255.                                         OLED_ShowCHinese(6, 106, 12);                                                 //开
  256.                                   break;
  257.                                 case 176:
  258.                                         angle= 500;
  259.                                         OLED_ShowCHinese(6, 90, 13);                                                 //关
  260.                                         OLED_ShowCHinese(6, 106, 14);                                                 //闭
  261.                                   break;
  262.                                 default:
  263.           break;
  264.                         }
  265.                         key_num=0;
  266.                         Servo_Control(angle);
  267.                 }
  268.                
  269.     /* USER CODE END WHILE */

  270.     /* USER CODE BEGIN 3 */
  271.   }
  272.        
  273.        
  274.   /* USER CODE END 3 */
  275. }

  276. /**
  277.   * @brief System Clock Configuration
  278.   * @retval None
  279.   */
  280. void SystemClock_Config(void)
  281. {
  282.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  283.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  284.   /** Initializes the RCC Oscillators according to the specified parameters
  285.   * in the RCC_OscInitTypeDef structure.
  286.   */
  287.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  288.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  289.   RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  290.   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  291.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  292.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  293.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  294.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  295.   {
  296.     Error_Handler();
  297.   }
  298.   /** Initializes the CPU, AHB and APB buses clocks
  299.   */
  300.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  301.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  302.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  303.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  304.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  305.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  306.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  307.   {
  308.     Error_Handler();
  309.   }
  310. }

  311. /* USER CODE BEGIN 4 */

  312. /* USER CODE END 4 */

  313. /**
  314.   * @brief  This function is executed in case of error occurrence.
  315.   * @retval None
  316.   */
  317. void Error_Handler(void)
  318. {
  319.   /* USER CODE BEGIN Error_Handler_Debug */
  320.   /* User can add his own implementation to report the HAL error return state */
  321.   __disable_irq();
  322.   while (1)
  323.   {
  324.   }
  325.   /* USER CODE END Error_Handler_Debug */
  326. }

  327. #ifdef  USE_FULL_ASSERT
  328. /**
  329.   * @brief  Reports the name of the source file and the source line number
  330.   *         where the assert_param error has occurred.
  331.   * @param  file: pointer to the source file name
  332.   * @param  line: assert_param error line source number
  333.   * @retval None
  334.   */
  335. void assert_failed(uint8_t *file, uint32_t line)
  336. {
  337.   /* USER CODE BEGIN 6 */
  338.   /* User can add his own implementation to report the file name and line number,
  339.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  340.   /* USER CODE END 6 */
  341. }
  342. #endif /* USE_FULL_ASSERT */


 楼主| 原来是wjc 发表于 2023-6-29 20:36 | 显示全部楼层
完整效果 83513649d7addc5329.png
Undshing 发表于 2023-7-1 23:17 | 显示全部楼层
遥控是怎么实现的啊?
万图 发表于 2023-12-30 07:12 | 显示全部楼层

把这干扰信号再次辐射出去
Uriah 发表于 2023-12-30 08:15 | 显示全部楼层

对变换器效率测量
帛灿灿 发表于 2023-12-30 10:11 | 显示全部楼层

印制电路板(PCB)的线路设计
Bblythe 发表于 2023-12-30 11:14 | 显示全部楼层

含有延展到远高于基本开关频率的谐波
Bblythe 发表于 2023-12-30 11:14 | 显示全部楼层

含有延展到远高于基本开关频率的谐波
周半梅 发表于 2023-12-30 13:10 | 显示全部楼层

需要设定一个阈值来对像素点进行设置
Pulitzer 发表于 2023-12-30 14:13 | 显示全部楼层

输入电容主要是起到高频能量存储器的作用
童雨竹 发表于 2023-12-30 16:09 | 显示全部楼层

二值化就是让图像的像素点矩阵中的每个像素点的灰度值为0(黑色)或者255(白色
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部