文档库

最新最全的文档下载
当前位置:文档库 > 18B20温度显示 c语言程序

18B20温度显示 c语言程序

#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit ds=P2^2; //温度传感器信号线

sbit dula=P2^6;

sbit wela=P2^7;

sbit beep=P2^3; //蜂鸣器

uint temp; //定义整型温度数据

float f_temp ; //定义温度型温度数据

uint warn_l1=270;

uint warn_l2=250;

uint warn_h1=300;

uint warn_h2=320;

sbit led1=P1^0; //发光二极管控制

sbit led2=P1^1;

sbit led3=P1^2;

sbit led4=P1^3;

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

0x07,0x7f,0x6f, //带小数点的0-9编码

0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,

0x87,0xff,0xef}; //不带小数点的0-9编码void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void dsreset(void) //DS18B20复位,初始化函数

{

uint i;

ds=0;

i=103;

while(i>0)i--;

ds=1;

i=4;

while(i>0)i--;

}

bit tempreadbit(void) //读一位数据函数

{

uint i;

bit dat;

ds=0;i++; //i++起延时作用

ds=1;i++;i++;

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

return(dat);

}

uchar tempread(void) //读一字节的数据

{

uchar i,j,dat;

dat=0;

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

{

j=tempreadbit();

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

return(dat);

}

void tempwritebyte(uchar dat) //向DS18B20里写一个字节的数据函数

{

uint i;

uchar j;

bit testb;

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

{

testb=dat&0x01;

dat=dat>>1;

if(testb) //写1

{

ds=0;

i++;i++;

ds=1;

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

}

else

{

ds=0; //写0

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

ds=1;

i++;i++;

}

}

}

void tempchange(void) //DS18B20开始获取温度并转换

{

dsreset();

tempwritebyte(0xcc); //写跳过读ROM指令

tempwritebyte(0x44); //写温度转换指令

}

uint get_temp() //读取存储器中储存的温度数据

{

uchar a,b;

dsreset();

delay(1);

tempwritebyte(0xcc); //写跳过读ROM指令

tempwritebyte(0xbe);

a=tempread(); //读低8位

b=tempread(); //读高8位

temp=b;

temp<<=8; //两个字节组成一个字

temp=temp|a;

f_temp=temp*0.0625; //温度在寄存器中为12为,分辨率为0.0625

f_temp=temp*10+0.5; //乘以10表示小数点后只取1位,加0.5是四舍五入

f_temp=temp+0.05;

return temp; //temp是整型

}

void display(uchar num,uchar dat) //数据管显示程序

{ //num是第几个数码管dat是显示的数字

uchar i;

dula=0;

P0=table[dat] ; //编码赋给P0口;

dula=1;

dula=0;

wela=0;

i=0xff;

i=i&(~((0x01)<<(num))); //用i来存储位选数据,只有一位为0

P0=i;

wela=1;

wela=0;

delay(1);

}

void dis_temp(uint t) //显示温度数值函数t传递的整形温度值

{

uchar i;

i=t/100; //除以100得到商为温度的十位

display(0,i); //在第一个数码管上显示

i=t%100/10; //温度的个位

display(1,i+10); //在第二个数码管上显示温度的个位

i=t%100%10; //温度的小数位

display(2,i); //在第三个数码管上显示

}

void warn(uint s,uchar led)

{

uchar i;i=s;

beep=0; //蜂鸣器响

P1=~(led); //控制相应的灯亮

while(i--)

{

dis_temp(get_temp()); //用温度显示函数起延时作用

}

beep=1; //蜂鸣器不响

P1=0xff; //控制相应的灯灭

i=s;

while(i--)

{

dis_temp(get_temp()); //用温度显示函数起延时作用

}

}

void deal(uint t) //温度处理函数

{

uchar i;

if((t>warn_l2)&&(t<=11))

{

warn(40,0x01); //第一个灯亮,蜂鸣器发出“嘀”声

}

else if(t<=warn_l2) //小于25度

{

warn(10,0x03); //第一个和第二个灯亮,蜂鸣器发出“嘀”声}

else if((t=warn_h1)) //小于32度大于30读

{

warn(40,0x04); //第三个灯亮,蜂鸣器发出“嘀”声}

else if(t>=warn_h2) //大于32度

{

warn(10,0x0c); // 第三个和第四个灯亮,蜂鸣器发出“嘀”声}

else //在27到30度之间只调用显示函数延时

{

i=40;

while(i--)

{

dis_temp(get_temp());

}

}

}

void init_com(void)

{

TMOD=0X20;

PCON=0X00;

SCON=0X50;

TH1= 0XFD; //波特率9600

TL1=0XFD;

TR1=1;

}

void comm(char*parr)

{

do

{

SBUF=*parr++;

while(!TI);

TI=0;

} while(*parr);

}

void main()

{

uchar buff[4],i;

dula=0;

wela=0;

init_com();

while(1)

{

tempchange(); //温度转换函数

for(i=10;i>0;i--)

{

dis_temp(get_temp()); //获取温度并显示}

deal(temp); //进行温度处理

sprintf(buff,"%f",f_temp); //将浮点温度格式转化为字符型

for(i=10;i>0;i--)

{

dis_temp(get_temp()); //温度显示

}

comm(buff); //串口发送

for(i=10;i>0;i--)

{

dis_temp(get_temp()); //温度显示

}

}

}