新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > #單片機#ds18b20 單位轉換 30度報警

        #單片機#ds18b20 單位轉換 30度報警

        作者: 時間:2016-11-27 來源:網絡 收藏
        #include"reg52.h"
        #define uchar unsigned char
        #define uint unsigned int
        sbit DSPORT=P3^7;
        sbit key3 = P3^2;
        sbit beep = P1^0;
        uchar flag;
        int tmp;
        float t;
        uint warn_d = 300; //溫度上限值,溫度為乘10之后的值
        uchar code table[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
        0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
        void Delay1ms(unsigned int y)
        {
        unsigned int x;
        for(y;y>0;y--)
        for(x=110;x>0;x--);
        }
        unsigned char Ds18b20Init()
        {
        unsigned int i;
        DSPORT=0; //將總線拉低480us~960us
        i=70;
        while(i--);//延時642us
        DSPORT=1;//然后拉高總線,如果DS18B20做出反應會將在15us~60us后總線拉低
        i=0;
        while(DSPORT)//等待DS18B20拉低總線
        {
        i ;
        if(i>5000)//等待>5MS
        return 0;//初始化失敗
        }
        return 1;//初始化成功
        }
        void Ds18b20WriteByte(unsigned char dat)
        {
        unsigned int i,j;
        for(j=0;j<8;j )
        {
        DSPORT=0;//每寫入一位數據之前先把總線拉低1us
        i ;
        DSPORT=dat&0x01; //然后寫入一個數據,從最低位開始
        i=6;
        while(i--); //延時68us,持續時間最少60us
        DSPORT=1;//然后釋放總線,至少1us給總線恢復時間才能接著寫入第二個數值
        dat>>=1;
        }
        }
        unsigned char Ds18b20ReadByte()
        {
        unsigned char byte,bi;
        unsigned int i,j;
        for(j=8;j>0;j--)
        {
        DSPORT=0;//先將總線拉低1us
        i ;
        DSPORT=1;//然后釋放總線
        i ;
        i ;//延時6us等待數據穩定
        bi=DSPORT; //讀取數據,從最低位開始讀取
        byte=(byte>>1)|(bi<<7);
        i=4;//讀取完之后等待48us再接著讀取下一個數
        while(i--);
        }
        return byte;
        }
        void Ds18b20ChangTemp()
        {
        Ds18b20Init();
        Delay1ms(1);
        Ds18b20WriteByte(0xcc);//跳過ROM操作命令
        Ds18b20WriteByte(0x44); //溫度轉換命令
        }
        void Ds18b20ReadTempCom()
        {
        Ds18b20Init();
        Delay1ms(1);
        Ds18b20WriteByte(0xcc); //跳過ROM操作命令
        Ds18b20WriteByte(0xbe); //發送讀取溫度命令
        }
        int Ds18b20ReadTemp()
        {
        int temp=0;
        unsigned char tmh,tml;
        Ds18b20ChangTemp(); //先寫入轉換命令
        Ds18b20ReadTempCom();//然后等待轉換完后發送讀取溫度命令
        tml=Ds18b20ReadByte();//讀取溫度值共16位,先讀低字節
        tmh=Ds18b20ReadByte();//再讀高字節
        temp=tmh;
        temp<<=8;
        temp|=tml;
        return temp;
        }
        void Display(int temp) //顯示
        {
        unsigned char datas[] = {0, 0, 0, 0, 0}; //定義數組
        float tp;
        if(temp< 0)//當溫度值為負數
        {
        //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
        temp=temp-1;
        temp=~temp;
        tp=temp;
        temp=tp*0.0625*10 0.5;
        //留兩個小數點就*100, 0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
        //后面的數自動去掉,不管是否大于0.5,而 0.5之后大于0.5的就是進1了,小于0.5的就
        //算加上0.5,還是在小數點后面。
        }
        else
        {
        tp=temp;//因為數據處理有小數點所以將溫度賦給一個浮點型變量
        //如果溫度是正的那么,那么正數的原碼就是補碼它本身
        temp=tp*0.0625*10 0.5;
        //留兩個小數點就*100, 0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
        //后面的數自動去掉,不管是否大于0.5,而 0.5之后大于0.5的就是進1了,小于0.5的就
        //算加上0.5,還是在小數點后面。
        }
        datas[0] = temp / 100;
        datas= temp % 100 / 10;
        datas= temp % 10;
        P0=0xff;
        P0 = table[datas[0]];
        P2 = 0xfd;
        Delay1ms(1);
        P0=0xff;
        P0 = table[datas] & 0x7f;
        P2 = 0xfb;
        Delay1ms(1);
        P0=0xff;
        P0 = table[datas];
        P2 = 0xf7;
        Delay1ms(1);
        }
        void Exter_Init()
        {
        EX0=1; //打開外部中斷
        EA=1; //打開總中斷
        IT0=0; //低電平觸發
        EX0 = 1;
        IT0 = 1;
        }
        void main()
        {
        Exter_Init();
        beep = 1;
        while(1)
        {
        if(flag%2 == 1)//奇數次按鍵,顯示華氏度
        {
        t = Ds18b20ReadTemp(); //華氏度=(攝氏度*9)/5 32
        t = t*0.0625*10 0.5;
        tmp = t*1.8 320;
        P0=0xff;
        P0 = table[15];
        P2 = 0xfe;
        Delay1ms(1);
        P0=0xff;
        P0 = table[tmp/100];
        P2 = 0xfd;
        Delay1ms(1);
        P0=0xff;
        P0 = table[tmp0/10] & 0x7f;
        P2 = 0xfb;
        Delay1ms(1);
        P0=0xff;
        P0 = table[tmp];
        P2 = 0xf7;
        Delay1ms(1);
        }
        else //偶數次按鍵,顯示攝氏度
        {
        t = Ds18b20ReadTemp();
        tmp = t*0.0625*10 0.5;
        Display(Ds18b20ReadTemp());
        if(tmp >= warn_d)//若溫度超限,蜂鳴器報警
        {
        beep = 0;
        Delay1ms(1);
        beep = 1;
        Delay1ms(1);
        }
        else beep = 1;
        }
        }
        }
        void exter0() interrupt 0
        {
        Delay1ms(5);//消抖
        while(!key3);
        flag ;
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 柯坪县| 四川省| 股票| 靖边县| 镇赉县| 屏东县| 曲阜市| 福安市| 平昌县| 鲁山县| 三亚市| 灯塔市| 枝江市| 临夏市| 道真| 富裕县| 芮城县| 新蔡县| 封开县| 尚义县| 双城市| 海伦市| 绍兴市| 北海市| 安义县| 福清市| 云林县| 涞源县| 平武县| 阳西县| 邢台市| 定边县| 绥芬河市| 嵊州市| 托克逊县| 遂昌县| 岑巩县| 孝义市| 东至县| 云阳县| 巴中市|