EDN China 电子设计技术互动社区>博客 >Alexi2008博客 >DS18B20+LCD1602液晶显示
个人档案
呢称:Alexi2008     文章(58)     访问(208822)     评论(218)     投票(14)     订阅本博  RSS
介绍: Alexi2008
全部博文:
2009年  -   10月 8月 7月 6月 5月 4月 3月 2月 1月
2008年  -   12月 11月 10月 9月
查看全部博文
              博客首页

DS18B20+LCD1602液晶显示  [单片机] 发布时间:2008-10-28 16:47:28  

http://space.ednchina.com/Upload/2008/10/28/c5aeb1bc-d05d-423b-84f9-ec26df0a062d.rar


 


//主函数


/*-----------------------------------------*/
#include<REG52.H>
#include"LCD1602_8.H"
#include"DS18B20_A.H"


 



/*-----------------------------------------*/
void main(void)
{
 lcd_init();
 lcd_pos(0,0);
 prints("DS18B20-Test:OK");
 lcd_pos(0,1);
 prints("Meter:");
 while(1)
 { 
  Temp_To_String();
  lcd_pos(7,1);
  prints(TempBuffer); 
  delay(244,7,29);
 }
}


 


//DS18B20的驱动程序


/*--------------------------------------------*/
//File: DS18B20_A.H 
//Date: 2008/10/17
//Time: 16:42
//Note: DS18B20的驱动程序 ★12Bits数据
//Ver : 0.3



/*--------------------------------------------*/
#ifndef __DS18B20_A_H__
#define __DS18B20_A_H__


sbit DQ = P2^3;     //数据接口定义
unsigned char TempBuffer[6]; //温度数据字符
bit  symbol = 0;     //温度数据正负号


 


/*--------------------------------------------*/
//函数声明
bit Init_DS18B20(void);              //DS18B20初始化函数,如果bit=0则初始化成功,bit=1则初始化失败
unsigned char ReadOneChar(void);     //DS18B20读出一个字节
void WriteOneChar(unsigned char dat);//DS18B20写入一个字节
unsigned char ReadTemp(void);   //读出DS18B20当前的温度
void Temp_To_String(void);    //温度数据转化成液晶字符显示//函数返回值为TempBuffer


 


/*--------------------------------------------*/
//延迟时间函数
void delay(unsigned char x, unsigned char y, unsigned char z)
{
    unsigned char tempx,tempy,tempz=z;
    do{tempy=y;do{tempx=x;while(--tempx);}while(--tempy);}while(--tempz);
}


 


/*--------------------------------------------*/
//DS18B20初始化函数
bit Init_DS18B20(void)
{
 bit Status="0";
 DQ=1;   //DS18B20复位
 //delay(1,1,1); //17us
 DQ=0;   //低电平复位
 delay(9,1,19); //500us  //保持低电平大于480us
 DQ=1;   //释放总线
 delay(2,1,2); //30us  //延时15us~60us  准备接收数据
 Status=DQ;  //如果Status=0则初始化成功,Status=1则初始化失败
 delay(10,5,1); //130us  //必要延迟时间
 return (Status);
}


 


/*--------------------------------------------*/
//DS18B20读出一个字节
unsigned char ReadOneChar(void)
{
 unsigned char i="0";
 unsigned char dat="0";
 for(i=8;i>0;i--)
 {
  DQ=0;   //读出数据开始//_nop_();
  dat>>=1;  //由低到高位依次读出
  DQ=1;   //释放总线
  if(DQ)
   dat|=0x80; //15us内必须完成读数据
  delay(4,5,1); //70us  //60us~120us释放总线
 }
 return (dat);
}


 


/*--------------------------------------------*/
//DS18B20写入一个字节
void WriteOneChar(unsigned char dat)

 unsigned char i="0";
 for(i=8;i>0;i--)
 {
  DQ=0;   //写开始
  DQ=dat&0x01; //由低到高依次写入
  delay(3,5,1); //60us //写入数据时间间隙为:至少60us连续写2位间的间隙应大于1us
  DQ=1;   //释放总线 
  dat>>=1;
 }
}


 


/*--------------------------------------------*/
//读出DS18B20当前的温度
unsigned char ReadTemp(void)
{
 unsigned char TempL="0";
 unsigned char TempH="0";
 unsigned char Temp_Value;



 Init_DS18B20();   //先复位,再写ROM,最后写RAM
 WriteOneChar(0xcc);  //跳过读出序列号的操作
 WriteOneChar(0x44);  //启动温度转换,默认的【12Bits】转化
 delay(217,94,17);  //700ms //12Bits转换时间750ms


 Init_DS18B20();   //先复位,再写ROM,最后写RAM
 WriteOneChar(0xcc);  //跳过读出序列号的操作
 WriteOneChar(0xbe);  //读出温度寄存器
 //delay(1,1,1);   //17us 


 TempL=ReadOneChar(); //读出温度值低8位/低四位为小数位
 TempH=ReadOneChar(); //读出温度值高8位/高四位和第四位为符号位
 
 if((TempH>>4)==0x0f) //1111=负数 0000=正数
  symbol = 1;
 else
  symbol = 0;


 Temp_Value=TempH<<4 | TempL>>4;
 return (Temp_Value);   
}


 


/*--------------------------------------------*/
//温度数据转化成液晶字符显示
void Temp_To_String(void)
{


 unsigned char  Temp_Value;
 Temp_Value = ReadTemp();
 if(symbol==1)
 {
  Temp_Value = 256 - Temp_Value;
  TempBuffer[0]=Temp_Value/100+'-'; //符号位
 }  
 else
 TempBuffer[0]=Temp_Value/100+'0'; //百位 
 TempBuffer[1]=Temp_Value/10%10+'0'; //十位
 TempBuffer[2]=Temp_Value%10+'0'; //个位
 TempBuffer[3]=0xdf;     //温度符号
 TempBuffer[4]='C';
 TempBuffer[5]='\0';     //字符串结束标志符
}


 


/*--------------------------------------------*/
#endif


 


 


//LCD1602液晶显示驱动(mini)


/*------------------------------------------------------------------------------*/
//File: LCD1602_8.H
//Date: 08-7-29
//Time: 16:09
//Note: LCD1602 Mini Driver.


 



/*------------------------------------------------------------------------------*/
#ifndef __LCD1602_8_H__
#define __LCD1602_8_H__
#include<intrins.h>


 



/*------------------------------------------------------------------------------*/
//LCD接口定义     
sfr   io = 0x80;    //P0-0x80,P1-0x90,P2-0xA0,P3-0xB0;
sbit  rs = P2^0;    //LCD数据/命令选择端(H/L)
sbit  rw = P2^1;    //LCD读/写选择端(H/L)
sbit  ep = P2^2;    //LCD使能控制
sbit     bz = io^7;    //LCD忙标志位


 


 


/*------------------------------------------------------------------------------*/
//函数声明  
void lcd_busy(void);     //测试LCD忙碌状态程序
void lcd_wcmd(unsigned char cmd);  //写入指令到LCD程序
void lcd_wdat(unsigned char dat);  //写入数据到LCD程序
void lcd_pos (unsigned char x, bit y); //LCD数据指针位置程序
//void printc(unsigned char CHAR);  //显示字符
void prints(unsigned char *string);  //显示字符串
void lcd_init(void);     //LCD初始化设定程序


 


/*------------------------------------------------------------------------------*/
//测试LCD忙碌状态
void lcd_busy(void)

 do{
  ep = 0;
  rs = 0;  //指令
  rw = 1;  //读出
  io = 0xff;
  ep = 1;
  _nop_(); //高电平读出 1us 
 }while(bz);  //bz=1表示忙,bz=0表示空闲
 ep = 0;  
}


 



/*------------------------------------------------------------------------------*/
//写入指令到LCD
void lcd_wcmd(unsigned char cmd)
{       
 lcd_busy(); //检测忙
 rs = 0;  //指令
 rw = 0;  //写入
 ep = 1; 
 io = cmd; //指令
 ep = 0;  //下降沿有效 
}


 



/*------------------------------------------------------------------------------*/
//写入数据函数
void lcd_wdat(unsigned char Data)
{
 lcd_busy();  //检测忙
 rs = 1;   //数据
 rw = 0;   //写入
 ep = 1;
 io = Data;  //数据
 ep = 0;   //下降沿有效
}


 



/*------------------------------------------------------------------------------*/
//LCD数据指针位置程序
void lcd_pos(unsigned char x, bit y)
{      
 if(y)lcd_wcmd(x|0xc0); //y=1,第二行显示;y=0,第一行显示  0<=x<16
 else lcd_wcmd(x|0x80); //数据指针=80+地址码(00H~27H,40H~67H)
}


 



/*------------------------------------------------------------------------------*/
//显示字符
/*
void printc(unsigned char CHAR)
{
 lcd_wdat(CHAR);
}
*/


 


/*------------------------------------------------------------------------------*/
//显示字符串
void prints(unsigned char *string)
{
 unsigned char i;
 //do{lcd_wdat(string[i]);i++;}while(string[i]!='\0');//生成代码比for循环大
 for(i=0;string[i]!='\0';i++)lcd_wdat(string[i]);  //有时用for循环也好哈
}


 



/*------------------------------------------------------------------------------*/
//LCD初始化设定
void lcd_init()
{      
 lcd_wcmd(0x38);  //设置LCD为16X2显示,5X7点阵,八位数据接口
 lcd_wcmd(0x06);  //LCD显示光标移动设置(光标地址指针加1,整屏显示不移动)
 lcd_wcmd(0x0c);  //LCD开显示及光标设置(光标不闪烁,不显示"_")
 lcd_wcmd(0x01);  //清除LCD的显示内容
}



#endif



 

标签:  
有[ 0 ]名读者喜欢此文     
阅读(4310)   评论(1)   [最后更新:2008-10-28 16:47:28]
收藏  I   打印  I   推荐到我的小组  I   转发到我的博客 (0)
对不起,您还没有登录,请先登录注册


有 [ 1 ] 名读者发表评论 - DS18B20+LCD1602液晶显示

网友:

shiyaoliang5195 快速回复
对不起,您还没有登录,请先登录注册
引用回复 (0)
对不起,您还没有登录,请先登录注册
2009-06-09 09:27
评论: 分享经验,谢谢楼主!
臭鸡蛋 (0) 鲜花 (0)
我来评论 - DS18B20+LCD1602液晶显示
您的昵称: 美国的游客        (您将以游客身份发表,请登录 |  注册)
您的评论:
 
你还可以输入1000
验证码:
   
转发到我的博客
评论 @Alexi2008's Blog 的“DS18B20+LCD1602液晶显示”
http://space.ednchina.com/Upload/2008/10/28/c5aeb1bc-d05d-423b-84f9-ec26df0a062d.rar//主函数/*-----------------------------------------*/#includeREG52.H#include"LCD1602_8.H"#include"DS18B20_A.H"/*-------
你还可以输入20000
同时评论给 Alexi2008
    
快速回复
 
你还可以输入1000
    
引用回复
引用评论 
 
你还可以输入1000
    
最新评论
热门标签

EDN官方QQ群   更多QQ群
  • EDN-深圳 8366025
  •  NEW!
  • 菜农Cortex-M0技术交流 12047788
  • EDN-哈尔滨 75642591
  • EDN-上海 15156661
  • EDN-广州 57660943
  • EDN-桂林 48813559
  • EDN-武汉 25150805
  • EDN-模拟电路 2837145
  • EDN-通讯 30548292
  • EDN-综合 57490949

促进EDN网友交流合作,方便EDN网友学习沟通

2012 EDN China -- Use of this website is subject to its terms of use.
经营许可编号:京公安备110102000546 京ICP备09028740号-20