刀刀网
您的当前位置:首页数字温度计的

数字温度计的

来源:刀刀网
数字温度计的设计与制作

一、课程设计任务要求

1、课题来源:老师和学生共同拟定。 2、类型:实做。

3、目的和意义:掌握单片机的编程。

4、基本要求:设计和制作一个温度显示器,可用键盘设置温度的上限和下限,测量的温度高于或低于设置的温度时,温度显示器报警。

5、完成时间:2011年3月9日。

二、方案论证选择

由于用汇编语言编程比较麻烦,不容易修改。我们仍然选择使用单片机C语言进行编程,设计思路如下: 1、计时方案

同样利用ATC52单片机内部的定时器/计数器进行中断定时。 (1)、计数初值计算

把定时器设为工作方式2,定时时间为0.25ms,则计数溢出4000次即得到时钟计时最小单位-----秒,而4000次计数可用软件方法实现。

假设使用T/C0,方式2,0.25ms定时,f(osc)=12MHZ. 则初值X满足(2^8-X)*1/12MHZ*12us=250us X=6---(0110)---(0006h)

(2)、 采用中断方式进行溢出次数累计,计数满4000次为秒计时(1s)。 2、键盘/显示方案

ATC52的P0口和P2口外接由8个LED数码管(LED7~LED0)构成的显示器,用P0口作LED的段码输出口,P2口作8个LED数码管的位控输出线,在内部RAM中设置显示缓冲区共8个单元。P1口外接4个按键set1,set2,set3,set4构成键盘电路,可以调节测温的上下限。复位电路由按钮,电容,电源接于ATC52的9脚。

3、利用DS18B20数字温度计来组成一个测温系统。只要求一个端口即可实现通信,不需要任何外部器件即可实现测温,通过程序编译可实现温度上、下限报警设置。 4、报警电路由蜂鸣器、三极管、电阻组成,超低温报警功能。

三、原理设计

1、基本工作原理

基于ATC52单片机的数字温度计由ATC52单片机控制器、电源、显示电路、温度传感器、复位电路、按键电路、报警电路和时钟电路组成,框图如系统框图所示。电源给整个电路供电,报警系统提示18B20接通工作,将温度值传给单片机,CPU判断是否在温度限值内,在则显示温度,不在则蜂鸣器报警。

2、DS18B20的引脚说明及工作原理:

DALLAS最新单线数字温度传感器DS18B20简介新的“一线器件”体积更小、适用电压更宽、更经济 Dallas 半导体公司的数字化温度传感器DS1820是世界上第一片支持 “一线总线”接口的温度传感器。一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。DS18B20、 DS1822 “一线总线”数字化温度传感器 同DS1820一样,DS18B20也 支持“一线总线”接口,测量温度范围为 -55°C~+125°C,在-10~+85°C范围内,精度为±0.5°C。DS1822的精度较差为± 2°C 。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。与前一代产品不同,新的产品支持3V~5.5V的电压范围,使系统设计更灵活、方便。而且新一代产品更便宜,体积更小。 DS18B20、 DS1822 的特性 DS18B20可以程序设定9~12位的分辨率,精度为±0.5°C。可选更小的封装方式,更宽的电压适用范围。分辨率设定,及用户设定的报警温度存储在EEPROM中,掉电后依然保存。DS18B20的性能是新一代产品中最好的!性能价格比也非常出色! DS1822与 DS18B20软件兼容,是DS18B20的简化版本。省略了存储用户定义报警温度、分辨率参数的EEPROM,精度降低为±2°C,适用于对性能要求不高,成本控制严格的应用,是经济型产品。 继“一线总线”的早期产品后,DS1820开辟了温度传感器技术的新概念。DS18B20和DS1822使电压、特性及封装有更多的选择,让我们可以构建适合自己的经济的测温系统。

(1)DS18B20的内部结构

DS18B20内部结构主要由四部分组成:位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18B20的管脚排列如下:

(2) DS18B20详细引脚功能描述

序号 1 2 GND DQ 名称

引脚功能描述 地信号 数据输入/输出引脚。开漏单总线接口引脚。当被用在寄生电源下,也可以向器件提供电源。 3 VDD 可选择VDD的引脚。当工作于寄生电源时,此引脚必须接地。

(3)、DS18B20的使用方法

由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对ATS51单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。

由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。 a、DS18B20的复位时序

b、DS18B20的读时序

对于DS18B20的读时序分为读0时序和读1时序两个过程。

对于DS18B20的读时隙是从主机把单总线拉低之后,在15秒之内就得释放单总线,以让DS18B20把数据传输到单总线上。DS18B20在完成一个读时序过程,至少需要60us才能完成。

c、DS18B20的写时序

对于DS18B20的写时序仍然分为写0时序和写1时序两个过程。

对于DS18B20写0时序和写1时序的要求不同,当要写0时序时,单总线要被拉低至少60us,保证DS18B20能够在15us到45us之间能够正确地采样IO总线上的“0”电平,当要写1时序时,单总线被拉低之后,在15us之内就得释放单总线。

3、元件清单

芯片:ATC52 1片、74LS245 1片、DS18B20 1片;74LS04 一片; 电阻:500R 8个、10K 5个、4.7K 1个、1K 1个; 电容:30pF 2个、10uF 1个;

发光二极管:1个; 开关 2个;

晶振:12MHZ 1个; 按钮: 5个; 下载口:1个;

四位一体共阳数码管:2个; 蜂鸣器:1个; 三极管:S8550 1个; 排针、排线:若干

4、系统组成框图如下:

按键电路 时钟电路 复位电路 ATC52 控 制 器 显示电路 报警电路 DS18B20 电源 5、单元电路框图如下:

(1)、复位电路——手动复位

C122pRST

R90.2kR171K(2)、晶振电路

6、电路仿真连接图如下:

C230pX1R510KC130p12MU119XTAL1U2P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617234567191A0A1A2A3A4A5A6A7CEAB/BA74ALS245B0B1B2B3B4B5B6B71817161514131211C310uVCC18XTAL29RST10k10K10K10K293031PSENALEEAP2.71212345678P1.0/T2P1.1/T2EXP1.2P1.3P1.4P1.5P1.6P1.7ATC52345P3.7613121110Q1R11k9P3.78BUZ12N2905BUZZERP2.7U4321VCCDQGNDDS18B2027.0

7、程序流程图如下所示:

初始化 调用显示子程序 1s到? 初次上电读出温度值温度计算处理显示数据刷新 发温度转换开始命令 主程序流程图 发DS18B20复位命令 发跳过ROM命令 发读取温度命令 读取操作,CRC校验 9字节完? CRC校验正? 移入温度暂存器 结束 读温度流程图

四、方案实现及测试(或调试)

1、 C语言源程序如下所示:

#ifndef __DELAY_H__ #define __DELAY_H__

/*------------------------------------------------

uS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编,大致延时 长度如下 T=tx2+5 uS

------------------------------------------------*/ void DelayUs2x(unsigned char t);

/*------------------------------------------------

mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编 ------------------------------------------------*/ void DelayMs(unsigned char t);

#endif

#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #include

#define uchar unsigned char #define uint unsigned int;

/*------------------------------------------------ 端口定义

------------------------------------------------*/ sbit DQ=P2^7;//ds18b20 端口

/*------------------------------------------------ 函数声明

------------------------------------------------*/ unsigned int ReadTemperature(void); bit Init_DS18B20(void);

unsigned char ReadOneChar(void); void WriteOneChar(unsigned char dat);

#endif

/*----------------------------------------------- DS18b20数码管显示 超温报警

***********************************************************/

#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #include \"18b20.h\" #include \"delay.h\"

#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换 #define CtrlPort P2 //定义位选端口 #define KeyPort P1 //按键

//#define OVERTEMP 29 //定义超温报警数值 //#define LOWTEMP 26 //定义超温报警数值

sbit bz=P3^7;

bit ReadTempFlag;//定义读时间标志 char OVERTEMP; char LOWTEMP;

unsigned char code DuanMa[10]={~0x3f,~0x06,~0x5b,~0x4f,~0x66,~0x6d,~0x7d,~0x07,~0x7f,~0x6f};// 显示段码值0~9// 显示段码值0~9

unsigned char code WeiMa[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//分别对应相应的数码管点亮,即位码 unsigned char TempData[8]; //存储显示值的全局变量

void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数 void Init_Timer0(void);//定时器初始化 unsigned char KeyScan(void);

/*------------------------------------------------ 主函数

------------------------------------------------*/ void main (void)

{

unsigned int TempH,TempL,temp; unsigned char num; Init_Timer0(); bz=1;

while (1) //主循环 {

num=KeyScan(); switch(num) { case 1:if(OVERTEMP<127)OVERTEMP++;break; case 2:if(OVERTEMP>-55)OVERTEMP--;break; case 3:if(LOWTEMP<127)LOWTEMP++;break; case 4:if(LOWTEMP>-55)LOWTEMP--;break; default:break; }

if(ReadTempFlag==1) {

ReadTempFlag=0;

temp=ReadTemperature(); if(temp&0x8000) {

TempData[0]=0x40;//负号标志 temp=~temp; // 取反加1 temp +=1; } else

TempData[0]=0;

TempH=temp>>4; TempL=temp&0x0F;

TempL=TempL*6/10;//小数近似处理 if(TempH>OVERTEMP)//如果超温则提示 bz=1; //TempData[0]=0x76;//显示\"H\" else if(TempLTempData[2]=DuanMa[(TempH%100)%10]|0x80; //个位温度,带小数点 TempData[1]=DuanMa[TempL]; // TempData[0]=0x39; // //显示C符号 }

} }

/*------------------------------------------------ 显示函数

------------------------------------------------*/

void Display(unsigned char FirstBit,unsigned char Num) {

static unsigned char i=0; DataPort=0; //清空数据,防止有交替重影

CtrlPort=WeiMa[i+FirstBit]; //取位码

DataPort=TempData[i]; //取显示数据,段码 i++;

if(i==Num) i=0; }

/*------------------------------------------------

定时器初始化子程序 ------------------------------------------------*/ void Init_Timer0(void) {

TMOD |= 0x01; EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; //定时器开关打开 }

/*------------------------------------------------ 定时器中断子程序 ------------------------------------------------*/ void Timer0_isr(void) interrupt 1 {

static unsigned int num; TH0=(65536-2000)/256; //重新赋值 2ms TL0=(65536-2000)%256;

Display(0,8); // 调用数码管扫描 num++;

if(num==300) // {

num=0;

ReadTempFlag=1; //读标志位置1 } }

/*------------------------------------------------ 按键扫描函数,返回扫描键值

------------------------------------------------*/ unsigned char KeyScan(void) {

unsigned char keyvalue; if(KeyPort!=0xff) {

DelayMs(10); if(KeyPort!=0xff) { keyvalue=KeyPort; while(KeyPort!=0xff); switch(keyvalue) { case 0xfe:return 1;break; case 0xfd:return 2;break; case 0xfb:return 3;break; case 0xf7:return 4;break; default:return 0;break; } } }

return 0; }

#include \"delay.h\"

/*------------------------------------------------

uS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编,大致延时 长度如下 T=tx2+5 uS

------------------------------------------------*/ void DelayUs2x(unsigned char t) {

while(--t); }

/*------------------------------------------------

mS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编 ------------------------------------------------*/ void DelayMs(unsigned char t) {

while(t--) {

//大致延时1mS DelayUs2x(245); DelayUs2x(245); } }

#include\"delay.h\" #include\"18b20.h\"

/*------------------------------------------------ 18b20初始化 ------------------------------------------------*/ bit Init_DS18B20(void) {

bit dat=0;

DQ = 1; //DQ复位

DelayUs2x(5); //稍做延时

DQ = 0; //单片机将DQ拉低

DelayUs2x(200); //精确延时 大于 480us 小于960us DelayUs2x(200);

DQ = 1; //拉高总线

DelayUs2x(50); //15~60us 后 接收60-240us的存在脉冲

dat=DQ; //如果x=0则初始化成功, x=1则初始化失败 DelayUs2x(25); //稍作延时返回 return dat; }

/*------------------------------------------------ 读取一个字节 ------------------------------------------------*/

unsigned char ReadOneChar(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; DelayUs2x(25); }

return(dat); }

/*------------------------------------------------ 写入一个字节 ------------------------------------------------*/ void WriteOneChar(unsigned char dat) {

unsigned char i=0; for (i=8; i>0; i--) {

DQ = 0;

DQ = dat&0x01; DelayUs2x(25); DQ = 1; dat>>=1; }

DelayUs2x(25); }

/*------------------------------------------------ 读取温度

------------------------------------------------*/ unsigned int ReadTemperature(void) {

unsigned char a=0; unsigned int b=0; unsigned int t=0; Init_DS18B20();

WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 DelayMs(10);

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作

WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=ReadOneChar(); //低位 b=ReadOneChar(); //高位

b<<=8; t=a+b;

return(t); }

2、 电路调试图如下所示:

(1)温度上下限值:

220R220R220R220R220R220R220R220RA_0A_1A_2A_3A_4A_5A_6A_7R1R2R3R4R5R6R7R8 (2)调节后为:

220R220R220R220R220R220R220R220RA_0A_1A_2A_3A_4A_5A_6A_7R1R2R3R4R5R6R7R8

(3)测得的温度为:

220R220R220R220R220R220R220R220RA_0A_1A_2A_3A_4A_5A_6A_7R1R2R3R4R5R6R7R8 3、调试过程

由于此电路与数字时钟电路共用一个单片机,驱动显示部分也是完全一样的,唯一的区别就是多了一个DS18B20温度计、蜂鸣器及驱动蜂鸣器报警的三极管S8550。电路有上一个电路做基础,焊接上没有太多问题,要变动的就是程序了,程序修改完毕无误后直接下载到单片机上,通电调试了几次就成功了!其他的按键操作也都在程序中做了修改,还算顺利,功能实现的也还行。

五、课程小结

这一课题的电路是在上一课题的基础上加了温度传感器部分和蜂鸣器部分,其他都是在程序

中进行改动的。单片机部分,数码管驱动及显示部分与数字时钟一样。这一课题有上一课题做基础,自然完成的也比较顺利。虽然我们的电路跟其他组相比有点乱,取得的成绩也不算理想,但是我们还是挺满意的,因为我们这组是最与众不同的(电路的布局和程序的编写),最重要的是我们学会了很多知识,自己动手实践、努力了、尽力了。

六、参考文献

(1)、《单片机技术及应用实例分析》,主编:马淑兰,西安电子科技大学出版社;

(2)、刘鸣等,温度传感器DS18B20的特性及程序设计方法,电测与仪表2001 第10期; (3)、《单片机开发技术与实训》,主编:黄庆华,张永格,电子工业出版社;

(4)、《单片机原理与应用实践指导》,主编:吴飞青,丁晓,,李林功,练斌,机械工业出版社; (5)、《51单片机技术与应用系统开发案例精选》 主编:江志红,清华大学出版社。

个人总结见下页所示

因篇幅问题不能全部显示,请点此查看更多更全内容