找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1064|回复: 4
收起左侧

请问这个18B20温度采集程序,报警怎么实现?

[复制链接]
ID:634601 发表于 2020-3-8 22:07 | 显示全部楼层 |阅读模式
请教大神:以下程序可以实现18B20进行温度采集和数码管温度显示,
但是温度报警有问题,
请帮忙看一下那里的问题,怎么修改?

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbit dx=P2^6;
sbit wx=P2^7;
sbit ds=P2^2;
sbit beep=P2^3;
bit flag;
uint bai,shi,ge,temp,num;

void delay(uint t)
{
while(t--);
}

void reset()
{
ds=1;
delay(5);
ds=0;
delay(80);
ds=1;
delay(14);
if(ds==0)
  flag=1;
else
  flag=0;
delay(20);
}

bit dubit()//读一位
{
bit dat;
ds=0;
_nop_();
_nop_();
ds=1;
_nop_();
dat=ds;
delay(10);
return dat;
}

uchar dsdubyte()//读一个字节
{
uchar i,j,k;
for(i=0;i<8;i++)
{
j=dubit();
k=(j<<7)|(k>>1);
}
return k;
  
}
void xiebyte(uchar dat)//写一个字节
{
uchar i;
for(i=0;i<8;i++)
{
ds=0;
_nop_();
ds=dat&0x01;
delay(6);
ds=1;
dat=dat>>1;
}
delay(6);
}
uint duwendu()//读取温度
{
uchar a,b;
reset();
xiebyte(0xCC);
xiebyte(0xBE);
a=dsdubyte();
b=dsdubyte();
temp=b;
temp=temp<<8;
temp=temp|a;
temp=temp*0.0625*10+0.5;
return temp;
}

void delay1(uint z)
{
int m,n;
for(m=z;m>0;m--)
  for(n=110;n>0;n--);
}
  void xianshi (uint temp)
{

P0=table[temp/100];
dx=1;
dx=0;
P0=0xfe;
wx=1;
wx=0;
delay1(2);
P0=table[temp%100/10]|0x80; //加小数点
dx=1;
dx=0;
P0=0xfd;
wx=1;
wx=0;
delay1(2);

P0=table[temp%10];
dx=1;
dx=0;
P0=0xfb;
wx=1;
wx=0;
delay1(2);
}  
void main()
{
while(1)
{
reset();
xiebyte(0xCC);
xiebyte(0x44);
xianshi(duwendu());
if(temp>300)//想实现温度值大于30度,让蜂鸣器响,但是下载后,温度不管啥时候,蜂鸣器一直叫。
beep=0;
   
}
}


回复

使用道具 举报

ID:584814 发表于 2020-3-8 23:28 | 显示全部楼层
xianshi(duwendu());
temp=duwendu();//加这句试试
if(temp>300)//想实现温度值大于30度,让蜂鸣器响,但是下载后,温度不管啥时候,蜂鸣器一直叫。
回复

使用道具 举报

ID:213173 发表于 2020-3-9 07:04 | 显示全部楼层
void main()
{
        uchar i;
        while(1)
        {
                reset();
                xiebyte(0xCC);
                xiebyte(0x44);
                num=duwendu();
                xianshi(num);
                i++;
                if(i>250)//少许延时避免初始85度误报警
                {
                        i=250;
                        if(num>300)
                                beep=0;   
                        else beep=1;
                }
        }
}
回复

使用道具 举报

ID:634601 发表于 2020-3-9 11:51 | 显示全部楼层
man1234567 发表于 2020-3-8 23:28
xianshi(duwendu());
temp=duwendu();//加这句试试
if(temp>300)//想实现温度值大于30度,让蜂鸣器响,但 ...

试了下,这样还是不行啊,二楼说的方法可以的,应该是问题所在
回复

使用道具 举报

ID:634601 发表于 2020-3-9 12:20 | 显示全部楼层
wulin 发表于 2020-3-9 07:04
void main()
{
        uchar i;

谢谢大侠,这个方法很好的解决了问题,感谢感谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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