模拟温度采集记录器 数码管模块: 1.温度采集界面 显示当前输入温度数据 A - - - 提示符 熄灭 输入温度数据显示(℃) 注:当前输入单元格以 0.5 秒/次的速度闪烁 2.数据显示界面 显示当前实际温度数据 C 2 3 提示符 熄灭 实际温度数据显示(℃) 注:实际温度数据采用四舍五入后保留整数部分 3.参数设置界面 显示当前设置电压参数 P 3 0 2 0 提示符 熄灭 TMAX TMIN 注:选中单元格以 0.5 秒/次的速度闪烁 按键模块: 按键定义 1.S1-S10:0-9 键盘输入矩阵 2.S11:定义为“小数点输入”按键,按下 S11 按键可输入小数点 3.S12:定义为“界面切换”按键,按下 S12 按键,切换选择数据显示界 面和参数设置界面 4.S13:定义为“参数切换”按键,按下 S13 按键,切换选择温度上限参数 TMAX 和温度下限参数 TMIN 5.S14:定义为“加”按键,按下 S14 按键,当前选择的温度参数增加 1℃ 6.S15:定义为“减”按键,按下 S15 按键,当前选择的温度参数减少 1℃ 7.S16:定义为“采集”按键,按下 S16 按键,进入温度采集界面 按键说明 1.S1-S11 只能在温度采集界面使能 2.在温度采集界面再次按下 S16 后,若数据输入合法有效,则保存返回显示界面, 若无效则清空数据重新输入 3.按键 S14 和按键 S15 的加、减功能仅在参数设置界面有效 4.按键 S14 和按键 S15 在长按 0.5 秒后可实现快速加、减功能 5.每次从数据界面切换到参数界面,默认当前选择的参数是温度上限参数 TMAX 6. 通过 S12 按键,从参数设置界面退出,进入数据显示界面时,需要进行必要 的参数合理性检查(TMAX≥TMIN);若设置的参数合理,参数生效,进入数据 界面;反之,自动恢复进入参数设置界面前的有效参数,进入数据界面。 LED 模块: 亮度等级 1.当前温度 T > TMAX 时,亮度等级为 1 级 2.当前温度 TMIN ≤ T ≤ TMAX 时,亮度等级为 2 级 3.当前温度 T < TMIN 时,亮度等级为 3 级 指示状态 1.当前温度满足 T > TMAX,指示灯 L1 点亮,否则熄灭 2.当前温度满足 TMIN ≤ T ≤ TMAX,指示灯 L2 点亮,否则熄灭 3.当前温度满足 T < TMIN,指示灯 L3 点亮,否则熄灭 4.如出现错误的参数设置操作,指示灯 L4 点亮,直至下一次正确的参数设置后, 指示灯熄灭 初始状态: 1.处于温度采集界面 2.采集温度有效范围:0-85℃ 3.温度参数有效范围:10-70℃ 4.默认温度上限值:30℃ 5.默认温度下限值:20℃
/*头文件声明区域*/
#include <REGX52.H>
#include "Key.h"
#include "Seg.h"
#include "Led.h"
/*变量声明区域*/
unsigned char Key_Slow_Down;
unsigned int Seg_Slow_Down;
unsigned char Seg_Buf[6]={10,10,10,10,10,10};
unsigned char Seg_Pos;
unsigned char Seg_Point[6];
unsigned char Seg_Mode;//0-温度采集界面1-数据显示界面2-参数设置界面
unsigned char Temper_Input_Buf[3];
unsigned char Temper_Input_Buf_Index;
bit Seg_Flag;//闪烁标志
unsigned char Input_Flag[3];//输入标志
unsigned int Timer_500ms;
float Temper_Input_Val;//实际输入温度
unsigned char Temper_Val;//四舍五入后实际温度
unsigned char TMAX=30,TMIN=20,TMIN_Old=20,TMAX_Old=30;//温度上下限参数
bit T_Set;//参数设置标志
unsigned char Key_Val,Key_Down,Key_Old;
bit Input_Enable;//输入有效使能
unsigned char Led_Buf[8];
unsigned char Led_Pos;
bit Errorset_Flag;//错误参数设置标志
/*按键处理函数*/
void Key_Proc()
{
if(Key_Slow_Down) return;
Key_Slow_Down=1;//减速
Key_Val=Key_Read();
Key_Down=Key_Val&(Key_Val^Key_Old);
Key_Old=Key_Val;//按键准备
if(Seg_Mode == 0)//0-9简单输入
{
if(Key_Down>=1&&Key_Down<=10)
{
Temper_Input_Buf[Temper_Input_Buf_Index]=Key_Down-1;
Input_Flag[Temper_Input_Buf_Index]=1;//输入成功
if(++Temper_Input_Buf_Index == 3)Temper_Input_Buf_Index=0;
}
}
switch(Key_Down)
{
case 16://保存退出、无效清空重新输入
//先算出实际电压值 看是否有效 记得复位小数点
if(Seg_Mode)Seg_Mode=0;
if(Seg_Point[5] == 1)
{
Input_Enable=0;
}
else
{
if(Seg_Point[4] == 1)//小数位00.0
{
Temper_Input_Val=((float)(Temper_Input_Buf[0]*100+Temper_Input_Buf[1]*10+Temper_Input_Buf[2])/10.0);
Temper_Val=(int)(Temper_Input_Val+0.5);
}
else if(Seg_Point[3] == 1)//小数位0.00
{
Temper_Input_Val=((float)(Temper_Input_Buf[0]*100+Temper_Input_Buf[1]*10+Temper_Input_Buf[2])/100.0);
Temper_Val=(int)(Temper_Input_Val+0.5);
}
else
{
Temper_Input_Val=100.0;
}
if(Temper_Input_Val>85.0)
{
Input_Enable=0;
Temper_Input_Val=0.0;
}
else
{
Input_Enable=1;
}
}
if(Input_Flag[2] == 1&&Input_Enable == 1)//采集数据有效
{
Seg_Mode=1;
Seg_Point[5]=0;
Seg_Point[4]=0;
Seg_Point[3]=0;
}
else
{
Input_Flag[0]=0;
Input_Flag[1]=0;
Input_Flag[2]=0;
Temper_Input_Buf[0]=0;
Temper_Input_Buf[1]=0;
Temper_Input_Buf[2]=0;
Temper_Input_Buf_Index=0;
Seg_Point[5]=0;
Seg_Point[4]=0;
Seg_Point[3]=0;
}
break;
case 11://小数点添加
if(Seg_Mode == 0) Seg_Point[Temper_Input_Buf_Index+3]=1;
break;
case 12://界面切换 合理性检查按键
if(Seg_Mode)
{
if(Seg_Mode == 2)
{
TMAX_Old=TMAX>=TMIN?TMAX:TMAX_Old;
TMIN_Old=TMAX>=TMIN?TMIN:TMIN_Old;
Errorset_Flag=TMAX>=TMIN?0:1;//发生错误判断
Seg_Mode=1;
}
else
{
TMAX=TMAX_Old;
TMIN=TMIN_Old;
Seg_Mode=2;
}
}
break;
case 13://参数切换
if(Seg_Mode == 2)
{
T_Set^=1;
}
break;
case 14://参数+1
if(Seg_Mode == 2)
{
if(T_Set == 0)
{
if(++TMAX == 71)TMAX=10;
}
else
{
if(++TMIN == 71)TMIN=10;
}
}
break;
case 15://参数-1
if(Seg_Mode == 2)
{
if(T_Set == 0)
{
if(--TMAX == 9)TMAX=70;
}
else
{
if(++TMIN == 9)TMIN=70;
}
}
break;
}
/*长按0.5秒快速加减功能????????????还没改不知道怎么写
if(Seg_Mode == 2)
{
if(Key_Old == 14)
{
if(T_Set == 0)
{
if(++TMAX == 71)TMAX=10;
}
else
{
if(++TMIN == 71)TMIN=10;
}
}
if(Key_Old == 15)
{
if(T_Set == 0)
{
if(--TMAX == 9)TMAX=70;
}
else
{
if(++TMIN == 9)TMIN=70;
}
}
}*/
}
/*数码管处理函数*/
void Seg_Proc()
{
if(Seg_Slow_Down) return;
Seg_Slow_Down=1;//减速
switch(Seg_Mode)
{
case 0://温度采集界面
Seg_Buf[0]=11;
Seg_Buf[1]=10;
Seg_Buf[2]=10;
Seg_Buf[3]=Input_Flag[0]?Temper_Input_Buf[0]:14;
Seg_Buf[4]=Input_Flag[1]?Temper_Input_Buf[1]:14;
Seg_Buf[5]=Input_Flag[2]?Temper_Input_Buf[2]:14;
//选中单元闪烁 index变化在按键中体现
Seg_Buf[3+Temper_Input_Buf_Index]=Seg_Flag?Temper_Input_Buf[Temper_Input_Buf_Index]:10;
break;
case 1://数据显示界面
Seg_Buf[0]=12;
Seg_Buf[1]=10;
Seg_Buf[2]=10;
Seg_Buf[3]=10;
Seg_Buf[4]=Temper_Val/10%10;
Seg_Buf[5]=Temper_Val%10;
break;
case 2://参数设置界面
Seg_Buf[0]=13;
Seg_Buf[1]=10;
if(T_Set == 0)//选中TMAX
{
Seg_Buf[2]=Seg_Flag?TMAX/10%10:10;
Seg_Buf[3]=Seg_Flag?TMAX%10:10;
Seg_Buf[4]=TMIN/10%10;
Seg_Buf[5]=TMIN%10;
}
else//选中TMIN
{
Seg_Buf[2]=TMAX/10%10;
Seg_Buf[3]=TMAX%10;
Seg_Buf[4]=Seg_Flag?TMIN/10%10:10;
Seg_Buf[5]=Seg_Flag?TMIN%10:10;
}
break;
}
}
/*Led处理函数*/
void Led_Proc()
{
unsigned char i;
if(Errorset_Flag == 0)//参数设置无错误?????????led[3]没有复位
{
if(Temper_Val>TMAX)
{
Led_Buf[0]=1;
Led_Buf[1]=0;
Led_Buf[2]=0;
}
else if(Temper_Val<TMIN)
{
Led_Buf[0]=0;
Led_Buf[1]=0;
Led_Buf[2]=1;
}
else
{
Led_Buf[0]=0;
Led_Buf[1]=1;
Led_Buf[2]=0;
}
}
else//发生错误
{
Led_Buf[3]=1;
}
}
/*定时器0初始化*/
void Timer0Init(void) //1毫秒@12.000MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
EA = 1;
}
/*中断函数*/
void Timer0Server() interrupt 1
{
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
if(++Key_Slow_Down == 10)Key_Slow_Down=0;
if(++Seg_Slow_Down == 500)Seg_Slow_Down=0;
if(++Seg_Pos == 6) Seg_Pos=0;
Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos],Seg_Point[Seg_Pos]);
if(++Led_Pos == 8) Led_Pos=0;
Led_Disp(Led_Pos,Led_Buf[Led_Pos]);
Timer_500ms++;
if(Timer_500ms == 500)//闪烁
{
Timer_500ms=0;
Seg_Flag^=1;
}
}
/*Main*/
void main()
{
Timer0Init();
while(1)
{
Key_Proc();
Seg_Proc();
Led_Proc();
}
}