本帖最后由 yesno 于 2012-5-19 15:29 编辑
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit DQ=P2^2;
uint temp;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0-9数字
void delay (uint x) //延时函数
{
uchar i;
while(x--)
for(i=0; i<120; i++);
}
void delay1(uint a) //延时函数
{
while(--a);
}
void disp(uchar num) //显示函数
{
uchar shi,ge;
shi=num/10;
ge=num%10;
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(5);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(5);
}
void init_18b20() // 初始化
{
DQ=1;
delay1(8);
DQ=0;
delay1(90);
DQ=1;
_nop_();
_nop_();
delay1(100);
DQ=1;
}
void write(uchar dat) //写字节
{
uchar i;
for(i=0; i<8; i++)
{
DQ=0;
DQ=dat&0x01;
delay1(5);
DQ=1;
dat>>=1;
}
delay1(4);
}
uchar read() //读字节
{
uchar i, dat=0;
DQ=1;
_nop_();
for(i=0; i<8; i++)
{
DQ=0;
_nop_();
_nop_();
dat>>=1;
DQ=1;
_nop_();
_nop_();
if(DQ)
dat|=0x80;
delay1(30);
DQ=1;
}
return dat;
}
uchar read_tu() // 温度转换
{
uchar a,b;
init_18b20();
delay1(100);
write(0xcc);
write(0x44);
init_18b20();
write(0xcc);
write(0xbe);
a=read();
b=read();
b<<=4;
b+=(a&0xf0)>>4;
return b;
}
void main() //主函数
{
delay(30);
while(1)
{
temp=read_tu;
disp(temp);
}
}
这个初学仔细检查啦视乎没错,可是下载到板子里面就不行啦。其他的情况也没什么就是温度没反应,数码管就是显示70,任凭我怎么触摸传感器都是没反应既不升温也不降温。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
哪那么复杂
bit P_N;
unsigned char msb,lsb;
/*****************************************************
函数:温度转换命令 + 读取计算保存
要求:在主程序中循环调用此函数,调用速度随意
比如:P_N = 0,msb = 20,lsb = 4,即+20.4℃
P_N = 1,msb = 14,lsb = 3,即-14.3℃
*****************************************************/
void Conversion_Update_Temp(void)
{
…………
a = DS18B20_ReadByte(); //读温度低字节
b = DS18B20_ReadByte(); //读温度高字节
P_N = (bit)( b & 0x80 ); //P_N=1负温,P_N=0正温
if ( P_N ) { b = 255 - b; if( a )a = 256 - a; else b++; } //负温计算方法1:65536减去后,按正温计算
………… //负温计算方法2:取反加1后,按正温计算
msb = (b<<4) | (a>>4); //温度整数 相当于 (b<<8 + a)*0.0625
//lsb = ((a&0x0F)*10)/16; //温度小数保留1位(不带四舍五入)相当于 ( (b<<8 + a)*0.0625*10) %10
lsb = ((a&0x0F)*10+8)/16; //温度小数保留1位(带四舍五入) 相当于 ( (b<<8 + a)*0.0625*10 +5 ) %10
}
一周热门 更多>