标题: 自制mini数字温度计 [打印本页]

作者: daogu    时间: 2015-4-1 23:20
标题: 自制mini数字温度计
    芯片采用AT89C2051,温度检测采用DS18B20,显示3位共阴数码管,电路非常简单。

原理仿真图:实际运用中请将P1口加上1K上拉电阻。


采用基本和数码管大小的一块实验洞洞板来焊接,电源采用常用的5VminiUSB供电(数据线好找些,可以直接USB,比较方便),晶振采用了坏U盘中的12MHZ的小晶振嵌入到集成插座的中间空隙以减小体积。为了减小数码管和其他电子元件通电后发热对DS18B20温检产生检测误差,将DS18B20的3只脚分别焊接到一个立体声插头上,然后再通过立体声插座再传递到AT89C2051的P3.7端口。数码管采用插接件,方便修改和烧录单片机程序。


只拍照的正面,背面就是乱云飞渡人从容啦


装好通电后效果,测试中还是感觉到电子元件温升的差异



源程序如下:

#include<reg52.h>
#include <intrins.h>
#define  uchar  unsigned  char
#define  uint   unsigned  int
sbit  DATA = P3^7; //DS18B20接入口
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
char  bai,shi,ge; //定义变量
/*延时子函数*/
void delay(uint num)
{
while(num--) ;
}
/*************DS18b20温度传感器函数*********************/
Init_DS18B20(void)     //传感器初始化
{
  uchar x=0;
  DATA = 1;    //DQ复位
  delay(10);  //稍做延时
  DATA = 0;    //单片机将DQ拉低
  delay(80); //精确延时 大于 480us    //450
  DATA = 1;    //拉高总线
  delay(20);
  x=DATA;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  delay(30);
}
//读一个字节
ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
  {
    DATA = 0; // 给脉冲信号
    dat>>=1;
    DATA = 1; // 给脉冲信号
    if(DATA)
     dat|=0x80;
    delay(8);
  }
  return(dat);
}
//写一个字节
WriteOneChar(unsigned char dat)
{
  uchar i=0;
  for (i=8; i>0; i--)
  {
    DATA = 0;
    DATA = dat&0x01;
   delay(10);
   DATA = 1;
   dat>>=1;
  }
delay(8);
}
//读取温度
int ReadTemperature(void)
{
uchar a=0;
uchar b=0;
int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();//低位
b=ReadOneChar();//高位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10+0.5;
return(t);
}
/*显示子函数*/
void  display(int bai,int shi,int ge)
{
P3=0XFB; //显示小数点
P1=0X80; //显示小数点
delay(50);//显示小数点
P3=0xf7;
P1=table[bai];//显示千位
delay(50);//一小段延时动态显示
P3=0xfb;
P1=table[shi];//显示百位
delay(50);
P3=0xfd;
P1=table[ge];//显示十位
delay(50);
}
void  main()
{
int  temp;
while(1)
{  
  temp=ReadTemperature();//读温度
  bai=temp%1000/100;//显示百位
  shi=temp%100/10;//显示十位
  ge=temp%10;//显示个位
  
  display(bai,shi,ge);//显示函数
}  
}




作者: 1783119269    时间: 2015-5-3 20:31
很好  赞一下
作者: horseydk    时间: 2015-5-6 17:52
程序挺多
作者: yjx189    时间: 2016-4-5 18:06
2051的芯片烧写是个问题,没有专用的编程器,可怎么办啊?

作者: admin    时间: 2016-4-8 15:07
yjx189 发表于 2016-4-5 18:06
2051的芯片烧写是个问题,没有专用的编程器,可怎么办啊?

AT89c2051需要用编程器才能烧录,建议采用stc的2051芯片,源代码引脚都能兼容。采用串口烧录。
作者: 爱玩单片机    时间: 2016-4-8 15:12
admin 发表于 2016-4-8 15:07
AT89c2051需要用编程器才能烧录,建议采用stc的2051芯片,源代码引脚都能兼容。采用串口烧录。

釆用STC的不能正常工作,时序不对还是什么请教
作者: mslong    时间: 2016-4-8 20:11
用STC芯片多好,试试
作者: Animals    时间: 2016-4-9 20:31
我的keil不知怎么了设置了生成hex文件却没生成谁做过的好心帮忙提供下hex文件啊
作者: admin    时间: 2016-4-9 21:11
Animals 发表于 2016-4-9 20:31
我的keil不知怎么了设置了生成hex文件却没生成谁做过的好心帮忙提供下hex文件啊

hex文件生成好了,0个警告,0个错误。你的应该是keil设置的问题: 源码及hex文件.rar (20.1 KB, 下载次数: 44)

作者: Animals    时间: 2016-4-9 22:54
本帖最后由 Animals 于 2016-4-9 23:02 编辑

谢谢了!
作者: 少年狂    时间: 2016-5-27 12:07
菜鸟请教一下   怎么做成3路检测3路显示?
作者: deng73301    时间: 2016-5-27 23:26
不错 支持diy
作者: deng73301    时间: 2016-5-27 23:27
哼不错 支持diy
作者: whengfu    时间: 2016-5-29 09:40
这款制作线路简单扼要,值得仿制
作者: LIUWEIMIN    时间: 2016-6-3 15:32
怎么实现不了呢
作者: 51hei电控2112311    时间: 2016-6-4 01:47
我用msp430g2231也做了个温湿度计,就是体积比你的大了好多,有点丑。
作者: 越快乐越堕落    时间: 2016-7-5 00:01
怎么只显示00.0???这是什么原因???楼主你的刚开机显示啥???
作者: bingobingo    时间: 2016-10-31 20:08
不错,支持支持一下
作者: XDDZ1013    时间: 2017-6-9 22:50
谢谢分享
作者: 18026723501    时间: 2017-11-19 14:37
请问数码管用哪一种呢

作者: ronglle    时间: 2018-9-5 13:48
温度检测,还是蛮准确的。用这个元器件。
作者: xunxing    时间: 2018-11-26 22:29
简单明了
作者: whrxl    时间: 2018-12-4 10:13
温度测量范围多少?
作者: mhl6408    时间: 2018-12-21 16:16
学习了
作者: Li平    时间: 2018-12-22 17:06
赞一下,很好。空了在仔细研究。  
作者: mhl6408    时间: 2018-12-25 14:50
这款简单明了
作者: brew9    时间: 2018-12-25 16:00
亮点在18b20的接入方式
作者: 快乐眼泪    时间: 2018-12-25 20:26
这个怎么改成LDE灯显示温度的?用LED灯珠做成一串,每一个灯珠代表0.5度,谁帮忙写下程序?先谢谢了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1