新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > DS18B20溫度檢測調節程序(C代碼)

        DS18B20溫度檢測調節程序(C代碼)

        作者: 時間:2016-11-17 來源:網絡 收藏
        #include"reg52.h"

        #include"intrins.h"
        #include"absacc.h"
        #define uint unsigned int
        #define uchar unsigned char
        uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共陽管0~9
        uchar code tab_motor_1[]={0x03,0x06,0x0c,0x09}; //電機正轉 向上
        uchar code tab_motor_2[]={0x09,0x0c,0x06,0x03}; //電機反轉 向下

        本文引用地址:http://www.104case.com/article/201611/315460.htm

        sbit ds18b20_in=P2^4; //溫度傳感器數據線位定義
        sbit dht11=P2^2; //溫濕度傳感器 數據線位定義
        sbit SPEAKER=P2^3; //報警器
        //sbit FAN=P2^5; //電風扇
        sbit HEATERS=P3^1;
        sbit FAN=P3^0;
        //******************全局變量定義**********************************
        uchar tempL=0,tempH=0; //ds18b20讀取值
        uchar Set_Temp_H=30,Set_Temp_L=24;//溫度邊界值設定值
        uchar Set_Humi_H,Set_Humi_L;
        uchar Set_Illu_H,Set_Illu_L;
        uchar flag_judge_temp,flag_judge_humi,flag_judge_illu; //標志位定義
        float temperature,illumination,humidity; //溫度值、光照值、濕度值?
        //**********************延時子程序************************
        void delay(uint time)
        {
        uint n=0;
        while(n {n++;}
        return;
        }
        void delay1()
        {
        int k;
        for(k=0;k<600;k++);
        }
        void delay20ms(void) //誤差 0us
        {
        unsigned char a,b;
        for(b=215;b>0;b--)
        for(a=45;a>0;a--);
        _nop_; //if Keil,require use intrins.h
        _nop_; //if Keil,require use intrins.h
        }
        //*******************顯示子程序**************************
        void display(float k)
        {
        int t;
        t=k*100;
        P1=0xfe;
        P0=tab[t/1000];//十位
        delay1();
        P1=0xfd;
        P0=tab[t%1000/100]-0x80;//個位+小數點
        delay1();
        P1=0xfb;
        P0=tab[t%100/10];//十分位
        delay1();
        P1=0xf7;
        P0=tab[t%10];//百分位
        delay1();
        P1=0xff;
        }
        //*****************ds18b20的初始化程序*********************
        init_ds18b20()
        {
        uchar x=0;
        ds18b20_in=1; //ds18b20_in先置高
        delay(8);
        ds18b20_in=0; //發送復位脈沖
        delay(85); //延時>480ms
        ds18b20_in=1; //拉高數據線
        delay(14); //等待15~60ms
        x=ds18b20_in; //用x的值來判斷初始化是否成功
        //ds18b20存在的話x=0,否則x=1
        delay(20);
        }
        /**************************讀取字符子程序******************/
        ReadOneChar()
        {
        uchar i=0; //主機數據線先從高電平拉低1ms以上,在拉高,從而產生讀信號

        uchar dat=0; //每個讀取周期最短持續時間為60ms,各個讀取周期之間必須有1ms以上的高電平恢復??

        for(i=8;i>0;i--) //一個字節8位
        {
        ds18b20_in=1;delay(1);
        ds18b20_in=0;dat>>=1;ds18b20_in=1;
        if(ds18b20_in)
        dat|=0x80;
        delay(4);
        }
        return(dat);
        }
        //****************向寫一個字節子程序*********************/
        WriteOneChar(uchar dat)
        {
        uchar i; //數據從高電平拉至低電平,產生寫起始信號
        for(i=8;i>0;i--)
        {
        ds18b20_in=0;
        ds18b20_in=dat&0x01;
        delay(5);
        ds18b20_in=1;
        dat>>=1;
        }
        delay(4);
        }
        /*********************************************************
        向ds18b20度溫度值
        出口參數temprature
        *********************************************************/
        ReadTemperature()
        {
        init_ds18b20(); //初始化
        WriteOneChar(0xcc); //跳過讀序列號的操作
        WriteOneChar(0x44); //啟動溫度轉換
        delay(125); //轉換延時
        init_ds18b20(); //初始化
        WriteOneChar(0xcc); //跳過讀序列號的操作
        WriteOneChar(0xbe); //讀溫度寄存器(頭兩個值分別是溫度的低位和高位)
        tempL=ReadOneChar(); //讀出溫度的低位LSB
        tempH=ReadOneChar(); //讀出高位的高位MSB
        //tempL=0X91;tempH=0X01;
        if(tempH&0x80)
        temperature=(~((tempH*256)+tempL)+1)*0.0625; //零度以下
        //溫度轉換,把高位低位做相應的運算轉換為實際的溫度
        else
        temperature=((tempH*256)+tempL)*0.0625; //零度以上
        delay(200);
        return(temperature);
        }
        //*************************************************************************************************************************************
        //**************報警子程序****************
        sounder_H()
        {

        SPEAKER=1;
        delay1();delay1();delay1();
        SPEAKER=0;
        }
        sounder_L() //蜂鳴器 低電平響
        {

        SPEAKER=1;
        delay1();delay1();delay1();
        delay1();delay1();delay1();
        delay1();delay1();delay1();
        delay1();delay1();delay1();
        SPEAKER=0;
        }
        //*************步進電機子程序**************
        void motor_up()
        {
        int m,n;
        for(m=0;m<24;m++)
        for(n=0;n<4;n++)
        { P3=tab_motor_1[n];delay20ms();}
        }
        void motor_down()
        {
        int m,n;
        for(m=0;m<288;m++)
        for(n=0;n<4;n++)
        { P3=tab_motor_2[n];delay20ms();}
        }
        /*************電風扇開啟子程序 **************
        **************由直流電機 控制 *************/
        void fan()
        {
        FAN=0; //開啟繼電器 打開電動機
        }
        //**************加熱器*********************
        void heaters()
        {
        HEATERS=0;
        }

        /*************溫度判斷***************
        正常返回“1 否則返回0?
        *************************************/
        judge_temp(float i)
        {
        int k;
        k=(int)(i*100);
        if( k<=Set_Temp_H*100 && k>=Set_Temp_L*100 ) //正常范圍內
        { return 1;}
        if(k {
        flag_judge_temp=0; return 0;}
        else
        {
        flag_judge_temp=1; return 0;} //高于最大值
        }
        /*************濕度判斷***************
        正常返回“1 否則返回0
        *************************************/
        judge_humi(float ii)
        {}
        /*************光照判斷***************
        正常返回“1 否則返回0
        *************************************/
        judge_illu(float iii)
        {}


        //********************主程序****************
        void main()
        {
        float i;
        while(1)
        {
        i=ReadTemperature();
        display(i);

        /**********判斷******/
        {
        if(!judge_temp(i))
        {
        if(flag_judge_temp) //溫度高
        {sounder_H(); fan();HEATERS=1;//motor_up();
        }
        else
        {sounder_L(); heaters();FAN=1;//motor_down();
        } //溫度低
        }
        else {SPEAKER=1;FAN=1;HEATERS=1;}//關閉相應調節功能
        }

        /*********處理**********/
        }
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 蓬溪县| 潼南县| 黄陵县| 项城市| 沙洋县| 安图县| 连平县| 泊头市| 永定县| 加查县| 罗城| 娄烦县| 东方市| 祥云县| 吉隆县| 洛川县| 镇远县| 夏河县| 罗定市| 永福县| 涡阳县| 建湖县| 伊吾县| 大新县| 芜湖市| 武川县| 广元市| 交口县| 曲靖市| 新安县| 兰坪| 清丰县| 皮山县| 太湖县| 平乐县| 酒泉市| 娄烦县| 正蓝旗| 内乡县| 美姑县| 库尔勒市|