基于89c51单片机数字温度计设计图和c语言程序,用DS18B20温度传感器和数码管。qq:609347745

2024-11-02 15:25:57
推荐回答(3个)
回答1:

sbit DQ=P1^6; //采集温度数据线

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:

汇编语言行么?这是我大三的课程设计。图是protel的。

回答3:

已加你Q