温度检测与高温警报系统_检查警报系统的程序

2020-02-28 其他范文 下载本文

温度检测与高温警报系统由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“检查警报系统的程序”。

《单片机原理》 实训报告

姓名:

沈俊卫

学号:

1145533129

班级:

11电气1班

专业: 电气工程及其自动化

学院: 电气与信息工程学院

江苏科技大学(张家港)

2014年12月

目录

一 设计内容及要求...........................................................................................................2 二 设计方案......................................................................................................................2 三 硬件系统设计..............................................................................................................21、STC89C52............................................................................................................22、时钟晶振..............................................................................................................33、LED指示灯.........................................................................................................34、数码管..................................................................................................................35、矩阵键盘..............................................................................................................36、蜂鸣器..................................................................................................................4

四、软件系统设计............................................................................................................4

五、程序代码....................................................................................................................6

基于51单片机的温度检测与高温报警系统一 设计内容及要求

设计内容:基于单片机的室内温度检测LED数码管显示及高温报警 要求:检测室内温度变化,并进行显示;

可进行正常运行与报警不同状态的显示;

可预设报警温度,一旦超过该温度进行报警;

温度报警:超出温度上下限BEEP报警。

二 设计方案

测温部分:采用18B20作为温度传感器,有一个由高低电平触发的且不因掉电而丢失的报警功能。

控制部分:STC89C52实验开发板 显示部分:八段数码管显示。

三 硬件系统设计

1、STC89C52 8k字节Flash,512字节RAM,32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外 STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz。(如图1所示)

图1 STC89C52引脚图

2、时钟晶振 原理图如图2所示。

图2 时钟晶振原理图

3、LED指示灯 原理图如图3所示。

图3 LED灯原理图

4、数码管

原理图如图4所示。

图4 数码管原理图

5、矩阵键盘

矩阵键盘原理图如图5所示。设计中用S2作为设定确认键,S3和S4分别作为温度加和减的设定键。

图5 矩阵键盘

6、蜂鸣器

原理图如图6所示。

图6 蜂鸣器原理图

四、软件系统设计

系统设计原理:

本次设计是基于单片机的数码管温度计设计,在开始设计的之前学会使用KEIL软件。根据设计要求选择好器件,编写好程序运行成功之后进行程序调试,验证系统是否正确。通过筛选,选用单片机STC89C52作为主控制系统;用数码管作为温度数据显示装置;智能温度传感器采用DS18B20器件作为测温电路主要组成部分。

程序流程图如图7-9所示。

图7 主程序流程图

图8 读取温度流程

图9 数码管显示流程图

五、程序代码

#include #define uchar unsigned char #define uint unsigned int #define display1 0xfe

//数码管1从右至在 #define display2 0xfd

//数码管2从右至在 #define display3 0xfb

//数码管3从右至在 #define display4 0xf7 //数码管4从右至在 #define display5 0xef //数码管5从右至在 #define display6 0xdf //数码管6从右至在 //===以下IO定义请根据您硬件的连接修改=== sbit dula=P2^6;sbit wela=P2^7;sbit led=P2^5;sbit TMDAT=P2^2;

//根据实实际情况设定 sbit set=P3^4;//设定 sbit up=P3^5;//加 sbit down=P3^6;//减 sbit ld7=P2^4;

//输出指示

//负温度标志led sbit point=P0^7;

//小数点显示 sbit sound=P2^3;uchar tempint,f,bb,tempth,settemp;

//温度整数部分和小数部分 int tempdf,c;code unsigned char ledmap[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x40};

//7段数码管0~9数字的共阳显示代码和负号位代码(最后一位)

void set_ds18b20();

//初始化DS18B20子程序 void get_temperature();

//获得温度子程序

void read_ds18b20();

//读DS18B20子程序

void write_ds18b20(uchar command);//向DS18B20写1字节子程序 void delayms(uchar count);

//延时count毫秒子程序 void disp_temp();

//显示温度子程序 void keyscan();void high_LED();

void main(){

set_ds18b20();

write_ds18b20(0xcc);

//发跳过ROM匹配命令

write_ds18b20(0xbe);

//发出读温度命令

read_ds18b20();

//将读出的数据

settemp=tempth;

//将TH读到单片机

P1=0xfe;

SP=0x60;

//设置堆栈指针

bb=0;

led=0;

while(1)

{

keyscan();

if(bb==0)

{

get_temperature();

//获得温度

high_LED();

}

disp_temp();

//显示温度

} } //***********************初始化DS18B20子程序********************************** //**************************************************************************** void set_ds18b20(){

while(1)

{

uchar delay,flag;

flag=0;

TMDAT=1;

delay=1;

while(--delay);

TMDAT=0;

//数据线置低电平

delay=250;

while(--delay);

//低电平保持500us

TMDAT=1;

//数据线置高电平

delay=30;

while(--delay);

//高电平保持60us

while(TMDAT==0)

//判断DS18B20是否发出低电平信号

{

delay=210;

//DS18B20响应,延时420us

while(--delay);

if(TMDAT)

//DS18B20发出高电平初始化成功,返回

{

flag=1;

//DS18B20初始化成功标志

//初始化成功LED标志

break;

}

}

if(flag)

//初始化成功,再延时480us,时序要求

{

delay=240;

while(--delay);

break;

}

} } //***********************获得温度子程序*************************************** //**************************************************************************** void get_temperature()

//温度转换、获得温度子程序 {

set_ds18b20();

//初始化DS18B20

write_ds18b20(0xcc);

//发跳过ROM匹配命令

write_ds18b20(0x44);

//发温度转换命令

disp_temp();

//显示温度,等待AD转换

set_ds18b20();

write_ds18b20(0xcc);

//发跳过ROM匹配命令

write_ds18b20(0xbe);

//发出读温度命令

read_ds18b20();

//将读出的温度数据保存到tempint和tempdf处

} //***********************读DS18B20子程序*************************************** //**************************************************************************** void read_ds18b20(){

uchar delay,i,j,k,temp,temph,templ;

j=3;

//读2位字节数据

do

{

for(i=8;i>0;i--)

//一个字节分8位读取

{

temp>>=1;

//读取1位右移1位

TMDAT=0;

//数据线置低电平

delay=1;

while(--delay);

TMDAT=1;

//数据线置高电平

delay=4;

while(--delay);

//延时8us

if(TMDAT)

//读取1位数据

temp|=0x80;

delay=25;

//读取1位数据后延时50us

while(--delay);

}

if(j==3)

templ=temp;//读取的第一字节存templ

if(j==2)

temph=temp;//读取的第二字节存temph

if(j==1)

tempth=temp;

//读取的第3字节存tempth

TH的值

}while(--j);

f=0;

if((temph & 0xf8)!=0x00)//若温度为负的处理,对二进制补码的处理

{

f=1;

//为负温度f置1

temph=~temph;

templ=~templ;

k=templ+1;

templ=k;

if(k>255)

{

temph++;

}

}

tempdf=templ & 0x0f;

//将读取的数据转换成温度值,整数部分存tempint,小数部分存tempdf

c=(tempdf*625);

tempdf=c;

templ>>=4;

temph

tempint=temph|templ;//两字节合并为一个字节

} //***********************写DS18B20子程序*************************************** //****************************************************************************

void write_ds18b20(uchar command){

uchar delay,i;

for(i=8;i>0;i--)

//将一字节数据一位一位写入

{

TMDAT=0;

//数据线置低电平

delay=6;

//延时12us

while(--delay);

TMDAT=command&0x01;

//将数据放置在数据线上

delay=25;

//延时50us

while(--delay);

command=command>>1;

//准备发送下一位数据

TMDAT=1;

//发送完一位数据,数据线置高电平

} } //***********************显示子程序*************************************** //**************************************************************************** void disp_temp(){

uchar tempinth,tempintl,cnt,tempinbai,shifen,baifen,gefen,mi;

if(bb!=0)

{tempint=settemp;

tempdf=0;

cnt=2;}

else

{cnt=100;}

tempinbai=tempint/100;

tempinth=tempint%100/10;

//整数取模

tempintl=tempint%10;

//整数取模

baifen =tempdf%10000/1000;

shifen=tempdf%1000/100;

gefen=tempdf%100/10;//小数取模

mi=tempdf%10;

while(--cnt)

{

if(tempth>tempint)

ld7=1;

else

ld7=1;while(f==1){

dula=1;P0=ledmap[10];

dula=0;if(tempinth==0){ wela=1;

P0=display1;

wela=0;

delayms(1);

goto loop;} else {P0=0xdf;} } delayms(1);

dula=1;

P0=ledmap[tempinbai];

dula=0;

wela=1;

P0=display1;//开百位

wela=0;

delayms(2);

dula=1;

P0=ledmap[tempinth];

dula=0;

wela=1;

P0=display2;//开十位

wela=0;

delayms(2);

loop:dula=1;

P0=ledmap[tempintl];

point=1;//小数点显示

dula=0;wela=1;P0=display3;

//开个位

wela=0;delayms(2);

dula=1;

P0=ledmap[baifen];

dula=0;wela=1;P0=display4;

//开分位

wela=0;

delayms(2);

dula=1;

P0=ledmap[shifen];

dula=0;wela=1;P0=display5;

//开十分位

wela=0;delayms(2);

dula=1;

P0=ledmap[gefen];

dula=0;wela=1;P0=display6;

//开百分位

wela=0;delayms(2);

}

} //***********************延时count ms子程序*************************************** //**************************************************************************** void delayms(uchar count)//延时count ms子程序 {

uchar i,j;

do

{

for(i=5;i>0;i--)

for(j=98;j>0;j--);

}while(--count);}

//***********************键盘扫描子程序*************************************** //****************************************************************************

void keyscan()//键盘扫描

{

if(set==0)

{

delayms(1);

}

if(set==0)

{

bb++;

while(!set);//循环在此 非0=1

}

if(bb==1)

{

if(up==0)

{

delayms(1);

}

if(up==0)

{

disp_temp();

if(settemp

{settemp++;}

while(!up)//非0=1

{

disp_temp();

}

}

if(down==0)

{

delayms(1);

}

if(down==0)

{

disp_temp();

if(settemp!=0)//不等于0为真执行

{

settemp--;

while(!down)// down为(非0=1)循环执行

{

disp_temp();

}

}

}

}

if(bb==2)

{bb=0;

set_ds18b20();

//初始化DS18B20

write_ds18b20(0xcc);

//发跳过ROM匹配命令

write_ds18b20(0x4e);

//发温度转换命令

write_ds18b20(settemp);

//写TH 3

set_ds18b20();

//初始化DS18B20

write_ds18b20(0xcc);

//发跳过ROM匹配命令

write_ds18b20(0x48);}} //***********************温度过高提示*************************************** //**************************************************************************** void high_LED(){ if(settemp

led=1;

P1=0x00;

sound=0;

led=0;} else if(bb==0)

{

led=1;

P1=0xfe;

sound=1;

led=0;

} }

《温度检测与高温警报系统.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
温度检测与高温警报系统
点击下载文档
相关专题 检查警报系统的程序 警报 高温 温度 检查警报系统的程序 警报 高温 温度
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文