编写基于stm32f103c6芯片的keil代码完成以下功能:ADC采集电压,转换为10Ω负载上的电流,定时器输入捕获测方波频率,最后LCD显示电流值和频率值。分模块呈现代码,对代码标注注解
时间: 2023-11-22 10:52:43 浏览: 104
注:由于题目涉及到硬件操作,以下代码仅供参考。
首先,我们需要在keil中创建工程,并且添加需要的头文件和库文件。
```c
#include<reg51.h>
#include <intrins.h>
#include "lcd.h"
```
接下来,定义一些常量和变量,包括ADC采集的引脚、定时器输入捕获的引脚、ADC采集到的电压值、10Ω负载上的电流值、方波频率等。
```c
#define ADC_PIN P1_0 //ADC采集引脚
#define CAP_PIN P1_1 //定时器输入捕获引脚
#define VREF 3.3 //参考电压
#define RLOAD 10 //负载电阻
float voltage = 0; //电压值
float current = 0; //电流值
float frequency = 0; //方波频率
```
接下来,定义ADC采集函数。在这个函数中,我们使用ADC采集电压值,并通过参考电压和电压分压计算出实际电压值。
```c
float adc_read(void)
{
float val;
ADC_PIN = 1; //设置ADC采集引脚为高电平
_nop_(); //延时
_nop_();
_nop_();
ADC_PIN = 0; //设置ADC采集引脚为低电平
while(ADC_PIN); //等待ADC采样完成
val = (float)ADC / 255 * VREF / 2; //计算实际电压值
return val;
}
```
接下来,定义计算电流值的函数。我们采用欧姆定律,根据负载电阻和采集到的电压值计算出电流值。
```c
float calc_current(float voltage)
{
float current;
current = voltage / RLOAD;
return current;
}
```
接下来,定义定时器输入捕获函数。在这个函数中,我们使用定时器输入捕获模块来测量方波的周期,并将周期转换为频率。
```c
void timer_capture(void) interrupt 5
{
static unsigned int t1, t2;
static unsigned int period;
t1 = t2;
t2 = TH1 * 256 + TL1;
period = t2 - t1;
frequency = 1000000.0 / period; //计算频率值
TH1 = 0;
TL1 = 0;
}
```
最后,我们在主函数中循环采集电压、计算电流、测量频率,并将电流值和频率值显示在LCD上。
```c
int main()
{
lcd_init(); //初始化LCD
lcd_clear(); //清屏
TMOD |= 0x10; //设置定时器1为输入捕获模式
TH1 = 0;
TL1 = 0;
TR1 = 1; //启动定时器1
ET1 = 1; //开启定时器1中断
EA = 1; //开启总中断
while(1)
{
voltage = adc_read(); //采集电压
current = calc_current(voltage); //计算电流
lcd_gotoxy(0,0); //设置光标位置
lcd_puts("I="); //显示“电流值:”
lcd_put_float(current, 2); //显示电流值
lcd_puts("A");
lcd_gotoxy(0,1); //换行,设置光标位置
lcd_puts("F="); //显示“频率值:”
lcd_put_float(frequency, 2); //显示频率值
lcd_puts("Hz");
}
}
```
至此,我们完成了基于stm32f103c6芯片的keil代码,实现了ADC采集电压、转换为10Ω负载上的电流、定时器输入捕获测方波频率,并最终在LCD上显示电流值和频率值的功能。
阅读全文