ds18b20编程

ds18b20编程,第1张

//18B20单线温度检测的应用样例程序

//青岛理工大学琴岛学院

#include<REG52.H>

#include<math.h>

#include<INTRINS.H>

#define uchar unsigned char

#define uint unsigned int

/*****************************************************************************/

sbit seg1=P2^0

sbit seg2=P2^1

sbit seg3=P2^2

sbit DQ=P1^7//ds18b20 端口

sfr dataled=0x80//显示数据端口

/**********************************************************************/

uchar temp

uchar flag_get,count,num,minute,second

uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}//7段数码管段码表共阳

uchar str[3]

/***********************************************************************/

void delay1(uchar MS)

unsigned char ReadTemperature(void)

void Init_DS18B20(void)

unsigned char ReadOneChar(void)

void WriteOneChar(unsigned char dat)

void delay(unsigned int i)

/************************************************************************/

main()

{

TMOD|=0x01//定时器设置

TH0=0xef

TL0=0xf0

IE=0x82

TR0=1

P2=0x00

count=0

while(1)

{

str[2]=0xc6//显示C符号

str[0]=tab[temp/10]//十位温度

str[1]=tab[temp%10]//个位温度

if(flag_get==1) //定时读取当前温度

{

temp=ReadTemperature()

flag_get=0

}

}

}

void tim(void) interrupt 1 using 1//中断,用于数码管扫描和温度检测间隔

{

TH0=0xef//定时器重装值

TL0=0xf0

num++

if (num==50)

{num=0<br> flag_get=1//标志位有效<br> second++<br> if(second>=60)<br>{second=0<br> minute++ <br> }

}

count++

if(count==1)

{P2=0xf7<br> dataled=str[0]}//数码管扫描

if(count==2)

{P2=0xfb<br> dataled=str[1]}

if(count==3)

{ P2=0xfd

dataled=str[2]

count=0}

}

/*************************************************************************************/

void delay(unsigned int i)//延时函数

{

while(i--)

}

/***************************************************************************************/

//18b20初始化函数

void Init_DS18B20(void)

{

unsigned char x=0

DQ = 1 //DQ复位

delay(8) //稍做延时

DQ = 0 //单片机将DQ拉低

delay(80)//精确延时 大于 480us

DQ = 1 //拉高总线

delay(10)

x=DQ //稍做延时后 如果x=0则初始化成功 x=1则初始化失败

delay(5)

}

//读一个字节

unsigned char ReadOneChar(void)

{

unsigned char i=0

unsigned char dat = 0

for (i=8i>0i--)

{

DQ = 0// 给脉冲信号

dat>>=1

DQ = 1// 给脉冲信号

if(DQ)

dat|=0x80

delay(5)

}

return(dat)

}

//写一个字节

void WriteOneChar(unsigned char dat)

{

unsigned char i=0

for (i=8i>0i--)

{

DQ = 0

DQ = dat&0x01

delay(5)

DQ = 1

dat>>=1

}

delay(5)

}

//读取温度

unsigned char ReadTemperature(void)

{

unsigned char a=0

unsigned char b=0

unsigned char t=0

//float tt=0

Init_DS18B20()

WriteOneChar(0xCC)// 跳过读序号列号的 *** 作

WriteOneChar(0x44)// 启动温度转换

delay(200)

Init_DS18B20()

WriteOneChar(0xCC)//跳过读序号列号的 *** 作

WriteOneChar(0xBE)//读取温度寄存器等(共可读9个寄存器) 前两个就是温度

a=ReadOneChar()

b=ReadOneChar()

b<<=4

b+=(a&0xf0)>>4

t=b

//tt=t*0.0625

//t= tt*10+0.5//放大10倍输出并四舍五入

return(t)

}

接上18B20温度传感器后数码管显示出当前温度

#include <reg52.h>

#define uchar unsigned char

#define uint unsigned int

sbit DS=P2^2 //define interface

uint temp// variable of temperature

uchar flag1 // sign of the result positive or negative

sbit dula=P2^6

sbit wela=P2^7

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}

unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,

0x87,0xff,0xef}

void delay(uint count) //delay

{

uint i

while(count)

{

i=200

while(i>0)

i--

count--

}

}

///////功能:串口初始化,波特率9600,方式1///////

void Init_Com(void)

{

TMOD = 0x20

PCON = 0x00

SCON = 0x50

TH1 = 0xFd

TL1 = 0xFd

TR1 = 1

}

void dsreset(void) //send reset and initialization command

{

uint i

DS=0

i=103

while(i>0)i--

DS=1

i=4

while(i>0)i--

}

bit tmpreadbit(void) //read a bit

{

uint i

bit dat

DS=0i++ //i++ for delay

DS=1i++i++

dat=DS

i=8while(i>0)i--

return (dat)

}

uchar tmpread(void) //read a byte date

{

uchar i,j,dat

dat=0

for(i=1i<=8i++)

{

j=tmpreadbit()

dat=(j<<7)|(dat>>1) //读出的数据最低位在最前面,这样刚好一个字节在DAT里

}

return(dat)

}

void tmpwritebyte(uchar dat) //write a byte to ds18b20

{

uint i

uchar j

bit testb

for(j=1j<=8j++)

{

testb=dat&0x01

dat=dat>>1

if(testb) //write 1

{

DS=0

i++i++

DS=1

i=8while(i>0)i--

}

else

{

DS=0 //write 0

i=8while(i>0)i--

DS=1

i++i++

}

}

}

void tmpchange(void) //DS18B20 begin change

{

dsreset()

delay(1)

tmpwritebyte(0xcc) // address all drivers on bus

tmpwritebyte(0x44) // initiates a single temperature conversion

}

uint tmp() //get the temperature

{

float tt

uchar a,b

dsreset()

delay(1)

tmpwritebyte(0xcc)

tmpwritebyte(0xbe)

a=tmpread()

b=tmpread()

temp=b

temp<<=8//two byte compose a int variable

temp=temp|a

tt=temp*0.0625

temp=tt*10+0.5

return temp

}

void readrom() //read the serial

{

uchar sn1,sn2

dsreset()

delay(1)

tmpwritebyte(0x33)

sn1=tmpread()

sn2=tmpread()

}

void delay10ms()//delay

{

uchar a,b

for(a=10a>0a--)

for(b=60b>0b--)

}

void display(uint temp) //显示程序

{

uchar A1,A2,A2t,A3,ser

ser=temp/10

SBUF=ser

A1=temp/100

A2t=temp%100

A2=A2t/10

A3=A2t%10

dula=0

P0=table[A1] //显示百位

dula=1

dula=0

wela=0

P0=0x7e

wela=1

wela=0

delay(1)

dula=0

P0=table1[A2] //显示十位

dula=1

dula=0

wela=0

P0=0x7d

wela=1

wela=0

delay(1)

P0=table[A3] //显示个位

dula=1

dula=0

P0=0x7b

wela=1

wela=0

delay(1)

}

void main()

{

uchar a

Init_Com()

do

{

tmpchange()

// delay(200)

for(a=10a>0a--)

{ display(tmp())

}

}while(1)

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11186182.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-14
下一篇2023-05-14

发表评论

登录后才能评论

评论列表(0条)

    保存