12864上显示18B20的温度。要精度到小数点后两位,刚开始显示两点几度加温后,为什么显示的温度只有一度左右的变化~下面是我的程序!请各位大侠帮解一下~我郁闷好久了!
#include"18b20.h"
#include"reg52.h"
#include"delay.h"
#include"12864.h"
#include <intrins.h>
sbit DQ=P0^2; //18b20数据口
uchar bb; //存放温度数值
void init_ds18b20(void)//初始化
{
uchar mm;
DQ=1;
delayus(10);
DQ=0;
delayus(100);
DQ=1;//释放总线
delayus(10);
mm=DQ;
delayus(5);
}
void write_byte(uchar dat)//向ds18b20写一个字节
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;//送数据从低位送起
delayus(5);
DQ=1;
dat>>=1;
}
delayus(5);
}
uchar read_byte(void)//读取18b20一个字节
{
uchar i,value;
for(i=0;i<8;i++)
{
DQ=0;
value>>=1;
DQ=1;
if(DQ)
value|=0x80;
delayus(5);
}
return value;
}
void zhongread()//读取温度值
{
float t;
uchar value,temp1,temp2,temp;
init_ds18b20();
write_byte(0xcc);//跳过ROM
write_byte(0x44);//启动温度测量
delayus(300);
init_ds18b20();
write_byte(0xcc);//跳过ROM
write_byte(0xbe);
temp1=read_byte();//读是低位 ,小数部分
temp2=read_byte();//读是高位
temp=temp2;
temp2<<=8;
temp= temp|temp1;
value=temp;
t=value*0.0625;
//t=value*0.0625;
//将它放大100倍, 使显示时可显示小数点后两位, 并对小数点后第三进行4舍5入
//如t=11.0625, 进行计数后, 得到value = 1106, 即11.06 度
//如t=-11.0625, 进行计数后, 得到value = -1106, 即-11.06 度
bb=t*100+(value>0?0.5:-0.5); //大于0加0.5, 小于0减0.5
}
void lcdsd18b20() //数据处理并在12864上显示
{
uchar tmp=bb,t1,t2,t3,t4,t5;
t1=tmp/10000;
t2=tmp%10000/1000;
t3=tmp%1000/100;
t4=tmp%100/10;
t5=tmp%10;
write_com(0X8b);
delayus(10);
write_dat(t1+0x30);delay(2);
write_dat(t2+0x30);delay(2);
write_dat(t3+0x30);delay(2);
write_dat(0x2e);
write_dat(t4+0x30);delay(2);
write_dat(t5+0x30);delay(2);
}
void xianshi()//在12864上显示温度值
{
zhongread();
lcdsd18b20();
}
此帖出自
小平头技术问答
一周热门 更多>