adcx1=Get_Adc_Average1(ADC_Channel_1,4); temp1=(float)adcx1*(3.3/4096); adcx1=temp1; OLED_ShowNum(1,1,adcx1,1); temp1-=adcx1; temp1*=1000;
时间: 2023-09-06 12:12:20 浏览: 123
这是一段用于将 ADC 采集到的电压值转换为整数并在 OLED 显示屏上显示的 C 语言代码。
首先,第一行代码调用了 Get_Adc_Average1 函数,对 ADC 通道 1 进行了 4 次采样并求平均值,将结果存储在 adcx1 变量中。接着,第二行代码利用前面提到的公式将 adcx1 转换为对应的电压值 temp1,并将结果存储为浮点型。第三行代码将 temp1 转换为整型变量,存储在 adcx1 中,这一步可以理解为将 temp1 的小数部分舍去,只保留整数部分。第四行代码调用 OLED_ShowNum 函数,在 OLED 显示屏上显示 adcx1 的值,其中参数 1,1 表示显示的起始位置,1 表示显示的位数。最后两行代码将 temp1 的小数部分提取出来并乘以 1000,得到一个三位小数的整数值,可以通过其他方式进行处理或显示。
综上,这段代码的作用是将 ADC 采集到的电压值转换为整数并在 OLED 显示屏上显示出来,同时将电压值的小数部分提取出来进行处理。
相关问题
while(1) { u8key=KEY_Scan(0); if(u8key==KEY1_PRES) { LED1=!LED1; } else if(u8key==KEY2_PRES) { if(u16DacVal>200) u16DacVal-=200; else u16DacVal=0; DAC_SetChannel1Data(DAC_Align_12b_R, u16DacVal); DAC_SetChannel2Data(DAC_Align_12b_R, u16DacVal); } else if(u8key==KEY3_PRES) { if(u16DacVal<4000) u16DacVal+=200; DAC_SetChannel1Data(DAC_Align_12b_R, u16DacVal); DAC_SetChannel2Data(DAC_Align_12b_R, u16DacVal); } if(u16ADCOK == 0x55D5) { u16gtmp = Get_Average(u16ADCConvertedValue,16); temp=(float)u16gtmp*(3.3/4096); adcx=temp; temp-=adcx; temp*=1000; adcy = temp; memset(buff,0,sizeof(buff)); sprintf(buff,"ADC:%2d.%3dV",adcx,adcy); OLED_ShowString(0,32,buff,16); printf ("%s\n\n",buff); printf("\r\n\r\n"); OLED_Refresh_PageGram(2); OLED_Refresh_PageGram(3); u16ADCOK = 0x0000; ADC_SoftwareStartConvCmd(ADC1, ENABLE); } if(u16ScanCnt%60==0x00) LED1 = !LED1; u16ScanCnt++; } }详细解释以上每句代码的意思
这段代码是一个无限循环,每次循环会扫描按键状态并根据按键状态执行相应的操作,同时也会检测ADC的转换状态并在转换完成后将结果显示在OLED屏幕上。下面是每句代码的意思:
```
while(1) {
```
无限循环。
```
u8key=KEY_Scan(0);
```
扫描按键,将扫描结果保存在变量u8key中。
```
if(u8key==KEY1_PRES) {
LED1=!LED1;
} else if(u8key==KEY2_PRES) {
if(u16DacVal>200) u16DacVal-=200;
else u16DacVal=0;
DAC_SetChannel1Data(DAC_Align_12b_R, u16DacVal);
DAC_SetChannel2Data(DAC_Align_12b_R, u16DacVal);
} else if(u8key==KEY3_PRES) {
if(u16DacVal<4000) u16DacVal+=200;
DAC_SetChannel1Data(DAC_Align_12b_R, u16DacVal);
DAC_SetChannel2Data(DAC_Align_12b_R, u16DacVal);
}
```
根据按键的状态执行相应的操作。如果按下的是KEY1,则将LED1的状态取反。如果按下的是KEY2,则将DAC的输出值减少200(最小值为0),并将新的值设置到DAC的通道1和通道2上。如果按下的是KEY3,则将DAC的输出值增加200(最大值为4000),并将新的值设置到DAC的通道1和通道2上。
```
if(u16ADCOK == 0x55D5) {
u16gtmp = Get_Average(u16ADCConvertedValue,16);
temp=(float)u16gtmp*(3.3/4096);
adcx=temp;
temp-=adcx;
temp*=1000;
adcy = temp;
memset(buff,0,sizeof(buff));
sprintf(buff,"ADC:%2d.%3dV",adcx,adcy);
OLED_ShowString(0,32,buff,16);
printf ("%s\n\n",buff);
printf("\r\n\r\n");
OLED_Refresh_PageGram(2);
OLED_Refresh_PageGram(3);
u16ADCOK = 0x0000;
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}
```
检测ADC是否完成转换,如果完成则将转换结果保存在变量u16ADCConvertedValue中,并计算出实际电压值。然后将电压值显示在OLED屏幕上,并通过printf函数将电压值输出到串口。然后重新启动ADC的转换。
```
if(u16ScanCnt%60==0x00) LED1 = !LED1;
```
每60次循环(约1秒)将LED1的状态取反。
```
u16ScanCnt++;
```
循环计数器加1。
#include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "lcd.h" #include "usart.h" #include "adc.h" int main(void) { float voltage = 0.0f; u16 adcx; //float temp; delay_init(); //ÑÓʱº¯Êý³õʼ»¯ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÉèÖÃÖжÏÓÅÏȼ¶·Ö×éΪ×é2£º2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶ uart_init(115200); //´®¿Ú³õʼ»¯Îª115200 LED_Init(); //LED¶Ë¿Ú³õʼ»¯ LCD_Init(); Adc_Init(); //ADC³õʼ»¯ while(1) { adcx=Get_Adc_Average(ADC_Channel_1,10); printf("adc:%d\r\n",adcx);//ÏÔʾADCµÄÖµ voltage = adcx * 3.3 / 4096; printf("v:%f\r",voltage);//ÏÔʾµçѹֵ LED0=!LED0; delay_ms(500); } }
这是一段STM32F407单片机的代码,实现了ADC采集电压并通过串口发送到电脑上,同时LED0闪烁。具体流程如下:
1. 引入相关头文件
2. 初始化延时函数
3. 设置中断分组为2,即2位抢占优先级,2位子优先级
4. 初始化串口,波特率为115200
5. 初始化LED
6. 初始化LCD
7. 初始化ADC
8. 进入主程序循环
9. 通过ADC_Channel_1通道采集电压值,并取10次平均值
10. 将采集的ADC数值通过串口发送到电脑上
11. 将ADC数值转换成电压值,并通过串口发送到电脑上
12. LED0闪烁,间隔500ms
阅读全文
相关推荐












