int main(void) { u16 i=0; u32 ADC_CURRENT,ADC_REF; u16 ADC_CURRENT_TEMP[10],ADC_REF_TEMP[10]; LED_GPIO_Config(); LED1_ON; Adc_Init(); SysTick_Init(); while(1) { ADC_CURRENT=0; ADC_REF=0; for(i=0;i<9;i++) { ADC_CURRENT_TEMP[i]=ADC_CURRENT_TEMP[i+1]; ADC_REF_TEMP[i]=ADC_REF_TEMP[i+1]; } Delay(500000); ADC_CURRENT_TEMP[9]=ADC_ConvertedValue[1]; ADC_REF_TEMP[9]=ADC_ConvertedValue[0]; for(i=0;i<10;i++) { ADC_CURRENT+=ADC_CURRENT_TEMP[i]; ADC_REF+=ADC_REF_TEMP[i]; } if(ADC_CURRENT*2>ADC_REF) //{CURRENT=((ADC_CURRENT*2-ADC_REF)*150)/4096;} {CURRENT=((ADC_CURRENT*2-ADC_REF)*165)/4096;} if(ADC_CURRENT*2<ADC_REF) //{CURRENT=((ADC_REF-ADC_CURRENT*2)*150)/4096;} {CURRENT=((ADC_REF-ADC_CURRENT*2)*165)/4096;} if(ADC_CURRENT*2==ADC_REF) {CURRENT=0;} if(CURRENT>2000) {CURRENT=2000;} a=CURRENT/1000; b=(CURRENT/100)%10; c=(CURRENT/10)%10; d=CURRENT%10; } } void Delay(__IO u32 nCount) { for( ; nCount != 0; nCount--); }请用程序框图表示这段程序的程序框图
时间: 2024-02-25 16:51:30 浏览: 30
抱歉,我无法生成程序框图,但是我可以对这段程序进行简单的解释:
该程序主要是对ADC进行采样,并对采样结果进行处理,得到电流值。程序使用了一个循环,不断地进行ADC采样,并将采样结果存储到数组中。然后,程序对数组中的数据进行处理,得到电流值。最后,将电流值的每一位数字分离出来,存储到变量a、b、c、d中。
其中,Delay函数用于产生一定的延时,以保证ADC采样的稳定性。
程序的结构如下:
```
main函数:
初始化LED和ADC
进入循环:
进行ADC采样,并将结果存储到数组中
对数组中的数据进行处理,得到电流值
将电流值的每一位数字分离出来,存储到变量a、b、c、d中
Delay函数:
产生一定的延时
```
相关问题
int main(void) { u16 i=0; u32 ADC_CURRENT,ADC_REF; u16 ADC_CURRENT_TEMP[10],ADC_REF_TEMP[10]; LED_GPIO_Config(); LED1_ON; Adc_Init(); SysTick_Init(); while(1) { ADC_CURRENT=0; ADC_REF=0; for(i=0;i<9;i++) { ADC_CURRENT_TEMP[i]=ADC_CURRENT_TEMP[i+1]; ADC_REF_TEMP[i]=ADC_REF_TEMP[i+1]; } Delay(500000); ADC_CURRENT_TEMP[9]=ADC_ConvertedValue[1]; ADC_REF_TEMP[9]=ADC_ConvertedValue[0]; for(i=0;i<10;i++) { ADC_CURRENT+=ADC_CURRENT_TEMP[i]; ADC_REF+=ADC_REF_TEMP[i]; } if(ADC_CURRENT*2>ADC_REF) //{CURRENT=((ADC_CURRENT*2-ADC_REF)*150)/4096;} {CURRENT=((ADC_CURRENT*2-ADC_REF)*165)/4096;} if(ADC_CURRENT*2<ADC_REF) //{CURRENT=((ADC_REF-ADC_CURRENT*2)*150)/4096;} {CURRENT=((ADC_REF-ADC_CURRENT*2)*165)/4096;} if(ADC_CURRENT*2==ADC_REF) {CURRENT=0;} if(CURRENT>2000) {CURRENT=2000;} a=CURRENT/1000; b=(CURRENT/100)%10; c=(CURRENT/10)%10; d=CURRENT%10; } }请对程序里的每一句代码进行中文含义标注
```
int main(void) { //程序入口
u16 i=0; //定义16位无符号整型变量i,初始值为0
u32 ADC_CURRENT,ADC_REF; //定义32位无符号整型变量ADC_CURRENT和ADC_REF
u16 ADC_CURRENT_TEMP[10],ADC_REF_TEMP[10]; //定义10个16位无符号整型数组变量ADC_CURRENT_TEMP和ADC_REF_TEMP
LED_GPIO_Config(); //调用LED_GPIO_Config函数,进行LED灯的初始化配置
LED1_ON; //LED1亮
Adc_Init(); //调用Adc_Init函数,进行ADC的初始化配置
SysTick_Init(); //调用SysTick_Init函数,进行SysTick定时器的初始化配置
while(1) //进入循环
{
ADC_CURRENT=0; //ADC_CURRENT清零
ADC_REF=0; //ADC_REF清零
for(i=0;i<9;i++) //循环9次
{
ADC_CURRENT_TEMP[i]=ADC_CURRENT_TEMP[i+1]; //将ADC_CURRENT_TEMP数组中i+1位置的值赋给i位置
ADC_REF_TEMP[i]=ADC_REF_TEMP[i+1]; //将ADC_REF_TEMP数组中i+1位置的值赋给i位置
}
Delay(500000); //延时500000个单位,这里的单位是一个空循环
ADC_CURRENT_TEMP[9]=ADC_ConvertedValue[1]; //将ADC_ConvertedValue数组中第1个元素的值赋给ADC_CURRENT_TEMP数组中第9个位置
ADC_REF_TEMP[9]=ADC_ConvertedValue[0]; //将ADC_ConvertedValue数组中第0个元素的值赋给ADC_REF_TEMP数组中第9个位置
for(i=0;i<10;i++) //循环10次
{
ADC_CURRENT+=ADC_CURRENT_TEMP[i]; //将ADC_CURRENT_TEMP数组中第i个位置的值加到ADC_CURRENT上
ADC_REF+=ADC_REF_TEMP[i]; //将ADC_REF_TEMP数组中第i个位置的值加到ADC_REF上
}
if(ADC_CURRENT*2>ADC_REF) //如果ADC_CURRENT乘以2大于ADC_REF
//{CURRENT=((ADC_CURRENT*2-ADC_REF)*150)/4096;} //CURRENT等于((ADC_CURRENT乘以2减去ADC_REF)乘以150)除以4096
{CURRENT=((ADC_CURRENT*2-ADC_REF)*165)/4096;} //CURRENT等于((ADC_CURRENT乘以2减去ADC_REF)乘以165)除以4096
if(ADC_CURRENT*2<ADC_REF) //如果ADC_CURRENT乘以2小于ADC_REF
//{CURRENT=((ADC_REF-ADC_CURRENT*2)*150)/4096;} //CURRENT等于((ADC_REF减去ADC_CURRENT乘以2)乘以150)除以4096
{CURRENT=((ADC_REF-ADC_CURRENT*2)*165)/4096;} //CURRENT等于((ADC_REF减去ADC_CURRENT乘以2)乘以165)除以4096
if(ADC_CURRENT*2==ADC_REF) //如果ADC_CURRENT乘以2等于ADC_REF
{CURRENT=0;}
if(CURRENT>2000) //如果CURRENT大于2000
{CURRENT=2000;} //CURRENT等于2000
a=CURRENT/1000; //a等于CURRENT除以1000的商
b=(CURRENT/100)%10; //b等于(CURRENT除以100的余数)除以10的余数
c=(CURRENT/10)%10; //c等于(CURRENT除以10的余数)除以10的余数
d=CURRENT%10; //d等于CURRENT除以10的余数
}
}
```
#include "stm32f10x.h" #include "bsp_SysTick.h" #include "bsp_led.h" #include "bsp_adc.h" extern __IO uint16_t ADC_ConvertedValue[2]; u16 SCAN_TIME=0; u16 CURRENT=1234; u16 a,b,c,d; void Delay(__IO u32 nCount); void SYSTICK_SCAN(void) { SCAN_TIME++; if(SCAN_TIME==1) { CLOSE_DISPLAY(); if(a==0) { DISPLAY(10);} else {DISPLAY(a);} GPIO_ResetBits(GPIOB, GPIO_Pin_12); } if(SCAN_TIME==2) { CLOSE_DISPLAY(); if(b==0) {DISPLAY(10);} else {DISPLAY(b);} GPIO_ResetBits(GPIOB, GPIO_Pin_14); } if(SCAN_TIME==3) { CLOSE_DISPLAY(); DISPLAY(c); GPIO_SetBits(GPIOB, GPIO_Pin_4); GPIO_ResetBits(GPIOB, GPIO_Pin_13); } if(SCAN_TIME>=4) { CLOSE_DISPLAY(); SCAN_TIME=0; DISPLAY(d); GPIO_ResetBits(GPIOB, GPIO_Pin_15); } } int main(void) { u16 i=0; u32 ADC_CURRENT,ADC_REF; u16 ADC_CURRENT_TEMP[10],ADC_REF_TEMP[10]; LED_GPIO_Config(); LED1_ON; Adc_Init(); SysTick_Init(); while(1) { ADC_CURRENT=0; ADC_REF=0; for(i=0;i<9;i++) { ADC_CURRENT_TEMP[i]=ADC_CURRENT_TEMP[i+1]; ADC_REF_TEMP[i]=ADC_REF_TEMP[i+1]; } Delay(500000); ADC_CURRENT_TEMP[9]=ADC_ConvertedValue[1]; ADC_REF_TEMP[9]=ADC_ConvertedValue[0]; for(i=0;i<10;i++) { ADC_CURRENT+=ADC_CURRENT_TEMP[i]; ADC_REF+=ADC_REF_TEMP[i]; } if(ADC_CURRENT*2>ADC_REF) //{CURRENT=((ADC_CURRENT*2-ADC_REF)*150)/4096;} {CURRENT=((ADC_CURRENT*2-ADC_REF)*165)/4096;} if(ADC_CURRENT*2<ADC_REF) //{CURRENT=((ADC_REF-ADC_CURRENT*2)*150)/4096;} {CURRENT=((ADC_REF-ADC_CURRENT*2)*165)/4096;} if(ADC_CURRENT*2==ADC_REF) {CURRENT=0;} if(CURRENT>2000) {CURRENT=2000;} a=CURRENT/1000; b=(CURRENT/100)%10; c=(CURRENT/10)%10; d=CURRENT%10; } } void Delay(__IO u32 nCount) { for( ; nCount != 0; nCount--); }详细的解释每一句代码
好的,下面是对这段代码的详细解释:
```c
#include "stm32f10x.h"
#include "bsp_SysTick.h"
#include "bsp_led.h"
#include "bsp_adc.h"
extern __IO uint16_t ADC_ConvertedValue[2]; // 声明一个全局变量
u16 SCAN_TIME=0;
u16 CURRENT=1234;
u16 a,b,c,d;
void Delay(__IO u32 nCount); // 声明一个延时函数
void SYSTICK_SCAN(void) {
SCAN_TIME++; // 计数器+1
if(SCAN_TIME==1) {
CLOSE_DISPLAY();
if(a==0) { DISPLAY(10);}
else {DISPLAY(a);}
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
}
if(SCAN_TIME==2) {
CLOSE_DISPLAY();
if(b==0) {DISPLAY(10);}
else {DISPLAY(b);}
GPIO_ResetBits(GPIOB, GPIO_Pin_14);
}
if(SCAN_TIME==3) {
CLOSE_DISPLAY();
DISPLAY(c);
GPIO_SetBits(GPIOB, GPIO_Pin_4);
GPIO_ResetBits(GPIOB, GPIO_Pin_13);
}
if(SCAN_TIME>=4) {
CLOSE_DISPLAY();
SCAN_TIME=0;
DISPLAY(d);
GPIO_ResetBits(GPIOB, GPIO_Pin_15);
}
}
int main(void) {
u16 i=0;
u32 ADC_CURRENT,ADC_REF;
u16 ADC_CURRENT_TEMP[10],ADC_REF_TEMP[10];
LED_GPIO_Config(); // LED初始化
LED1_ON; // 点亮LED1
Adc_Init(); // ADC初始化
SysTick_Init(); // 系统滴答计初始化
while(1) {
ADC_CURRENT=0;
ADC_REF=0;
for(i=0;i<9;i++) {
ADC_CURRENT_TEMP[i]=ADC_CURRENT_TEMP[i+1];
ADC_REF_TEMP[i]=ADC_REF_TEMP[i+1];
}
Delay(500000); // 延时一段时间
ADC_CURRENT_TEMP[9]=ADC_ConvertedValue[1];
ADC_REF_TEMP[9]=ADC_ConvertedValue[0];
for(i=0;i<10;i++) {
ADC_CURRENT+=ADC_CURRENT_TEMP[i];
ADC_REF+=ADC_REF_TEMP[i];
}
if(ADC_CURRENT*2>ADC_REF) {
//{CURRENT=((ADC_CURRENT*2-ADC_REF)*150)/4096;}
{CURRENT=((ADC_CURRENT*2-ADC_REF)*165)/4096;}
}
if(ADC_CURRENT*2<ADC_REF) {
//{CURRENT=((ADC_REF-ADC_CURRENT*2)*150)/4096;}
{CURRENT=((ADC_REF-ADC_CURRENT*2)*165)/4096;}
}
if(ADC_CURRENT*2==ADC_REF) {
CURRENT=0;
}
if(CURRENT>2000) {
CURRENT=2000;
}
a=CURRENT/1000;
b=(CURRENT/100)%10;
c=(CURRENT/10)%10;
d=CURRENT%10;
}
}
void Delay(__IO u32 nCount) {
for( ; nCount != 0; nCount--); // 简单的延时函数
}
```
这段代码的主要功能是读取ADC的值,并将其转换为数字显示在数码管上。具体的解释如下:
1. `#include`语句包含了需要使用的头文件,其中包括STM32F10x系列芯片的底层驱动库、SysTick和ADC的驱动库等。
2. `extern __IO uint16_t ADC_ConvertedValue[2];` 声明一个全局变量,用于存储ADC转换后的值。该变量在其他文件中也有定义,使用`extern`关键字声明可以在本文件中使用它。
3. `u16 SCAN_TIME=0; u16 CURRENT=1234; u16 a,b,c,d;` 定义了几个变量,包括计数器`SCAN_TIME`,电流值`CURRENT`和用于存储电流值各个位数的变量`a`、`b`、`c`、`d`。
4. `void SYSTICK_SCAN(void)` 是系统滴答计中断函数,用于控制数码管的扫描和显示。在该函数中,计数器`SCAN_TIME`每次加1,当`SCAN_TIME`的值为1、2、3、4时分别控制数码管的不同位显示。
5. `int main(void)` 主函数中,首先进行了一些初始化操作,包括LED和ADC的初始化以及系统滴答计的初始化。然后进入了一个无限循环,循环中先读取ADC的值,并将其转换为电流值。最后将电流值按位存储到变量`a`、`b`、`c`、`d`中,并在数码管上显示。
6. `void Delay(__IO u32 nCount)` 是一个简单的延时函数,其作用是在ADC转换后延时一段时间再进行读取。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)