蓝牙模块HC05
試驗都通過:
- USB-TTL+藍牙模塊與手機藍牙通訊,測試通過,能夠互發數據并接收;
- STM32串口藍牙與手機藍牙通訊,測試通過;輸入1,LED亮,輸入2,LED滅,輸入其它字符,LED亮;
- STM32串口藍牙與PC藍牙通訊,測試通過;輸入1,LED亮,輸入2,LED滅,輸入其它字符,LED亮;
?
1. USB-TTL驅動安裝,連接藍牙模塊
?
?
?
2. 藍牙模塊的調試
2.1 兩種工作模式:
HC-05藍牙串口通訊模塊具有兩種工作模式:命令響應工作模式和自動連接工作模式。在自動連接工作模式下模塊又可分為主(Master)、從(Slave)和回環(Loopback)三種工作角色。
- 當模塊處于自動連接工作模式時,將自動根據事先設定的方式連接的數據傳輸;
- 當模塊處于命令響應工作模式時能執行AT命令,用戶可向模塊發送各種AT 指令,為模塊設定控制參數或發布控制命令。
2.2 進入命令響應工作模式?
進入命令響應工作模式有兩種方法:
- 模塊上電,未配對情況下就是AT模式,波特率為模塊本身的波特率,默認:9600,發送一次AT指令時需要置高一次PIO11;
- PIO11 置高電平后,再給模塊上電,此時模塊進入AT 模式,波特率固定為:38400,可以直接發送AT指令。
2.3 什么叫做置高一次PIO11?
在藍牙模塊中有一個小按鍵,按一下就置高一次PIO11。也就是說,第一種方法需要每發送一次AT指令按一次;而第二種方式是長按的過程中上電,之后就無需再管了,直接發送AT命令即可。
需要注意一下,兩種進入命令響應工作模式的方式使用的波特率是不一樣的,建議使用第二種方式。
2.4 怎么區分進了命令響應工作模式呢?
在藍牙模塊上有燈,當燈快閃的時候,就是自動連接工作模式;當燈慢閃的時候,就是命令響應工作模式。
2.5 串口調試助手發送AT命令格式
串口軟件發送給HC-05藍牙模塊AT指令 ,必須嚴格按照格式發送才可以(即使看不到格式情況),否則返回錯誤ERROR或者沒有反應,格式如下兩種:
1.AT+一個回車;
2.AT命令+勾選發送新行
2.6?AT命令
進入到命令響應工作模式之后,就可以使用串口調試助手進行藍牙調試了。
首先有一點,AT指令不區分大小寫,下面介紹常用的AT指令:
| 指令名 | 響應 | 含義 |
| AT | OK | 測試指令 |
| AT+RESET | OK | 模塊復位 |
| AT+VERSION? | +VERSION:<Param> OK | 獲得軟件版本號 |
| AT+ORGL | OK | 恢復默認狀態 |
| AT+ADDR? | +ADDR:<Param> OK | 獲得藍牙模塊地址 |
| AT+NAME=<Param> | OK | 設置設備名稱 |
| AT+NAME? | +NAME:<Param> OK | 獲得設備名稱 |
| AT+PSWD=<Param> | OK | 設置模塊密碼 |
| AT+PSWD? | +PSWD:<Param> OK | 獲得模塊密碼 |
| AT+UART=<Param1>,<Param2>,<Param3>,輸入數據去掉尖括號 | OK | 設置串口參數 |
| AT+UART? | +UART:<Param1>,<Param2>,<Param3> OK | 獲得串口參數 |
2.7?AT命令之設置串口
- AT+UART?:獲得串口參數,串口的參數一共有三個,波特率、停止位、檢驗位。其取值如下:
| 參數名稱 | 取值 |
| 波特率 | 2400、4800、9600、19200、38400、5760、 115200、230400、460800、921600、1382400 |
| 停止位 | 0:1位 1:2位 |
| 校驗位 | 0:NONE? 1:Odd? 2:Even |
設置藍牙串口的波特率:115200。之后的內容,就會采用這個波特率來進行通訊。
?
?
3. PC藍牙模塊與手機傳輸數據
3.1 藍牙模塊與USB-TTL轉換模塊連接,再連接到電腦上,進入自動連接工作模式,打開軟件野火的多功能調試助手fireTools或其它串口調試工具,在設置中選擇編碼為GB18030或UTF-8。
3.2 手機下載并打開“藍牙串口APP”,連接藍牙模塊,藍牙名HC05,配對碼1234,設置編碼與串口調試助手一致,在聊天界面下接收發送數據。
3.3 然后在電腦上的串口調試助手和手機的“藍牙串口APP”之間就可以相互傳輸了,互相發送漢字或字符串試驗。偶爾出現亂碼,可能是我的USB-TTL-藍牙模塊的線太長的原因,干擾導致。
4.?STM32藍牙模塊與電腦通訊
藍牙模塊上電,電腦控制面板搜索藍牙設備,密碼匹配,則電腦與透傳模塊將建立起連接,如果以前沒有安裝過藍牙串口設備,則系統將自動安裝驅動并生成虛擬串口,設備管理器打開串口設置通信格式或者使用串口調試軟件進行設置。打開這個端口的時候藍牙模塊的LED會由快閃變為雙閃,這時只需要把藍牙模塊當成是電腦的固定波特率的串口一樣使用即可,只不過它是無線的。
5.STM32藍牙模塊與手機通訊
實現功能:手機通過藍牙,向STM32單片機發送消息,STM32接收到消息之后原封不動的返回給手機,同時輸入1、2、其它字符控制LED燈。
連線:使用USART5進行試驗,也就是說STM32選取PC12(TX)、PD2(RX)來和HC-05進行連接,見下圖UART5;同時手機通過藍牙來和HC-05進行連接。
原理:手機通過藍牙傳輸到HC-05上,再通過串口和STM32通信;而之前一般都是電腦上通過USB線轉串口的方式,通過串口和STM32通信。本質上沒有區別的。
說白了,只是個藍牙轉串口的設備,只要知道串口怎么編程使用,就可以了,實現了所謂的透明傳輸。藍牙的相關一切都被封裝起來了,都不需要接觸到。
?
5. STM32控制程序
/********************************************************************************* @file main.c* @author fire* @version V1.0* @date 2013-xx-xx* @brief 測試led******************************************************************************* @attention** 實驗平臺:秉火 F103-霸道 STM32 開發板 * 論壇 :http://www.firebbs.cn* 淘寶 :http://firestm32.taobao.com********************************************************************************/ #include "stm32f10x.h" #include "bsp_led.h" #include "bsp_usart.h" #include "bsp_rccclkconfig.h"int main(void) { USART_Config();LED_GPIO_Config();HSE_SetSysClk( RCC_PLLMul_6 );/*********************藍牙串口輸入輸出、控制LED**********************************************/ printf( "藍牙串口輸入輸出、控制LED測試\n" );Usart_SendStr(DEBUG_USARTx, "請輸入1、2、3,觀察LED和返回值:");// Usart_SendByte(DEBUG_USARTx,'A'); // Usart_SendHalfWord(DEBUG_USARTx, 0xff56); // Usart_SendArray(DEBUG_USARTx, a,10);while (1){} } /*********************************************END OF FILE**********************/?
#include "bsp_usart.h"static void NVIC_Configuration(void) {NVIC_InitTypeDef NVIC_InitStructure;/* 嵌套向量中斷控制器組選擇 */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);/* 配置USART為中斷源 */NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;/* 搶斷優先級*/NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;/* 子優先級 */NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;/* 使能中斷 */NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;/* 初始化配置NVIC */NVIC_Init(&NVIC_InitStructure); }void USART_Config(void) {GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;// 打開串口GPIO的時鐘DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);// 打開串口外設的時鐘DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);// 將USART Tx的GPIO配置為推挽復用模式GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);// 將USART Rx的GPIO配置為浮空輸入模式GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);// 配置串口的工作參數// 配置波特率USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;// 配置 針數據字長USART_InitStructure.USART_WordLength = USART_WordLength_8b;// 配置停止位USART_InitStructure.USART_StopBits = USART_StopBits_1;// 配置校驗位USART_InitStructure.USART_Parity = USART_Parity_No ;// 配置硬件流控制USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;// 配置工作模式,收發一起USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;// 完成串口的初始化配置USART_Init(DEBUG_USARTx, &USART_InitStructure);// 串口中斷優先級配置NVIC_Configuration();// 使能串口接收中斷USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE); // 使能串口USART_Cmd(DEBUG_USARTx, ENABLE); }/* 發送一個字節 */ void Usart_SendByte(USART_TypeDef* pUSARTx, uint8_t data) {USART_SendData(pUSARTx, data);while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET ); }/* 發送兩個字節的數據 */ void Usart_SendHalfWord(USART_TypeDef* pUSARTx, uint16_t data) {uint8_t temp_h,temp_l;temp_h = (data&0xff00) >> 8 ;temp_l = data&0xff;USART_SendData(pUSARTx, temp_h);while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET );USART_SendData(pUSARTx, temp_l);while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET ); }/* 發送8位數據的數組 */ void Usart_SendArray(USART_TypeDef* pUSARTx, uint8_t *array,uint8_t num) {uint8_t i;for( i=0; i<num; i++ ){Usart_SendByte(pUSARTx, array[i]);}while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TC) == RESET ); }/* 發送字符串 */ void Usart_SendStr(USART_TypeDef* pUSARTx, uint8_t *str) {uint8_t i=0;do{Usart_SendByte(pUSARTx, *(str+i));i++;}while(*(str+i) != '\0');while( USART_GetFlagStatus(pUSARTx, USART_FLAG_TC) == RESET ); }///重定向c庫函數printf到串口,重定向后可使用printf函數 int fputc(int ch, FILE *f) {/* 發送一個字節數據到串口 */USART_SendData(DEBUG_USARTx, (uint8_t) ch);/* 等待發送完畢 */while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET); return (ch); }///重定向c庫函數scanf到串口,重寫向后可使用scanf、getchar等函數 int fgetc(FILE *f) {/* 等待串口輸入數據 */while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);return (int)USART_ReceiveData(DEBUG_USARTx); } #ifndef __BSP_USART_H #define __BSP_USART_H#include "stm32f10x.h" #include <stdio.h>#define DEBUG_USART1 0 #define DEBUG_USART2 0 #define DEBUG_USART3 0 #define DEBUG_USART4 0 #define DEBUG_USART5 1#if DEBUG_USART1 // 串口1-USART1 #define DEBUG_USARTx USART1 #define DEBUG_USART_CLK RCC_APB2Periph_USART1 #define DEBUG_USART_APBxClkCmd RCC_APB2PeriphClockCmd #define DEBUG_USART_BAUDRATE 115200// USART GPIO 引腳宏定義 #define DEBUG_USART_GPIO_CLK (RCC_APB2Periph_GPIOA) #define DEBUG_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd#define DEBUG_USART_TX_GPIO_PORT GPIOA #define DEBUG_USART_TX_GPIO_PIN GPIO_Pin_9 #define DEBUG_USART_RX_GPIO_PORT GPIOA #define DEBUG_USART_RX_GPIO_PIN GPIO_Pin_10#define DEBUG_USART_IRQ USART1_IRQn #define DEBUG_USART_IRQHandler USART1_IRQHandler#elif DEBUG_USART2 //串口2-USART2 #define DEBUG_USARTx USART2 #define DEBUG_USART_CLK RCC_APB1Periph_USART2 #define DEBUG_USART_APBxClkCmd RCC_APB1PeriphClockCmd #define DEBUG_USART_BAUDRATE 115200// USART GPIO 引腳宏定義 #define DEBUG_USART_GPIO_CLK (RCC_APB2Periph_GPIOA) #define DEBUG_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd#define DEBUG_USART_TX_GPIO_PORT GPIOA #define DEBUG_USART_TX_GPIO_PIN GPIO_Pin_2 #define DEBUG_USART_RX_GPIO_PORT GPIOA #define DEBUG_USART_RX_GPIO_PIN GPIO_Pin_3#define DEBUG_USART_IRQ USART2_IRQn #define DEBUG_USART_IRQHandler USART2_IRQHandler#elif DEBUG_USART3 //串口3-USART3 #define DEBUG_USARTx USART3 #define DEBUG_USART_CLK RCC_APB1Periph_USART3 #define DEBUG_USART_APBxClkCmd RCC_APB1PeriphClockCmd #define DEBUG_USART_BAUDRATE 115200// USART GPIO 引腳宏定義 #define DEBUG_USART_GPIO_CLK (RCC_APB2Periph_GPIOB) #define DEBUG_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd#define DEBUG_USART_TX_GPIO_PORT GPIOB #define DEBUG_USART_TX_GPIO_PIN GPIO_Pin_10 #define DEBUG_USART_RX_GPIO_PORT GPIOB #define DEBUG_USART_RX_GPIO_PIN GPIO_Pin_11#define DEBUG_USART_IRQ USART3_IRQn #define DEBUG_USART_IRQHandler USART3_IRQHandler#elif DEBUG_USART4 //串口4-UART4 #define DEBUG_USARTx UART4 #define DEBUG_USART_CLK RCC_APB1Periph_UART4 #define DEBUG_USART_APBxClkCmd RCC_APB1PeriphClockCmd #define DEBUG_USART_BAUDRATE 115200// USART GPIO 引腳宏定義 #define DEBUG_USART_GPIO_CLK (RCC_APB2Periph_GPIOC) #define DEBUG_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd#define DEBUG_USART_TX_GPIO_PORT GPIOC #define DEBUG_USART_TX_GPIO_PIN GPIO_Pin_10 #define DEBUG_USART_RX_GPIO_PORT GPIOC #define DEBUG_USART_RX_GPIO_PIN GPIO_Pin_11#define DEBUG_USART_IRQ UART4_IRQn #define DEBUG_USART_IRQHandler UART4_IRQHandler#elif DEBUG_USART5 //串口5-UART5 #define DEBUG_USARTx UART5 #define DEBUG_USART_CLK RCC_APB1Periph_UART5 #define DEBUG_USART_APBxClkCmd RCC_APB1PeriphClockCmd #define DEBUG_USART_BAUDRATE 115200// USART GPIO 引腳宏定義 #define DEBUG_USART_GPIO_CLK (RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD) #define DEBUG_USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd#define DEBUG_USART_TX_GPIO_PORT GPIOC #define DEBUG_USART_TX_GPIO_PIN GPIO_Pin_12 #define DEBUG_USART_RX_GPIO_PORT GPIOD #define DEBUG_USART_RX_GPIO_PIN GPIO_Pin_2#define DEBUG_USART_IRQ UART5_IRQn #define DEBUG_USART_IRQHandler UART5_IRQHandler#endifvoid USART_Config(void); void Usart_SendByte(USART_TypeDef* pUSARTx, uint8_t data); void Usart_SendHalfWord(USART_TypeDef* pUSARTx, uint16_t data); void Usart_SendArray(USART_TypeDef* pUSARTx, uint8_t *array,uint8_t num); void Usart_SendStr(USART_TypeDef* pUSARTx, uint8_t *str); #endif /* __BSP_USART_H */ //晶振8M改為12M #include "bsp_rccclkconfig.h"void HSE_SetSysClk( uint32_t RCC_PLLMul_x ) {ErrorStatus HSEStatus;// 把RCC 寄存器復位成復位值RCC_DeInit(); // 使能 HSE RCC_HSEConfig(RCC_HSE_ON);HSEStatus = RCC_WaitForHSEStartUp();if( HSEStatus == SUCCESS ){// 使能預取指FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);FLASH_SetLatency(FLASH_Latency_2);RCC_HCLKConfig(RCC_SYSCLK_Div1);RCC_PCLK1Config(RCC_HCLK_Div2);RCC_PCLK2Config(RCC_HCLK_Div1);// 配置 PLLCLK = HSE * RCC_PLLMul_xRCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_x);// 使能PLLRCC_PLLCmd(ENABLE);// 等待PLL穩定while( RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET );// 選擇系統時鐘RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);while( RCC_GetSYSCLKSource() != 0x08 );}else{/* 如果HSE 啟動失敗,用戶可以在這里添加處理錯誤的代碼 */} }void HSI_SetSysClk( uint32_t RCC_PLLMul_x ) {__IO uint32_t HSIStatus = 0;// 把RCC 寄存器復位成復位值RCC_DeInit(); // 使能 HSI RCC_HSICmd(ENABLE);HSIStatus = RCC->CR & RCC_CR_HSIRDY;if( HSIStatus == RCC_CR_HSIRDY ){// 使能預取指FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);FLASH_SetLatency(FLASH_Latency_2);RCC_HCLKConfig(RCC_SYSCLK_Div1);RCC_PCLK1Config(RCC_HCLK_Div2);RCC_PCLK2Config(RCC_HCLK_Div1);// 配置 PLLCLK = HSE * RCC_PLLMul_xRCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_x);// 使能PLLRCC_PLLCmd(ENABLE);// 等待PLL穩定while( RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET );// 選擇系統時鐘RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);while( RCC_GetSYSCLKSource() != 0x08 );}else{/* 如果HSI 啟動失敗,用戶可以在這里添加處理錯誤的代碼 */} }void MCO_GPIO_Config(void) {GPIO_InitTypeDef GPIO_InitStructure;// 開啟GPIOA的時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// 選擇GPIO8引腳GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//設置為復用功能推挽輸出GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//設置IO的翻轉速率為50MGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;// 初始化GPIOA8GPIO_Init(GPIOA, &GPIO_InitStructure);} #ifndef __BSP_RCCCLKCONFIG_H #define __BSP_RCCCLKCONFIG_H#include "stm32f10x.h"void HSE_SetSysClk( uint32_t RCC_PLLMul_x ); void MCO_GPIO_Config(void); void HSI_SetSysClk( uint32_t RCC_PLLMul_x ); #endif /*__BSP_RCCCLKCONFIG_H */ #include "stm32f10x_it.h" #include "bsp_usart.h" #include "bsp_led.h"// 串口中斷服務函數 void DEBUG_USART_IRQHandler(void) {uint8_t ucTemp;if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)!=RESET){ ucTemp = USART_ReceiveData(DEBUG_USARTx);//只能使用中斷作為輸入,不能使用ch = getchar(),藍牙串口手機軟件不支持。switch(ucTemp){case '1': LED1(ON);break;case '2': LED1(OFF);break;default: LED1(ON);break;} USART_SendData(DEBUG_USARTx,ucTemp); } }?
6. 藍牙其它知識
6.1產品特性:
1、核心模塊使用HC-05從模塊,引出接口包括VCC,GND,TXD,RXD,EN引腳、藍牙連接狀態引出腳(STATE),未連接輸出低,連接后輸出高(應該是指通信后輸出高);
2、led指示藍牙連接狀態,快閃表示沒有藍牙連接,慢閃表示進入AT模式,雙閃表示藍牙已連接并打開了端口
3、底板設置防反接二極管,帶3.3V LDO,輸入電壓3.6~6V,未配對時電流約30mA,配對后約10mA,輸入電壓禁止超過7V!
4、接口電平3.3V,可以直接連接各種單片機(51,AVR,PIC,ARM,MSP430等),5V單片機也可直接連接,無需MAX232也不能經過MAX232!
5、空曠地有效距離10米(功率等級為CLASS 2),超過10米也是可能的,但不對此距離的連接質量做保證
6、配對以后當全雙工串口使用,無需了解任何藍牙協議,支持8位數據位、1位停止位、可設置奇偶校驗的通信格式,這也是最常用的通信格式,不支持其他格式。
7、可以通過拉高34腳進入AT命令模式設置參數和查詢信息
8、體積小巧(3.57cm*1.52cm),工廠貼片生產,保證貼片質量。并套透明熱縮管,防塵美觀,且有一定的防靜電能力。
9、可通過AT命令切換為主機或者從機模式,可通過AT命令連接指定設備
10、支持從4800bps~1382400bps間的標準波特率
6.2 藍牙三種角色:
AT+ROLE:該指令用于選擇HC05藍牙模塊的角色,總共有三種角色:master,slave,loop-slave.
AT+ROLE=0\r\n ?將藍牙模塊設置成從角色,只能被動連接
AT+ROLE=1\r\n ?將藍牙模塊設置成主角色,可以查詢周圍SPP藍牙從設備,并發送連接
AT+ROLE=2\r\n ?將藍牙模塊設置成回環角色,被動連接,接收遠程藍牙模塊主設備數據并將數據原樣返回給遠程藍牙設備
這幾個指令用在不同的場合,當設置藍牙模塊為從設備的時候,可以用手機的相關藍牙裝串口軟件連接該設備,進行通訊;當設置成主角色的時候,可以搜索周遭的藍牙從設備,并連接,這種模式在應用中很常用;回環角色很多時候都是用來做測試用的。
設置為主模塊的步驟:
1、PIO11 置高。
2、上電,模塊進入AT 命令響應狀態。
3、超級終端或其他串口工具,設置波特率38400,數據位8 位,停止位1 位,無校驗位,無流控制。
4、串口發送字符“AT+ROLE=1\r\n”,成功返回“OK\r\n”,其中\r\n 為回車換行。
5、PIO 置低,重新上電,模塊為主模塊,自動搜索從模塊,建立連接。
?
6.3?藍牙測試軟件
USB-TTL連接藍牙模塊HC-05后,可一鍵獲取和設置模塊信息
? ? ?
?
總結
- 上一篇: 速达5000进销存PDA条码打印扫码开单
- 下一篇: 电子计算机中专考试试题,职业中专考试试题