标题:
好热呀,没有温度计可不行,自己做个温度计18B20+2051单片机+数码管(小儿科)
[打印本页]
作者:
huxiao
时间:
2015-1-24 14:38
标题:
好热呀,没有温度计可不行,自己做个温度计18B20+2051单片机+数码管(小儿科)
本帖最后由 huxiao 于 2015-1-24 14:39 编辑
西安这鬼天气,这几天真的好热呀,估计也在30多度
这几天也没什么事情干,做个温度计吧,好坏不说知道有多热。
很简单得,18B20+AT89C2051+数码管
用洞洞板好了,电路不复杂。
这个是我每次用洞洞板前必须要做的工作,用cad先把走线布一下,这样焊起来就方便多了。
焊接完得正面是这个样子得:
显示数字的用前面三个数码管,最后一个反过来用,可以显示摄氏度符号。
背面的镀锡走线是这个垃圾效果:
上电测试温度显示:
最后把程序给大家,线路看着程序走,数码管是共阳的。
#include<reg51.h>
#define leddata P1
sbit led0=P3^7;
sbit led1=P3^0;
sbit led2=P3^1;
sbit DQ=P3^5;
typedef unsigned char byte;
byte i;
unsigned char code tab2[]={0,0,1,1,2,3,3,4,5,5,6,6,7,8,8,9};//小数部分显示数据
unsigned char code tab1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};//LED段码表,根据自己硬件修改
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, off
void delays(unsigned char k)
{
unsigned char i,j;
for(i=0;i<k;i++)
for(j=0;j<50;j++);
}
//*********** 18B20驱动 **************************
void delay(unsigned char i)
{
while(--i);
}
//复位
byte ow_reset(void)
{
byte presence;
DQ=0; //拉低总线
delay(250); // 保持 480us
delay(250);
DQ = 1; // 释放总线
delay(30); // 等待回复
presence = DQ; // 读取信号
delay(250); // 等待结束信号
return(presence); // 返回 0:正常 1:不存在
}
//从 1-wire 总线上读取一个字节
byte read_byte(void)
{
byte i;
byte value = 0;
for (i=8;i>0;i--)
{
value>>=1;
DQ = 0;
DQ = 1;
delay(2);
if(DQ)value|=0x80;
delay(6);
}
return(value);
}
//向 1-WIRE 总线上写一个字节
void write_byte(char val)
{
byte i;
for (i=8; i>0; i--) // 一次写一位
{ DQ=1;
DQ=0;
DQ = val&0x01;
delay(30);
DQ = 1;
val=val/2;
}
delay(70);
}
unsigned int Read_Temperature(void)
{
union
{
unsigned char c[2];
unsigned int x;
}temp;
temp.x=0x0000;
i=ow_reset();
if(!i)
{
write_byte(0xCC); //Skip ROM
write_byte(0xBE); //Read Scratch Pad
temp.c[1]=read_byte(); //Start read data
temp.c[0]=read_byte(); //read two byte data from device
ow_reset(); //reset
write_byte(0xCC); //Skip ROM
write_byte(0x44); //Start Conversion
}
return temp.x;
}
//***************************
void main(void)
{ unsigned int j;
unsigned char p,q,n0,n1,n2;
while(1)
{
j=Read_Temperature();
q=(unsigned char)(j&0x000f);
p=(unsigned char)(j>>4)-2;
n0=p/10;
n1=p%10;
n2=tab2[q];
led0=0;leddata=tab1[n0];delays(30);led0=1;
led1=0;leddata=tab1[n1]&0x7f;delays(30);led1=1;
led2=0;leddata=tab1[n2];delays(20);led2=1;
}
}
复制代码
超级简单吧,所以这个小儿科,给初学者一个参考,高手就不要给我拍砖了,不然我要被打死了。
作者:
jxr0345
时间:
2015-1-24 22:29
不错,支持分享精神。
51hei有你更精彩!!
作者:
dege
时间:
2015-1-26 10:51
写得不错。
作者:
lilijun5292
时间:
2015-6-6 10:34
make an effort
作者:
星星一眨眼
时间:
2015-6-9 21:16
谢谢分享制作的真好
作者:
xiaowei105
时间:
2015-6-26 18:07
18B20+AT89C2051+数码管
51hei有你更精彩!!
作者:
waiwai
时间:
2015-8-11 21:57
排线不错
作者:
ludaijin
时间:
2015-9-7 13:47
有打算做一个,好资料,谢谢
作者:
ludaijin
时间:
2015-9-7 13:47
51hei有你更精彩!!
作者:
wxgzf
时间:
2015-9-9 14:28
楼主,超过18b20的测温上限和下限怎么处理!
作者:
wxgzf
时间:
2015-9-9 14:30
程序里只能显示0-99左右,零下无法实现呀。
作者:
somexu
时间:
2015-10-13 16:51
學習了,思路很清晰
作者:
ls0899
时间:
2015-10-13 23:02
我也做了一个,那天发个图上来
作者:
暗夜321
时间:
2016-4-12 09:02
有没有原理图 大神 求原理图
作者:
jiajuntao
时间:
2016-4-12 10:45
pcb的背面做的很漂亮,就是有点费锡
作者:
brhzlzx
时间:
2016-4-12 12:41
不错,楼主辛苦了
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1