找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2304|回復(fù): 3
收起左側(cè)

這個(gè)溫度報(bào)警程序,上下限溫度是怎么看的

[復(fù)制鏈接]
ID:386308 發(fā)表于 2018-10-20 10:48 | 顯示全部樓層 |閱讀模式
#include <reg52.h>
#include <intrins.h>
#include <math.h>

#define uchar unsigned char
#define uint unsigned int

sbit RS = P0^7;   
sbit LCDEN = P0^5;
sbit rw=P0^6;
sbit  BEEP=P3^6;

void delay500(void)     //500us延時(shí)函數(shù)
{
        uchar  i;
        for(i=230;i>0;i--);
}

void delayUs()
{
        _nop_();
}

void delayMs(uint a)
{
    uint i, j;
    for(i=a; i>0; i--)
    for(j=100; j>0; j--);
}


void writeComm(uchar comm)
{
        RS = 0;   
    P2 = comm;
    LCDEN = 1;
        delayUs();
    LCDEN = 0;
    delayMs(1);
}

//寫(xiě)數(shù)據(jù):RS=1, RW=0;
void writeData(uchar dat)
{
    RS = 1;
    P2 = dat;
    LCDEN = 1;
        delayUs();
    LCDEN = 0;
    delayMs(1);
}


void init()
{
    rw=0;
    writeComm(0x38);
    writeComm(0x0c);
        writeComm(0x06);
    writeComm(0x01);
}

void writeString(uchar * str, uchar length)
{
        uchar i;
    for(i=0; i<length; i++)
    {
                writeData(str[i]);
    }
}

/*******************************DS18B20*******************************/
sbit dq = P3^7;
void dqInit()
{

    unsigned int i;  
    dq = 0;
    i = 100;  
        while(i>0) i--;
    dq = 1;   
    i = 4;
    while(i>0) i--;
}

void dqWait()
{
        unsigned int i;
    while(dq);  
    while(~dq);
    i = 4;
    while(i > 0) i--;
}


bit readBit()
{
    unsigned int i;
    bit b;
    dq = 0;
    i++;   
    dq = 1;
    i++; i++;  
    b = dq;
    i = 8;
    while(i>0) i--;
    return b;
}

unsigned char readByte()
{
    unsigned int i;
    unsigned char j, dat;
   dat = 0;
    for(i=0; i<8; i++)
    {
        j = readBit();

        dat = (j<<7)|(dat>>1);
    }
    return dat;
}


void writeByte(unsigned char dat)
{
    unsigned int i;
    unsigned char j;
    bit b;
    for(j=0; j<8; j++)
    {
        b = dat & 0x01;
        dat >>= 1;

        if(b)   
        {
                        dq = 0;         
                        i++;   
            dq = 1;   
            i = 8;
                        while(i>0)
                        i--;  
        }
        else  
        {
            dq = 0;
            i = 8;
                        while(i>0)
                        i--;  
            dq = 1;
            i++;
        }
   }
}


void sendChangeCmd()
{
    dqInit();   
    dqWait();   
    delayMs(1);   
    writeByte(0xcc);
    writeByte(0x44);
}

void sendReadCmd()
{
    dqInit();
    dqWait();
    delayMs(1);
    writeByte(0xcc);
    writeByte(0xbe);
}


int getTmpValue()
{
    unsigned int tmpvalue;
    int value;
    float t;
    unsigned char low, high;
    sendReadCmd();   
    low = readByte();
    high = readByte();   
    tmpvalue = high;
    tmpvalue <<= 8;
    tmpvalue |= low;
    value = tmpvalue;
    t = value * 0.0625;
    value = t*100+(value>0?0.5:-0.5); //大于0加0.5, 小于0減0.5
    return value;
}

void display(int v)
{
    unsigned char count;
    unsigned char datas[] = {0, 0, 0, 0, 0};
    unsigned int tmp = abs(v);
    datas[0] = tmp / 10000;
    datas[1] = tmp % 10000 / 1000;
    datas[2] = tmp % 1000 / 100;
    datas[3] = tmp % 100 / 10;
    datas[4] = tmp % 10;
    writeComm(0xc0+3);
    if(v < 0)
        {
                writeString("- ", 2);
    }
    else
    {
        writeString("+ ", 2);
    }
    if(datas[0] != 0)
    {
        writeData('0'+datas[0]);
    }
    for(count = 1; count != 5; count++)
    {
        writeData('0'+datas[count]);
        if(count == 2)
        {
            writeData('.');
        }
    }
}
/*******************************DS18B20*******************************/

void main()
{
    uchar table[] = "  Temperature:  ";
        int i;//i儲(chǔ)存轉(zhuǎn)換后的溫度值
        uchar j;
    sendChangeCmd();
    init();
    writeComm(0x80);
    writeString(table, 16);
    while(1)
    {
        delayMs(1000); //溫度轉(zhuǎn)換時(shí)間需要750ms以上
        writeComm(0xc0);
                i = getTmpValue();
                if(i > 2300)
                {
                        for(j=200;j>0;j--)
                        {
                                  BEEP=~BEEP;       //輸出頻率1KHz
                                  delay500();       //延時(shí)500us
                        }
       
                        for(j=200;j>0;j--)
                        {
                                  BEEP=~BEEP;       //輸出頻率500Hz
                                  delay500();       //延時(shí)1ms
                                  delay500();
                        }       
                }
        display(i);
        sendChangeCmd();
    }
}

回復(fù)

使用道具 舉報(bào)

ID:303383 發(fā)表于 2018-10-20 12:46 | 顯示全部樓層
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽
回復(fù)

使用道具 舉報(bào)

ID:7485 發(fā)表于 2018-10-20 18:17 | 顯示全部樓層
這個(gè)程序大概你還看不懂。

溫度上下限是初始設(shè)置時(shí)寫(xiě)進(jìn)去的。和溫度實(shí)測(cè)值一同讀出來(lái)。
回復(fù)

使用道具 舉報(bào)

ID:274129 發(fā)表于 2018-10-30 22:27 | 顯示全部樓層
溫度上下限是自己程序里面設(shè)置的

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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