微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STC51系列如何写DS18B20通过TFT-LCD显示屏显示温度

STC51系列如何写DS18B20通过TFT-LCD显示屏显示温度

时间:10-02 整理:3721RD 点击:
#include "config.h"
#include "STC15FXXXX.H"
#if LCD_USE8BIT_MODEL==1      //8位并行数据写入时序
#define uint unsigned int
#define uchar unsigned char
sbit DQ=P1^1;
sbit LCD_CS=P3^4;
sbit LCD_WR=P4^0;
uint temp; //温度值
void dsreset()
{
    DQ=1;                      //DQ复位,多余,但是保险起见
    delay(1);                  //稍做延时
  DQ = 0;                    //单片机拉低总线
  delay(250);                //精确延时,维持至少480us
  DQ = 1;                    //释放总线,即拉高了总线
  delay(100);                //此处延时有足够,确保能让DS18B20发出存在脉冲。  
}
uchar Read_One_Byte() //读取一个字节的数据
{
    uchar i=0;
    uchar dat=0;
    for(i=8;i>0;i--)
        {
          DQ = 0;                //将总线拉低,要在1us之后释放总线
                                   //单片机要在此下降沿后的15us内读数据才会有效。
          _nop_();                 //至少维持了1us,表示读时序开始
          dat >>= 1;               //让从总线上读到的位数据,依次从高位移动到低位。
          DQ = 1;                  //释放总线,此后DS18B20会控制总线,把数据传输到总线上
          delay(1);              //延时7us,此处参照推荐的读时序图,尽量把控制器采样时间放到读时序后的15us内的最后部分
          if(DQ)                 //控制器进行采样
          {
          dat |= 0x80;           //若总线为1,即DQ为1,那就把dat的最高位置1;若为0,则不进行处理,保持为0
           }
          delay(10);             //此延时不能少,确保读时序的长度60us。
         }
          return (dat);   
}
void Write_One_Byte(uchar dat)
{
  uchar i = 0;
  for(i=8;i>0;i--)
  {
  DQ = 0;                        //拉低总线
  _nop_();                       //至少维持了1us,表示写时序(包括写0时序或写1时序)开始
  DQ = dat&0x01;                 //从字节的最低位开始传输
                                     //指令dat的最低位赋予给总线,必须在拉低总线后的15us内,
                                 //因为15us后DS18B20会对总线采样。
  delay(10);                     //必须让写时序持续至少60us
  DQ = 1;                        //写完后,必须释放总线,
  dat >>= 1;
  delay(1);
  }
}
uint Get_Tmp()                     //获取温度get the temperature
{
  uchar a,b;
  Init_Ds18b20();                //初始化
  Write_One_Byte(0xcc);          //忽略ROM指令
  Write_One_Byte(0x44);          //温度转换指令
  Init_Ds18b20();                //初始化
  Write_One_Byte(0xcc);          //忽略ROM指令
  Write_One_Byte(0xbe);          //读暂存器指令
  a = Read_One_Byte();           //读取到的第一个字节为温度LSB
  b = Read_One_Byte();           //读取到的第一个字节为温度MSB
  temp = b;                      //先把高八位有效数据赋于temp
  temp <<= 8;                    //把以上8位数据从temp低八位移到高八位
  temp = temp|a;                 //两字节合成一个整型变量
  return temp;
}
void delay(unsigned char i)
{
  while(--i);  
}
只是写到了这里不知道该怎么跟LCD进行数据交换,求大神帮忙,然后顺便给我讲解一下




不懂啊爱莫能助

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

网站地图

Top