51单片机如何对ADC的值进行处理,去掉一个最大值,去掉一个最小值,在求取中间值的代码
时间: 2024-10-15 14:15:03 浏览: 34
使用51单片机+ADC0809实现电压值检测报警仿真设计资料包含源程序及仿真文件
5星 · 资源好评率100%
在51单片机中,ADC(Analog-to-Digital Converter,模拟数字转换器)用于将模拟信号转换成数字信号。为了处理ADC采集到的数据并去除最大值和最小值,通常需要以下步骤:
1. **读取ADC值**:
使用适当的寄存器,如8051系列的ADCH和ADCL,获取ADC的结果。如果使用定时中断法,可以在中断服务程序里读取。
```c
unsigned char adc_result;
adc_result = ADCH; // 取得低八位
if (ADCS == 0) { // 如果ADCS标志置位,表示高八位有值
adc_result |= ADCH << 8; // 将高八位添加到低八位
}
```
2. **存储数据**:
将连续采集的ADC值存储在一个数组或链表中,便于后续操作。
```c
int adc_values[10]; // 假设可以储存10次值
adc_values[index] = adc_result;
```
3. **排序或比较**:
你可以选择先排序整个数组,然后直接取出中间值,或者每次读取后就检查是否是最小或最大值,然后剔除。这里假设已经排序:
```c
int compare_and_remove_min_max(int *array, int size, int &min, int &max) {
if (size > 0) {
min = max = array[0];
for (int i = 1; i < size; i++) {
if (array[i] < min) {
min = array[i];
} else if (array[i] > max) {
max = array[i];
}
}
// 去掉最小和最大值
for (int i = 0; i < size && array[i] != min && array[i] != max; i++);
}
return size - i; // 返回有效值的数量
}
int middle_value_index = compare_and_remove_min_max(adc_values, sizeof(adc_values)/sizeof(adc_values[0]), adc_values[0], adc_values[0]);
```
4. **计算中间值**:
最后,从数组中提取出剩余的有效值,找到中间值。若数组大小为奇数,中间值就是`middle_value_index`位置的值;若偶数,则是两个中间值的平均值。
```c
int average = 0;
if (size % 2 == 0)
{
average = (adc_values[middle_value_index - 1] + adc_values[middle_value_index]) / 2;
}
else
{
average = adc_values[middle_value_index];
}
// 现在average变量包含了去除了最大值、最小值后的中间值
```
阅读全文