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();
}
}