跪求用温度传感器ds18b20显示温度的单片机程序

要求2位数码管静态显示 邮箱274902071@qq.com 谢谢!!!
2024-12-19 01:49:46
推荐回答(3个)
回答1:

把返回值放到你数码管显示子程序中分解显示即可
sbit DQ=P1^6; //采集温度数据线
sbit SPK=P3^7;
unsigned char tflag;
unsigned int tive;
float temper;

/****************************************
函数功能:短暂延时
入口参数:num
出口参数:
*****************************************/
void delay(unsigned int num)
{
while(num--);
}

/****************************************
函数功能:DS18B20初始化
入口参数:
出口参数:
*****************************************/
void init_DS18B20(void)
{
//主机发送复位脉冲
DQ=1;
DQ=0;
delay(600); //x
DQ=1;
//等待DS18B20发送应答信号
delay(60); //防止DS18B20本身问题而读不出数据采用确认法
while(!DQ);

// delay(480); //DS18B20本身没有问题,可以延时将应答过程忽略

}
/****************************************
函数功能:读一个字节
入口参数:
出口参数:
*****************************************/
readchar(void) //从低位开始读
{
unsigned char i=0;
unsigned char dat=0;

for(i=0;i<8;i++)
{
DQ=1;
DQ=0;
delay(10); //CPU缓冲时间 采样时间
dat>>=1; //从高到低先存放一位数据
DQ=1;
if(DQ) //如果是1,将数据存放
dat|=0x80;
DQ=1;
delay(9); //数据读取时间,下一次数据读取前需要延时
}
return(dat);
}
/****************************************
函数功能:写一个字节
入口参数:
出口参数:
*****************************************/
writechar(unsigned char dat)
{
unsigned char i=0;

for(i=0;i<8;i++)
{
DQ=1;
DQ=0; //等待接收缓冲区的来临,整个过程的时间为60~120us
delay(15); //
DQ=dat&0x01; //第一次写最低位,将字节变为位
delay(15); //
dat>>=1; //准备写入下一位数据。
}
}
/****************************************
函数功能:读取温度
入口参数:
出口参数:
*****************************************/
read_temperature(void)
{
unsigned int a,b;

init_DS18B20(); //初始化子程序
writechar(0xcc); //写入指令
writechar(0x44);

init_DS18B20();
writechar(0xcc);
writechar(0xbe);

a=readchar(); //低八位
b=readchar(); //高八位
tive=b;
tive<<=8;
tive=tive|a;
if(tive>0x0800) //温度为负温度第13位到15为为1,温度为正温度 //第13位到15为为0,所以值小于0x800说明为正温度
tive=~tive+1;
else
tive=tive;

temper=tive*0.0625; //采用12位分辨率所以每次的增量是0.0625

temper=temper*10; //保留小数点后面一位

return(temper);
}

回答2:

昨天刚做了一个四位数码管的

回答3:

楼上的比较详细。