找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的数字温度报警器源程序

  [复制链接]
跳转到指定楼层
楼主
ID:128215 发表于 2017-2-14 20:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg51.h>
typedef unsigned char uchar;
typedef unsigned int  uint;
uchar i;
sbit RS=P2^7;
sbit RW=P2^6;
sbit E=P2^5;
sbit D1=P1^0;
sbit D2=P1^1;
sbit k1=P2^1;//加按键
sbit k2=P2^2;//减按键
sbit k3=P2^0;//设置按键
uint th=360;//设定 高温
uint tl=350;//设定 低温
uint ta;//实际温度
uchar code t0[]="WD=  .          ";
uchar code t1[]="TH=  .  TL=  .  ";
uchar code wendu[]="0123456789";        //利用一个温度表解决温度显示乱码
sbit DQ=P2^3;//定义DS18B20总线IO
uchar position;//设置的位置
//延时子函数
void delay(uint z)
{
        uint x,y;
        for(x=100;x>1;x--)
                for(y=z;y>1;y--);
}
//LCD1602液晶写命令子函数
void write_com(uchar com)
{
        RS=0;
        P0=com;                                       
        delay(5);
        E=1;
        delay(5);
        E=0;
}
//LCD1602液晶写数据子函数
void write_date(uchar date)
{
        RS=1;
        P0=date;
        delay(5);
        E=1;
        delay(5);
        E=0;
}
//LCD1602液晶初始化子函数
void LCD1602_init()
{
        E=0;
        RW=0;
        write_com(0x38);
        write_com(0x01);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x80);       
        for(i=0;i<16;i++)
        {
                write_date(t0[i]);
                delay(0);
        }
        write_com(0x80+0x40);
        for(i=0;i<16;i++)
        {
                write_date(t1[i]);
                delay(0);
        }
}
//延时子函数
void tmpDelay(int num)
{
        while(num--);
}       
//DS18B20温度传感器初始化子函数
void DS18B20_init()
{
        uchar x=0;
        DQ=1;    //DQ复位
        tmpDelay(8);  //稍做延时
        DQ=0;    //单片机将DQ拉低
        tmpDelay(80); //精确延时 大于 480us
        DQ=1;    //拉高总线
        tmpDelay(14);
        x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
        tmpDelay(20);
}
//DS18B20温度传感器读一个字节子函数
uchar ReadOneChar()
{
        uchar i=0;
        uchar dat=0;
        for(i=8;i>0;i--)
        {
                DQ=0; // 给脉冲信号
                dat>>=1;
                DQ=1; // 给脉冲信号
                if(DQ)
                        dat|=0x80;
                tmpDelay(4);
        }
        return(dat);
}
//DS18B20温度传感器写一个字节子函数
void WriteOneChar(uchar dat)
{
        uchar i=0;
        for(i=8;i>0;i--)
        {
                DQ=0;
                DQ=dat&0x01;
                tmpDelay(5);
                DQ=1;
                dat>>=1;
        }
}
//读取温度子函数
uint Readtemp()
{
        uchar a=0;
        uchar b=0;
        uint t=0;
        float tt=0;       
        DS18B20_init();
        WriteOneChar(0xCC); // 跳过读序号列号的操作
        WriteOneChar(0x44); // 启动温度转换
        DS18B20_init();
        WriteOneChar(0xCC); //跳过读序号列号的操作
        WriteOneChar(0xBE); //读取温度寄存器
        a=ReadOneChar();   //连续读两个字节数据   //读低8位
        b=ReadOneChar();                          //读高8位
        t=b;
        t<<=8;
        t=t|a; //两字节合成一个整型变量。
        tt=t*0.0625;  //得到真实十进制温度值,因为DS18B20可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度
        t=tt*10+0.5; //放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。
        return(t);
}
//LCD1602液晶显示子函数
void display()
{
           uint shi,ge,xiaoshu;            //这里的num,shi,ge,xiaoshu 必须用unsigned int无符号整数来表示,用unshigned char  字符型则显示错误
        shi=th/100;                  //显示 最高温度 Th
        ge=th/10%10;
        xiaoshu=th%10;
        write_com(0x80+0x40+3);
        write_date(wendu[shi]);
        write_com(0x80+0x40+4);
        write_date(wendu[ge]);                                       
        write_com(0x80+0x40+6);
        write_date(wendu[xiaoshu]);
        shi=tl/100;          //显示 最低文帝 Tl  
        ge=tl/10%10;
        xiaoshu=tl%10;
        write_com(0x80+0x40+11);
        write_date(wendu[shi]);
        write_com(0x80+0x40+12);
        write_date(wendu[ge]);                                               
        write_com(0x80+0x40+14);
        write_date(wendu[xiaoshu]);
}
//报警子函数
void temp_check()
{
        uint shi,ge,xiaoshu;            //这里的num,shi,ge,xiaoshu 必须用unsigned int无符号整数来表示,用unshigned char  字符型则显示错误
        ta=Readtemp();
        if(ta>th)
        {
                D1=0;
                D2=1;
        }
        else if(ta<tl)
        {
                D1=1;
                D2=0;
        }
        else
        {
                D1=1;
                D2=1;
        }
        shi=ta/100;         //显示 实际温度  
        ge=ta/10%10;
        xiaoshu=ta%10;
        write_com(0x80+3);
        write_date(wendu[shi]);
        write_com(0x80+4);
        write_date(wendu[ge]);                                                 
        write_com(0x80+6);
        write_date(wendu[xiaoshu]);
}
//按键扫描子函数
void key()
{       
        if(k3==0)                 //set 按键 按下
        {
                delay(1);
                if(k3==0)
                {                                                        //设置位置设定
                        position++;
                        if(position>2)
                                position=0;
                        if(position==0)                  // 无设置位置
                        {
                                write_com(0x80+0x40+7);
                                write_date(' ');
                                write_com(0x80+0x40+15);
                                write_date(' ');
                        }
                        if(position==1)                //设置TH 在th后显示< 标识当前位置
                        {
                                write_com(0x80+0x40+7);
                                write_date('<');
                                write_com(0x80+0x40+15);
                                write_date(' ');                  
                        }
                        if(position==2)          //设置Tl   在tl后显示< 标识当前位置
                        {
                                write_com(0x80+0x40+7);
                                write_date(' ');
                                write_com(0x80+0x40+15);
                                write_date('<');                  
                        }
                        while(k3==0);       
                }       
        }       
        if(k1==0)
        {
                delay(1);
                if(k1==0)
                {
                        if(position==1)
                        {
                                th+=5;
                                if(th>1000)
                                        th=990;
                        }
                        if(position==2)
                        {
                                tl+=5;                          //tl>th时  是个错误,这里避免此情况发生
                                if(tl>=th)
                                        tl=th-5;
                        }       
                        display();
                }       
                while(k1==0);
        }
        if(k2==0)
        {
                delay(1);
                if(k2==0)
                {
                        if(position==1)
                        {
                                th-=5;                         //th<tl时  是个错误,这里避免此情况发生
                                if(th<=tl)
                                        th=tl+5;
                        }
                        if(position==2)
                        {       
                                if(tl<10)
                                        tl=10;
                                else
                                        tl-=5;
                        }       
                        display();
                }       
                while(k2==0);
        }
}
//主函数
void main()
{         
        uint i;
        LCD1602_init();
        display();
        while(1)
        {       
                delay(1);
                if((++i)>500) //500ms 检测一次温度
                {
                         temp_check();
                         i=0;
                }               
                key();               
        }
}



2、仿真图.zip

60.03 KB, 下载次数: 223, 下载积分: 黑币 -5

评分

参与人数 1黑币 +5 收起 理由
3s. + 5 太想下了。

查看全部评分

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

使用道具 举报

沙发
ID:357435 发表于 2018-6-23 20:41 | 只看该作者
好东西  谢谢 楼主 分享
回复

使用道具 举报

板凳
ID:353024 发表于 2018-6-25 14:42 | 只看该作者
想看!!
回复

使用道具 举报

地板
ID:364106 发表于 2018-7-3 16:45 | 只看该作者
优秀优秀
回复

使用道具 举报

5#
ID:366772 发表于 2018-7-7 13:16 | 只看该作者
超级想看
回复

使用道具 举报

6#
ID:369264 发表于 2018-7-11 15:24 | 只看该作者
文档是仿真图?
回复

使用道具 举报

7#
ID:369562 发表于 2018-7-11 16:18 | 只看该作者
呃呃,感觉有改进的地方
回复

使用道具 举报

8#
ID:319537 发表于 2018-9-25 15:14 | 只看该作者
这个资料好
回复

使用道具 举报

9#
ID:412814 发表于 2018-11-7 19:52 | 只看该作者
虽然还是有很多地方看不懂,但是还是觉得很厉害的样子。
回复

使用道具 举报

10#
ID:435832 发表于 2018-12-5 14:05 | 只看该作者
仿真图打不开
回复

使用道具 举报

11#
ID:457343 发表于 2018-12-28 15:19 | 只看该作者
谢谢dalao
回复

使用道具 举报

12#
ID:490961 发表于 2019-3-14 19:15 | 只看该作者
电路图清晰吗
回复

使用道具 举报

13#
ID:771301 发表于 2020-6-7 12:05 | 只看该作者
很棒,对大作业帮助很大
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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