找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1537|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

基于單片機的恒溫控制

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:530536 發(fā)表于 2019-5-15 14:52 來自手機 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include<reg52.h>
#include"mytype.h"
#include"led.h"
#include"ds18b20.h"
#include"key.h"


/*****繼電器端口***********/
sbit cold=P1^4;
sbit heat=P1^5;

sbit buzzer=P1^6;  //蜂鳴器

uint  tvalue;

uint dig3,dig2,dig1,dig0;          //digx數(shù)碼管要顯示的數(shù)據(jù),在led.h中聲明的外部變量
uint dig3_u,dig2_u,dig1_u,dig0_u; //保存設(shè)置上限  up
uint dig3_d,dig2_d,dig1_d,dig0_d; //保存設(shè)置下限  down

uchar key;                                          //key是key的返回值,在key.h中聲明的外部變量

uchar kflag,kshift=1,kmode=0;//按鍵設(shè)置標(biāo)志、閃爍led的移位按鍵、按鍵模式(上下限溫度)
uint  temp;                //緩存溫度

void KeyCtrl();//按鍵控制

void main(void)
{

        TMOD=0x01; //方式1的定時計數(shù)50ms,設(shè)置定時器每一段時間采集溫度值
          TH0=0x3c;         
          TL0=0xb0;
        EA=1;
        TR0=1;
        ET0=1;
       
        dig2_u=5;  //初始化上限50.0度
        dig1_u=0;
        dig0_u=0;

        dig2_d=3;  //初始化下限30.0度
        dig1_d=0;
        dig0_d=0;

        while(1)
        {                               
                if(KeyScan())KeyCtrl();//掃描到按鍵執(zhí)行按鍵控制,否則跳過

                if(kflag) //如果按鍵設(shè)置標(biāo)志為1,進入閃爍顯示
                {                       
                        LedFlick(kshift); //數(shù)碼管閃爍顯示
                }
                else
                {
                        temp=tvalue;  //tvalue是外部變量,在定時器執(zhí)行中斷采集溫度時ReadTemp();改變溫度值
                        dig3=0;
                        dig2=temp/100%10;   
                        dig1=temp/10%10 ;   
                        dig0=temp%10;

                        LedScan();//數(shù)碼管顯示采集溫度

                                if( temp>(dig2_u*100+dig1_u*10+dig0_u) )//大于上限值報警并制冷
                                {       
                                        buzzer=1;
                                        heat=0;       
                                        cold=1;
                                }
                                else if(temp<(dig2_d*100+dig1_d*10+dig0_d) )//小于下限值報警并制熱
                                {
                                        buzzer=1;
                                        heat=1;
                                        cold=0;
                                }
                                else //不報警停止制冷制熱
                                {
                                        buzzer=0;
                                        heat=0;        //高電平有效,此處關(guān)閉制熱
                                        cold=0;        //高電平有效,此處關(guān)閉制冷
                                }                               
                }
                                       
        }       
               
}
/***********按鍵控制函數(shù),模式、加減、確認(rèn)***********/
void KeyCtrl()
{

        if(key)        //key是外部變量,在掃描的時候改變,在退出這個函數(shù)前清零,否則會一直保持控制,閃啊閃的
        {
                switch(key)        //判斷掃描到的按鍵是什么,作出相應(yīng)的操作
                {
                        case 1: kflag=1;         //模式切換按鍵
                                    kmode++;
                                        if(kmode==1)//把保存的上限溫度值顯示出來
                                        {
                                                dig0=dig0_u;
                                                dig1=dig1_u;
                                                dig2=dig2_u;
                                                dig3=11;//'H'                                               
                                        }
                                        else if(kmode==2) //把保存的下限溫度值顯示出來
                                        {
                                                dig0=dig0_d;
                                                dig1=dig1_d;
                                                dig2=dig2_d;
                                                dig3=12;//'L'                                       
                                        }
                                        else if(kmode==3) //恢復(fù)溫度采集顯示
                                        {
                                                kmode=0;
                                                kflag=0;
                                                dig3=0;
                                        }
                                        break;
                        case 2: kshift++;         //閃爍位左移按鍵
                                        if(kshift==4)kshift=1;
                                        break;

                        case 3:        if(kflag)   //加1按鍵
                                        switch(kshift)
                                        {
                                                case 1: dig0++;
                                                                if(dig0==10)dig0=0;        //之所以這樣,是避免dig0加到10以上會顯示數(shù)組段碼的后面的字符
                                                                break;
                                                case 2: dig1++;
                                                                if(dig1==10)dig1=0;
                                                                break;
                                                case 3: dig2++;
                                                                if(dig2==10)dig2=0;
                                                                break;
                                        }
                                        break;
                        case 4:        if(kflag)         //減1按鍵
                                        switch(kshift)
                                        {
                                                case 1: dig0--;
                                                                if(dig0==-1)dig0=9;
                                                                break;
                                                case 2: dig1--;
                                                                if(dig1==-1)dig1=9;
                                                                break;
                                                case 3: dig2--;
                                                                if(dig2==-1)dig2=9;
                                                                break;
                                        }
                                        break;
                        default:break;
                }
        }
        if(kmode==1)  //把顯示的溫度值上限保存一下
        {
                dig0_u=dig0;
                dig1_u=dig1;
                dig2_u=dig2;
                dig3_u=dig3;                                               
        }
        else if(kmode==2) //把顯示的溫度值下限保存一下
        {
                dig0_d=dig0;
                dig1_d=dig1;
                dig2_d=dig2;
                dig3_d=dig3;                                       
       
        }
        key=0;                                               
}

/**********定時中斷每隔一段時間采集一次當(dāng)前溫度******/
void time0() interrupt 1
{
        uchar cnt;
        TH0=0x3c; //重賦初值
        TL0=0xb0;
               
        if(!cnt)
        {
                ReadTemp();
        }
        cnt++;
        if(cnt==4)cnt=0; //50ms*4=1/5s采集一次溫度值
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:1 發(fā)表于 2019-5-15 21:55 | 只看該作者
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表