蓝桥杯温度采集系统(功能不全 望多指教)

模拟温度采集记录器 数码管模块: 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();
    }
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值