|
/*****************************
功能:和DS18B20温度传感器通信,读出传感器数据,转换为温度值用数码管显示
欢迎各位交流单片机学习困惑和编程思路 QQ30777103
******************************/
#include <reg52.h>
#include "ds18b20.h"
#define Duan1 P0
sbit s1=P1^0;
sbit s2=P1^1;
sbit s3=P1^2;
uchar smg[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
void main()
{
uint i,temp;
float tp;
while(1)
{
tp=readtemp();
temp=tp*0.0625*10+0.5;
for(i=0;i<3;i++)
{
switch(i)
{
case 0:s1=0;s2=0;s3=0; Duan1=~smg[temp/100]; break;
case 1:s1=1;s2=0;s3=0; Duan1=~smg[temp%100/10]|0x80;break;
case 2:s1=0;s2=1;s3=0; Duan1=~smg[temp%100%10];break;
}
delayus(200);
}
}
}
子程序:DS18B20.C
#include "DS18B20.H"
#include "intrins.h"
void delayus(uint t)
{
while(t--);
}
uchar Ds_Init()
{
uchar i;
ds=0;
delayus(70);
ds=1;
delayus(14);
while(ds)
{
delayus(100);
i++;
if(i>5)
return 0;
}
return 1;
}
bit ds_read_bit()
{
bit dat;
ds=0;
_nop_();
_nop_();
ds=1;
_nop_();
dat=ds;
delayus(9);
return dat;
}
uchar ds_read_byte()
{
uchar i,dat,j;
for(i=0;i<8;i++)
{
j=ds_read_bit();
dat=dat>>1;
dat=(j<<7)|dat;
}
return dat;
}
void ds_write_bit(bit dat)
{
ds=0;
_nop_();
_nop_();
ds=dat;
delayus(8);
ds=1;
_nop_();
}
void ds_write_byte(uchar dat)
{
uchar i;
bit j;
for(i=0;i<8;i++)
{
j=dat&0x01;
ds_write_bit(j);
dat=dat>>1;
}
delayus(1);
}
void changetemp()
{
Ds_Init();
delayus(100);
ds_write_byte(0xcc);
ds_write_byte(0x44);
delayus(200);
}
uint readtemp()
{
uint temp=0;
uchar th,tl;
changetemp();
Ds_Init();
delayus(5);
ds_write_byte(0xcc);
ds_write_byte(0xbe);
tl=ds_read_byte();
th=ds_read_byte();
temp=th;
temp<<=8;
temp|=tl;
return temp;
}
头文件:DS18B20.H
#ifndef _DS18B20_H_
#define _DS18B20_H_
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P2^2;
void delayus(uint t);
uchar Ds_Init();
bit ds_read_bit();
uchar ds_read_byte();
void ds_write_bit(bit dat);
void ds_write_byte(uchar dat);
void changetemp();
uint readtemp();
#endif
|
|