DS18B20-LCD1602

  • 格式:docx
  • 大小:13.69 KB
  • 文档页数:2

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define lcd P0//可以改用其他I/O;但最好不要使用P0(驱动能力差,哪怕加上拉电阻)

sbit lcdrs = P2^0;//硬件连接

sbit lcdwr = P2^1;

sbit lcde = P2^2;

sbit dq = P1^2;//DS18B20的单总线连接需要4.7k或5.1k上拉电阻。

int a,b;//a为实测16位(只有低12位有效,高4位为0)数据,b为经过适当算法后得到的显示值

void delay(uchar j)//----------------------延时子函数,7个机器周期(本程序使用24M晶振:如果是12M晶振,需要后面程序中的的延迟重新计算)

{while(--j)_nop_();}

void write_com(uchar com)//----------------LCD1602写命令

{lcd=com;lcdrs=0;lcdwr=0;delay(250);lcde=0;delay(250);lcde=1;}

void write_dat(uchar dat)//----------------LCD1602写数据

{lcd=dat;lcdrs=1;lcdwr=0;delay(5);lcde=0;delay(5);lcde=1;}

void write_str(char *str)//----------------LCD1602写字符串

{uchar i;for(i=0;str[i]!='\0';i++){write_dat(str[i]);}}

void chushihua()//-------------------------程序所需内容初始化

{

dq=1;

write_com(0x01);//清屏

write_com(0x3f);//8位数据,双行显示,5*7点阵

write_com(0x06);//光标右移,内容可移动(每行显示内容部多余16个字符时,也不会移动)

write_com(0x0c);//显示开,光标不显示,字符不闪烁

write_str("Welcome!");}

bit reset_dq(void)//-----------------------复位,返回1时说明单总线可用;否则不可用

{bit flag;dq=0;delay(140);dq=1;delay(4);if(dq)flag=1;delay(60);dq=1;return flag;}

void wr_dq(char j)//-----------------------写一个字节

{uchar i=8,ii=0x01;while(i--){dq=0;delay(1);dq=(j&ii);delay(20);dq=1;delay(5);ii*=2;}}

void rd_dq()//-----------------------------读数据(12位数据一次性读出,更方便)

{int ii;char

i=12;while(i--){ii>>=1;dq=0;delay(1);dq=1;delay(5);if(dq)ii|=0x0800;delay(13);dq=1;}a=ii;}

void display(void)//-----------------------处理温度并LCD显示

{

write_com(0xc0);

if(a&0x0800)write_dat('-'),b=(int)((float)(4096-a)*10/16*10);//负温度与正温度算法不同

else b=(int)((float)(a)*10/16*10);//正温度

if(b/10000)write_dat(b/10000+'0');//百位

write_dat(b/1000%10+'0');//十位

write_dat(b/100%10+'0');//个位

write_dat('.');write_dat(b/10%10+'0');//0.1

write_dat(b%10+'0');//0.01

write_dat(0xdf);write_dat('C');write_dat(' ');//符号

}

void temperature()//------------------------测温

{

write_com(0x80);

if(reset_dq())write_str("Temperature:");else write_str("Wrong 18B20!");//复位,单总线存在否

wr_dq(0xcc);//跳过ROM

wr_dq(0x44);//开始温度转换

delay(150);//500us延时,测试成功,如果不成功可以改为下一行估计就可以了。

//uint i=1000;while(i--)delay(250);//1s左右的延时,备用,供上一行程序调试不成功使用。

reset_dq();//复位

wr_dq(0xcc);//跳过ROM

wr_dq(0xbe);//读取温度

rd_dq();//读取有符号的12位温度

reset_dq();//复位

display();//显示

}

void main()//------------------------------主程序

{

chushihua();

while(1)

{

temperature();

}

}