原创 DS18B20+LCD1602液晶显示

2008-10-28 16:47 7029 4 5 分类: MCU/ 嵌入式

https://assets-stash.oss-cn-shanghai.aliyuncs.com/album/old-resources/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++;}while(string!='\0');//生成代码比for循环大
 for(i=0;string!='\0';i++)lcd_wdat(string);  //有时用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



 

文章评论1条评论)

登录后参与讨论

shiyaoliang5195 2009-6-9 09:27

分享经验,谢谢楼主!
相关推荐阅读
Alexi2008 2010-05-22 22:40
LCD简单菜单显示
LCD简单菜单显示显示器件为图形型LCD12864(主控芯片KS0108)什么都不带!包含以下文件:LCD菜单(测试)LCD菜单(简单)LCD菜单(界面)LCD菜单(遥控器)希望对大家有用^_^感兴趣...
Alexi2008 2010-05-22 14:33
LCD12864(KS0108)液晶演示程序
LCD12864(KS0108)液晶演示程序LCD12864(KS0108)液晶演示程序视频: LCD12864演示程序(什么都不带的液晶) 视频演示网址:http://v.youku.com/v_s...
Alexi2008 2009-10-22 18:27
AVR代码
AVR单片机程序代码集,给需要的朋友们参考呵呵,都是自己一边学一边写的,一个一个字符从键盘敲出来的^_^希望对大家有用:-)呵呵,编译软件为:  ICCAVR V6.31A版本一共七个压缩包,呵呵,分...
Alexi2008 2009-10-22 15:18
VGA相关资料
VGA相关资料呵呵^_^如果你想玩的就请下载,有很多东西,都是花了我好几个夜晚才搜到的都是网上的资料:-)有兴趣的可以做做哦 包含以下文件夹:├─VGA+2051│  │  共享-----国外优秀电子...
Alexi2008 2009-10-10 14:46
PS/2 键盘与单片机
程序打包PS/2 键盘与单片机接口用LCD1602显示调试成功所以拿出来给大家分享,希望对大家有用,呵呵^_^用PS/2键盘做系统输入部分蛮方便的哦!可以使用Backspace/Esc/Tab/Cap...
Alexi2008 2009-08-17 19:54
AVR端口操作宏定义,便于移植
AVR端口操作宏定义头文件(ICCAVRIO.H),便于移植(ICCAVR编译环境) 压缩包里面有网上的相关资料,把它看完,相信你会更加了解红宏定义的^_^还有头文件在ICCAVRIO.H在Inclu...
我要评论
1
4
1
2
3
4
5
6
7
8
9
0
关闭 热点推荐上一条 /2 下一条