根据51单片机读取18B20序列号代码.docx
《根据51单片机读取18B20序列号代码.docx》由会员分享,可在线阅读,更多相关《根据51单片机读取18B20序列号代码.docx(10页珍藏版)》请在冰豆网上搜索。
![根据51单片机读取18B20序列号代码.docx](https://file1.bdocx.com/fileroot1/2023-6/4/9cbec512-d723-4f17-8dbf-51bba93b634e/9cbec512-d723-4f17-8dbf-51bba93b634e1.gif)
根据51单片机读取18B20序列号代码
//主函数
#include"ds18b20.h"
#include"lcd12864.h"
#include"delay.h"
voidmain()
{
init_lcd();
dis_readnumber();//显示序列号
delay(1000);
while
(1)
{
change_ds18b20();
display_lcd12864(value);
}
}
//读取序列号
//温度传感器设置模块
#include"ds18b20.h"
#include"delay.h"
uintvalue;
//sbitDQ=P2^0;
voiddelay_us(uchart)//微妙延时
{
while(t--);
}
voidinit_ds18b20()//数据初始化
{
DQ=1;
delay_us(4);
DQ=0;
delay_us(80);
DQ=1;
delay_us(200);
}
voidwrite_ds18b20(uchardat)//写数据
{
uchari;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
delay_us(15);
DQ=1;
dat=dat>>1;
}
delay_us(10);
}
ucharread_ds18b20()//读数据
{
uchari=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);
}
returnreadat;
}
/***************************************************************************/
/*********************************************************************************/
ucharchange_ds18b20()
{
uchartl,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);
returnvalue;
}
//温度传感器设置模块头文件
#ifndef__DS18B20_H__
#define__DS18B20_H__
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitDQ=P3^7;
externuintvalue;
voiddelay_us(uchart);//微妙延时
voidinit_ds18b20();//数据初始化
voidwrite_ds18b20(uchardat);//写数据
ucharread_ds18b20();//读数据
ucharchange_ds18b20();
#endif
//显示模块
//液晶12864显示模块
#include"lcd12864.h"
#include"ds18b20.h"
#include"delay.h"
//sbitlcdrs=P2^5;引脚的定义
//sbitlcdrw=P2^6;
//sbitlcden=P2^7;
ucharwendu[]={"温度测点"};
ucharsave_number[8];
voidwrite_com(ucharcom)
{
lcdrs=0;//写指令
P2=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_dat(uchardat)
{
lcdrs=1;//写数据
P2=dat;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidinit_lcd()
{
lcden=0;
lcdrw=0;
write_com(0x30);//基本指令操作
delay(5);
write_com(0x0c);//开显示,关光标
delay(5);
write_com(0x01);//清屏
delay(5);
}
/*************************************************************/
//
//显示温度
//
/**************************************************************/
voiddisplay_lcd12864(uintvalue)
{
uchari;
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);
}
/***********************************************************/
//
//读序列号
//
/************************************************************/
voiddis_readnumber()
{
uchari,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
#defineuintunsignedint
#defineucharunsignedchar
//sbitlcdrs=P2^5;
//sbitlcdrw=P2^6;
//sbitlcden=P2^7;
sbitlcdrs=P0^0;
sbitlcdrw=P0^1;
sbitlcden=P0^2;
externucharsave_number[];
externvoidwrite_com(ucharcom);
externvoidwrite_dat(uchardat);
externvoidinit_lcd();
externvoiddisplay_lcd12864(uintvalue);
externvoiddis_readnumber();
#endif
//延时函数
/***********延时函数****ms***********/
#include"delay.h"
voiddelay(uintx)
{
uinti,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
//延时函数头文件
#ifndef__DELAY_H__
#define__DELAY_H__
#defineuintunsignedint
#defineucharunsignedchar
voiddelay(uintx);
#endif