您的当前位置:首页正文

基于51单片机温度传感器设计

2023-04-02 来源:年旅网


基于51单片机温度传感器设计

本设计是以51单片机为核心的温度传感器设计 该系统以STC89C52单片机为中心控制单元

由数码管显示模块

蜂鸣器警报模块组成,并预设温度报警上下限,系统启动后

可以实时采集环境中的温度,并且当温度超出上下限的值以后蜂鸣器报警. 关键词STC89C51、数码管、蜂鸣器、DS18B20温度传感器

原理概述: STC89C52单片机为主控制器,用于处理采集的温度值以及相关报警值。本设计采用DALLAS公司的DS18b20温度传感器采集温度通过主控制器进行温度的采样以及转换并在数码管上进行相应的显示通过蜂鸣器报警提示。

当外界温度值超出预设的报警温度值时

实验要求 (1) 温度读取 (2) LED数码管或LCD显示 (3) 定时读取数据

(4) 报警

实验设备

51学习开发板STC89C52单片机DS18B20 设计内容

软件流程图

设计方法

DS18B20特性

• 独特的单线接口仅需一个端口引脚进行通讯

• 简单的多点分布应用

• 无需外部器件

• 可通过数据线供电

• 零待机功耗

• 测温范围-55---+125℃以0.5℃递增。华氏器件-67---+257℉以0.9℉递增

• 温度以9 位数字量读出

• 温度数字量转换时间 200ms典型值

• 用户可定义的非易失性温度报警设置

• 报警搜索命令识别并标志超过程序限定温度温度报警条件的器件

• 应用包括温度控制、工业系统、消费品、温度计或任何热感测系统

温度传感器说明 DS1820 数字温度计以 9 位数字量的形式反映器件的温度值。

DS1820通过一个单线接口发送或接收信息仅需一条连接线加上地线

因此在中央微处理器和 DS1820 之间

无需

。用于读写和温度转换的电源可以从数据线本身获得

外部电源。因为每个 DS1820 都有一个独特的片序列号 所以多只 DS1820 可以同时

连在一根单线总线上这样就可以把温度传感器放在许多不同的地方。这一特性在 HVAC 环境控制、探测建筑物、仪器或机器的温度以及过程监测和控制等方面非常有用。

数码管显示

数码显示器件按显示方法不同显示器有很多种他们是字形重叠式显示器、分段式

显示器、点阵式显示器。分段式显示器有七段和八段显示之分在这里我们选用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);

}

if(TempH>32||TempH<31)

{beep();}

}

}

//定时器初始化

void init_timer()

{ TMOD|=0x01; //定时器设置

TH0=0xef;

TL0=0xf0;

IE=0x82;

TR0=1;

}

void beep()

{

for(i=0;i<20;i++)

{

beeper=1;

delay(20);

beeper=0;

delay(20);

}

}

//延时

void delay(unsigned int i ) //延时函数

{

while(i--);

} //定时器0中断函数

void tim(void) interrupt 1 using 1 //中断{

TH0=0xef; //定时器重装值

TL0=0xf0;

num++;

if(num==50)

用于数码管扫描和温度检测间隔

{

num=0;

readflag=1;

}

} //18b20初始化

void Init_DS18B20(void)

{

unsigned char x=0;

DQ = 1;

//DQ复位

delay(8);

//稍做延时

DQ = 0;

//单片机将DQ拉低

delay(80);

//精确延时 大于 480us

DQ = 1; //拉高总线

delay(10);

x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败

delay(5);

} //读字节

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;

delay(5);

}

return(dat);

}

//写字节

void WriteOneChar(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(5);

}

//读温度

unsigned int ReadTemperature(void)

{

unsigned char a=0;

unsigned int b=0;

unsigned int t=0;

Init_DS18B20();

WriteOneChar(0xCC);

//跳过读序号列号的操作

WriteOneChar(0x44);

//启动温度转换

delay(200); Init_DS18B20();

WriteOneChar(0xCC);

//跳过读序号列号的操作

WriteOneChar(0xBE);

//读取温度寄存器等

共可读9个寄存器前两个就是温度 a=ReadOneChar();

//低位

b=ReadOneChar();

//高位 b<<=8;

t=a+b;

return(t);

}

参考文献: [1]. DS1820数据手册;

[2]. 郭天祥<<51单片机C语言学习教程>>;

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