用keil写出第1次采集瞬时值除以60为第1秒平均值,第1秒累加到第60秒值除以60,为上电60秒计算出来的平均值,第61秒平均值为上电第2秒累加到61秒瞬时值除以60,依次往后类推),总是取当前时间点过去的六十秒瞬时值来计算出当前平均值
时间: 2024-05-07 15:22:46 浏览: 155
60秒倒计时时钟设计_单片机实现60秒倒计时时钟_六十秒计时_
5星 · 资源好评率100%
以下是基于Keil的代码实现:
```c
#include <reg52.h>
#include <stdio.h>
#define MAX_SAMPLES 60 // 采样点数
unsigned int adc_buf[MAX_SAMPLES]; // 存储采样数据的数组
unsigned int avg_buf[MAX_SAMPLES]; // 存储平均值的数组
unsigned char avg_index = 0; // 当前平均值在数组中的下标
unsigned int sum = 0; // 当前累加和
unsigned char count = 0; // 当前累加次数
void adc_init() {
ADC_CONTR = 0x88; // 启动ADC,选择通道0,左对齐,不启动自动采样
}
unsigned int adc_read() {
ADC_CONTR |= 0x40; // 启动ADC转换
while (!(ADC_CONTR & 0x20)); // 等待转换完成
return ADC_RES * 256 + ADC_RESL; // 返回转换结果
}
void timer0_init() {
TMOD |= 0x01; // 设置定时器0为模式1(16位定时器)
TH0 = 0xFC; // 定时1ms
TL0 = 0x66;
ET0 = 1; // 允许定时器0中断
TR0 = 1; // 启动定时器0
EA = 1; // 打开总中断
}
void timer0_isr() interrupt 1 {
TH0 = 0xFC; // 定时1ms
TL0 = 0x66;
adc_buf[avg_index] = adc_read(); // 读取采样值
sum += adc_buf[avg_index]; // 累加当前采样值
count++; // 累加次数加1
if (count >= MAX_SAMPLES) {
// 计算平均值
avg_buf[avg_index] = sum / MAX_SAMPLES;
sum -= adc_buf[avg_index - MAX_SAMPLES + 1]; // 去掉最早的采样值
count = MAX_SAMPLES - 1;
}
avg_index++;
if (avg_index >= MAX_SAMPLES) {
avg_index = 0;
}
}
void main() {
adc_init();
timer0_init();
while (1);
}
```
上述代码中,首先初始化ADC和定时器0。在定时器0的中断服务程序中,读取当前采样值并进行累加,同时判断是否达到了采样点数。如果达到了,就计算当前平均值并将其存储到数组中,同时去掉最早的采样值。最后,将当前平均值的下标加1,如果已经到了数组的末尾,则将其重置为0。这样就可以实现取当前时间点过去的六十秒瞬时值来计算出当前平均值的功能。
阅读全文