单片机
返回首页

温度测量DSB1820 lcd1602液晶显示

2015-02-09 来源:51hei

程序中要用到LCD1602display.h头文件 可以在我的另一篇文章中取得: http://www.51hei.com/mcu/3292.html 为同一个文件
#include
#include
#include 'LCD1602display.h'
sbit DQ=P2^0; //ds18b20
uint wendu=0;
uchar num,num1;
uint temperature=0;
uchar code range[]='===TEMPERTURE===';
uchar code ASCII[]='0123456789.';
uchar code table0[]='ROME TEMP:00.0C ';
uchar code table1[]=' ERRO !!! ';
uchar temp[3]={0,0,0};
//********************延时
void delay1ms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
//*************************初始化
bit init_DS18B20()
{
bit flag; //储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在
DQ=1;
_nop_(); //先拉高
DQ=0;
for(num=0;num<200;num++); //要求保持480~960us
DQ=1; //释放数据线
for(num=0;num<10;num++); //等待DS18B20响应
flag=DQ; // 响应
for(num=0;num<200;num++); //延时足够长时间(此延时函数为了防止收不到信号而进入死胡同)
DQ=1; //释放数据线
return (flag); //返回检测成功标志
}
//*******************************写温度数据
void DS18B20_WR_CHAR(uchar byte) // 先写低位
{
for(num1=0;num1<8;num1++)
{
DQ=1;
_nop_();
DQ=0; //将数据线从高拉低时即启动写时序
for(num=0;num<5;num++);//等待15us
DQ=byte&0x01;
for(num=0;num<15;num++); //延时约45us,DS18B20在约15~45us期间从数据线上采样
byte>>=1;
for(num=0;num<1;num++);//延时3us,两个写时序间至少需要1us的恢复期
}
DQ=1;//释放数据线
}
//**********************************读出温度数据
uchar DS18B20_RD_CHAR() //先读低位
{
uchar byte=0;
for(num1=0;num1<8;num1++)
{
DQ=1;
_nop_();
DQ=0; //给个低脉冲
_nop_();
DQ=1;
for(num=0;num<5;num++); //延时约15us,使主机在15us内采样
byte>>=1;
if(DQ==1)
byte|=0x80;
else
byte|=0x00;
for(num=0;num<1;num++);//延时3us,两个读时序之间必须有大于1us的恢复期
}
return (byte);
}
//*********************************温度计算
void DS18B20_WENDU()
{
uchar temperaturel=0,temperatureh=0;
if(init_DS18B20()==0)
{
DS18B20_WR_CHAR(0xcc);
DS18B20_WR_CHAR(0x44);
delay1ms(1000);
if(init_DS18B20()==0)
{
DS18B20_WR_CHAR(0xcc);
DS18B20_WR_CHAR(0xBE);
_nop_();
temperaturel=DS18B20_RD_CHAR();
temperatureh=DS18B20_RD_CHAR();
temperature=(temperatureh*256+temperaturel)*0.625;
init_DS18B20();
}
//return (temperature);
}
}
//******************************温度显示
void display_DS18B20()
{
temp[2]=temperature/100%10;
temp[1]=temperature%100/10;
temp[0]=temperature%10;

DisplayListChar(0, 1, table0);
DisplayOneChar(10, 1, ASCII[ temp[2] ] );
DisplayOneChar(11, 1, ASCII[ temp[1] ] );
DisplayOneChar(12, 1, ASCII[10] );
DisplayOneChar(13, 1, ASCII[ temp[0] ] );
}
//*******************************主函数
main()
{
InitLCM();
DisplayListChar(0,0,range);
DisplayListChar(0,1,table0);
while(1)
{
if( init_DS18B20()==0)
{
DS18B20_WENDU();
display_DS18B20();
}
}
}
进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • CCD图像传感器在微光电视系统中的应用

  • 光控音效发生器电路

  • 一个简单的警笛电路图

  • 一个简单的立体声平衡指示器电路

  • 使用NE555和磁簧开关的橱柜照明电路

  • 电谐波图形均衡器示意图

    相关电子头条文章