你把倒数第三行改为
dsxianshi(get_temp())试试看?你现在这样不会启动18b20采集温度,全局变量temp得不到温度值。
另外,这种用全局变量传值的玩法很不好看,能不用就不要用。
另外2, 全局变量和局部变量或函数参数同名字也不是好玩法。
#include<reg52.h>#define
uchar
unsigned
char
#define
uint
unsigned
int
sbit
dq
=
p3^3
//ds18b20数据口
uchar
code
table[10]
=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}
void
delay(uint
a)
//延时
{
while(a--)
//为了精准控制
}
void
reset()
//复位
{
dq=0
delay(50)
dq=1
delay(50)
}
void
write_bit(uchar
a)
//写一位
{
dq=0
if(a)
dq=1
delay(5)
dq=1
}
uchar
read_bit()
//读一位
{
dq=0
dq=1
delay(0)
//需要非常准确控制时间
5us左右
return
dq
}
void
write_byte(char
k)
//写一个字节
{
uchar
i,b
for(i=0i<8i++)
{
b=k
b=b>>i
//位 *** 作
用于除2计算
write_bit(b&0x01)
delay(5)
}
}
uchar
read_byte()
//读一个字节
{
uchar
i,m=1,s=0
for(i=0i<8i++)
{
if(read_bit())
s+=m<<i
//位 *** 作
用于乘2计算
delay(5)
}
return
s
}
void
display_smg(uint
temp)
//驱动数码管
{
uint
i
for(i=7i>=0i--)
{
p2=i
//位选
p0=table[temp%10]
//段选
temp/=10
delay(500)
if(temp==0)
break
//消零
}
}
main()
{
uchar
temp_h,temp_l
uint
temp
p0=0x00
p2=0x00
while(1)
{
reset()
//复位
write_byte(0xcc)
//跳过搜索
write_byte(0x44)
//温度转换
reset()
//复位
write_byte(0xcc)
//跳过搜索
write_byte(0xbe)
//要求读出数据
temp_l=read_byte()
//读出低八位
temp_h=read_byte()
//读出高八位
reset()
//终止读数
temp=temp_h*16+temp_l/16//转换低位和高位之和
display_smg(temp)
//驱动数码管
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)