DS18B20温度采集与1602显示程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DS18B20温度采集与1602显示程序
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P1^4; //DS18B20口
sbit LCD_RS=P2^7;
sbit LCD_RW=P2^6;
sbit LCD_EN=P2^5; //液晶有关控制位//
unsigned char code str1[]={"welcome "};
unsigned char code str2[]={"temp and 1602:"};
unsigned char code str3[]={"temp: "};
unsigned char data temp_data[2] = {0x00,0x00} ;
unsigned char code mytab[8]= {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ;
uchar data disdata[5] = {0x00,0x00,0x00,0x00,0x00} ;
uint tvalue;//温度值
/*************延时程序***************/
void delay1(int ms)
{
unsigned int i,j;
for(i=0;i<ms;i++)
for(j=0;j<250;j++);
}
void delay2( unsigned int k)
{
unsigned int n;
n=0;
while(n < k)
{n++;}
return;
}
/***********************************/
/***********lcd1602程序*************/
/***********************************/
/*************写指令****************/
void lcd_wcmd(unsigned char cmd)
{
delay1(1);
LCD_RS=0;
LCD_RW=0;
LCD_EN=0;
P0=cmd;
delay1(1);
LCD_EN=1;
delay1(1);
LCD_EN=0;
}
/*************写数据****************/
void lcd_wdat(unsigned char dat)
{
delay1(1);
LCD_RS=1;
LCD_RW=0;
LCD_EN=0;
P0=dat;
delay1(1);
LCD_EN=1;
delay1(1);
LCD_EN=0;
}
/*************初始化****************/
void lcd_init()
{
delay1(15) ;
lcd_wcmd(0x01) ; //清除LCD的显示内容
lcd_wcmd(0x38) ; //16*2显示,5*7点阵,8位数据delay1(5) ;
lcd_wcmd(0x38) ;
delay1(5) ;
lcd_wcmd(0x38) ;
delay1(5) ;
lcd_wcmd(0x0c) ; //显示开,关光标
delay1(5) ;
lcd_wcmd(0x06) ; //移动光标
delay1(5) ;
lcd_wcmd(0x01) ; //清除LCD的显示内容
delay1(5) ;
}
/**********设定显示位置*************/
void lcd_pos(uchar pos)
{
lcd_wcmd(pos | 0x80) ; //数据指针=80+地址变量}
/***********************************/
/************DS18B20程序************/
/***********************************/
/***********ds1820初始化************/
Init_DS18B20(void)
{
DQ = 1 ; //DQ复位
delay2(8) ; //稍做延时
DQ = 0 ; //单片机将DQ拉低
delay2(85) ; //精确延时大于480us
DQ = 1 ; //拉高总线
delay2(18) ;
}
/**********读一个字节数据*************/ ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ=1;
delay2(1);
DQ = 0; //给脉冲信号
dat>>=1;
DQ = 1; //给脉冲信号
if(DQ)
dat|=0x80;
delay2(4);
}
return(dat);
}
/**********写一个字节数据*************/ WriteOneChar(unsigned char dat)
{
unsigned char i = 0 ;
for (i=8;i>0;i--)
{
DQ = 0 ;
DQ = dat&0x01 ;
delay2(5) ;
DQ = 1 ;
dat>>=1 ;
}
delay2(4);
}
/*************读取温度值**************/
Read_Temperature(void)
{
Init_DS18B20() ;
WriteOneChar(0xCC) ; // 跳过读序号列号的操作
WriteOneChar(0x44) ; // 启动温度转换
delay2(125);
Init_DS18B20() ;
WriteOneChar(0xCC) ; //跳过读序号列号的操作
WriteOneChar(0xBE) ; //读取温度寄存器
temp_data[0] = ReadOneChar() ; //温度低8位
temp_data[1] = ReadOneChar() ; //温度高8位
tvalue=((temp_data[1]*256)+temp_data[0])*0.625;
//return(tvalue);
}
/*************温度转换**************/
Disp_Temperature()//温度值显示
{
disdata[0]=tvalue/1000+0x30;//百位数
disdata[1]=tvalue%1000/100+0x30;//十位数
disdata[2]=tvalue%100/10+0x30;//个位数
disdata[3]=tvalue%10+0x30;//小数位
if(disdata[0]==0x30)
{
disdata[0]=0x20; //如果百位为0,不显示
if(disdata[1]==0x30)
{
disdata[1]=0x20; //如果百位为0,十位为0也不显示
}
}
lcd_pos(0x48);
lcd_wdat(disdata[0]);//显示百位
lcd_pos(0x49);
lcd_wdat(disdata[1]);//显示十位
lcd_pos(0x4a);
lcd_wdat(disdata[2]);//显示个位
lcd_pos(0x4b);
lcd_wdat(0x2e); //显示小数点
lcd_pos(0x4c);
lcd_wdat(disdata[3]);//显示小数位
}
/**************显示函数***************/
void dis_play()
{
uchar m ;
lcd_init() ; //初始化LCD
lcd_pos(0) ; //设置显示位置为第一行的第1个字符m = 0 ;
while(str1[m] != '\0')
{ //显示字符
lcd_wdat(str1[m]) ;
m++ ;
}
lcd_pos(0x40); //设置显示位置为第二行第1个字符
m = 0 ;
while(str2[m] != '\0')
{
lcd_wdat(str2[m]); //显示字符
m++ ;
}
delay1(3000);
lcd_init() ; //初始化LCD
lcd_pos(0) ; //设置显示位置为第一行的第1个字符m = 0 ;
while(str3[m] != '\0')
{ //显示字符
lcd_wdat(str3[m]) ;
m++ ;
}
/***************主函数****************/ void main()
{
dis_play();//初始化显示
while(1)
{
Read_Temperature() ;//读取温度
Disp_Temperature() ;//显示温度
}。