OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3272|回复: 0

基于51单片机C51和DS18B20的温度探测

[复制链接]

221

主题

221

帖子

0

精华

高级会员

Rank: 4

积分
762
金钱
762
注册时间
2021-5-18
在线时间
28 小时
发表于 2021-11-11 17:22:04 | 显示全部楼层 |阅读模式
这次的项目姑且算作旧瓶装新酒吧,以前做过STM32和DHT11的温度探测,这一次是较为低价版的C51和DS18B20温度探测。

DS18B20是常用的数字温度传感器,其输出的是数字信号,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。 个人感觉主要特点就是价格低,这对于很多精度要求不高的量产产品来说很重要。

这个设计实现了:温度探测功能。DS18B20模块采用排针和杜邦线与单片机连接。同时还设置了临界温度(温度上限),超过该温度使用蜂鸣器鸣响报警。临界温度可以采用两个按键调整。
1.png
proteus里有专门的一个DS18B20模块用来仿真,也可以按动上下箭头来模拟传感器输出的温度变化情况。模块上直接显示温度数据,比一些模拟传感器要好用一些。

在PCB设计里还是采用排针+杜邦线的形式,把传感器做成了一个外置模块(J1)。整体设计还是中规中矩,没有很大难度,亮点在于我这一次没使用通孔。
2.jpg
代码主要则集中在DS18B20传感器的处理方面,大致有六个函数来实现数据传输功能。
部分代码如下:

//主函数

void main()
{
        int tp,ts;
        int s=30;
        unsigned char x,y;
        while(1)
        {
                s=keyscan(s);
                temp=ds18b20readtemp();
                if(temp<0)
                {
                        temp=temp-1;
                        temp=~temp;
                        tp=temp;
                        temp=tp*0.0625*100+0.5;
                }
                else
                {
                        tp=temp;
                        temp=tp*0.0625*100+0.5;
                }
                digdisplay(temp);
                ts=temp/100;
                if(ts>s)
                {
                        beep=0;
                        for(y=2;y>0;y--)
                        {
                                for(x=110;x>0;x--)
                                {
                                        digdisplay(temp);
                                }
                        }
                        beep=1;
                        for(y=2;y>0;y--)
                        {
                                for(x=110;x>0;x--)
                                {
                                        digdisplay(temp);
                                }
                        }
                }
        }
}

//按键函数

int keyscan(int t)
{
        int m;
        unsigned char x,y;
        m=t;
        if(high==0)
        {
                delayms(10);
                if(high==0)
                {
                        m=m+1;
                        display_h(m);
                        while(!high);
                }
                for(y=10;y>0;y--)
                {
                        for(x=110;x>0;x--)
                        {
                                display_h(m);
                        }
                }
                return m;
        }
       
        if(low==0)
        {
                delayms(10);
                if(low==0)
                {
                        m=m-1;
                        display_l(m);
                        while(!low);
                }
                for(y=10;y>0;y--)
                {
                        for(x=110;x>0;x--)
                        {
                                display_l(m);
                        }
                }
                return m;
        }
        return m;
}

//温度显示函数

void digdisplay(int temp)
{
        int bai;
        int shi;
        int ge;
        int yi;
       
        unsigned char i;
        unsigned int j;
        bai=temp/10000;
        shi=temp%10000/1000;
        ge=temp%1000/100;
        yi=temp%100/10;
        for(i=0;i<5;i++)
        {
                weixuan=wxcode;
                duanxuan=0xff;
                if(i==0)
                {
                        duanxuan=dxcode[bai];
                }
                if(i==1)
                {
                        duanxuan=dxcode[shi];
                }
                if(i==2)
                {
                        duanxuan=dxcode[ge]&0x7f;
                }
                if(i==3)
                {
                        duanxuan=dxcode[yi];
                }
                j=10;
                while(j--);
                duanxuan=0xff;
        }
}

//上调临界值显示函数

void display_h(int t)
{
        int shi,ge;
        unsigned char a;
        unsigned int b;
        shi=t/10;
        ge=t%10;
        for(a=0;a<5;a++)
        {
                weixuan=wxcode[a];
                duanxuan=0xff;
                if(a==0)
                {
                        duanxuan=dxcode[10];
                }
                if(a==1)
                {
                        duanxuan=dxcode[12];
                }
                if(a==2)
                {
                        duanxuan=dxcode[shi];
                }
                if(a==3)
                {
                        duanxuan=dxcode[ge];
                }
                b=10;
                while(b--);
                duanxuan=0xff;
        }
}

原文链接:http://bj.dyrs.com.cn/story/202111/1165864

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 22:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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