资源描述
《单片机原理及接口技术》
课程设计报告
课题名称
数字温度计2
学院
专业
电气工程及自动化
班级
学号
姓名
时间
2011年12月25日
数字温度计设计说明书
摘要:
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向发展。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示。本系统基于AT89C51单片机设计的一种数字温度测量及报警电路,使用PT100热敏电阻感应温度,在该系统中应用8位A/D转换器ADC0808作为模数转换模块,使用LED作为显示模块;该系统测量范围为-50℃~110℃,并且实现了上下限报警功能等;用4位共阴极LED数码管以串口传送数据,实现温度显示,能准确达到以上要求;该电路结构简单,在智能化、生活中能有广泛的应用。
关键词: 单片机AT89C51 热敏电阻PT100 A/D转换器ADC0808
共阴极LED数码管
Summary:
With the continuous improvement of people's living standard, single-chip control is undoubtedly one goal, one of the convenience it brings is undeniable, digital thermometer which is a typical example, but it is increasingly required of it the higher the work for modern, scientific research, to provide better and more convenient life facilities will need to start from a single-chip technology, all toward the digital control, intelligent control direction.
The design presented in digital thermometer with a traditional thermometer, compared with easy to read, wide temperature range, temperature accuracy, the output digital temperature display. The system is based on AT89C51 microcontroller design of a digital temperature measurement and alarm circuit, using PT100 thermistor temperature sensors, the system applied in 8-bit A / D converter ADC0808 as an analog to digital converter module, using LED as a display module; the system measurement range of -50 ℃ ~ 110 ℃, and achieve a lower limit alarm functions; with four common cathode LED digital serial transmission of data to achieve the temperature display can accurately achieve the above requirements; the circuit structure is simple, smart technology, life can have a wide range of applications.
Keywords: Microcontroller AT89C51 Thermistor PT100 A / D Converter ADC0808 Common cathode LED digital tube
目录
摘要: 1
目录 3
一 、设计任务及要求 4
二 、设计的基本步骤及方案 4
三、 硬件电路的设计及描述 5
1.总体电路图 5
2.主控制器 5
3.A/D转化模块 6
4.温度测量 9
5.显示电路 10
6、报警模块 11
四、 软件设计的思想及流程 12
1.总体设计流程图 12
2、为读取数据子程序的流程图 13
3、 数据处理流程图 15
4、显示部分源代码: 17
5、报警部分 18
五、 硬件软件的的调试过程及调试方法 19
1.硬件系统调试 19
2. 软件部分调试 19
3.仿真效果 20
4.测量数据及分析 21
六、 课程设计的心得体会 22
七、 参考文献 22
附录: 23
总程序 23
一 、设计任务及要求
基于MCS-51系列单片机AT89C51,使用热敏电阻类的温度传感器件,设计一个数字显示温度计。
1、测量温度范围-50℃~110℃。
2、精度误差小于0.5℃。
3、LED数码直读显示。
4、@可以任意设定温度上下限警报功能。
5、☆编程实现热敏电阻的非线性补偿。
6、☆实现语音报出测量的温度值。
二 、设计的基本步骤及方案
根据系统的设计的要求,选择PT100作为本系统的温度传感器,选择单片机AT89C51为监测系统的核心来完成数据采集、处理、显示、报警等功能。同时还选用8位A/D转换器ADC0808完成模数转换,省却了采样/保持电路、运放以及进行长距离传输时的串/并转换电路,简化了电路,缩短了系统的工作时间,降低了系统的硬件成本。
该系统的设计总体思路如下,温度传感器PT100把所测得的温度发送到A/D转换器ADC0808上,完成模数转换;接着再把信号传到AT89C51单片机上,经过单片机的处理,将把温度在LED显示模块上显示,本系统采用4位共阳极LED数码管以动态扫描的方法实现。测量温度范围:-50℃~110℃。按照系统设计功能的要求,确定系统由4个模块组成:主控制器、A/D 转换、测温电路和显示电路。系统总体框图如下所示:
数字温度计总体电路结构框图
三、 硬件电路的设计及描述
1.总体电路图
2.主控制器
本设计采用89C51单片机作为微处理器,89C51一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压、高性能CMOS8位微处理器,俗称单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器,89C2051是它的一种精简版本。89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。89c51主要有以下特点:8位CPU;具有片内振荡器和时钟电路;32根I/O线;外部存贮器寻址范围ROM、RAM64K;2个16位的定时器/计数器;5个中断源,两个中断优先级;全双工串行口;布尔处理器。
3.A/D转化模块
A/D转化器采用了ADC0808 。ADC0808是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。ADC0808是ADC0809的简化版本,功能基本相同。一般在硬件仿真时采用ADC0808进行A/D转换,实际使用时采用ADC0809进行A/D转换下图为。
ADC0808的管脚图和时序图如下所示:
ADC0808管脚图
ADC0808时序图
8080转化计算公式如下:
4.温度测量
温度传感器采用PT100温度传感器。Pt100在-200℃~+850℃内比热电偶更精确、线性度更佳两端产生的降压远远大于热电偶的输出,并且不需要冷端补偿。此外,Pt100海具有抗振动、防腐蚀、良好的互换性、重视性和稳定性等优点,常用于低中温测量。因为电阻的变化导致电压的变化很小,因此我们在后级放大,使电压范围为0-5v之间,电路图如下所示:
测温电路
5.显示电路
显示电路采用4位共阳极LED数码管,从P0口输出断码,列扫描P2.0~P2.3口分别作为LED的1、2、3、4。下为显示电路图:
6、报警模块
本模块通过软件设置上下限实现报警功能,硬件电路如下图:
四、 软件设计的思想及流程
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。
1.总体设计流程图
2、为读取数据子程序的流程图
读数部分源程序:
P0=0; //显示器初始化
P0=P0|0x80; //设置中断
IE=0x8a; //T0,T1中断
TMOD=18; //设置定时器工作方式
TH0=245;
TL0=0;
TH1=(65536-1000)/256; //T1高8位
TL1=(65536-1000)%256; //TI低8位
TR0=1; //为ADC0808提供时钟
H_LED=L_LED=1;
while(1) //开始转换
{
ST=0;ST=1;ST=0;
while(1)
{
if(EOC==1)
{
OE=1;
b=P1; //读取结果
OE=0;
{
ST=0;ST=1;ST=0; //控制ADC0808
while(1)
{
if(EOC==1)
{
OE=1;
d=P1; //读取结果
h=P1;
OE=0;
d=d*0.66-55; //数值转换
b=d;
3、 数据处理流程图
读出温度数据后,LOW的低四位为温度的小数部分,可以精确到0.0625℃,LOW的高四位和HIGH的低四位为温度的整数部分,HIGH的高四位全部为一表示负数,全部为0表示正数。所以先将数据提取出来,分为三个部分:小数部分、整数部分和符合部分。小数部分进行四舍五入处理,大于0.5℃的话,向个位进1;小于0.5℃的时候,舍去不要。当数据是负数的时候,显示之前要进行数据转换,将其整数部分反加一。因为PT100的最温度只能为-50℃,所以可以将整数部分的最高位换成一个“-”,表示为负数。下图为数据处理流程图:
源程序:
if(b>84) //数值转换
{
int ii=(int)(d*10);
d=b*0.66-55; //0~110转换公式
Temperature[3]=ii/1000; //第一位显示
Temperature[2]=ii%1000/100; //第二位显示
Temperature[1]=ii%100/10; //第三位显示
Temperature[0]=ii%10; //第四位显示
Show_Temperature(); //调用显示模块
}
else
{
h=(h-84.2)/1.5; //-50~0转换公式
h=(256-h);
Temperature[3]=h/100;
Temperature[2]=h%100/10;
Temperature[1]=h%10;
h=h*10 ;
Temperature[0]=h%10;
Show_Temperature1();
}
4、显示部分源代码:
unchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x80}; //数码管段码定义
unchar Temperature[]={0,0,0,0}; //待显示各温度位数
void Show_Temperature() //0~110显示函数
{
unchar i,DSY_IDX[]={0xF7,0xFB,0xFD,0xFE}; //定义数码管
for(i=0;i<4;i++)
{
P0=DSY_CODE[Temperature[i]];
if(i==1)
P0=DSY_CODE[Temperature[1]]|0x80 ;
P2&=DSY_IDX[i];
DelayMS(2);
P2|=0x0F;
}
}
void Show_Temperature1() //-50~0显示函数
{
unchar i,DSY_IDX[]={0xF7,0xFB,0xFD,0xFE};
for(i=0;i<4;i++)
{
P0=DSY_CODE[Temperature[i]];
if(i==1)
P0=DSY_CODE[Temperature[1]]|0x80;
if(i==3)
P0=0x40;
P2&=DSY_IDX[i];
DelayMS(2);
P2|=0x0F;
}
5、报警部分
void T1_INT()interrupt 3 //报警中断程序
{
TH1=(65536-1000)/256;
TL1=(65536-1000)%256 ;
BEEP=~BEEP;
if(L_LED==0)
{if(++t!=110)return;}
else
{if(++t!=50)return;}
t=0;
DelayMS(20);
}
五、 硬件软件的的调试过程及调试方法
1.硬件系统调试
首先我们对测温部分进行调试,开始我们直接使用了AD590,但后来发现题目要求使用热敏类电阻,因此我们根据题目中所给的电路参考图进行改正,之后我们又对两级放大器中的反馈电阻进行修正,让温度从-50℃~110℃变化时最后输出端的电压变化范围为0.11V~4.86V。
之后我们又发现A/D模块不能进行转换,经过查阅ADC0808资料,根据它的时序图我们发现需要给START脚一个起始脉冲才能开始转换,然后我们在程序上修改使用中断给它提供了一个脉冲,ADC0808就能工作了。
其次就是显示模块,这一部分主要涉及的是编程问题。
2. 软件部分调试
对于这个系统在程序部分可分为A/D转换模块,显示模块两个大块,开始我们使用汇编语言进行编程,但发现用汇编的浮点数太复杂,所以之后我们查阅了网上的C语言程序,进行更改,处理了这一问题;后来关于-50℃~0℃这一段的程序比较复杂,我们通过公式转换成正的,然后单独设置一个显示模块,首位直接取负号,完成了这一问题。关于报警模块我们也实现了,并且可以随意设置上下限。
3.仿真效果
①设置温度
通过热敏电阻改变温度。
②显示温度
LED显示屏上显示的是测量温度
③报警器
此时温度达到设定值,报警器报警。
4.测量数据及分析
实际温度
(℃)
-50
-30
0
20
40
60
90
110
测量电压
(V)
0.10
0.72
1.63
2.32
2.82
3.41
4.30
4.82
测量温度
(℃)
-52.8
30.4
0
20.2
40.0
59.8
90.2
106.7
分析:测试结果我们发现在-30℃~100℃之间精确度很高,符合要求,但在两端存在一定误差,根据分析因为我们的温度范围为0.1V~4.89V,并非是0V~5V,这一点是因为在取反馈放大电阻时很难取到合适值,我们将进一步对我们的系统进行修正。
六、 课程设计的心得体会
经过为期两星期的设计,我们基本完成了题目所要求的设计任务。单片机课程设计作为独立的教学环节,是自动化及相关专业集中实践性环节,是学习完《单片机原理及应用》课程后,并在进行相关课程设计基础上进行的一次综合练习。使我们增进对单片机的感性认识,加深对单片机理论方面的理解,加深单片机内部功能模块的的应用,如中断,定时器/计时器,片外存储器,串行2接口等。使我们了解和掌握单片机应用系统的软硬件设计过程,方法及实现,强化单片机的应用电路的设计与分析能力。提高了我们在单片机应用方面的实践技能和科学作风,培养了我们综合运用理论知识解决实际问题的能力。课程设计中充分体现了以我们的认知为主体,充分调动了我们的积极性和能动性。
本次课程设计还增强了我们克服困难的能力。克服困难的方法多种多样——集体讨论就是一个很好的办法,集体讨论(要构建一个小的团队,记住团队的力量远比一个人的强大)、查阅资料(查阅资料又包括到图书馆,或者是利用Internet上的资源等)、整合从各方获取的信息,并从中找到有利于解决问题的信息,最终得出解决问题的最佳方案。让我们深深体会到团队配合的力量。一个人的力量是单薄的,但是大家团结在一起协同好各方的关系,让个体统一到整体中,那么团队才会充分发挥其作用,真正起到1+1>2团队效应。相信,这会给我以后的工作带来许多机会。因为这是我们新时代青年所必须具备的一项能力。
这样的实践教学活动对我们的帮助是很大的,对我们各方面能力有很大的提高。希望老师和学校多组织这样的活动!
七、 参考文献
[1] 马建国. 电子系统设计 北京: 高等教育出版社, 2004
[2] 杨素行. 模拟电子技术基础简明教程(第四版) 北京: 高等教育出版社, 2005
[3] 周润景 ,徐宏伟 单片机电路设计、分析与制作 北京: 机械工程出版社, 2010
[4] 何立民 MCS-51系列 单片机应用系统设计系统配置与接口技术 北京: 航空航天大学出版社 ,1990
[5] 陈光东 ,赵性初 单片微型计算机原理与接口技术(第二版) 武昌: 华中科技大学出版社 ,1999
[6] 彭伟.单片机C语言程序设计实训100例.北京:电子工业出版社,2009
附录:
总程序
#include<reg51.h>
#define unchar unsigned char
#define unint unsigned int
sbit ST=P2^5; //ADC0808引脚定义
sbit OE=P2^7;
sbit EOC=P2^6;
sbit CLK=P2^4;
sbit H_LED=P3^0; //报警指示灯
sbit L_LED=P3^1;
sbit BEEP=P3^7; //蜂鸣器
unchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x80}; //数码管段码定义
unchar Temperature[]={0,0,0,0}; //待显示各温度位数
unchar t=0;
float b,d,c;
unchar h;
void DelayMS(unint ms) //延时程序
{
unchar i;
while(ms--) for(i=0;i<120;i++);
}
void Show_Temperature() //显示函数
{
unchar i,DSY_IDX[]={0xF7,0xFB,0xFD,0xFE};
for(i=0;i<4;i++)
{
P0=DSY_CODE[Temperature[i]];
if(i==1)
P0=DSY_CODE[Temperature[1]]|0x80 ;
P2&=DSY_IDX[i];
DelayMS(2);
P2|=0x0F;
}
}
void Show_Temperature1()
{
unchar i,DSY_IDX[]={0xF7,0xFB,0xFD,0xFE};
for(i=0;i<4;i++)
{
P0=DSY_CODE[Temperature[i]];
if(i==1)
P0=DSY_CODE[Temperature[1]]|0x80 ;
if(i==3)
P0=0x40 ;
P2&=DSY_IDX[i];
DelayMS(2);
P2|=0x0F;
}
}
void main() //主程序
{
P0 =0;
P0=P0|0x80;
IE=0x8a; //T0,T1中断
TMOD=18; //设置定时器工作方式
TH0=245;
TL0=0;
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
TR0=1; //为ADC0808提供时钟
H_LED=L_LED=1;
while(1)
{
ST=0;ST=1;ST=0;
while(1) //开始转换
{
if(EOC==1)
{
OE=1;
d=P1; //读取结果
h=P1;
OE=0;
d=d*0.66-55; //数值转换
b=d;
if(h>84)
{
int ii=(int)(d*10);
Temperature[3]=ii/1000;
Temperature[2]=ii%1000/100;
Temperature[1]=ii%100/10;
Temperature[0]=ii%10;
Show_Temperature();
}
else
{
h=(h-84.2)/1.5; //数值转换
h=(256-h);
Temperature[3]=h/100;
Temperature[2]=h%100/10;
Temperature[1]=h%10;
h=h*10 ;
Temperature[0]=h%10;
Show_Temperature1();
}
if(b<50) //判断下限
{
TR1=1;
L_LED=!H_LED;
}
else
if(b>110) //判断上限
{
TR1=1;H_LED=!L_LED;
}
else
{
TR1=0;H_LED=L_LED=1;
}
break;
}
}
}
}
void Timer0_INT()interrupt 1 //TO中断函数,为ADC0808提供时钟
{
CLK=!CLK;
}
void T1_INT()interrupt 3 //报警中断程序
{
TH1=(65536-1000)/256;
TL1=(65536-1000)%256 ;
BEEP=~BEEP;
if(L_LED==0)
{if(++t!=110)return;}
else
{if(++t!=50)return;}
t=0;
DelayMS(20);
}
26
展开阅读全文