注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
扫把鑫的个人空间 https://home.eeworld.com.cn/space-uid-299703.html [收藏] [复制] [分享] [RSS]
日志

温度传感器DS18B20精确到小数位

已有 2977 次阅读2011-8-21 14:35 |个人分类:51学习|

最近在学习温度传感器DS18B20,看教程的时候都是将温度整数显示,DS18B20是可以精确到9位的,我就想把他小数位的也在数码管上显示出来,但是想了很久都不明白怎样才能将小数部分也显示出来,希望各位大侠给点思路。还有就是下面的程序中的语句(红色字体 b<<=4; b+=(a&0xf0)>>4;)不懂,希望大家能指点指点!
 
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P2^3;
sbit A =P2^0;
sbit B1=P2^1;
sbit C =P2^2;
uchar code table[11] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80};
uchar temp;
//***** 函数声明**********
 void init_ds18b20();
 void delay(del);
 void delay_50us(t);
 void writr_byte(uchar dat);
 uchar read_byte(void);
 uchar read_temperature(void);
 void display();
//******主函数******
void main(void)
{
   while(1)
 {
  
  display();
 }
}
//****DS18B20初始化函数***
void init_ds18b20()
{
 uchar n;
 DQ=1;
 delay(8);
 DQ=0;
 delay(80);
 DQ=1;
 delay(8);
 n=DQ;
 delay(4);
}
//******延时函数*****
void delay(del)
{
 while(del--);
}
void delay_50us(t)
{
 uchar i,j;
 for(i=0;i<t;i++)
  for(j=0;j<19;j++);
}
 //*****DS18b20读函数****
 void write_byte(uchar dat)
 {
    uchar i;
 for(i=0;i<8;i++)
 {
  DQ=0;
  DQ=dat&0x01;
  delay(4);//    大概延时40~50us
  dat>>=1;
  DQ=1;
 }
 delay(4);
 }
//******DS18B20写函数****
uchar read_byte(void)
{
 uchar i,value;
 for(i=0;i<8;i++)
 {
  DQ=0;
  value>>=1;
  DQ=1;
  if(DQ) value|=0x80;
  delay(4);
 }
 return value;
}
//*****读温度函数*****
uchar read_temperature(void)
{
 uchar a,b;
 init_ds18b20();
 write_byte(0xcc);//跳过ROM,不检测序列号
 write_byte(0x44);//写入启动温度转换
 delay(300);
 
 init_ds18b20();
 write_byte(0xcc);
 write_byte(0xbe); // 写入读温度
 a=read_byte();
 b=read_byte();
 b<<=4;
 b+=(a&0xf0)>>4;
 return b;
}
//*****显示函数****
void display()
{
 temp=read_temperature();
 A=0;B1=0;C=0;
 P0=table[temp/10];
 delay_50us(25);
 A=1;B1=0;C=0;
 P0=table[temp%10];
 delay_50us(25);
  
评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章