微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 两个DS18B20读取的温度在12864中串行实时显示

两个DS18B20读取的温度在12864中串行实时显示

时间:10-02 整理:3721RD 点击:
要做多点测温并在12864上显示各个点的温度,12864需要串行连接,用一个温度传感器的时候可以正常显示,但是两个温度传感器的时候,程序就无法正常显示,这是什么原因,求大神

显示跟传感器没有关系啊 。你要看 是哪里显示错误了

这个应该是显示的问题,要显示2个温度,建议12864显示的时候放在2行显示,显示函数中,调用一个2个显示Desplay_Temp(1,temperature),//第一行显示第一个温度
Desplay_Temp(2,temperature),//第二行显示第二个温度,
等类似。

问题说明不清,一,如何无法正常显示,该显示的没显示?显示乱码?部分正常显示,部分不正常?二,显示是否符合设计,你设计如何显示,如显示位置,显示方式等,是否部分按设计显示?三,是显示内容不正常,还是显示内容,显示位置等于显示相关的都不正常。

谢谢,这个问题我解决了,我现在想在一个单片机引脚上接四个温度传感器,分别读取每个传感器的地址来读取给温度,该如何实现?谢谢。我的程序是这样的
温度传感器程序
#include<reg51.h>
#include"ds18b20.h"
#include"12864.h"
#include"delay.h"
uchar high,low;
float f_temp;
uint temp;
extern uchar d2,d1,d0;

void init_temp()
{
        uint i;
        DQ=0;  //拉低总线,产生复位信号
        i=80;
        while(i>0)
        i--;  //延时480~960us
        DQ=1;  //拉高总线
        i=4;
        while(i>0)
        i--;  //延时15~60us
        while(DQ);  //等待产生应答脉冲
        i=70;
        while(i>0)
        i--;  //延时至少480us
}
void wr_temp(uchar dat)  //写1个字节
{
        uint i,j;
        bit testb;
        for(j=8;j>0;j--)
        {
          testb=dat&0x01;
          dat=dat>>1;
          if(testb)  //写1
          {
                   DQ=0;  //拉低总线,产生写时间隙
                   i++;  //延时大于1us
                   DQ=1;  //拉高总线
                   i=8;
                   while(i>0)
                   i--;  //延时至少60us,供DS18B20采样
          }
          else    //写0
          {
                   DQ=0;  //拉低总线,产生写时间隙
                   i=8;
                   while(i>0)
                   i--;  //保持至少60us,供DS18B20采样
                   DQ=1;  //拉高总线
                   i++;i++;
          }
        }
}
uchar rd_temp()  //读1个字节
{
        uint i,j;
        bit b;  //定义存放接收到的1个字节
        uchar i_b;
        uchar rdbyte;
        for(j=8;j>0;j--)
        {
          DQ=0;  //拉低总线,产生读时隙
          i++;  //延时大于1us
          DQ=1;  //释放总线
          i++;i++;  //给一定时间让总线释放
          b=DQ;  //读取数据
          i=8;while(i>0)i--;  //延时至少60us
          i_b=b;
          rdbyte=(i_b<<7)|(rdbyte>>1);  //将读取到得一位值左移7位,存放读取的数据变量rdbyte右移1位
        }
        return rdbyte;
}
void get_temp()
{
          init_temp();  //初始化,复位并获取应答信号
        wr_temp(0xcc);  //跳过ROM
        wr_temp(0x44);  //开始温度转换
        delay_ms(1000);  //等待温度转换完成
        init_temp(); //将DS18B20复位
        wr_temp(0xcc);  //跳过ROM
        wr_temp(0xbe);  //读暂存器
        low=rd_temp();  //读取低8位
        high=rd_temp();  //读取高8位
        temp=high;
        temp<<=8;
        temp=temp|low;  //将读取的低8位和高8位合并
        f_temp=temp*0.0625;  //温度在寄存器中为12位 分辨率位0.0625°
        temp=f_temp*10+0.5;  //精确到十分位,四舍五入
        d2=temp/100;  //显示数据:十位
        d1=temp%100/10;  //显示数据:个位
        d0=temp%10;  //显示数据:十分位
}
12864串行显示
#include<reg51.h>
#include"12864.h"
#include"ds18b20.h"
extern uchar d2,d1,d0;
sbit CS=P2^5;                //片选信号
sbit SID=P2^6;                //数据信号
sbit SCLK=P2^7;                //时钟信号
sbit RST=P2^2;                //复位信号
void sendbyte(unsigned char zdata)
{
        unsigned int i;
        for(i=0; i<8; i++)
        {
                if((zdata << i) & 0x80)
                {
                        SID = 1;
                }
                else
                {
                        SID = 0;
                }
                SCLK = 0;
                SCLK = 1;//上升沿
        }
}
void write_com(unsigned char cmdcode)
{
        CS = 1;
        sendbyte(0xf8);//从mcu向LCD发送指令
        sendbyte(cmdcode & 0xf0);//发送高四位
        sendbyte((cmdcode << 4) & 0xf0);//发送低四位
        delay(2);
}
void write_data(unsigned char Dispdata)
{
        CS = 1;
        sendbyte(0xfa);//从mcu向LCD发送数据
        sendbyte(Dispdata & 0xf0);
        sendbyte((Dispdata << 4) & 0xf0);
        delay(2);
}
void lcdinit()
{  
        RST = 0;
        delay(100);
        RST = 1;
        delay(1000);        //20000 改变大小可以调整显示的快慢
        write_com(0x30);//功能设定
        delay(50);
        write_com(0x0c);//开显示,不显示游标和游标位置
        delay(50);
}
void hzkdis(unsigned char code *s)
{  
        while(*s > 0)
    {
                write_data(*s);
                s++;
                delay(50);
    }
}
void Test()
{  
        write_com(0x03);
        delay(50);   
        write_com(0x80);
        hzkdis("当前室温:"); //每行不能多于16个空格,不然下一行会闪烁
    write_com(0x85);
        hzkdis("00.0度");
}
void dat_dis()
{   
   
     write_com(0x85);  //显示温度
         write_data(0x30+d2);
         write_data(0x30+d1);
     write_data(0x2e);  //写入“.”号
         write_data(0x30+d0);
  }
主程序
#include<reg51.h>
#include"12864.h"
#include"ds18b20.h"
#include"delay.h"
uchar d2,d1,d0;

void main()
{
        lcdinit();//初始化   
        Test();
        while(1)
        {
                get_temp();
                dat_dis();
          }
}
延时
#include"delay.h"
void delay(unsigned int t)
{
        unsigned int i,j;
        for(i=0; i<t;  i++)
    for(j=0; j<10; j++);
}
void delay_ms(uint z)      //延时z毫秒
{
        uint x,y;
        for(x=z;x>0;x--)
          for(y=115;y>0;y--);
}

谢谢您,我现在解决了

恩恩,我后面解决了,谢谢

小编在吗,我的LCD1602第一行可以正确显示,但是第二行(即第二个DS18B20)一闪而过,怎么回事?

怎么解决的?哪个时序出问题了?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top