📄 eco_energy.c
字号:
P3_3 = 1;
P3_4 = 1;
P3_5 = 0;
};break;
case 1:
{
P1_3 = 0;
P1_2 = 0;
P1_1 = 0;
P1_0 = 1;
P3_3 = 1;
P3_4 = 1;
P3_5 = 0;
};break;
case 2:
{
P1_3 = 0;
P1_2 = 0;
P1_1 = 1;
P1_0 = 0;
P3_3 = 1;
P3_4 = 1;
P3_5 = 0;
};break;
case 3:
{
P1_3 = 0;
P1_2 = 0;
P1_1 = 1;
P1_0 = 1;
P3_3 = 1;
P3_4 = 1;
P3_5 = 0;
};break;
case 4:
{
P1_3 = 0;
P1_2 = 1;
P1_1 = 0;
P1_0 = 0;
P3_3 = 1;
P3_4 = 1;
P3_5 = 0;
};break;
case 5:
{
P1_3 = 0;
P1_2 = 1;
P1_1 = 0;
P1_0 = 1;
P3_3 = 1;
P3_4 = 1;
P3_5 = 0;
};break;
case 6:
{
P1_3 = 0;
P1_2 = 1;
P1_1 = 1;
P1_0 = 0;
P3_3 = 1;
P3_4 = 1;
P3_5 = 0;
};break;
case 7:
{
P1_3 = 0;
P1_2 = 1;
P1_1 = 1;
P1_0 = 1;
P3_3 = 1;
P3_4 = 1;
P3_5 = 0;
};break;
case 8:
{
P1_3 = 1;
P1_2 = 0;
P1_1 = 0;
P1_0 = 0;
P3_3 = 1;
P3_4 = 1;
P3_5 = 0;
};break;
case 9:
{
P1_3 = 1;
P1_2 = 0;
P1_1 = 0;
P1_0 = 1;
P3_3 = 1;
P3_4 = 1;
P3_5 = 0;
};break;
}
}
}
/************************************************************
*function:定时中断0,定时5ms中断
*parameter:
*return:
*Modify:
*************************************************************/
void RectifyTEMP_Timer0() interrupt 1 using 2
{
uint m,n,t;
TR0 = 0;
TH0 = 0xf6;
TL0 = 0x3c;
TR0 = 1;
if((num % 100) == 0)
{
tempera[sum] = Temperature;
sum += 1;
}
num += 1;
if(501 == num)
{
for(m=1;m<=4;m++)
for(n=1;n<=5-m;n++)
if(tempera[m]>tempera[m+1])
{
t=tempera[m];
tempera[m] = tempera[m+1];
tempera[m+1] = t;
}
Temperature_final = tempera[4];
num = 1;
sum = 1;
if(0 == Type_data_flag)
{
Key_value = Temperature_final;
}
}
Scantime_flag--;
timing_num++;
timing_wink_num++;
keypress_num--;
if(0 == keypress_num)
{
keypress_num_flag = 1;
keypress_num = 1000;
}
if(40 <= timing_wink_num)
{
timing_wink_flag = 1;
if(80 <= timing_wink_num)
{
timing_wink_flag = 0;
timing_wink_num = 0;
}
}
if(0 == Scantime_flag)
{
Scantime_flag = 1;
if(4 <= timing_num)
Scan_sta_flag = 0;
}
if(0 != alarm_time_num)
alarm_time_num--;
if(1 == alarm_time_num)
{
alarm_time_flag = 1; //用户设定定时报警标志置1
}
}
/************************************************************
*Function:每20ms扫键一次,去抖10ms,调显示,扫到键后100ms不再扫键
*parameter:
*Return:
*Modify:
*************************************************************/
void Key_scan(void)
{
if((0 == up) || (0 == set) || (0 == down)) //有键按下
{
if(6 == timing_num) //去抖10ms
{
if((0 == up) || (0 == set) || (0 == down)) //确认有键按下
{
keypress_num = 1000;
Type_data_flag = 1;
Keyscan_flag = 1;
if(0 == up) //若上翻键被按下
Up_flag = 1; //上翻标志置1
else if(0 == set)
Set_flag = 1;
else Down_flag = 1;
Scantime_flag = 20; //后100ms不再扫键
timing_num = 0; //扫键计数值置0
Display_key_1();
}
}
}
else
timing_num = 0;
}
/************************************************************
*Function:扫描到键值后显示相应内容,界面1
*parameter:
*Return:
*Modify:
*************************************************************/
void Display_key_1(void)
{
if((1 == Keyscan_flag) && (1 == Type_data_flag))
{
if((1 == Set_flag) && (0 == Page_flag)) //在缺省界面下按设定键,则进入功能选择界面
{
Page_flag = 1; //置相应的标志位和显示值
Key_value = 1;
Keyscan_flag = 0;
Set_flag = 0;
}
if((1 == Up_flag) && (1 == Page_flag)) //在功能选择菜单按上翻键
{
Up_flag = 0;
Page_flag = 1;
Keyscan_flag = 0;
switch(Key_value)
{
case 1: Key_value = 3;break;
case 2: Key_value = 1;break;
case 3: Key_value = 2;break;
}
}
if((1 == Down_flag) && (1 == Page_flag)) //在功能选择菜单上按下翻键
{
Down_flag = 0;
Page_flag = 1;
Keyscan_flag = 0;
switch(Key_value)
{
case 1: Key_value = 2;break;
case 2: Key_value = 3;break;
case 3: Key_value = 1;break;
}
}
}
Display_key_2();
}
/************************************************************
*Function:扫描到键值后显示相应内容,界面2
*parameter:
*Return:
*Modify:
*************************************************************/
void Display_key_2(void)
{
if((1 == Keyscan_flag) && (1 == Type_data_flag))
{
if((1 == Set_flag) && (1 == Page_flag) && (1 == Key_value)) //在功能1下按下设定键,闪烁显示当前温度
{
Page_flag = 2;
Keyscan_flag = 0;
Set_flag = 0;
Wink_flag = 1;
Wink_value = Temperature_final;
func_one_flag = 1;
}
if((1 == Set_flag) && (1 == Page_flag) && (2 == Key_value))//在功能2下按下设定键,闪烁显示当前定时值
{
Page_flag = 2;
Keyscan_flag = 0;
Set_flag = 0;
Wink_flag = 1;
Wink_value = 1;
func_two_flag = 1;
}
if((1 == Set_flag) && (1 == Page_flag) && (3 == Key_value))//在功能3下按下设定键,闪烁显示系统默认报警时间
{
Page_flag = 2;
Keyscan_flag = 0;
Set_flag = 0;
Wink_flag = 1;
Wink_value = 1;
func_thr_flag = 1;
}
}
Display_key_3();
}
/************************************************************
*Function:扫描到键值后显示相应内容,界面3
*parameter:
*Return:
*Modify:
*************************************************************/
void Display_key_3(void)
{
if((1 == Keyscan_flag) && (1 == Type_data_flag))
{
if((1 == Up_flag) && (2 == Page_flag) && (1 == func_one_flag))
{
Wink_value--; //按下上翻键,定温值减1摄氏度
Up_flag = 0;
Keyscan_flag = 0;
Page_flag = 2;
if(0 >= Wink_value) //越界处理
Wink_value = 100;
}
if((1 == Down_flag) && (2 == Page_flag) && (1 == func_one_flag))
{
Wink_value++; //按下下翻键,定温值加1摄氏度
Down_flag = 0;
Keyscan_flag = 0;
Page_flag = 2;
if(100 <= Wink_value) //越界处理
Wink_value = 0;
}
if((1 == Up_flag) && (2 == Page_flag) && (1 == func_two_flag))
{
Wink_value--; //按下上翻键,定时值减1分钟
Up_flag = 0;
Keyscan_flag = 0;
Page_flag = 2;
if(0 >= Wink_value) //越界处理
Wink_value = 998;
}
if((1 == Down_flag) && (2 == Page_flag) && (1 == func_two_flag))
{
Wink_value++; //按下下翻键,定时值加1分钟
Down_flag = 0;
Keyscan_flag = 0;
Page_flag = 2;
if(999 <= Wink_value) //越界处理
Wink_value = 1;
}
if((1 == Up_flag) && (2 == Page_flag) && (1 == func_thr_flag))
{
Wink_value--; //按下上翻键,报警时间减1分钟
Up_flag = 0;
Keyscan_flag = 0;
Page_flag = 2;
if(0 >= Wink_value) //越界处理
Wink_value = 10;
}
if((1 == Down_flag) && (2 == Page_flag) && (1 == func_thr_flag))
{
Wink_value++; //按下下翻键,报警时间加1分钟
Down_flag = 0;
Keyscan_flag = 0;
Page_flag = 2;
if(10 < Wink_value) //越界处理
Wink_value = 1;
}
if((1 == Set_flag) && (2 == Page_flag) && (1 == func_one_flag))
{
Wink_flag = 0; //此时按下设定键,确定报警温度
func_one_flag = 0;
Set_flag = 0;
Keyscan_flag = 0;
Page_flag = 3;
Key_value = Wink_value;
manual_tempera = Wink_value;
}
if((1 == Set_flag) && (2 == Page_flag) && (1 == func_two_flag))
{
Wink_flag = 0; //此时按下设定键,确定定时报警时间
func_two_flag = 0;
Set_flag = 0;
Keyscan_flag = 0;
Page_flag = 3;
Key_value = Wink_value;
manual_time = Wink_value;
alarm_time_num = (manual_time * 12000);
}
if((1 == Set_flag) && (2 == Page_flag) && (1 == func_thr_flag))
{
Wink_flag = 0;
func_thr_flag = 0;
Set_flag = 0;
Keyscan_flag = 0;
Page_flag = 3;
Key_value = Wink_value;
manual_alarm_time = Wink_value;
}
}
Display_key_4();
}
/************************************************************
*Function:扫描到键值后显示相应内容,界面4
*parameter:
*Return:
*Modify:
*************************************************************/
void Display_key_4(void)
{
if((1 == Keyscan_flag) && (1 == Type_data_flag))
{
if((1 == Set_flag) && (3 == Page_flag)) //在页面3下扫描到设定键,回到缺省界面
{
Type_data_flag = 0;
Set_flag = 0;
Keyscan_flag = 0;
Page_flag = 0;
}
}
if(1 == Keyscan_flag) //报警时按下上翻键或下翻键,报警停止
{
if((1 == P1_4) && (0 == P1_5) && ((1 == Up_flag) || (1 == Down_flag)))
{
Keyscan_flag = 0;
Up_flag = 0;
Down_flag = 0;
Page_flag = 0;
Type_data_flag = 0;
P1_4 = 0;
P1_5 = 1;
}
}
}
/************************************************************
*function:闪烁函数
*parameter:
*return:
*Modify:
*************************************************************/
void Wink(void)
{
if(1 == Wink_flag)
{
if(1 == timing_wink_flag)
Key_value = 999; //控制数码管灭
else Key_value = Wink_value; //控制数码管亮
}
}
/************************************************************
*function:定温报警函数
*parameter:
*return:
*Modify:
*************************************************************/
void Alarm_tempera(void)
{
if(manual_tempera <= Temperature_final)
{
P1_4 = 1;
P1_5 = 0;
Type_data_flag = 0;
manual_tempera = 999;
}
}
/************************************************************
*function:定时报警函数
*parameter:
*return:
*Modify:
*************************************************************/
void Alarm_time(void)
{
if(1 == alarm_time_flag)
{
alarm_time_flag = 0;
alarm_time_num = 0;
Type_data_flag = 0;
P1_4 = 1;
P1_5 = 0;
}
}
/************************************************************
*function:主函数
*parameter:
*return:
*Modify:
*************************************************************/
void main()
{
uint i;
P3_3 = 1;
P3_4 = 1;
P3_5 = 1;
P1_4 = 0;
opera_flag = 0;
EA = 1; //允许CPU中断
ET0 = 1; //定时器0中断打开
TMOD = 0x11; //设定时器为模式1,16位模式
TH0=0xf6;
TL0=0x3c; //设定时值为5000us(5ms)
TR0 = 1;
ET1 = 0; //定时器1中断打开
TH1 = 0xf6;
TL1 = 0x3c; //设定时值为100000us(100ms)
TR1 = 1;
num = 1;
sum = 1;
Page_flag = 0; //初始缺省界面标志为0
LED_one = 0;
LED_two = 0;
LED_three = 0;
timing_num = 0; //计数值置0
timing_wink_num = 0;
alarm_time_num = 0; //用户设定定时时间计数值置0
manual_tempera = 999;
keypress_num = 1000;
Scantime_flag = 1;
Key_value = 0; //初始键值置0
Keyscan_flag = 0; //位标志初始化
Up_flag = 0;
Set_flag = 0;
Down_flag = 0;
Type_data_flag = 0;
Scan_sta_flag = 1;
Wink_flag = 0;
func_one_flag = 0;
func_two_flag = 0;
func_thr_flag = 0;
alarm_time_flag = 0;
keypress_num_flag = 0;
while(1)
{
for(i=1;i<4;i++) //循环动态显示个十百位的值
{
TemperatuerResult(); //得到18B20检测到的温度值
if(0 == Scan_sta_flag)
{
Scan_sta_flag = 1;
Key_scan(); //执行键扫描函数
}
if((1 == Type_data_flag) && (2 == Page_flag))
Wink(); //执行闪烁显示函数
if (3 == opera_flag)
{
Trans_temp(Key_value); //得到要显示的各个位值
opera_flag = 0;
}
Dis_play_temp(LED_one,LED_two,LED_three,i); //显示函数
}
if(0 != manual_tempera)
Alarm_tempera(); //定温报警函数
if(0 != manual_time)
Alarm_time(); //定时报警函数
if(1 == keypress_num_flag) //5秒无键按下返回缺省界面
{
keypress_num_flag = 0;
keypress_num = 1000;
Type_data_flag = 0;
Page_flag = 0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -