DS18B20温度采集+1602显示

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/*************************************************************************************************************** 名称:DS18B20采集温度+1602LCD显示

编写:超

时间:2012-11-29

内容:

***************************************************************************************************************/ #include

#define uchar unsigned char

#define uint unsigned int

sbit DQ=P3^7; //ds18b20与单片机连接口

sbit RS=P3^0; //1602写数据/写命令选择端口

//RS=1写数据,即要显示的内容

//RS=0写命令,即一些LCD设置命令

sbit RW=P3^1; //1602读/写选择端,RW=0为写模式

sbit EN=P3^2; //给EN一个高脉冲,将数据送入液晶控制器,完成写操作

uchar code str1[]={"^_^ Zhang Chao"};

uchar code str2[]={" T= "};

uchar data disdata[5];//百、十、个、小数位

uint tvalue; //温度值

uchar tflag; //温度正负标志

/*************************lcd1602设置子函数*******************************************************************/ void delay1ms(uint ms) //延时1毫秒子函数,形参为ms(不够精确的)

{

unsigned int i,j;

for(i=0;i

for(j=0;j<110;j++);

}

void wr_com(uchar com)//lcd写控制指令子函数,形参为com

{

delay1ms(1); //调用延时子函数,并用实参1代替延时子函数中的形参ms

RS=0; //RS=0进入写命令状态,即一些LCD设置命令

RW=0; //RW=0为写模式

EN=0; //EN=0时不能完成写操作

P2=com; //把要设置的指令码com送给P2口

delay1ms(1);

EN=1; //给EN一个高脉冲,将数据送入液晶控制器,完成写操作

delay1ms(1);

EN=0; //EN=0时不能完成写操作

}

void wr_dat(uchar dat)//lcd写显示数据子函数,形参为dat

{

delay1ms(1);

RS=1; //RS=1进入写数据状态,即要显示的内容

RW=0; //RW=0为写模式

EN=0; //EN=0时不能完成写操作

P2=dat; //把要显示的数据dat送给P2口

delay1ms(1);

EN=1; //给EN一个高脉冲,将数据送入液晶控制器,完成写操作

delay1ms(1);

EN=0; //EN=0时不能完成写操作

}

void lcd_init() //lcd初始化设置子函数,不带参数,0x38是显示模式设置,其余是显示开/关及光标设置,无顺序

{

delay1ms(15);

wr_com(0x38); //调用写控制指令子函数,并用实参"0011 1000"代替形参com

//0x38表示设置为16*2显示,每个块为5*7点阵,8位数据接口

delay1ms(5);

wr_com(0x08); //调用写控制指令子函数,并用实参"0000 1000"代替形参com

//0x08表示设置为关显示、不显示光标、光标不闪烁

delay1ms(5);

wr_com(0x01); //调用写控制指令子函数,并用实参"0000 0001"代替形参com

//0x01表示显示数据清屏(数据指针清0,所有显示清0)

delay1ms(5);

wr_com(0x06);//调用写控制指令子函数,并用实参"0000 0110"代替形参com

//0x06表示当读或写一个字符后地址指针加1,且光标加1;当写一个字符时,整屏显示不移动delay1ms(5);

wr_com(0x0c);//调用写控制指令子函数,并用实参"0000 1100"代替形参com

//0x0c打开显示、不显示光标、光标不闪烁

delay1ms(5);

}

void display(uchar *p)//lcd显示字符串子函数

{

while(*p!='\0') //测试是否等于'\0',即判断是否结尾

{

wr_dat(*p); //显示指针所指的字符串

p++; //指针加1

delay1ms(1);

}

}

init_play()//初始化显示子函数

{

lcd_init(); //调用lcd初始化设置子函数,对LCD进行初始化

wr_com(0x80); //调用写控制指令子函数,并用实参"1000 0000"代替形参com

//并将数据指针定位到第一行第一个字符处

display(str1);//从第一行第一个字符处显示字符串str1

wr_com(0x80+0x40);//调用写控制指令子函数,并用实参"1000 0000"代替形参com

//并将数据指针定位到第二行第一个字符处

display(str2); //从第二行第一个字符处显示字符串str2

}

/**************************************************************************************************************/

/******************************ds18b20程序******************************************************************/ void delay_18b20(uint i)//延时1微秒

{

while(i--);

}

void ds18b20rst() //ds18b20初始化子函数

//要求"数据线拉高-延时-数据线拉低-延时大于480微妙-数据线拉高-延时等待" {

uchar x=0;

DQ = 1; //信号线DQ复位

delay_18b20(4); //延时

DQ = 0; //DQ拉低

delay_18b20(100); //精确延时大于480us

DQ = 1; //拉高

delay_18b20(40);

}

void ds18b20wr(uchar wdata)/*写数据子函数,无返回值,含参数*/

{

uchar i=0;

for (i=8; i>0; i--)//要写完一个字节,故需要重复8次以下操作

相关文档
最新文档