main.c(352): error C249: 'DATA': SEGMENT TOO LARGE
,是不是要用什么结构体来一键定义全局变量
程序:#include <reg52.h>
#include "LCD1602.h"
#include "dht11.h"
#include "adc0832.h"
#include "delay.h"
#include <math.h>
#include <stdio.h>
// 硬件接口定义
sbit BUZZER = P1^3; // 蜂鸣器连接P1^3
sbit LED1 = P2^0; // LED1 连接P2^0
sbit LED2 = P2^1; // LED2 连接P2^1
sbit LED3 = P2^2;
sbit LED4 = P2^3;
sbit LED5 = P2^4;
// 矩阵键盘定义
#define ROWS 4
#define COLS 4
sbit ROW1 = P3^0;
sbit ROW2 = P3^1;
sbit ROW3 = P3^2;
sbit ROW4 = P3^3;
sbit COL1 = P3^4;
sbit COL2 = P3^5;
sbit COL3 = P3^6;
sbit COL4 = P3^7;
// 函数声明
void InitUART(void);
void UART_send_byte(char dat);
void UART_send_string(unsigned char *buf);
void check_thresholds(void);
void check_alarms(void);
void update_display(void);
void set_parameters(void);
unsigned char get_key(void);
void LCD_Process(void);
unsigned char scan_key(void); // 添加函数原型
// 全局变量
unsigned char keymap[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
char disp1[16] = "PM2.5:0000ug/m3 ";
char disp2[16] = "T :00C RH:00%";
unsigned char Rx_buf[4], Rxnum = 0;
int T1L = 15, T1H = 35, R1L = 30, R1H = 80;
double PM, pm1 = 0.0, pm2 = 0.0;
int PMVAL = 0, HPM = 200, PM_count = 0, pm1_count = 0;
unsigned char T1_data = 0, R1_data = 0, T2_data = 0, R2_data = 0; // 温度、湿度变量
unsigned char shezhi_flag = 1, Mode_flag = 1, n = 1; // 设置变量
unsigned char buzzer_flag = 0, count = 0, buzzer_time = 9; // 蜂鸣器报警变量
unsigned long Mode_count = 0;
// 主函数
void main(void)
{
// 初始化代码
InitUART(); // 初始化串口
LCD_Init();
WriteChar(1, 0, 16, "PM2.5:0000ug/m3 "); // 在第一行显示‘PM2.5:0000ug/m3 ’
WriteChar(2, 0, 16, "T :00C RH:00%"); // 在第二行显示‘T :00C RH:00%’
while(1)
{
unsigned char key; // 变量声明移至代码块开始
// 读取传感器数据
T1_data = Read_TRH(0, 0); // 温度
disp2[3] = T1_data / 10 + '0'; // 十位
disp2[4] = T1_data % 10 + '0'; // 个位
R1_data = Read_TRH(1, 0); // 湿度
disp2[13] = R1_data / 10 + '0'; // 十位
disp2[14] = R1_data % 10 + '0'; // 个位
// PM2.5 数据处理
pm1 += read_data(1);
if(++PM_count >= 20)
{
PM_count = 0;
pm1 /= 20.0;
pm2 += pm1;
pm1 = 0.0;
if(++pm1_count >= 5)
{
pm1_count = 0;
PM = pm2 / 5.0;
PM = (PM * 50.0 / 255.0) - 4.0;
PM /= 5.0;
PM *= 1000.0;
PMVAL = (int)PM;
PMVAL += 235;
PMVAL /= 9;
if(PMVAL >= 9999) PMVAL = 9999;
// PM2.5 显示
WriteCOMDATA(0x86, 0);
if(PMVAL < 0)
{
WriteCOMDATA('0', 1);
PMVAL = abs(PMVAL);
}
else
{
WriteCOMDATA((PMVAL / 1000 % 10 + '0'), 1);
WriteCOMDATA((PMVAL / 100 % 10 + '0'), 1);
WriteCOMDATA((PMVAL / 10 % 10 + '0'), 1);
WriteCOMDATA((PMVAL % 10 + '0'), 1);
}
pm1 = pm2 = 0.0;
}
}
// 报警检测
check_thresholds();
check_alarms();
// 更新显示
update_display();
// 设置模式处理
if(Mode_flag == 0)
{
set_parameters();
}
// 处理LCD队列
LCD_Process();
// 按键处理
key = get_key();
if(key)
{
switch(key)
{
case '1':
T1L = (T1L < T1H - 1) ? T1L + 1 : T1H - 1;
break;
case '2':
T1L = (T1L > 0) ? T1L - 1 : 0;
break;
case '3':
T1H = (T1H < 99) ? T1H + 1 : 99;
break;
case 'A':
T1H = (T1H > T1L + 1) ? T1H - 1 : T1L + 1;
break;
case '4':
R1L = (R1L < R1H - 1) ? R1L + 1 : R1H - 1;
break;
case '5':
R1L = (R1L > 0) ? R1L - 1 : 0;
break;
case '6':
R1H = (R1H < 99) ? R1H + 1 : 99;
break;
case 'B':
R1H = (R1H > R1L + 1) ? R1H - 1 : R1L + 1;
break;
case '7':
HPM = (HPM < 9999) ? HPM + 1 : 9999;
break;
case '8':
HPM = (HPM > 0) ? HPM - 1 : 0;
break;
case '9':
HPM = (HPM < 9999) ? HPM + 1 : 9999;
break;
case 'C':
HPM = (HPM > 0) ? HPM - 1 : 0;
break;
case '*':
shezhi_flag = (shezhi_flag + 1) % 4;
break;
case '0':
shezhi_flag = 0;
break;
case '#':
shezhi_flag = 0;
break;
case 'D':
Mode_flag = !Mode_flag;
break;
default:
break;
}
}
}
}
// 获取按键函数(添加消抖机制)
unsigned char get_key(void)
{
static unsigned char last_key = 0;
unsigned char new_key = scan_key();
if(new_key != 0 && new_key == last_key)
{
Delay_ms(10); // 消抖延时
if(new_key == scan_key()) return new_key;
}
last_key = new_key;
return 0;
}
// 扫描按键函数(修正行列扫描逻辑)
unsigned char scan_key(void)
{
unsigned char row, col;
for(row = 0; row < ROWS; row++)
{
// 行扫描
switch(row)
{
case 0: COL1 = 0; COL2 = COL3 = COL4 = 1; break;
case 1: COL2 = 0; COL1 = COL3 = COL4 = 1; break;
case 2: COL3 = 0; COL1 = COL2 = COL4 = 1; break;
case 3: COL4 = 0; COL1 = COL2 = COL3 = 1; break;
}
Delay_ms(2); // 消抖延时
for(col = 0; col < COLS; col++)
{
if(!ROW1 && col == 0) return keymap[row][col];
else if(!ROW2 && col == 1) return keymap[row][col];
else if(!ROW3 && col == 2) return keymap[row][col];
else if(!ROW4 && col == 3) return keymap[row][col];
}
// 恢复列状态
COL1 = COL2 = COL3 = COL4 = 1;
}
return 0; // 无按键按下
}
// 阈值检测函数
void check_thresholds(void)
{
LED1 = (T1_data > T1H) ? 1 : 0;
LED2 = (T1_data < T1L) ? 1 : 0;
LED3 = (R1_data > R1H) ? 1 : 0;
LED4 = (R1_data < R1L) ? 1 : 0;
LED5 = (PMVAL > HPM) ? 1 : 0;
}
// 报警检测函数
void check_alarms(void)
{
static unsigned char alarm_cnt = 0;
if(T1_data > T1H || T1_data < T1L ||
R1_data > R1H || R1_data < R1L ||
PMVAL > HPM){
BUZZER = 0; // 低电平触发蜂鸣器
alarm_cnt = 50; // 持续报警时间
}
else if(alarm_cnt > 0){
BUZZER = (alarm_cnt-- % 2); // 间歇报警
}
else{
BUZZER = 1; // 关闭蜂鸣器
}
}
// 显示更新函数
void update_display(void)
{
char buf[16];
if(Mode_flag)
{
// 实时数据显示
sprintf(buf, "T:%02d RH:%02d", T1_data, R1_data);
WriteChar(2, 0, 16, buf);
}
else
{
// 参数设置显示
char disp_set[16];
switch(shezhi_flag)
{
case 1: sprintf(disp_set, "T_SET:%02d-%02d ", T1L, T1H); break;
case 2: sprintf(disp_set, "H_SET:%02d-%02d ", R1L, R1H); break;
case 3: sprintf(disp_set, "PM_SET:%04d ", HPM); break;
default: sprintf(disp_set, "SET MODE "); break;
}
WriteChar(2, 0, 16, disp_set);
}
}
// 参数设置函数
void set_parameters(void)
{
unsigned char key = get_key();
if(key)
{
switch(key)
{
case '1':
T1L = (T1L < T1H - 1) ? T1L + 1 : T1H - 1;
break;
case '2':
T1L = (T1L > 0) ? T1L - 1 : 0;
break;
case '3':
T1H = (T1H < 99) ? T1H + 1 : 99;
break;
case 'A':
T1H = (T1H > T1L + 1) ? T1H - 1 : T1L + 1;
break;
case '4':
R1L = (R1L < R1H - 1) ? R1L + 1 : R1H - 1;
break;
case '5':
R1L = (R1L > 0) ? R1L - 1 : 0;
break;
case '6':
R1H = (R1H < 99) ? R1H + 1 : 99;
break;
case 'B':
R1H = (R1H > R1L + 1) ? R1H - 1 : R1L + 1;
break;
case '7':
HPM = (HPM < 9999) ? HPM + 1 : 9999;
break;
case '8':
HPM = (HPM > 0) ? HPM - 1 : 0;
break;
case '9':
HPM = (HPM < 9999) ? HPM + 1 : 9999;
break;
case 'C':
HPM = (HPM > 0) ? HPM - 1 : 0;
break;
case '*':
shezhi_flag = (shezhi_flag + 1) % 4;
break;
case '0':
case '#':
shezhi_flag = 0;
break;
case 'D':
Mode_flag = !Mode_flag;
break;
default:
break;
}
}
} |