迅维网

查看: 1174|回复: 0
打印 上一主题 下一主题

1602+ds18b20温度报警器一直响

[复制链接]
跳转到指定楼层
1#
发表于 2016-3-16 07:15:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式 来自: 山东 来自 山东

马上注册,获取阅读精华内容及下载权限

您需要 登录 才可以下载或查看,没有帐号?注册

x
把报警值设为26度以上温度报警器就一直响(环境温度未超过),其余时候正常,求大神指点。。
#include <reg52.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit ds=P2^2;        //温度传感器信号线
sbit beep=P2^3;        //蜂鸣器
sbit lcden=P3^4;//液晶使能端
sbit lcdrs=P3^5;//液晶数据命令选择端
sbit RW=P3^6;        //读写选择端
uint temp;                //定义整型温度数据
uchar num;
uint a1,a2,a3;
float f_temp;        //定义浮点型温度数据
uchar warn;                //定义温度报警值
sbit s1=P3^0;        //进入报警温度设置键
sbit s2=P3^1;        //温度增加1
sbit s3=P3^2;        //温度减少1
sbit s4=P3^3;        //保存并退出
uchar code table1[]="The Warn:       ";
uchar code table2[]="The Temp:       ";
uchar code table3[]="0123456789";
void delay(uint z)        //延时函数
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);        
}

//1602模块
void write_com(uchar com)        //写命令函数
{
        lcdrs=0;
        P0=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
void write_data(uchar date)        //写数据函数
{
        lcdrs=1;
        P0=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
void init0()                //初始化函数
{
        lcden=0;
        RW=0;
        dula=0;
        wela=0;
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
}
void init1()                //液晶屏显示初始
{
        warn=26;
        a1=warn/10;
        a2=warn%10;
        write_com(0x80);
        for(num=0;num<16;num++)
        {
                write_data(table1[num]);
                delay(5);
        }
        write_com(0x80+11);
        write_data(table3[a1]);
        write_data(table3[a2]);
        write_com(0x80+40);
        for(num=0;num<16;num++)
        {
                write_data(table2[num]);
                delay(5);
        }
}
//以上为1602液晶显示模块
//DS18b20模块
void dsreset(void)        //DS18b20复位初始化函数
{
        uint i1;
        ds=0;
        i1=103;
        while(i1>0)i1--;
        ds=1;
        i1=4;
        while(i1>0)i1--;
}
bit tempreadbit(void)        //读一位数据函数
{
        uint i2;
        bit dat;
        ds=0;i2++;
        ds=1;i2++;i2++;
        dat=ds;
        i2=8;while(i2>0)i2--;
        return (dat);
}
uchar tempread(void)        //读一个字节数据函数
{
        uchar i3,j,dat;
        dat=0;
        for(i3=1;i3<=8;i3++)
        {
        j=tempreadbit();
        dat=(j<<7)|(dat>>1);
        }
        return(dat);
}
void tempwritebyte(uchar dat)        //向DS18b20写一个字节数据函数
{
        uint i4;
        uchar j;
        bit testb;
        for(j=1;j<=8;j++)
        {
        testb=dat&0x01;
        dat=dat>>1;
        if(testb)
                {
                        ds=0;
                        i4++;i4++;
                        ds=1;
                        i4=8;
                        while(i4>0)
                        i4--;
                }
        else
                {
                        ds=0;
                        i4=8;
                        while(i4>0)
                        i4--;
                        ds=1;
                        i4++;
                        i4++;
                }
        }        
}
void tempchange(void)        //DS18b20开始获取温度并转换
{
        dsreset();
        delay(1);
        tempwritebyte(0xcc);
        tempwritebyte(0x44);        
}
uint get_temp()        //读取寄存器中存储的温度数据
{
        uchar a,b;
        dsreset();
        delay(10);
        tempwritebyte(0xcc);
        tempwritebyte(0xbe);
        a=tempread();        //读第八位
        b=tempread();        //读高八位
        temp=b;
        temp<<=8;                //组合两个字节
        temp=temp|a;
        f_temp=temp*0.0625;        //温度在寄存器为12位,分辨率0.0625
        temp=f_temp*10+0.5;        //乘10表示小数点后取一位并四舍五入
        return temp;
}
void dis_temp(uint t1)        //显示温度数值
{
        uint i;
        i=t1/100;
        write_com(0xc0+11);
        write_data(table3);
        i=t1%100/10;
        write_com(0xc0+12);
        write_data(table3);
        i=t1%100%10;
        write_com(0xc0+13);
        write_data(0x2e);
        write_com(0xc0+14);
        write_data(table3);
}

//以上为ds18b20模块
//键盘模块
void keyscan()
{
        if(s1==0)
        {
                delay(5);
                if(s1==0)
                {
                        write_com(0x80+11);
                        write_com(0x0f);
                        while(!s1);
                }
        }
        if(s2==0)
        {
                delay(5);
                if(s2==0)
                {
                        warn++;
                        a1=warn/10;
                        a2=warn%10;
                        write_com(0x80+11);
                        write_com(0x0f);
                        write_data(table3[a1]);
                        write_data(table3[a2]);
                        while(!s2);                        
                }
        }
        if(s3==0)
        {
                delay(5);
                if(s3==0)
                {
                        warn--;
                        a1=warn/10;
                        a2=warn%10;
                        write_com(0x80+11);
                        write_com(0x0f);
                        write_data(table3[a1]);
                        write_data(table3[a2]);
                        while(!s3);                        
                }
        }
        if(s4==0)
        {
                delay(5);
                if(s4==0)
                {
                        write_com(0x38);
                        write_com(0x0c);
                        write_com(0x06);
                        while(!s4);                        
                }                        
        }
}
//以上为键盘模块
void deal(uint t2)         //温度处理和报警函数
{
        if(t2>warn)
        {
                beep=0;
                delay(10);
        }
        else
        {
                beep=1;
                delay(10);
        }
}
//主函数
void main()
{
        uchar i5;
        init0();
        init1();
        while(1)
        {
                keyscan();
                delay(10);
                a3=warn;
                warn=a3*10;
                delay(10);
                tempchange();
                delay(5);
                for(i5=10;i5>0;i5--)
                {
                        dis_temp(get_temp());
                }
                delay(5);
                deal(temp);
                warn=a3;
        }
}


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

本版积分规则

快速回复 返回顶部 返回列表
附近
店铺
微信扫码查看附近店铺
维修
报价
扫码查看手机版报价
信号元
件查询
点位图 AI维修
助手



芯片搜索

快速回复