找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1166|回复: 0
打印 上一主题 下一主题
收起左侧

单片机智能温度检测控制系统设计程序

[复制链接]
跳转到指定楼层
楼主
ID:826660 发表于 2020-10-7 20:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
智能温度检测控制系统设计
下面直接给出源代码:
/*参考LCD1602液晶显示实验接线(开发攻略内在对应的实验章节内实验现象有接线说明)
2,独立按键模块-->单片机管脚.
K1-->P34
K2-->P35
K3-->P32
3,蜂鸣器模块-->单片机管脚
BEEP-->P15
4,LED模块-->单片机管脚
D1-->P24
5,LED模块-->单片机管脚
D1-->P24
6,继电器模块-->单片机管脚
RELAY-->P14
7,直流电机模块-->单片机管脚
IN1-->P10 (参考直流电机实验接线)
8,EPROM模块-->单片机管脚
参考EEPROM实验接线
9,DS18B20模块-->单片机管脚
参考DS18B20温度传感器实验接线
实验现象:,
首先它能显示环境的温度并能设置上下限阀值,这是最基本的功能,系统. 上电的时候显示的是当前环境温度
和设定的温度阀值,我们可以通过按键来修改温度上下限阀值。我们看,按下这个K1键会进入温度阀值设置
界面,每按一下,切换一次阀值设置(上下阀值)界面,按第3次时,会自动回到主界面,如此循环。
在进入温度阀值设计界面时,可以通过K2、K3键对阀值进行加减,这里我们只对温度整数部分进行设置,
小数部分我们就不需要了,将设置好的上下限阀值保存到AT24C02 (EERROM) 内,当下一次开启系统时只需
从AT24C02内读取保存的阀值数据,而不需要重复设置上下限阀值。这样的话,我们用3个按键就实现了温度上下
限阀值的设定,这是温度检测控制系统基本的功能。假如我们把温度上限设置为32°C,下限设置 为30°C.
另外还有恒定温度的功能。当设定好上下限阀值时,系统即会把当前的温度与设定的上下限阀值对比,
如果高于上限温度,开启散热进行降温,同时报警:如果低于下限温度,开启加热,同时报警:
如果当前温度处于'下限和,上限温度之间时,关闭散热、加热及报警。从而可将温度控制在阀值的范围内。*/

#include "public.h"
#include "lcd.h"
#include "temp.h"
#include "i2c.h"


sbit k3=P3^2;   
sbit k1=P3^4;                  
sbit k2=P3^5;                  

sbit led=P2^4

sbit beep=P1^5;        
sbit relay=P1^4;
sbit moto=P1^0;  


char set_templ=22,set_temph=40;
u16 temp_val;
u8 mode;

void Temp_DataPros()
{
        short temp;
        u8 temp_buf[5];
        temp=Ds18b20ReadTemp();
        temp_val=temp;        
        if(temp<0)
        {
                temp=-temp;
                LCD_Dispstring(2+5,0,"-");
        }
        else
        {
                LCD_Dispstring(2+5,0," ");
        }

        temp_buf[0]=temp/100+0x30;
        temp_buf[1]=temp%100/10+0x30;
        temp_buf[2]='.';
        temp_buf[3]=temp%100%10+0x30;
        temp_buf[4]='\0';
        LCD_Dispstring(2+6,0,temp_buf);        

        temp_buf[0]=set_temph/10+0x30;
           temp_buf[1]=set_temph%10+0x30;
        temp_buf[2]='\0';
        LCD_Dispstring(5,1,temp_buf);        

        temp_buf[0]=set_templ/10+0x30;
           temp_buf[1]=set_templ%10+0x30;
        temp_buf[2]='\0';
        LCD_Dispstring(14,1,temp_buf);
}



#define  K1_MODE  1
#define  K2_ADD  2
#define  K3_DEC  3

u8 KEY_Scan(u8 mode)
{
        static u8 key=1;
        if(key&&(k1==0||k2==0||k3==0))
        {
                delay(1000);   //лֶ
                key=0;
                if(k3==0)
                {
                        return K1_MODE;
                }
                else if(k1==0)
                {
                        return K2_ADD;
                }
                else if(k2==0)
                {
                        return K3_DEC;        
                }
        }
        else if(k1==1&&k2==1&&k3==1)
        {
                key=1;        
        }
        if(mode)
        {
                key=1;
        }
        return 0;        
}

void KEY_Pros()
{
        u8 key;
        u8 temph_buf[3];

        key=KEY_Scan(0);
        
        if(key==K1_MODE)  
        {
                mode++;
                LCD_Clear();

                if(mode==1)
                {
                        LCD_Dispstring(0,0,"SETH:   C");               
                }
                else if(mode==2)
                {
                        LCD_Dispstring(0,1,"SETL:   C");        
                }
                else
                {
                        mode=0;
                        LCD_Dispstring(2,0,"Temp:     C");
                        LCD_Dispstring(0,1,"SETH:  ");
                        LCD_Dispstring(9,1,"SETL:  ");        
                }
        }
        if(mode==1)
        {
                switch(key)        
                {
                        case K2_ADD:         
                                                set_temph++;
                                                if(set_temph>=80)set_temph=80;
                                                break;
                        case K3_DEC:          //ݵ
                                                set_temph--;
                                                if(set_temph<=0)set_temph=0;
                                                break;
                }

                temph_buf[0]=set_temph/10+0x30;
                temph_buf[1]=set_temph%10+0x30;
                temph_buf[2]='\0';
                   LCD_Dispstring(6,0,temph_buf);
                At24c02Write(0,set_temph);
        }

        else if(mode==2)
        {
                switch(key)        
                {
                        case K2_ADD:         
                                                set_templ++;
                                                if(set_templ>=80)set_templ=80;
                                                break;
                        case K3_DEC:          //ݵ
                                                set_templ--;
                                                if(set_templ<=0)set_templ=0;
                                                break;
                }

                temph_buf[0]=set_templ/10+0x30;
                temph_buf[1]=set_templ%10+0x30;
                temph_buf[2]='\0';
                   LCD_Dispstring(6,1,temph_buf);
                At24c02Write(2,set_templ);
        }
        


}



void sound()
{
        u8 i=50;
        while(i--)
        {
                beep=!beep;
                delay(10);
        }
}
void TempData_Compare()
{
        if(temp_val>set_temph*10)
        {
                led=1;
                moto=1;
                relay=1;
                sound();               
        }
        else if(temp_val<set_templ*10)
        {
                led=1;
                moto=0;
                relay=0;
                sound();               
        }
        else                    
        {
                moto=0;
                led=0;
                relay=1;
        }
}

void kai_display()
{
        if(At24c02Read(255)!=18)
        {
                At24c02Write(0,set_temph);
                At24c02Write(2,set_templ);
                At24c02Write(255,18);        
        }
        else
        {
                set_temph=At24c02Read(0);
                set_templ=At24c02Read(2);        
        }

        LCD_Dispstring(2,0,"Temp:     C");
        LCD_Dispstring(0,1,"SETH:  ");
        LCD_Dispstring(9,1,"SETL:  ");
}

void main()
{
        moto=0;
        led=0;
        relay=1;

        LCD_Init();
        kai_display();
        while(1)
        {
                if(mode==0)
                        Temp_DataPros();
                KEY_Pros();        
                TempData_Compare();                                
        }
}





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表