资源描述
课程设计报告
——《数字报警温度计的设计》
l 设计背景
微机相比,单片机全称为单片微型计算机,是在一块半导体的芯片上集成了微机三大部件(CPU,存储器,与输入与输出接口电路),和控制器件的特殊功能计算机。单片机主要用于控制方面。由于单片机的集成度高,功能强,通用性好,特别它具有体积小,重量轻,能耗低,价格便宜,抗干扰能力强和使用仿版等方面的优点,是它迅速的得到了推广和应用,目前已经成为测量控制系统中的优良机种和新电子产品中的关键部件,已经在测控领域获得了广泛的应用。
不仅如此,现代生活中,多功能的数字温度计能给我们的生活带来很大的方便,支持"一线总线"接口的温度传感器简化了数字温度计的设计,降低了成本;因此这次的课程设计,我选择以美国MAXIM/DALLAS半导体公司的单总线温度传感器DS18B20为核心,以ATMEL公司的AT89S52位控制器设计的AT89S51为控制器设计的DS18B20温度传感器结构简单,测温准确,具有一定控制功能的智能温度控制器。
同时对通过对本次实验的学习,实践,进一步理解所学的单片机知识和它在实际生活中的应用。而且这次的课程设计不仅仅是单片机的知识,还涉与到模拟电路,数字电路,传感器以与计算机等方面的灵活应用,这样也可以进一步提高自己的动手操作和对各学科知识综合应用的能力。
l 设计方案
1. 器件性能分析
本次课程设计主要是通过常见的AT89C51单片机实现对温度的控制、读取、显示,以与通过DS18B20温度传感器实现对温度的测量。系统以51单片机为控制核心,加上测温电路,AD数模转换器,4位温度数据显示数码管以与外围电源时钟电路组成。
传统的温度传感器大多以热敏电阻作为温度传感器,但热敏电阻的可靠性差,准确率低,而且必须经过专门的接口电路转换成数字信号才能由单片机进行处理,而这需要比较多的外部的硬件的支持,硬件电路复杂(需要用到A/D转换电路,感温电路),软件调试也复杂,制作成本也非常高。而DS18B20温度传感器克服了以上的诸多缺点,并使实验电路电路简单,软硬件结构模块化,易于实现,操作。
而且与传统的温度计相比,该数字温度计利用温度传感器与接口电路完成温度的测量并转换成模拟电压信号,经由模数转换器转换成单片机能够处理的数字信号,然后送到单片机中进行处理变换,最后将温度值显示在数码管上。系统以 单片机为控制核心,加上DS18B20温度传感器,4位温度数据显示的共阴极数码管,与外围电源和报警电路组成。测温发映速度快,读数方便快捷,测量精度高,误差小等优点,同时我还另外增加了温度报警电路,可以实时监测温度,这在实际生产生活中有很大应用。
2方案的总体设计框图
该系统的总体设计思路如下:温度传感器DS18B20把所测得的温度发送到AT89C51单片机上,经过51单片机处理,将把温度在显示电路上显示,本系统显示器用4位共阴LED数码管以动态扫描法实现。 数字温度计总体电路结构框图如图1所示。
AT89C51
单片机
主
控
制
器
显示电路
温度传感器
DS18B20
扫描驱动
l 硬件电路设计
1 电路原理图和器件
这是本次数字温度计的器件和电路图:
元件名称
型号
数量
单片机芯片
89C51
1
温度传感器
DS18B20
1
晶振
11.0592Hz
1
电源
5V
1
三极管
8550(PNP)
5
电容
30pF
2
41uF
1
LED数码管
7SEG_MPX4_CA
1
电阻
1K
5
10K
4
开关
3
万能板
1
扬声器
1
IC插座
若干
导线
若干
- 14 - / 19
2 单片机主控制器系统
AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
3温度传感器模块
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
DS18B20 的性能特点如下:
●独特的单线接口方式仅需要一个端口引脚进行通信;
●多个DS18B20可以并联在唯一的三线上,实现多点组网功能;
●无需外部器件;
●可通过数据线供电,电压围:3.0~5.5V;
●测温围-55℃~+125℃,在-10~+85℃时精度为±0.5℃
●零待机功耗
●温度以9或12位数字量读出;
●用户可定义的非易失性温度报警设置
●报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件
●负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作
4显示模块
采用4位共阴极LED数码管显示,采用共阴极数码管需要加入负载驱动。 此外我还设置了KEY1,KEY2,KEY3三个按钮,KEY1是复位键,KEY2是增加上线温度报警键,KEY3是减少下线温度报警键。
5电源模块
5V直流电源(+-0.3v)用于该温度计的供电;
l 系统程序的设计
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,报警子程序和显示数据刷新子程序等.
#include <REGX52.H>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#include "DS18B20.c"
uint mun=0;
uchar time_yang=0;
unsigned har ode table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit B0=P1^0;
sbit B1=P1^1;
sbit B2=P1^2;
sbit B3=P1^3;
sbit K1=P3^1;
sbit K2=P3^2;
sbit K3=P3^3;
sbit jingbao=P3^7;
uchar wendu_H=38;
uchar wendu_L=5;
uchar SHOW=0;
void delay(uint ms)
{
uchar i;
while(ms--)
{
for(i = 63;i > 1;i--);
}
}
void Sys_Initial(void)
{
TMOD = 0x22;
TH0 = 0x3C;
TL0 = 0xB0;
ET0 = 1;
TR0 = 1;
EA=1;
}
void timer0() interrupt 1 using 2
{
TH0=0xff;
TL0=0xa0;
time_yang++;
if(SHOW==0)
{
if(time_yang==5)
{
P2=0xff;
B0=0;B1=1;B2=1;B3=1;
P2=~table[mun/1000];
}
if(time_yang==10)
{
P2=0xff;
B0=1;B1=0;B2=1;B3=1;
P2=~table[(mun%1000)/100];
}
if(time_yang==15)
{
P2=0xff;
B0=1;B1=1;B2=0;B3=1;
P2=(~table[(mun%100)/10])&0x7f;
}
if(time_yang==20)
{
time_yang=0;
P2=0xff;
B0=1;B1=1;B2=1;B3=0;
P2=~table[mun%10];
}
}
if(SHOW==1)
{
if(time_yang==5)
{
P2=0xff;
B0=0;B1=1;B2=1;B3=1;
P2=~0x38;
}
if(time_yang==10)
{
P2=0xff;
B0=1;B1=0;B2=1;B3=1;
P2=0xff;
}
if(time_yang==15)
{
P2=0xff;
B0=1;B1=1;B2=0;B3=1;
P2=~table[wendu_L/10];
}
if(time_yang==20)
{
time_yang=0;
P2=0xff;
B0=1;B1=1;B2=1;B3=0;
P2=~table[wendu_L%10];
}
}
if(SHOW==2)
{
if(time_yang==5)
{
P2=0xff;
B0=0;B1=1;B2=1;B3=1;
P2=~0x76;
}
if(time_yang==10)
{
P2=0xff;
B0=1;B1=0;B2=1;B3=1;
P2=0xff;
}
if(time_yang==15)
{
P2=0xff;
B0=1;B1=1;B2=0;B3=1;
P2=~table[wendu_H/10];
}
if(time_yang==20)
{
time_yang=0;
P2=0xff;
B0=1;B1=1;B2=1;B3=0;
P2=~table[wendu_H%10];
}
}
}
void key_scan(void)
{
if(!K1)
{
delay(100);
SHOW++;
if(SHOW==3)SHOW=0;
}
if(!K2)
{
delay(100);
if(SHOW==0)return;
if(SHOW==1)
{
if(wendu_L==(wendu_H-1))
return;
else
wendu_L++;
}
if(SHOW==2)
{
if(wendu_H<99)
wendu_H++;
}
}
if(!K3)
{
delay(100);
if(SHOW==0)return;
if(SHOW==1)
{
if(wendu_L>0)
wendu_L--;
}
if(SHOW==2)
{
if(wendu_H==(wendu_L+1))
return;
else
wendu_H--;
}
}
}
void main(void)
{
Sys_Initial();
while(1)
{
wendu_read();
mun=wendu*10+xiaoshu;
if(wendu>wendu_L&&wendu<wendu_H)
{
jingbao=0;
}
else
jingbao=1;
key_scan();
}
}
//DS18B20的函数。
sbit DS=P3^6;
#define uchar unsigned char
uchar tempL=0xaa;
uchar tempH=0x50;
uchar wendu,xiaoshu;
void delay1(uchar count)
{
while(count>0) count--;
}
void reset(void)
{
DS=0;
delay1(100);
DS=1;
delay1(4);
delay1(20);
}
bit read_bit(void)
{
bit temp;
DS=0;
_nop_();
DS=1;
_nop_();
temp=DS;
EA=1;
delay1(20);
EA=0;
return temp;
}
uchar read_byte(void)
{
uchar i,byte=0;
bit j;
for(i=0;i<8;i++)
{
byte=_cror_(byte ,1);
j=read_bit();
if(j==0) byte=byte|0x00;
else byte=byte|0x80;
}
return byte;
}
void write_byte(uchar command)
{
uchar i;
for(i=0;i<8;i++)
{
if((command & 0x01)==0)
{
DS=0;
delay1(8);
DS=1;
_nop_();
}
else
{
DS=0;
_nop_();
DS=1;
delay1(8);
}
command=_cror_(command,1);
}
}
uint readtemperature()
{
uint temperature;
EA=0;
reset();
EA=1;
delay1(1);
EA=0;
write_byte(0xcc);
EA=1;
delay1(1);
EA=0;
write_byte(0x44);
EA=1;
delay1(12);
EA=0;
reset();
write_byte(0xcc);
EA=1;
delay1(1);
EA=0;
write_byte(0xbe);
EA=1;
delay1(1);
EA=0;
tempL=read_byte();
EA=1;
delay1(1);
EA=0;
tempH=read_byte();
EA=1;
temperature=tempL+tempH*256;
temperature=temperature*(0.625);
return(temperature);
}
void wendu_read(void)
{
uint t;
t=readtemperature();
wendu=(t/10)%1000;
xiaoshu=t%10;
}
l 调试与仿真
我利用电脑中的 Proteus(keil)软件将设计好的电路图进行仿真,如下图所示:
l 总结和体会
整个课程设计的过程其实就是一个不断应用过去所学理论知识和遇到新问题学习新知识解决问题的过程,尤其是要求我们对以前所学习的模拟电路,数字电路,C语言,单片机,传感器这些课程很多知识的整体理解和灵活运用。在完成课程设计之前我也对与之相关的书本知识进行了复习巩固。
其中特别值得提起的是,恰好在课程设计作业布置后不久,我参加的电子设计,对单片机应用软件proteus和keil 进行了学习,加上以前自己C语言基础还不错,这对完成课程设计带来很多方便。自己可以通过软件编程,完成原理图的设计,再在电脑上进行调试仿真,更快地看到实验结果。
所以一个课程设计,并不是针对某一个单一学科知识的运用,而是检验大家对各学科知识的综合实践运用能力。同时,当设计过程中遇到新的知识,比如此次对温度传感器DS18B20电路原理图的设计,和编程。这对于我来说,完全是新的知识,以前没有遇到过,因此我上网查阅了关于DS18B20的电路原理,特别是编写它的读温度程序中的温度转换,转换延时,跳过检查ROM序列,这都是关系到整个程序成功运行的关键和难点。因此对于开放性的课程设计,也考验着大家的独立学习和分析问题解决问题的能力。所以从这样一次实验课程中,能学到很多知识,提高自己的综合素质。
展开阅读全文