急求解答、关于温度
附上有关的两个函数、详细登陆http://wenku.baidu.com/view/90942eda551810a6f52486ce.html !
uchar tmrtemp(void) //读取温度transform read temperature
{
uchar a,b;
tmreset();
tmpre();
dmsec(1);
tmwbyte(0xcc);
tmwbyte(0xbe); //读内部RAM中9字节的内容
a=tmrbyte(); //LSB低八位
b=tmrbyte(); //LSB高八位
y3=b;
y3<<=8;
y3=y3|a;
ff=y3*0.0625;
y3=ff*10+0.5;
return(y3);
}
void main(void) //主程序
{
uint temperature;
dianji=0;
tmstart(); //初始化DS18B20
dmsec(450);
while(1)
{
tmstart(); //DS18B20开始初始化
dmsec(2);
temperature=tmrtemp()+256; //读取温度
shi=temperature/100;
ge=(temperature%100)/10;
xiaoshu=(temperature%100)%10;
keyscan();
dmsec(2);
deal(temperature/10);
dianjik();
}
}
没人解答,有木有人呀
求老饼来拯救菜鸟
给你一个在我的开发板完美运行的正确程序自己看吧/*************************************************
/**************************************************
*程序名称:shumaguan.c
*程序功能:实时采集当前环境温度值,并显示于数码管上,数码管前三位显示数值,第四位显示单位
*程序说明:18B20的数据口为P3^6,数码管的数据口为P1,段选,位选为P3^4,P 3^5
**************************************************/
#include <reg52.h> //头文件
#define uchar unsigned char //宏定义
#define uint unsigned int
sbit DS=P3^6; //定义18B20的信号端
uint temp; // 定义一变量,存储温度值
sbit dula=P3^4; //数码管的位选,段选
sbit wela=P3^5;
unsigned char code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, //数码管的数字编码,0-F
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code table1[]={ //数码管的数字编码,0-9(与table[]的区别是,这些数带小数点)
0xbf,0x86,0xdb,0xcf,0xe6,
0xed,0xfd,0x87,0xff,0xef};
uchar A1,A2,A2t,A3;
sbit boop=P3^7;
/**************************************************
*名称:void delay(uint count)
*功能:延时函数,用来延迟时间
*入口参数:count
*出口参数:无
*说明:通过不断地执行空语句,来延迟时间(延时可以用延时语句,也可以用定时器产生中断来延迟时间,此例属于延时语句)
*范例:void delay(uint xms);
**************************************************/
void delay(uint count)
{
uint i,j;
for(i=count;i>0;i--)
for(j=103;j>0;j--);
}
/**************************************************
*名称:void dsreset(void)
*功能:18B20的复位函数,18B20使用时一定要初始化
*入口参数:无
*出口参数:无
*说明:请参照18B20的时序图,看程序
*范例:void dsreset(void);
**************************************************/
void dsreset(void)
{
DS=0; //先让ds为低电平
delay(1); //延迟一段时间
DS=1; //拉高
delay(1); //延时
}
/**************************************************
*名称: bit tmpreadbit(void)
*功能: 从18B20读一位二进制数据,
*入口参数:无
*出口参数:dat
*说明:请参照18B20的读数据的时序图,看程序
*范例:bit tmpreadbit(void));
**************************************************/
bit tmpreadbit(void)
{
uint i;
bit dat; //定义返回值,注意类型
DS=0;i++; //短暂的延时,此时不用延时函数
DS=1;i++;i++; //短暂的延时,期间单片机会对总线上的数据进行采样,获取数据值
dat=DS; //将获得的数值返回给dat
i=8;while(i>0)i--; //延时
return (dat);
}
/**************************************************
*名称: uchar tmpread(void)
*功能: 从18B20读一个字节的数据函数
*入口参数:无
*出口参数:dat
*说明:请参照18B20的读数据的时序图,看程序
*范例:uchar tmpread(void);
**************************************************/
uchar tmpread(void)
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}
/**************************************************
*名称: void tmpwritebyte(uchar dat)
*功能: 向18B20写一个字节的数据
*入口参数:dat
*出口参数:无
*说明:请参照18B20的读数据的时序图,看程序
*范例:void tmpwritebyte(uchar dat);
**************************************************/
void tmpwritebyte(uchar dat)
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0; //write 0
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
/**************************************************
*名称: void tmpchange(void)
*功能: 18B20开始获取温度并转换,温度值存储在18B20的寄存器中
*入口参数:无
*出口参数:无
*说明:注意18B20的有关命令。
*范例:void tmpchange(void)
**************************************************/
void tmpchange(void)
{
dsreset(); //先初始化
delay(1); //延时一会
tmpwritebyte(0xcc); // 跳过ROM,直接向18B20发温度变换命令,
tmpwritebyte(0x44); // 开始温度转换
}
/**************************************************
*名称: uint tmp()
*功能: 从18B20的寄存器中读取温度
*入口参数:无
*出口参数:temp
*说明:注意18B20的有关命令。
*范例:uint tmp();
**************************************************/
uint tmp()
{
float tt; //定义一个浮点型数据
uchar a,b;
dsreset(); //初始化
delay(1); //延时一会
tmpwritebyte(0xcc); //跳过ROM,使用于只有一个18B20
tmpwritebyte(0xbe); //读暂存器
a=tmpread(); //读低八位,
b=tmpread(); //读高八位
temp=b;
temp<<=8; //temp是个16位的数据,将b的值放在高八位,然后再将a的值放在低八位,组成一个十六位的数据
temp=temp|a;
tt=temp*0.0625; //temp*0.0625就是实际温度值,出厂时默认配置为12位,分辨率为0.0625,
temp=tt*10+0.5; //转化为整数,加0.5表示四舍五入。经过temp=tt*10+0.5;后
return temp; //假如实际温度为25.583度,现在temp的数值为256,如果不加0.5,则为255,由于只取前三位将会有较大的误差
}
/**************************************************
*名称: void display(uint temp)
*功能: 在数码管上显示数据
*入口参数:temp
*出口参数:无
*说明:注意18B20的有关命令。
*范例:void display(uint temp);
**************************************************/
void display(uint temp)
{
A1=temp/100; //以上面的数为例,temp为256,则A1为2
A2t=temp%100; //A2T为56
A2=A2t/10; //A2为5,
A3=A2t%10; //A3为6
dula=0;
P1=table[A1]; //显示第一位
dula=1;
dula=0;
wela=0;
P1=0xfe;
wela=1;
wela=0;
delay(1); //延时,时间太长会导致闪烁,时间太短,会导致有重影
dula=0;
P1=table1[A2]; //显示第二位,注意这个数需要带小数点,用的是table1[]
dula=1;
dula=0;
wela=0;
P1=0xfd;
wela=1;
wela=0;
delay(1);
P1=table[A3]; //显示第三位
dula=1;
dula=0;
P1=0xfb;
wela=1;
wela=0;
delay(1);
dula=0;
P1=table[12]; //显示C,作为单位
dula=1;
dula=0;
wela=0;
P1=0xf7;
wela=1;
wela=0;
delay(1);
}
void main() //主函数
{
while(1)
{
tmpchange();
display(tmp());
}
}
