![]() |
#include "stm32f1xx_hal.h" UART_HandleTypeDef huart1; ADC_HandleTypeDef hadc1; void SystemClock_Config(void) { // 配置系統時鐘 } void MX_GPIO_Init(void) { // 初始化GPIO } void MX_ADC1_Init(void) { // 初始化ADC,設置分辨率為12位,采樣時間為239.5個周期 hadc1.Instance = ADC1; hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; hadc1.Init.ContinuousConvMode = DISABLE; hadc1.Init.DiscontinuousConvMode = DISABLE; hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc1.Init.NbrOfConversion = 1; hadc1.Init.DMAContinuousRequests = DISABLE; hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; HAL_ADC_Init(&hadc1); } void MX_USART1_UART_Init(void) { // 初始化USART1,設置波特率為9600bps huart1.Instance = USART1; huart1.Init.BaudRate = 9600; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_NONE; HAL_UART_Init(&huart1); } int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_ADC1_Init(); MX_USART1_UART_Init(); while (1) { HAL_ADC_Start(&hadc1); // 啟動ADC轉換 if (HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY) == HAL_OK) { // 等待轉換完成 uint32_t adcValue = HAL_ADC_GetValue(&hadc1); // 獲取ADC值 char adcStr; // 用于存儲轉換結果的字符串表示形式,包括終止符'\0' sprintf(adcStr, "%d", adcValue); // 將ADC值轉換為字符串形式 HAL_UART_Transmit(&huart1, (uint8_t*)adcStr, strlen(adcStr), HAL_MAX_DELAY); // 通過串口發送ADC值 } } } |
STC官方ADC例子基本都是用串口發送的。 |
samxon 發表于 2024-12-2 23:37 你是說直接發送ADC的值嗎 那以下兩個函數直接改成 // 獲取ADC結果 unsigned char GetADCResult() { unsigned int ADC_10BIT_RES; ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_CHANNEL | ADC_START; // 啟動ADC轉換 _nop_(); // 等待4個機器周期 _nop_(); _nop_(); _nop_(); while (!(ADC_CONTR & ADC_FLAG)); // 等待轉換完成 ADC_CONTR &= ~ADC_FLAG; // 清除完成標志 ADC_10BIT_RES = ADC_RES; // 獲取高8位結果 // ADC_10BIT_RES <<= 2; // ADC_10BIT_RES += (0x03 & ADC_RESL); // 獲取低2位結果 return ADC_10BIT_RES; // 返回10位ADC結果 } // 主函數 void main() { unsigned int adcValue; InitADC(); // 初始化ADC InitSerialPort(); // 初始化串口 while (1) { SendByte(GetADCResult()); // 獲取ADC值并發送高8位 SendByte(ADC_RESL);//低2位 Delay20ms(); // 延時,控制發送頻率 } } |
3176912825 發表于 2024-12-2 22:39 謝謝你的精彩代碼,我想發送的是ADC_10BIT_RES這個結果 |
3176912825 發表于 2024-12-2 22:30 #include <STC15W.h> #include <intrins.h> // 定義ADC通道,這里以通道1為例 #define ADC_CHANNEL 1 // 延時函數,用于ADC穩定 void Delay20ms() { unsigned char i, j, k; i = 1; j = 234; k = 113; do { do { while (--k); } while (--j); } while (--i); } // 初始化ADC void InitADC() { P1ASF |= (1 << ADC_CHANNEL); // 設置P1.1為ADC輸入 ADC_RES = 0; // 清除ADC結果寄存器 ADC_CONTR = ADC_POWER | ADC_SPEEDLL; // 使能ADC,設置速度為最快 Delay20ms(); // 等待ADC穩定 } // 獲取ADC結果 unsigned int GetADCResult() { unsigned int ADC_10BIT_RES; ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_CHANNEL | ADC_START; // 啟動ADC轉換 _nop_(); // 等待4個機器周期 _nop_(); _nop_(); _nop_(); while (!(ADC_CONTR & ADC_FLAG)); // 等待轉換完成 ADC_CONTR &= ~ADC_FLAG; // 清除完成標志 ADC_10BIT_RES = ADC_RES; // 獲取高8位結果 ADC_10BIT_RES <<= 2; ADC_10BIT_RES += (0x03 & ADC_RESL); // 獲取低2位結果 return ADC_10BIT_RES; // 返回10位ADC結果 } // 初始化串口 void InitSerialPort() { SCON = 0x50; // 設置串口為模式1 AUXR |= 0x01; // 選擇定時器2作為波特率發生器 AUXR |= 0x04; // 定時器2工作在8位自動重裝模式 T2L = 0xE0; // 設置定時器2的重裝值,波特率9600 T2H = 0xFE; AUXR |= 0x10; // 啟動定時器2 REN = 1; // 允許接收 SM0 = 0; // 設置串口為模式1 SM1 = 1; } // 發送一個字節 void SendByte(unsigned char byte) { SBUF = byte; // 將數據放入到發送緩沖寄存器 while (!TI); // 等待發送完成 TI = 0; // 清除發送完成標志 } // 發送字符串 void SendString(unsigned char *str) { while (*str) { SendByte(*str++); // 發送當前字符,并指向下一個字符 } } // 主函數 void main() { unsigned int adcValue; InitADC(); // 初始化ADC InitSerialPort(); // 初始化串口 while (1) { adcValue = GetADCResult(); // 獲取ADC值 SendString("ADC Value: "); // 發送字符串 SendByte(adcValue / 1000 + '0'); // 發送ADC值的千位 SendByte((adcValue % 1000) / 100 + '0'); // 發送ADC值的百位 SendByte((adcValue % 100) / 10 + '0'); // 發送ADC值的十位 SendByte(adcValue % 10 + '0'); // 發送ADC值的個位 SendByte('\r\n'); // 發送換行符 Delay20ms(); // 延時,控制發送頻率 } } |
這段代碼首先初始化ADC和串口,然后在主循環中不斷讀取ADC值,并通過串口發送。請注意,根據您的具體硬件配置和需求,您可能需要調整ADC通道和串口設置。 |