#define MAX_DATA_NUM 100 // 定义数组的最大容量为100int data[MAX_DATA_NUM]; // 定义一个长度为100的数组用于存储数据int data_num = 0; // 定义一个变量用于记录已经存储的数据数量while (1){ Elude_detect_barrier(); char buf[10]; int i = 0; while (1) { if (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == SET) { buf[i] = USART_ReceiveData(USART3); i++; if (i == 9) { break; } } } formaldehyde = (buf[2] << 8) + buf[3]; sprintf(display, "Formaldehyde: %d", formaldehyde); float formaldehyde_f = (float)formaldehyde / 10.0; if (formaldehyde_f > 0.1) { sprintf(display, "Formaldehyde: %.1f", formaldehyde_f); Car_Stop(0); OLED_Clear(); OLED_ShowString(0, 0, display, 16); Beep_Alert(); // 将超过浓度阈值的数据存储到数组中 if (data_num < MAX_DATA_NUM) { data[data_num] = formaldehyde; data_num++; } } // 检查数组中存储的数据是否超过一定数量,如果超过则触发相应的报警或者处理机制 if (data_num >= 10) { // TODO: 触发报警或者处理机制 data_num = 0; // 重置数据数量 } delay(30000);}怎么设计程序实现显示将数组中存储的超标的浓度显示出来
时间: 2023-12-06 10:45:29 浏览: 128
可以在触发报警或处理机制的时候,遍历数组将超标数据显示出来。例如,可以在触发报警或处理机制的 TODO 部分添加以下代码:
```c
// 遍历数组将超标数据显示出来
for (int i = 0; i < data_num; i++) {
if (data[i] > 10) { // 假设超标阈值为10
sprintf(display, "Data[%d]: %d", i, data[i]);
OLED_ShowString(0, i*16+16, display, 16);
}
}
```
这段代码会将数组中所有超过阈值的数据的索引和数值显示在 OLED 屏幕上。注意,需要在显示之前调用 `OLED_Clear()` 清空屏幕。
相关问题
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define MAX_POINTS 1000 // 最多监测点数 typedef struct point_record { // 监测点每次记录的数据结构体 char point_name[100]; // 监测点名称 float residual_chlorine; // 余氯值 float conductivity; // 电导率 float ph; // pH值 float orp; // ORP值 float turbidity; // 浊度值 char time[100]; //时间 } point_record; typedef struct point_set { int num_points; // point_record data[MAX_POINTS]; } point_set; void save_data(struct point_set data); // 保存数据到文件 void load_data(struct point_set* data); // 从文件加载数据 void add_point_data(struct point_set* data); // 录入某点水质数据 void modify_point_data(struct point_set* data); // 修改某点水质数据 void delete_point_data(struct point_set* data); // 删除某点水质数据 void query_water_quality(struct point_set* data); // 根据条件查询水质信息 void alarm_high_quality(struct point_set* data); // 水质超标报警显示 void disp_all_data(struct point_set* data); //显示全部数据 char* getCurrentTime() { time_t t = time(NULL); struct tm tm = *localtime(&t); char* currentTime = (char*)malloc(sizeof(char) * 20); sprintf(currentTime, "%d-%02d-%02d %02d:%02d:%02d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); return currentTime; }解释以上代码
这段代码是一个水质监测系统的程序,主要包含以下几个功能:
1. 定义了两个结构体,分别为监测点每次记录的数据结构体和监测点集合的数据结构体。
2. 定义了一些常量,如最多监测点数。
3. 定义了一些函数,如保存数据到文件、从文件加载数据、录入某点水质数据、修改某点水质数据、删除某点水质数据、根据条件查询水质信息、水质超标报警显示、显示全部数据。
4. 定义了一个获取当前时间的函数。
这个程序可以通过调用上述函数来实现对水质监测点数据的管理,包括添加、修改、删除、查询、报警等功能。其中,每个监测点的数据包括余氯值、电导率、pH值、ORP值、浊度值和时间等信息。
根据这段代码#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NAME_LEN 20 #define MAX_ADDRESS_LEN 50 #define MAX_SEX_LEN 5 #define MAX_PHONE_LEN 11 #define MAX_STUDENT_NUM 1000 // 定义学生结构体 typedef struct { char name[MAX_NAME_LEN]; char address[MAX_ADDRESS_LEN]; char SEX[MAX_SEX_LEN]; char phone[MAX_PHONE_LEN]; } Student; // 定义通讯录结构体 typedef struct { Student students[MAX_STUDENT_NUM]; int num_students; } AddressBook;修改void modifyStudentInfo(AddressBook *book) { assert(book); char name[NAME_MAX]; printf("请输入需要修改信息用户的名字:>\n"); scanf("%s", name); int pos = FindByName(pc, name);//pos为要寻找的人的下标 if (pos == -1) { printf("查无此人\n"); } else { int num = 0; do { printf("请输入你想修改此用户的信息\n"); printf(" 0.退出 1.姓名 2.性别 3.年龄 4.电话 5.地址:>\n"); scanf("%d", &num); switch (num) { case NAME: printf("请输入你想修改的姓名:>\n"); scanf("%s", pc->data[pos].name); break; case SEX: printf("请输入你想修改的性别:>\n"); scanf("%s", pc->data[pos].sex); break; case AGE: printf("请输入你想修改的年龄:>\n"); scanf("%d", &(pc->data[pos].age)); break; case TELE: printf("请输入你想修改的电话:>\n"); scanf("%s", pc->data[pos].tele); break; case ADDR: printf("请输入你想修改的地址:>\n"); scanf("%s", pc->data[pos].addr); break; case 0: printf("不修改退回界面\n"); break; default:printf("无效操作数!\n"); } } while (num); } }这段代码
这段代码中有几个问题:
1. `name`数组的大小没有定义,应该改为`char name[MAX_NAME_LEN]`。
2. `FindByName`函数的参数应该是`book`而不是`pc`,因为`book`是传递给`modifyStudentInfo`函数的指针。
3. `sex`、`age`、`tele`和`addr`这些变量都没有定义,应该改为`SEX`、`AGE`、`TELE`和`ADDR`,并且在前面应该定义它们的最大长度。
4. 在`switch`语句中,`case`后的常量应该改为`NAME`、`SEX`、`AGE`、`TELE`和`ADDR`,因为这些是宏定义的常量。
5. 在`scanf`函数中,应该使用`%s`来读取字符串类型的变量,而不是使用`%d`。
6. 在修改`sex`、`age`、`tele`和`addr`时,应该使用结构体中定义的变量名,而不是使用错误的变量名。
修改后的代码如下所示:
```
void modifyStudentInfo(AddressBook *book) {
assert(book);
char name[MAX_NAME_LEN];
printf("请输入需要修改信息用户的名字:>\n");
scanf("%s", name);
int pos = FindByName(book, name);
if (pos == -1) {
printf("查无此人\n");
} else {
int num = 0;
do {
printf("请输入你想修改此用户的信息\n");
printf(" 0.退出 1.姓名 2.性别 3.年龄 4.电话 5.地址:>\n");
scanf("%d", &num);
switch (num) {
case NAME:
printf("请输入你想修改的姓名:>\n");
scanf("%s", book->students[pos].name);
break;
case SEX:
printf("请输入你想修改的性别:>\n");
scanf("%s", book->students[pos].SEX);
break;
case AGE:
printf("请输入你想修改的年龄:>\n");
scanf("%d", &(book->students[pos].AGE));
break;
case TELE:
printf("请输入你想修改的电话:>\n");
scanf("%s", book->students[pos].phone);
break;
case ADDR:
printf("请输入你想修改的地址:>\n");
scanf("%s", book->students[pos].address);
break;
case 0:
printf("不修改退回界面\n");
break;
default:
printf("无效操作数!\n");
}
} while (num);
}
}
```
阅读全文