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);-------------//顯示函數
}
}
|