找回密码
 立即注册

QQ登录

只需一步,快速开始

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

1602显示温度程序

[复制链接]
跳转到指定楼层
楼主
ID:125275 发表于 2016-9-1 14:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

DS18B20温度采集,可以让液晶1602显示出
程序100%可以运行 哈哈

//DS18B20温度采集,LCD1602显示
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar table[]={"  temp:"};
uchar table1[]={"www.E3_china.cn"};
/********IO引脚定义**********/
sbit rs=P1^0;
sbit rw=P1^1;
sbit en=P1^2;
sbit dq=P3^2;
sbit beep=P1^5;
uchar num;
uint tempwarn,d=0,h=0;

void delay(uint n)                //延时程序
{
        while(n>0)n--;
}

void write_com(uchar com)  //液晶写命令程序
{
        rs=0;                        //等0输入命令
        en=0;                        //液晶使能信号初始化
        P0=com;                        //把com参数,液晶的命令值送到P0口
        delay(100);                //延时,按照液晶的时序图的要求
        en=1;                        //使能信号,0到1表示上升沿打开可以写命令数据到液晶里
        delay(100);
        en=0;                        //使能信号回复
}
void write_data(uchar date)           //液晶写数据程序
{
        rs=1;                  //等1表示输入数据
        en=0;
        P0=date;          //把date参数,液晶的数据送到P0口
        delay(100);
        en=1;
        delay(100);
        en=0;
}
void init()        //液晶初始化程序
{
        en=0;
        write_com(0x38);        //设置16X2显示,5X7点阵,8位数据口
        write_com(0x0c);        //设置开显示,不显示光标
        write_com(0x06);        //写一个字符后地址指针加1
        write_com(0x01);        //显示清0,数据指针清0
}
void  Writebyte(uchar dat)//DS18B20温度芯片的写字节程序
{
        uchar j;
        for(j=0;j<8;j++)
        {
                dq=0;
                dq=dat&0x01;
                delay(5);
                dq=1;
                dat>>=1;
        }
}
uchar Readbyte(void)//DS18B20温度芯片读字节程序
{
        uchar i,dat=0;
        for(i=0;i<8;i++)
        {
                dq=0;
                dat>>=1;
                dq=1;
                if(dq==1)
                dat|=0x80;
                delay(4);
        }       
        return dat;
}
void initds18b20(void)//温度芯片初始化程序
{
        uchar x=0;
        dq=1;
        delay(8);
        dq=0;
        delay(80);
        dq=1;
        delay(14);
        x=dq;
        delay(20);
}
void Readtemp(void)//读温度程序
{
        initds18b20();
        Writebyte(0xcc);
        Writebyte(0x44);

        initds18b20();
        Writebyte(0xcc);
        Writebyte(0xbe);
        d=Readbyte();        //温度信号的低8位数据函数
        h=Readbyte();        //温度信号的高8位数据函数
}
convert() //温度信号处理程序,把温度信号数据值转换为液晶显示
{
        uint temp,tmp;
        float tt;
        tmp=d;         //低8位数据给tmp
        temp=h;         //高8位数据给temp
        temp<<=8;  //高8位左移8位
        temp|=d;   //高低8位数据或起来再赋给temp
        if((h&0x80)!=0)         //高8位h&10000000是否等0,不等0表示负多少度
        {
                table[7]='-';        //把-赋给液晶数组的第8个元素,表示-号在第8位,1602一行有16个字符
                temp=temp-1;
                temp=~temp;
        }
        else
                table[7]='+';
                temp>>=4;
                table[8]=(temp/100)+'0';        //液晶第9位字符为温度的百位数,例如120度的1
                table[9]=(temp/10)%10+'0';        //液晶第10位字符为温度的十位数,例如120度的2
                table[10]=(temp%10)+'0';        //液晶第9位字符为温度的个位数,例如120度的0
                tmp=tmp&0x0f;  //低位温度提取小数数据
                tt=tmp*0.0625; //小数部分数据转换
                table[11]='.'; //显示小数点
                table[12]=((uchar)(tt*10))%10+'0';//小数点后面的小数数字
                tempwarn=temp;               
        return tempwarn;//温度值返回
}
void warn(uint tempwarn)//温度报警程序
{
        if(tempwarn<=16) //返回的值是温度的值,如果温度小于20度就报警并且启动风冷设备
        {
                beep=0;
                delay(5000);//蜂鸣器的声音响的时间
                beep=1;
                delay(50000); //蜂鸣器的声音不响的时间
        }
        else if(tempwarn>=25)//如果温度大于25度并且启动报警
        {
                beep=0;
                delay(5000);
                beep=1;
                delay(50000);
        }
}
void main()
{       
        rw=0;                  //rw直接置0,应该在液晶初始化前,否则断电后再通电就不能显示,切记!!!
        init();         //液晶初始化函数       
        write_com(0x80+0x40); //0x80+0x40表示液晶的第二行开始显示
        for(num=0;num<15;num++)        //num<16,16表示显示16位
        {
                write_data(table1[num]);//液晶显示需要的内容,调用写液晶数据函数,这行显示拼音dengtianming       
        }
        while(1)        //大循环,不断检测和更新温度
        {
                 Readtemp();
                 convert();
                 warn(tempwarn);
                 write_com(0x80);  //液晶的第一行开始地址
                 for(num=0;num<15;num++)//显示16位数据,后面的几位没有用到就写不到16,以免后面的几位会出现一个随机数据显示乱码
                 {
                        write_data(table[num]);//液晶需要显示的内容
                 }
        }
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:264029 发表于 2017-12-19 23:30 | 只看该作者
学习了。
回复

使用道具 举报

板凳
ID:260785 发表于 2017-12-25 10:49 | 只看该作者
谢谢,你说的很易学懂!
回复

使用道具 举报

地板
ID:981034 发表于 2021-11-26 16:01 | 只看该作者

谢谢,你说的很易学懂!学习了。
回复

使用道具 举报

5#
ID:896483 发表于 2021-11-26 17:47 | 只看该作者
真心写的不错
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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