⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eco_energy.c

📁 基于MCS-51系列的AT89C2051的典型应用
💻 C
📖 第 1 页 / 共 2 页
字号:
				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 + -