微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 用ds18b20和12864显示即时温度,结果温度没变化

用ds18b20和12864显示即时温度,结果温度没变化

时间:10-02 整理:3721RD 点击:
程序如下:
#include<reg51.h>
#define uchar unsigned char
#define LCD_data P0             //数据口
sbit RS  =  P2^0;            //寄存器选择输入
sbit RW  =  P2^1;            //液晶读/写控制
sbit E   =  P1^6;            //液晶使能控制
sbit PSB =  P2^2;
sbit DQ=P3^2;
uchar a,b,t;                 
uchar tempbuf[3];
void delay(uchar z)
  {
     while(z--);
  }
void init_ds18b20()
  {
   uchar x=0;
   DQ=1;
   delay(10);
   DQ=0;
   delay(80);
   DQ=1;
   delay(14);
   x=DQ;
   delay(20);
  }
void write_onechar(uchar dat)
{
   uchar i=0;
    for(i=0;i<8;i++)
     {
       DQ=0;
       DQ=dat&0x01;
       delay(5);
       DQ=1;
       dat=dat>>=1;
     }
     delay(4)
}
uchar read_onechar()
{
    uchar i=0;uchar dat=0;
      for(i=0;i<8;i++)
        {
         DQ=0;
         dat>>=1;
         DQ=1;
         if(DQ) dat|=0x80;
         delay(4);
       }
             return(dat);
}
uchar read_temperature()
  {
   init_ds18b20();
   write_onechar(0xcc);
   write_onechar(0x44);
   delay(100);
   init_ds18b20();
   write_onechar(0xcc);
   write_onechar(0xbe);
   delay(100);
   a=read_onechar();
   b=read_onechar();
   a=(a&0xf0)>>4;      
   b=b<<4;
   t=b|a;
   return(t);
  }
  void temperature(void)
  {
    tempbuf[0]=t/10+0x30;
    tempbuf[1]=t%10+0x30;             
}
void chk_busy()
{  RS=0;
   RW=1;
   E=1;
   LCD_data=0xff;
   while((LCD_data&0x80)==0x80);
   E=0;
}
  void write_com(uchar cmdcode)
{
        chk_busy();
        RS=0;
        RW=0;
        E=1;
        LCD_data=cmdcode;
         E=0;
}  
void write_data(uchar Dispdata)
{
        chk_busy();
        RS=1;
        RW=0;
        E=1;
        LCD_data=Dispdata;
        E=0;  
}
/*------------------初始化LCD屏--------------------------*/
void lcdreset()
{
        PSB = 1;  
        write_com(0x30);       //选择基本指令集
        write_com(0x0c);       //开显示(无游标、不反白)
        write_com(0x01);       //清除显示,并且设定地址指针为00H
        write_com(0x06);      // 游标右移
}
void hzkdis(uchar *s)
{
    while(*s>0)                
    {
        write_data(*s);
        s++;
        delay(50);
    }
}
void main()
{          uchar i=0;
        lcdreset();
        while(1)
        {   
                read_temperature();
                temperature();
                write_com(0x80);
                hzkdis("温度为:    ");
                write_com(0x84);
                write_data(tempbuf[0]);
                write_com(0x85);
                write_data(tempbuf[1]);
                delay(10);
        }
}希望大神能就我写的程序进行修改不要另外写一个,谢谢。


为了方便调试,可以在读出时钟芯片的时间信息之后将其通过窗口发出去,这样你通过串口调试助手就可以得知有没有顺利读出来。如果读出来了,那就是LCD那边的问题了

有点听不懂,我这只与时间芯片ds1302没关系,12864没问题其他程序能用,还是谢谢了

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

网站地图

Top