PS:如果我将转化函数和读温度函数放在循环里的话(不加上begin的话,可以正常显示,包括按键变化温度值都能读出来,只是第一次运行要跳出85℃),但是加上begin的话就只能放在循环外面,在我的认知里,DS18B20应该是转化一次就可以读温度了吧,所以放在外面应该不影响温度的显示,但是实际的运行结果却是只能显示第一次的结果,如果你按键的话,数码管显示不出来。
求大佬帮帮忙
单片机源程序如下:
#include <REGX51.H>
#include <intrins.h>
#include "display.h"
#include "delay.h"
sbit DQ=P3^7;
void delay_us(unsigned char i)------------//us级延时(进入函数11us运行延时6us)
{
while(i--);
}
bit DS18B20chushihua()-------------------//初始化
{
bit n;
DQ=1;
_nop_();
DQ=0;
delay_us(80);
DQ=1;
delay_us(4);
n=DQ;
delay_us(20);
DQ=1;
_nop_();
return n;
}
void writeDS18B20(unsigned char xdat)------------写时序
{
unsigned char j;
for(j=0;j<8;j++)
{
DQ=0;
_nop_();
DQ=xdat&0x01;
delay_us(10);
DQ=1;
xdat=xdat>>1;
// _nop_();
}
// _nop_();
}
unsigned char readDS18B20()--------------------------//读时序
{
unsigned char j,rdat;
for(j=0;j<8;j++)
{
rdat=rdat>>1;
DQ=0;
_nop_();
DQ=1;
_nop_();
if(DQ==1)
rdat=rdat|0x80;
delay_us(10);
DQ=1;
_nop_();
}
_nop_();
return rdat;
}
void DS18B20_zhuanhua()----------------温度转化函数
{
DS18B20chushihua();
writeDS18B20(0xcc);
writeDS18B20(0x44);
}
unsigned int DS18B20_duwendu()-------------读温度
{
unsigned int L;
unsigned int H;
unsigned int temp;
DS18B20chushihua();
writeDS18B20(0xcc);
writeDS18B20(0xbe);
L=readDS18B20();
H=readDS18B20();
H=(H<<8)|L;
if((H&0xf800)==0xf800)
H=!H+1;
temp=H*0.0625;
return temp;
}
void main()------------主函数
{
unsigned int temp;
DS18B20_zhuanhua();
begin();------------------------//数码管初始化----的函数(已延时800ms)
while(1)
{
temp=DS18B20_duwendu();
display_s(temp);-------------//显示函数
}
}
|