单片机课程设计--基于51单片机温度传感器设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机课程设计报告基于51单片机温度传感器设计
系统概述
摘要:
本设计是以51单片机为核心的温度传感器设计,该系统以STC89C52单片机为中心控制单元,由数码管显示模块,蜂鸣器警报模块组成,并预设温度报警上下限,系统启动后可以实时采集环境中的温度,并且当温度超出上下限的值以后蜂鸣器报警.
关键词:STC89C51、数码管、蜂鸣器、DS18B20温度传感器
系统框图:
原理概述:
STC89C52单片机为主控制器,用于处理采集的温度值以及相关报警值。本设计采用DALLAS公司的DS18b20温度传感器采集温度,通过主控制器进行温度的采样以及转换并在数码管上进行相应的显示,当外界温度值超出预设的报警温度值时,通过蜂鸣器报警提示。
实验要求:
(1)温度读取
(2)LED数码管或LCD显示
(3)定时读取数据
(4)报警
实验设备:
51学习开发板,STC89C52单片机,DS18B20 设计内容:
软件流程图:
N
设计方法:
DS18B20
特性
• 独特的单线接口仅需一个端口引脚进行通讯 • 简单的多点分布应用 • 无需外部器件 • 可通过数据线供电 • 零待机功耗
• 测温范围-55---+125℃,以0.5℃递增。华氏器件-67---+257℉,以0.9℉递增 • 温度以9 位数字量读出
• 温度数字量转换时间 200ms (典型值) • 用户可定义的非易失性温度报警设置
• 报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件 • 应用包括温度控制、工业系统、消费品、温度计或任何热感测系统
温度传感器说明:
DS1820 数字温度计以 9 位数字量的形式反映器件的温度值。 DS1820
通过一个单线接口发送或接收信息,因此在中央微处理器和DS1820 之间仅需一条连接线(加上地线)。用于读写和温度转换的电源可以从数据线本身获得,无需外部电源。因为每个DS1820 都有一个独特的片序列号,所以多只DS1820 可以同时连在一根单线总线上,这样就可以把温度传感器放在许多不同的地方。这一特性在HV AC 环境控制、探测建筑物、仪器或机器的温度以及过程监测和控制等方面非常有用。
数码管显示:
数码显示器件按显示方法不同,显示器有很多种,他们是字形重叠式显示器、分段式显示器、点阵式显示器。分段式显示器有七段和八段显示之分,在这里,我们选用4位8段数码管显示采集到的温度值,数码管显示具有耗能低,稳定性好,价格便宜等优点。
蜂鸣器:
压电式蜂鸣器是一种电声转换器件。压电式蜂鸣器具有体积小、灵敏度高、耗电省、可靠性好,造价低廉的特点和良好的频率特性。因此它广泛应用于各种电器产品的报警、发声用途。最常见的莫过于音乐贺卡、电子手表、袖珍计算器、电子门铃和电子玩具等小型电子用品上作发声器件。
硬件原理图:
51单片机:
温度传感器:蜂鸣器连接:
源代码:
/***************温度传感器**********************/
//制作:RXJ
//时间:2012/6/2
//修改:无
/************************************************/
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int;
sbit DQ=P1^3;//ds18b20 端口
sbit beeper=P1^0;
//全局变量
uint temp,TempH,TempL;
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数码管段码表共阴
uchar num,readflag=0,str[6];
uchar i;
unsigned int ReadTemperature(void);
void Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
void delay(unsigned int i);
void init_timer();
void beep();
void main()
{
str[0]=0;
init_timer();
while(1)
{
if(readflag==1)
{
temp=ReadTemperature();
if(temp&0x8000)
{
str[0]=0x40; //负号标志
temp=~temp; // 取反加1
temp +=1;
}
else str[0]=0;
}
TempH=temp>>4;
TempL=temp&0x0F;
TempL=TempL*6/10; //小数近似处理
str[5]=0x39; //显示C符号
str[1]=tab[TempH/100]; //十位温度
str[2]=tab[(TempH%100)/10]; //十位温度
str[3]=tab[(TempH%100)%10]|0x80; //个位温度,带小数点
str[4]=tab[TempL];
for(i=0;i<40;i++)
{
P2=5;P0=str[5];delay(10);
P2=4;P0=str[4];delay(10);
P2=3;P0=str[3];delay(10);
P2=2;P0=str[2];delay(10);
P2=1;P0=str[1];delay(10);
}