|
PS:如果我將轉(zhuǎn)化函數(shù)和讀溫度函數(shù)放在循環(huán)里的話(不加上begin的話,可以正常顯示,包括按鍵變化溫度值都能讀出來,只是第一次運(yùn)行要跳出85℃),但是加上begin的話就只能放在循環(huán)外面,在我的認(rèn)知里,DS18B20應(yīng)該是轉(zhuǎn)化一次就可以讀溫度了吧,所以放在外面應(yīng)該不影響溫度的顯示,但是實(shí)際的運(yùn)行結(jié)果卻是只能顯示第一次的結(jié)果,如果你按鍵的話,數(shù)碼管顯示不出來。
求大佬幫幫忙
單片機(jī)源程序如下:
#include <REGX51.H>
#include <intrins.h>
#include "display.h"
#include "delay.h"
sbit DQ=P3^7;
void delay_us(unsigned char i)------------//us級(jí)延時(shí)(進(jìn)入函數(shù)11us運(yùn)行延時(shí)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)------------寫時(shí)序
{
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()--------------------------//讀時(shí)序
{
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()----------------溫度轉(zhuǎn)化函數(shù)
{
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()------------主函數(shù)
{
unsigned int temp;
DS18B20_zhuanhua();
begin();------------------------//數(shù)碼管初始化----的函數(shù)(已延時(shí)800ms)
while(1)
{
temp=DS18B20_duwendu();
display_s(temp);-------------//顯示函數(shù)
}
}
|
|