找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1792|回复: 3
打印 上一主题 下一主题
收起左侧

这个温度报警程序,上下限温度是怎么看的

[复制链接]
跳转到指定楼层
楼主
ID:386308 发表于 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延时函数
{
        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);
}

//写数据: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储存转换后的温度值
        uchar j;
    sendChangeCmd();
    init();
    writeComm(0x80);
    writeString(table, 16);
    while(1)
    {
        delayMs(1000); //温度转换时间需要750ms以上
        writeComm(0xc0);
                i = getTmpValue();
                if(i > 2300)
                {
                        for(j=200;j>0;j--)
                        {
                                  BEEP=~BEEP;       //输出频率1KHz
                                  delay500();       //延时500us
                        }
       
                        for(j=200;j>0;j--)
                        {
                                  BEEP=~BEEP;       //输出频率500Hz
                                  delay500();       //延时1ms
                                  delay500();
                        }       
                }
        display(i);
        sendChangeCmd();
    }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:303383 发表于 2018-10-20 12:46 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

板凳
ID:7485 发表于 2018-10-20 18:17 | 只看该作者
这个程序大概你还看不懂。

温度上下限是初始设置时写进去的。和温度实测值一同读出来。
回复

使用道具 举报

地板
ID:274129 发表于 2018-10-30 22:27 | 只看该作者
温度上下限是自己程序里面设置的

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表