您的位置 首页 数字

单片机中运用DS18B20温度传感器C言语程序(参阅1)

单片机中使用DS18B20温度传感器C语言程序(参考1)/***********************************************************************

单片机中运用DS18B20温度传感器C言语程序(参阅1)

/********************************************************************************
DS18B20 测温程序

硬件:AT89S52
(1)单线ds18b20接 P2.2
(2)七段数码管接P0口
(3)运用外部电源给ds18b20供电,没有运用寄生电源
软件:Kei uVision 3

**********************************************************************************/
#include “reg52.h”
#include “intrins.h”
#define uchar unsigned char
#define uint unsigned int
sbit ds=P2^2;
sbit dula=P2^6;
sbit wela=P2^7;
uchar flag ;
uint temp; //参数temp必定要声明为 int 型
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //不带小数点数字编码

uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef}; //带小数点数字编码

/*延时函数*/
void TempDelay (uchar us)
{
while(us–);
}

void delay(uint count) //延时子函数
{
uint i;
while(count)
{
i=200;
while(i>0)
i–;
count–;
}
}

/*串口初始化,波特率9600,方法1 */
void init_com()
{
TMOD=0x20; //设置定时器1为形式2
TH1=0xfd; //装初值设定波特率
TL1=0xfd;
TR1=1; //发动定时器
SM0=0; //串口通讯形式设置
SM1=1;
// REN=1; //串口答应接纳数据
PCON=0; //波特率不倍频
// SMOD=0; //波特率不倍频
// EA=1; //开总中止
//ES=1; //开串行中止
}

/*数码管的显现 */
void display(uint temp)
{
uchar bai,shi,ge;
bai=temp/100;
shi=temp%100/10;
ge=temp%100%10;

dula=0;
P0=table[bai]; //显现百位
dula=1; //从0到1,有个上升沿,免除锁存,显现相应段
dula=0; //从1到0再次锁存

wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(1); //延时约2ms

P0=table1[shi]; //显现十位
dula=1;
dula=0;

P0=0xfd;
wela=1;
wela=0;
delay(1);

P0=table[ge]; //显现个位
dula=1;
dula=0;

P0=0xfb;
wela=1;
wela=0;
delay(1);
}
/*****************************************
时序:初始化时序、读时序、写时序。
一切时序都是将主机(单片机)作为主设备,单总
线器材作为从设备。而每一次指令和数据的传输
都是从主机自动发动写时序开端,假如要求单总
线器材回送数据,在进行写指令后,主机需发动
读时序完结数据接纳。数据和指令的传输都是低
位在先。
初始化时序:复位脉冲 存在脉冲
读;1 或 0时序
写;1 或 0时序
只要存在脉冲信号是从18b20(从机)宣布的,其
它信号都是由主机宣布的。
存在脉冲:让主机(总线)知道从机(18b20)已
经做好了预备。
******************************************/
/*——————————————————————————————————————–
初始化:检测总线操控器宣布的复位脉冲
和ds18b20的任何通讯都要从初始化开端

初始化序列包含一个由总线操控器宣布的复位脉冲
和跟在其后由从机宣布的存在脉冲。

初始化:复位脉冲+存在脉冲

详细操作:
总线操控器宣布(TX)一个复位脉冲 (一个最少坚持480μs 的低电平信号),然后开释总线,
进入接纳状况(RX)。单线总线由5K 上拉电阻拉到高电平。探测到I/O 引脚上的上升沿后
DS1820 等候15~60μs,然后宣布存在脉冲(一个60~240μs 的低电平信号)。

详细看18b20 单线复位脉冲时序和1-wire presence detect “的时序图
——————————————————————————————————————-*/
void ds_reset(void)
{
ds=1;
_nop_(); //1us
ds=0;
TempDelay(80); //当总线停留在低电平超越480us,总线上所以器材都将被复位,这儿//延时约530us总 线停留在低电平超越480μs,总线上的一切器材都
//将被复位。
_nop_();
ds=1; //发生复位脉冲后,微处理器开释总线,让总线处于闲暇状况,原因查//18b20中文材料

TempDelay(5); //开释总线后,以便从机18b20通过拉低总线来指示其是否在线,
//存在检测高电平时刻:15~60us, 所以延时44us,进行 1-wire presence //detect(单线存在检测)
_nop_();
_nop_();
_nop_();
if(ds==0)
flag=1; //detect 18b20 success
else
flag=0; //detect 18b20 fail
TempDelay(20); //存在检测低电平时刻:60~240us,所以延时约140us
_nop_();
_nop_();
ds=1; //再次拉高总线,让总线处于闲暇状况
/**/
}

/*—————————————-
读/写时刻隙:
DS1820 的数据读写是通过时刻隙处理
位和指令字来承认信息交流。
——————————————*/
bit ds_read_bit(void) //读一位
{
bit dat;
ds=0; //单片机(微处理器)将总线拉低
_nop_(); //读时隙起始于微处理器将总线拉低至少1us
ds=1; //拉低总线后接着开释总线,让从机18b20能够接收总线,输出有用数据
_nop_();
_nop_(); //小延时一下,读取18b20上的数据 ,由于从ds18b20上输出的数据
//在读”时刻隙”下降沿呈现15us内有用
dat=ds; //主机读从机18b20输出的数据,这些数据在读时隙的下降沿呈现//15us内有用
TempDelay(10); //一切读”时刻隙”有必要60~120us,这儿77us
return(dat); //回来有用数据
}
uchar ds_read_byte(void ) //读一字节
{

uchar value,i,j;
value=0; //必定别忘了给初值
for(i=0;i<8;i++)
{
j=ds_read_bit();
value=(j<<7)|(value>>1); //这一步的阐明在一个word文档里边
}
return(value); //回来一个字节的数据
}
void ds_write_byte(uchar dat) //写一个字节
{
uchar i;
bit onebit; //必定不要忘了,onebit是一位
for(i=1;i<=8;i++)
{
onebit=dat&0x01;
dat=dat>>1;
if(onebit) //写 1
{
ds=0;
_nop_();
_nop_(); //看时序图,至少延时1us,才发生写”时刻隙”
ds=1; //写时刻隙开端后的15μs内答应数据线拉到高电平
TempDelay(5); //一切写时刻隙有必要最少继续60us
}
else //写 0
{
ds=0;
TempDelay(8); //主机要生成一个写0 时刻隙,有必要把数据线拉到低电平并坚持至少60μs,这儿64us
ds=1;
_nop_();
_nop_();
}
}
}

/*****************************************
主机(单片机)操控18B20完结温度转化要通过三个过程:
每一次读写之前都要18B20进行复位操作,复位成功后发送
一条ROM指令,最终发送RAM指令,这样才能对DS18b20进行
预订的操作。
复位要求主CPU将数据线下拉500us,然后开释,当ds18B20
遭到信号后等候16~60us,后宣布60~240us的存在低脉冲,
主CPU收到此信号表明复位成功
******************************************/

/*—————————————-
进行温度转化:
先初始化
然后越过ROM:越过64位ROM地址,直接向ds18B20发温度转化指令,合适单片作业
发送温度转化指令
——————————————*/

void tem_change()
{
ds_reset();
delay(1); //约2ms
ds_write_byte(0xcc);
ds_write_byte(0x44);
}

/*—————————————-
取得温度:
——————————————*/
uint get_temperature()
{
float wendu;
uchar a,b;
ds_reset();
delay(1); //约2ms
ds_write_byte(0xcc);
ds_write_byte(0xbe);
a=ds_read_byte();
b=ds_read_byte();
temp=b;
temp<<=8;
temp=temp|a;
wendu=temp*0.0625; //得到实在十进制温度值,由于DS18B20
//能够准确到0.0625度,所以读回数据的最低位代表的是 //0.0625度

temp=wendu*10+0.5; //扩大十倍,这样做的意图将小数点后第一位
//也转化为可显现数字,一起进行一个四舍五入操作。
return temp;
}
/*—————————————-
读ROM
——————————————*/
/*
void ds_read_rom() //这儿没有用到
{
uchar a,b;
ds_reset();
delay(30);
ds_write_byte(0x33);
a=ds_read_byte();
b=ds_read_byte();
}
*/
void main()
{
uint a;
init_com();
while(1)
{
tem_change(); //12位转化时刻最大为750ms
for(a=10;a>0;a–)
{
display( get_temperature());
}
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/shuzi/266319.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部