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

標題: 基于單片機的恒溫控制 [打印本頁]

作者: w1162687410    時間: 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采集一次溫度值
}


作者: admin    時間: 2019-5-15 21:55
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产高清无av久久 | 天天想天天干 | 99亚洲精品视频 | 这里精品 | 免费在线观看av网址 | 天天夜天天操 | 欧美黄色片 | 中文字幕在线观看一区 | 午夜视频免费在线观看 | 国产91亚洲精品一区二区三区 | 污免费网站 | 一区欧美 | 国产日韩一区二区三免费高清 | 欧美亚洲国产日韩 | 七七婷婷婷婷精品国产 | 精品久久久久久久 | 福利视频一区二区 | 亚洲一区二区视频在线播放 | 日本三级电影在线免费观看 | 亚洲一区二区免费视频 | 成人免费福利 | 天天插天天操 | 国产成人综合网 | 国产女人第一次做爰毛片 | www.日韩高清| 91精品国产综合久久久久久漫画 | 精品一区二区三区在线播放 | 蜜桃一区二区三区 | 久久av一区 | 欧美另类视频 | 久热精品免费 | 国产人免费人成免费视频 | 免费99视频 | 国产精品视频综合 | 美女一级a毛片免费观看97 | 久久精品成人 | 精品日韩 | 狠狠干夜夜草 | 国产精品欧美一区二区三区 | 国产欧美一区二区精品久导航 | 一区二区在线免费播放 |