while(1) { u16 adcx,dacx; float q; OLED_ShowString(0,0,"DAC:",12); OLED_ShowString(0,16,"ADC:",12); OLED_ShowString(0,28,"adv:",12); OLED_ShowString(60 ,28,".",12); OLED_ShowString(96,28,"V",12); OLED_ShowString(0,40,"tms:",12); dacx=DAC_GetDataOutputValue(DAC_Channel_1); OLED_ShowNum(48,0,dacx,4,12); adcx=Get_Adc_Average(ADC_Channel_1,10); OLED_ShowNum(48,16,adcx,4,12); q=(float)adcx*(3.3/4096); //得到ADC电压值 adcx=q; OLED_ShowNum(48,28,adcx,1,12); //显示电压值整数部分 q-=adcx; q*=1000; OLED_ShowNum(72,28,q,3,12); OLED_Refresh_Gram(); LED1=!LED1; delay_us(100); }
时间: 2023-03-29 13:03:49 浏览: 105
这是一个关于嵌入式系统的代码问题,我可以回答这个问题。这段代码是一个无限循环,每次循环中获取 DAC 和 ADC 的值,并将 ADC 的电压值转换为浮点数后显示在 OLED 屏幕上。同时,还会闪烁 LED1。
相关问题
uart_init(115200); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2 delay_init(); //初始化延时函数 LED_Init(); //初始化LED KEY_Init(); //按键初始化 AT24CXX_Init(); //IIC初始化 OLED_init(); Dac1_Init(); //DAC通道1初始化 Adc_Init(); //初始化ADC OLED_ShowString(0,16, "2023/06/01",16); OLED_ShowString(0,0, "21221054",16); OLED_Refresh_Gram();//更新显示到OLED u16 u16DacVal=0; u16 adcx,adcy; //adcx存放整数,adcy存放小数 float temp; //temp为DAC设置的数字量 u16ScanCnt = 0; DAC_SetChannel1Data(DAC_Align_12b_R,u16DacVal); //初始值为0 ADC_SoftwareStartConvCmd(ADC1, ENABLE); 这段代码出现了以下问题:main.c(240): error: #268: declaration may not appear after executable statement in block u16 adcx,adcy; //adcx存放整数,adcy存放小数 main.c(241): error: #268: declaration may not appear after executable statement in block float temp; //temp为DAC设置的数字量 main.c(251): error: #268: declaration may not appear after executable statement in block u8 u8key;请修改它们
这段代码的问题和前面一样,变量的声明出现在了可执行语句之后。需要将变量的声明放在可执行语句之前。
修改后的代码如下:
```
u16 u16DacVal=0;
u16 adcx,adcy; //adcx存放整数,adcy存放小数
float temp; //temp为DAC设置的数字量
u8 u8key;
uart_init(115200);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(); //初始化延时函数
LED_Init(); //初始化LED
KEY_Init(); //按键初始化
AT24CXX_Init(); //IIC初始化
OLED_init();
Dac1_Init(); //DAC通道1初始化
Adc_Init(); //初始化ADC
OLED_ShowString(0,16, "2023/06/01",16);
OLED_ShowString(0,0, "21221054",16);
OLED_Refresh_Gram();//更新显示到OLED
u16ScanCnt = 0;
DAC_SetChannel1Data(DAC_Align_12b_R,u16DacVal); //初始值为0
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
```
这样就可以正确声明变量并使用了。
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。