这个51单片机数码管显示温度程序

这个51单片机数码管显示温度程序,第1张

你把倒数第三行改为

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)

//驱动数码管

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7812589.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-10
下一篇 2023-04-10

发表评论

登录后才能评论

评论列表(0条)

保存