久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1535|回復: 1
打印 上一主題 下一主題
收起左側

基于單片機的恒溫控制

[復制鏈接]
跳轉到指定樓層
樓主
ID:530536 發表于 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數碼管要顯示的數據,在led.h中聲明的外部變量
uint dig3_u,dig2_u,dig1_u,dig0_u; //保存設置上限  up
uint dig3_d,dig2_d,dig1_d,dig0_d; //保存設置下限  down

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

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

void KeyCtrl();//按鍵控制

void main(void)
{

        TMOD=0x01; //方式1的定時計數50ms,設置定時器每一段時間采集溫度值
          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();//掃描到按鍵執行按鍵控制,否則跳過

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

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

                                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;        //高電平有效,此處關閉制熱
                                        cold=0;        //高電平有效,此處關閉制冷
                                }                               
                }
                                       
        }       
               
}
/***********按鍵控制函數,模式、加減、確認***********/
void KeyCtrl()
{

        if(key)        //key是外部變量,在掃描的時候改變,在退出這個函數前清零,否則會一直保持控制,閃啊閃的
        {
                switch(key)        //判斷掃描到的按鍵是什么,作出相應的操作
                {
                        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) //恢復溫度采集顯示
                                        {
                                                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以上會顯示數組段碼的后面的字符
                                                                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;                                               
}

/**********定時中斷每隔一段時間采集一次當前溫度******/
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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲高清在线观看 | 久久九九色| 中文字幕av第一页 | 一区二区精品视频 | 国产精品久久性 | 国产成人一区 | 日本天堂视频在线观看 | 九九伊人sl水蜜桃色推荐 | 最新av在线播放 | 亚洲欧洲av在线 | 一区二区在线看 | 亚洲精品1区 | 亚洲精品成人av久久 | 日韩免费福利视频 | 91新视频| 日韩精品久久一区二区三区 | 欧美一级欧美三级在线观看 | 久久91精品 | 国产高清美女一级a毛片久久w | 久综合 | 亚洲精品视频三区 | 国产 欧美 日韩 一区 | 超碰导航 | 视频一区二区三区中文字幕 | 围产精品久久久久久久 | 国产精品久久久久久中文字 | 亚洲综合久久网 | 日韩精品一区二区三区中文字幕 | 在线中文字幕亚洲 | 一区二区三区国产 | 欧美成人猛片aaaaaaa | 国产精品美女久久久久久久网站 | 成人免费视频网站在线看 | 国产精品久久久久久久岛一牛影视 | 成人av高清在线观看 | 国产97人人超碰caoprom | 久久国产精品视频 | 成人av播放| 国产综合久久 | 欧美最猛黑人 | 精品久久久久久久久久久 |