ds18b20送出数据其中小数部分在单片机STC89C52RC怎么处理并在LED显示出来的 谢谢高手们 我只会汇编语言

如题所述

我有一个12864做的温度计,有源程序
QQ:470981308
数码管显示的和12864的不一样,12864和1602的原理一样,
数码管的小数部分的四位数据需要和整数的8位数据分别存放,然后将整数处理成数码管显示,最后一位数码管码用个或运算加上,在整数后面把转换的小数显示出来就可以,
下面是12864的部分程序,18B20温度测量返回16位数据temp(uint类型),将其强制转换成浮点型(float类型),让后在乘以0.0625,通过格式化输出函数sprintf()转化为ASSII码存入数组,就可以直接被12864显示出来
希望能帮上忙

#include<reg52.h>
#include<stdio.h>
#include"lcd12864.h"
#include"18b20.h"
#include"delay24.h"
#define uchar unsigned char
#define uint unsigned int
uchar temp[16];
uint temperature;
float temper;
main()
{
open_18b20();
delay_10ms(95);
temperature=read_temp();
temper=(float)temperature*0.0625;
sprintf(temp,"温度: %3.3f℃",temper);
lcd12864_init();
lcd_write_str(0,0,"温度测量系统"); //温度测量系统
lcd_write_str(1,0,"恭贺我校申本成功"); //恭贺我校升本成功
lcd_write_str(2,0,temp); //温度:
lcd_write_str(3,1,"成都工业学院"); //成都工业学院
}

/**************************************
温度传感器DS18B20测试程序
主芯片 : STC12C5A60S2 (1T)
工作频率: 24.000MHz
**************************************/

#include "delay24.h"
#include "18b20.h"
#include<reg52.h>

#define uchar unsigned char
#define uint unsigned int
sbit DQ = P1^3;

uchar cy;
/**************************************
复位DS18B20,并检测设备是否存在
**************************************/
void init_18b20(void)
{
uchar i;
DQ=1;
delay_1us();
DQ=0;
delay_5us(120);
DQ=1;
delay_5us(10);
for(i=0;i<10;i++) //器件检测,共检测10次,器件正常,返回0,器件不正常,结束初始化并返回1
{
delay_5us(3);
cy=DQ;
if(cy==0)
break;

}
}

/**************************************
从DS18B20读1字节数据
**************************************/
uchar ds18b20_read_byte(void)
{
uchar i,dat;

for(i=0;i<8;i++)
{
while(DQ!=1);
DQ=0;
delay_5us(2);
DQ=1;
dat=dat>>1;
if(DQ)
dat|=0x80;
delay_5us(10);
}
return dat;

}
/**************************************
向DS18B20写1字节数据
**************************************/
void ds18B20_write_byte(unsigned char dat)
{
uchar i;

for(i=0;i<8;i++)
{
while(DQ!=1);
DQ=0;
delay_5us(2);
DQ=(dat&0x01);
dat=dat>>1;
delay_5us(9);
DQ=1;

}
delay_5us(5);
}

/**************************************
启动温度转换
**************************************/
void open_18b20(void)
{
init_18b20();
ds18B20_write_byte(0xcc); //跳过ROM地址
ds18B20_write_byte(0x44); //启动温度转换
}

/**************************************
读取温度值
**************************************/
uint read_temp(void)
{
uchar l,m;
uint t;
init_18b20();
ds18B20_write_byte(0xcc); //跳过读序号列号的操作
ds18B20_write_byte(0xbe); //读取暂存器,一共可读9位,第一二位为温度的低位和高位
l=ds18b20_read_byte();
m=ds18b20_read_byte();
t=m;
t=t<<8; //m=m<<4;
t=t+l;//m+=(l&0xf0)>>4;
//t=m;
return t;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-03-13
你需要精确到小数后几位?一般保留一位的话小数点后一位为1,则0.5,为0则为0
其它依次
相似回答
大家正在搜