chenke1988的笔记 https://bbs.21ic.com/?652386 [收藏] [复制] [RSS]

日志

液晶显示ds18b20的温度值

已有 737 次阅读2010-10-17 04:09 |系统分类:单片机| 液晶, ds18b20

/*******************************************************************************
*  描述:                                                                       *
*         1602字符型LCD显示演示程序                                            *
*         在第一行显示  welcome                                                *
*         在第二行显示  www.PRECHIN.com                                         *
*                                                                              *
********************************************************************************/


#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef bit BOOL ;
sbit DQ=P3^7;
sbit rs = P2^6;  //
sbit rw = P2^5;
sbit ep = P2^7;
uint tvalue;//温度值
uchar tflag;//温度正负标志
uchar data disdata[5];
BYTE code dis1[] = {"temperature: "};
//BYTE code dis2[] = {" abc             "};


delay(BYTE ms)
{       // 延时子程序
 BYTE i;
 while(ms--)
 {
  for(i = 0; i< 250; i++)
  {
   _nop_();
   _nop_();
   _nop_();
   _nop_();
  }
 }
}


BOOL lcd_bz()
{       // 测试LCD忙碌状态
 BOOL result;
 rs = 0;
 rw = 1;
 ep = 1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 result = (BOOL)(P0 & 0x80);
 ep = 0;
 return result; 
}


lcd_wcmd(BYTE cmd)
{       // 写入指令数据到LCD
 while(lcd_bz());
 rs = 0;
 rw = 0;
 ep = 0;
 _nop_();
 _nop_(); 
 P0 = cmd;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 ep = 1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 ep = 0;  
}


lcd_pos(BYTE pos)
{       //设定显示位置
 lcd_wcmd(pos | 0x80);
}


lcd_wdat(BYTE dat) 
{       //写入字符显示数据到LCD
 while(lcd_bz());
 rs = 1;
 rw = 0;
 ep = 0;
 P0 = dat;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 ep = 1;
 _nop_();
 _nop_();
 _nop_();
 _nop_();
 ep = 0; 
}


lcd_init()
{       //LCD初始化设定
 lcd_wcmd(0x38);   //
 delay(1);
 lcd_wcmd(0x0c);   //
 delay(1);
 lcd_wcmd(0x06);   //
 delay(1);
 lcd_wcmd(0x01);   //清除LCD的显示内容
 delay(1);
}
/******************************ds1820程序***************************************/
void delay_18B20(unsigned int i)//延时1微秒
{
   while(i--);
}
void ds1820rst()/*ds1820复位*/
{
unsigned char x=0;
DQ = 1;          //DQ复位
delay_18B20(4); //延时
DQ = 0;          //DQ拉低
delay_18B20(100); //精确延时大于480us
DQ = 1;          //拉高
delay_18B20(40);
}
uchar ds1820rd()/*读数据*/
{ unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{   DQ = 0; //给脉冲信号
    dat>>=1;
    DQ = 1; //给脉冲信号
    if(DQ)
    dat|=0x80;
    delay_18B20(10);
}
 return(dat);
}
void ds1820wr(uchar wdata)/*写数据*/
{unsigned char i=0;
    for (i=8; i>0; i--)
   { DQ = 0;
     DQ = wdata&0x01;
     delay_18B20(10);
     DQ = 1;
     wdata>>=1;
   }
}
read_temp()/*读取温度值并转换*/
{uchar a,b;
ds1820rst();   
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0x44);//*启动温度转换*/
ds1820rst();   
ds1820wr(0xcc);//*跳过读序列号*/
ds1820wr(0xbe);//*读取温度*/
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
    if(tvalue<0x0fff)
   tflag=0;
    else
   {tvalue=~tvalue+1;
tflag=1;
   }
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/*  -----------------------------------------*/
void ds1820disp()//温度值显示
{ uchar flagdat;
   disdata[0]=tvalue/1000+0x30;//百位数
     disdata[1]=tvalue%1000/100+0x30;//十位数
     disdata[2]=tvalue%100/10+0x30;//个位数
     disdata[3]=tvalue%10+0x30;//小数位
   
     if(tflag==0)
     flagdat=0x20;//正温度不显示符号
     else
       flagdat=0x2d;//负温度显示负号:-


     if(disdata[0]==0x30)
    {disdata[0]=0x20;//如果百位为0,不显示
   if(disdata[1]==0x30)
    {disdata[1]=0x20;//如果百位为0,十位为0也不显示
    }
   }
  lcd_wcmd(0xc0);
   lcd_wdat(flagdat);//显示符号位
    lcd_wcmd(0xc1);
    lcd_wdat(disdata[0]);//显示百位
    lcd_wcmd(0xc2);
    lcd_wdat(disdata[1]);//显示十位
    lcd_wcmd(0xc3);
    lcd_wdat(disdata[2]);//显示个位
    lcd_wcmd(0xc4);
   lcd_wdat(0x2e);//显示小数点
   lcd_wcmd(0xc5);
    lcd_wdat(disdata[3]);//显示小数位
   }



main()
{
 BYTE i;
 lcd_init();    // 初始化LCD   
 delay(10);
 lcd_pos(4);    // 设置显示位置为第一行的第5个字符
 i = 0;
 while(dis1 != '\0')
 {      // 显示字符"welcome!"
  lcd_wdat(dis1);
  i++;
 }
 lcd_pos(0x41);   // 设置显示位置为第二行第二个字符
/* i = 0;
 while(dis2 != '\0')
 {
  lcd_wdat(dis2); // 显示字符"  www.PRECHIN.com  "
  i++;
 } */
 while(1)
    {read_temp();//读取温度
    ds1820disp();//显示
     }
}


 


  


路过

鸡蛋

鲜花

握手

雷人

全部作者的其他最新日志

评论 (0 个评论)