大三温度采集报警系统设计资料Word格式文档下载.docx
《大三温度采集报警系统设计资料Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《大三温度采集报警系统设计资料Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
一、设计任务与要求1
二、总体方案设计1
三、单元电路设计与参数计算1
四、总原理图6
五、仿真与调试15
六、性能测试与分析17
七、结论与心得18
八、参考文献19
温度采集报警系统设计
1、设计任务与要求
(1)设计任务
(1)以单片机为核心,设计一个温度采集报警系统设计;
(2)完成至少4路温度信号采集。
(3)能实时显示各路温度信号值。
(4)具有温度上、下限报警功能。
(5)可设定系统报警温度上、下限。
(2)设计要求
(1)根据功能要求选择设计方案,并进行论证;
(2)画出电路的总体方框图和电路原理图;
(3)说明系统工作原理,对系统进行调试;
(4)写出课程设计报告。
2、总体方案设计
1总体设计思路
(1)采用单片机作为数据处理与控制单元,为了进行数据处理,单片机控制温度传感器,把温度信号通过模数转换模块(ADC0808)从温度传感器传递到单片机.单片机进行数据处理之后发出控制信号改变报警和控制执行模块的状态,同时将当前温度信息发送到数码管进行显示.
(2)通过四个按键控制四路温度采集的切换.
(3)通过两个按键来调节温度上下限,当采集到的温度超过设定的数值是,启动蜂鸣器发出报警信号,同时点亮发光二极管.
2总体设计原理
八路模拟信号数值测量显示电路由A/D转换、数据处理及显示控制等组成。
3、单元电路设计与参数计算
(1)AT89C51单片机介绍
图
(一)AT89C51单片机最小系统及其连接
图
(二)AT89C51单片机片内结构
1AT89C51简介
AT89C51是一种带4K字节FLASH存储器的低电压、高性能CMOS8位微处理器,俗称单片机,AT89C51提供以下标准功能:
4k字节Flash
闪速存储器,128字节内部RAM,32个I/O口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。
空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。
掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
2AT89C51单片机的并行I/O端口
(1)P0口:
P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。
当P0口的管脚第一次写1时,被定义为高阻输入。
P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。
在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。
(2)P1口:
P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。
P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。
在FLASH编程和校验时,P1口作为低八位地址接收。
(3)P2口:
P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。
并因此作为输入时,P2口的管脚被外部拉低,将输出电流。
这是由于内部上拉的缘故。
P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。
在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。
P2口在FLASH编程和校验时接收高八位地址信号和控制信号。
(4)P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。
当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。
作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。
(二)ADC0808的介绍
图(三)ADC0808及其连接
ADC0808是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器件。
其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。
ADC0808是ADC0809的简化版本,功能基本相同。
一般在硬件仿真时采用ADC0808进行A/D转换,实际使用时采用ADC0809进行A/D转换。
有28条引脚,采用双列直插式封装,如图(三)所示.
(三)LED数码管简介
图(四)led数码管
LED数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。
右图是共阳极数码管及其的内部电路,它们的发光原理是一样的,只是它们的电源极性不同而已。
将多只LED的阴极连在一起即为共阴式,而将多只LED的阳极连在一起即为共阳式。
(三)温度采集电路:
图(五)温度采集电路
本系统采用铂热电阻PT100作为温度传感器,它的阻值会随着温度的变化而改变。
PT后的100即表示它在0℃时阻值为100欧姆,在100℃时它的阻值约为138.5欧姆。
当PT100在0摄氏度的时候他的阻值为100欧姆,它的阻值会随着温度上升而成近似匀速的增长。
。
向PT100输入稳恒电流,再通过转换后测得PT100两端的电压,即可得到PT100的阻值。
本系统采用2.55mA的电流源对PT100进行供电,然后用运算放大器LM324搭建的同相放大电路将其电压信号放大10倍后输入到ADC0808中,利用电阻变化率0.385Ω/℃的特性,可计算出当前的温度值。
(4)按键电路
图(五)按键电路连接
如图所示,k1,k2为四路温度采集电路的切换按键。
当无按键按下时时,第一路采集电路导通;
当K1按下时,第二路采集电路导通;
当K2按下时,第三路采集电路导通;
当K1和K2同时按下时,第四路采集电路导通。
JIA按键为调节温度上限按键,JIAN按键为调节温度下限按键。
(5)报警电路
图(六)报警电路
当前采集到的温度如果超过或者低于设定的温度上下限,则led灯发光同时蜂鸣器发出报警信号。
4、总原理图
(一)硬件电路
图(七)整体模块
图(八)总体硬件电路图
(2)软件程序
#include<
reg51.h>
sbitSTART=P2^0;
//IO口定义
sbitEOC=P2^1;
sbitOE=P2^2;
sbitadda=P2^4;
sbitaddb=P2^5;
sbitaddc=P2^6;
sbitbuzzer=P2^3;
//蜂鸣器定义
sbitled=P2^7;
//LEd定义
sbitwei1=P0^3;
//位选定义
sbitwei2=P0^2;
sbitwei3=P0^1;
sbitwei4=P0^0;
sbitk1=P0^4;
sbitk2=P0^5;
sbitJia=P0^6;
//加键定义
sbitJian=P0^7;
//减键定义
unsignedcharad_data,t;
charcount;
unsignedcharkeynum;
unsignedchardis[4]={0x00,0x00,0x00,0x00};
/*用来放AD转换处理结果值*/
unsignedcharcodedis_7[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x40};
/*共阴LED段码表对应"
0"
"
1"
2"
3"
4"
5"
6"
7"
8"
9"
不亮"
-"
*/
voiddelay(unsignedintt)//11微秒延时函数
{
for(;
t>
0;
t--)
{
;
}
}
voiddelay10ms(void)//误差0us
{
unsignedchara,b,c;
for(c=5;
c>
c--)
for(b=4;
b>
b--)
for(a=248;
a>
a--);
}
voidAdDisplay()//AD转换显示
wei4=0;
P3=dis_7[dis[0]];
delay(90);
wei4=1;
wei3=0;
P3=dis_7[dis[1]]|0x80;
wei3=1;
//加入小数点
wei2=0;
P3=dis_7[dis[2]];
wei2=1;
wei1=0;
P3=dis_7[dis[3]];
wei1=1;
voidadc0809()//AD转换
P1=0xff;
//读取P1口之前先给其写全1
START=0;
START=1;
while(EOC==0);
OE=1;
ad_data=P1;
//AD数据读取赋给P1口
OE=0;
/*---------AD转换结果处理--------*/
voidad_compute()//u=2.55+T/100,2.55反映在AD上为0x83
chart_temp;
unsignedchari;
ad_data=ad_data-0x83;
t_temp=ad_data*2-4;
if((t_temp>
count)&
&
(count>
0))//大于上限设定值,则开启报警装置
for(i=0;
i<
50;
i++)
led=~led;
buzzer=~buzzer;
}
led=0;
buzzer=1;
else
led=1;
buzzer=0;
if((t_temp<
(count<
0))//小于下限设定值,则开启报警装置
for(i=0;
if(t_temp>
0)
dis[3]=t_temp/100;
//最高位
dis[2]=t_temp/10%10;
dis[1]=t_temp%10;
dis[0]=t%5*2;
//最低位
}