根据51单片机读取18B20序列号代码

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

//主函数
#include"ds18b20.h"
#include"lcd12864.h"
#include"delay.h"
void main()
{
init_lcd();
dis_readnumber(); //显示序列号
delay(1000);
while(1)
{
change_ds18b20();
display_lcd12864(value);
}
}
//读取序列号
// 温度传感器设置模块
#include"ds18b20.h"
#include"delay.h"
uint value;
//sbit DQ=P2^0;
void delay_us(uchar t)//微妙延时{
while(t--);
}
void init_ds18b20() //数据初始化{
DQ=1;
delay_us(4);
DQ=0;
delay_us(80);
DQ=1;
delay_us(200);
}
void write_ds18b20(uchar dat) //写数据{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
delay_us(15);
DQ=1;
dat=dat>>1;
}
delay_us(10);
}
uchar read_ds18b20() //读数据
{
uchar i=0,readat=0;
for(i=0;i<8;i++)
{
DQ=0;
readat=readat>>1;//八位全部都是0,向右移一位后,仍然全是0
DQ=1;
if(DQ) //如果DQ为1,readat进行或运算,如果为0,则子语句不执行,直接for循环此时采集的数据是0
readat=readat|0x80;//此时最高位为1 ,然后再进行for循环最高位成为第七位,依次往复
delay_us(10);
}
return readat;
}
/***************************************************************************/
/*********************************************************************************/ uchar change_ds18b20()
{
uchar tl,th;
init_ds18b20(); //初始化
write_ds18b20(0xcc); //跳过rom
write_ds18b20(0x44); //启动ds18b20进行温度转换,结果存入9字节ram中
init_ds18b20(); //?缺少不可执行
write_ds18b20(0xcc);
write_ds18b20(0xbe); //启动读暂存器。

读内部ram中9字节温度数据
tl=read_ds18b20();
th=read_ds18b20();
value=th;
value=value<<8;
value=value|tl;
value=value*(0.0625*10);
return value;
}
// 温度传感器设置模块头文件
#ifndef __DS18B20_H__
#define __DS18B20_H__
_ #include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit DQ=P3^7;
extern uint value;
void delay_us(uchar t); //微妙延时
void init_ds18b20(); //数据初始化
void write_ds18b20(uchar dat); //写数据
uchar read_ds18b20(); //读数据
uchar change_ds18b20();
#endif
//显示模块
//液晶12864显示模块#include"lcd12864.h"
#include"ds18b20.h"
#include"delay.h"
//sbit lcdrs=P2^5; 引脚的定义//sbit lcdrw=P2^6;
//sbit lcden=P2^7;
uchar wendu[]={"温度测点"}; uchar save_number[8];
void write_com(uchar com) {
lcdrs=0; //写指令
P2=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_dat(uchar dat)
{
lcdrs=1; //写数据
P2=dat;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init_lcd()
{
lcden=0;
lcdrw=0;
write_com(0x30); //基本指令操作
delay(5);
write_com(0x0c);//开显示,关光标
delay(5);
write_com(0x01);//清屏
delay(5);
/*************************************************************/ //
// 显示温度
//
/**************************************************************/ void display_lcd12864(uint value)
{
uchar i;
write_com(0x80);
for(i=0;i<8;i++)
{
write_dat(wendu[i]);
delay(3);
}
write_dat(0x41);
write_dat(0x3a);
write_dat(value/100+0x30);
write_dat(value%100/10+0x30);
write_dat(0x2e);
write_dat(value%10+0x30);
/***********************************************************/
//
// 读序列号
//
/************************************************************/
void dis_readnumber()
{
uchar i,temp;
init_ds18b20();
write_ds18b20(0x33); //读rom 即rom中的编码for(i=0;i<8;i++)
{
save_number[i]=read_ds18b20(); //保存序列号
}
write_com(0x88);
for(i=0;i<8;i++)
{
temp=save_number[i]>>4;
if(temp<10)
{
write_dat(0x30+temp);
}
else
{
write_dat(0x37+temp);
}
temp=save_number[i]&0x0f;
if(temp<10)
{
write_dat(0x30+temp);
}
else
{
write_dat(0x37+temp);
}
}
}
//显示模块头文件
#ifndef __LCD12864_H__
#define __LCD12864_H__
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
//sbit lcdrs=P2^5;
//sbit lcdrw=P2^6;
//sbit lcden=P2^7;
sbit lcdrs=P0^0;
sbit lcdrw=P0^1;
sbit lcden=P0^2;
extern uchar save_number[];
extern void write_com(uchar com); extern void write_dat(uchar dat); extern void init_lcd();
extern void display_lcd12864(uint value);
extern void dis_readnumber();
#endif
//延时函数
/***********延时函数****ms***********/ #include"delay.h"
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
//延时函数头文件#ifndef __DELAY_H__
#define __DELAY_H__
#define uint unsigned int
#define uchar unsigned char void delay(uint x);
#endif。

相关文档
最新文档