简易家用USB温度测量器:下载温度测量器
[摘 要]随着现代化信息的飞速发展和传统工业改造的逐步实现,能独立工作的温度检测系统已广泛应用于各种不同领域。现在很多温度检测场合已广泛使用单总线的温度传感器,使整个系统简单可靠。而目前单片机技术在大中专院校中也已普及,掌握基本的单片机应用技术也越来越显得重要。本制作简易家用USB温度测量器正是运用单片机技术指导学生制作完成的温度测量控制装置。
[关键词]温度检测 单片机 单总线
[中图分类号]TP[文献标识码]A[文章编号]1007-9416(2010)02-0066-03
1 硬件设计
简易家用USB温度测量器的事物如图1所示。元件清单如附一所示。电路原理图如附二所示。
(1)主控电路
电路由AT89C2051单片机控制,采用12MHz晶振。89C2051有P1、P3二组I/O口线,本制作选用P1口做数码管动态显示的段选,P3.2、.P3.3、P3.4、P3.5做数码管动态显示的位选,P3.0外接DS18B20作为温度采集端口。
(2)温度采集
本制作采用DS18B20测温传感器作为温度采集装置。DS18B20遵循单总线协议,每次测温时都必须有4个过程:(1)初始化;(2)传送ROM命令;(3)传送RAM命令;(4)数据交换。所谓单总线,是美国Dallas半导体公司(现已并入MAXIM公司)于20世纪90年代新推出的一种串行总线技术。该技术只需使用一根信号线(将计算机的地址线、数据线、控制线合为一根信号线)便可完成串行通信。单根信号线,既传输时钟,又传输数据,而且数据传输是双向的,在信号线上可挂上许多测控对象,电源也由这根信号线供给。由于DS18B20资料较丰富,其具体使用方法可参见使用说明,这里不加赘述。
(3)显示电路
显示电路采用4个共阳数码管组成,采用动态显示方法。将由单片机P3.0口采集的温度信号通过数码管进行实温监测显示。温度显示保留到小数点后一位,且有温度符号“C”。为此,在利用单片机进行编程时,利用P3.2~P3.5作为数码管动态显示的位选端,P1.0~P1.7作为数码管动态显示的段选位。当P3.2输出高电平时则选中“1”号数码管,P3.3输出高电平时则选中“2”号数码管,以次类推。在电路中,P3.2~P3.5外接4个NPN三极管作为驱动。P1.0~P1.7外接8个电阻用作限流保护。
(4)电源电路
单片机5V工作电压采用USB口共给。将USB适配器接入电路板上的USB口或直接接入计算机的USB通信口即可。这样,既节省了资源,又能够获得较为理想的工作电压。
2 软件设计
本制作进行程序设计时着重注意以下几点:1.DS18B20的初始化、时序、底层数据交换协议;2.数码管动态显示。
本设计采用单片机C语言进行编程,其参考程序如下:
#include "reg51.h"
#define uchar unsigned char
#define unit unsigned int
sbit DQ=P3^0;
sbit p32=P3^2;
sbit p33=P3^3;
sbit p34=P3^4;
sbit p35=P3^5;
sbit p37=P3^7;
code uchar tab[]={0xC0,0xf9,0xA4,0xB0,0x99,
//0~9
0x92,0x82,0xf8,0x80,0x90};
code uchar tab1[]={0X40,0X79,0X24,0X30,0X19,
0X12,0X02,0X78,0X00,0X10};
//0~9
uchar a,b,t,h;
uchar bai,shi,ge,xiao;
void delay(unsigned int i)
{
while(i--);
}
bit int_DS18B20(void)
{
unsigned char x=0;
DQ=1;
//DQ复位
delay(8);
//延时片刻
DQ=0;
//单片机将DQ拉低
delay(80);
//延时480us
DQ=1;
//拉高总线
delay(14);
x=DQ;
//延时片刻后,若x=0,则初始化成功;若x=1,则初始化失败
delay(20);
return x;
}
Read (void)
{
unsigned char i=0;
unsigned char dat=0;
for(i=8;i>0;i--)
{
DQ=0;
//给脉冲信号
dat>>=1;
DQ=1;
//给脉冲信号
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
Write(unsigned char dat)
{
unsigned char i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(4);
}
void int_(void)
{
while(int_DS18B20());
//若为1,则重新初始化
Write(0xCC);
//跳过读序号的操作
Write(0x44);
//启动温度转换
}
void main(void)
{
unit count=0;
p32=0;
p33=0;
p34=0;
p35=0;
int_();
//启动转换
delay(2200);
for(count=0;count127)
//若b大于127,则说明温度小于0
{
a=~a;
b=~b;
a=a>>4;
//低位右移4位,舍弃小数部分
t=b=10)
{p32=1;
//百位
P1=0xBF;
//负数符号
delay(80);
p32=0;
p33=1;
//十位
P1=tab[shi];
delay(80);
p33=0;
p34=1;
//个位
P1=tab1[ge];
delay(80);
p34=0;
p35=1;
//显示温度标志C
P1=0xc6;
delay(80);
p35=0;
}
else
{ p32=0;
p33=1;
//十位
P1=0xBF;
//负符号
delay(80);
p33=0;
p34=1;
//个位
P1=tab1[ge];
delay(80);
p34=0;
p35=1;
//显示温度标志C
P1=0xc6;
delay(80);
p35=0;
}
}
}
else
{count=0;
a=a>>4;
//低位右移4位,舍弃小数部分
t=b 本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文
