#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--); }详细的解释每一句代码
时间: 2024-02-24 07:58:43 浏览: 106
好的,下面是对这段代码的详细解释:
```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转换后延时一段时间再进行读取。
阅读全文