1、 《单片机原理及接口技术》 课程设计报告 课题名称 数字温度计2 学院 专业 电气工程及自动化 班级 学号 姓名 时间 2011年12月25日 数字温度计设计说明书 摘要: 随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化控制,智能化控制方向发展。 本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范
2、围广,测温准确,其输出温度采用数字显示。本系统基于AT89C51单片机设计的一种数字温度测量及报警电路,使用PT100热敏电阻感应温度,在该系统中应用8位A/D转换器ADC0808作为模数转换模块,使用LED作为显示模块;该系统测量范围为-50℃~110℃,并且实现了上下限报警功能等;用4位共阴极LED数码管以串口传送数据,实现温度显示,能准确达到以上要求;该电路结构简单,在智能化、生活中能有广泛的应用。 关键词: 单片机AT89C51 热敏电阻PT100 A/D转换器ADC0808 共阴极LED数码管 Summary: With the continuous improv
3、ement 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 conven
4、ient 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 digi
5、tal 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 modu
6、le; 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
7、 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
8、/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 一 、设计任务及要求 基于M
9、CS-51系列单片机AT89C51,使用热敏电阻类的温度传感器件,设计一个数字显示温度计。 1、测量温度范围-50℃~110℃。 2、精度误差小于0.5℃。 3、LED数码直读显示。 4、@可以任意设定温度上下限警报功能。 5、☆编程实现热敏电阻的非线性补偿。 6、☆实现语音报出测量的温度值。 二 、设计的基本步骤及方案
10、 根据系统的设计的要求,选择PT100作为本系统的温度传感器,选择单片机AT89C51为监测系统的核心来完成数据采集、处理、显示、报警等功能。同时还选用8位A/D转换器ADC0808完成模数转换,省却了采样/保持电路、运放以及进行长距离传输时的串/并转换电路,简化了电路,缩短了系统的工作时间,降低了系统的硬件成本。 该系统的设计总体思路如下,温度传感器PT100把所测得的温度发送到A/D转换器ADC0808上,完成模数转换;接着再把信号传到AT89C51单片机上,经过单片机的处理,将把温度在LED显示模块上显示,本系统采用4位共阳极LED数码管以动态扫描
11、的方法实现。测量温度范围:-50℃~110℃。按照系统设计功能的要求,确定系统由4个模块组成:主控制器、A/D 转换、测温电路和显示电路。系统总体框图如下所示: 数字温度计总体电路结构框图 三、 硬件电路的设计及描述 1.总体电路图 2.主控制器 本设计采用89C51单片机作为微处理器,89C51一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低电压、高性能CMOS8位微处理器,俗称单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATM
12、EL高密度非易失存储器制造技术制造,与工业标准的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位的、以逐次逼近原理进
13、行模/数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。ADC0808是ADC0809的简化版本,功能基本相同。一般在硬件仿真时采用ADC0808进行A/D转换,实际使用时采用ADC0809进行A/D转换下图为。 ADC0808的管脚图和时序图如下所示: ADC0808管脚图 ADC0808时序图 8080转化计算公式如下: 4.温度测量 温度传感器采用PT100温度传感器。Pt100在-200℃~+850℃内比热电偶更精确、线性度更佳两端产生的降压远远大于热电偶的输出,并且不需
14、要冷端补偿。此外,Pt100海具有抗振动、防腐蚀、良好的互换性、重视性和稳定性等优点,常用于低中温测量。因为电阻的变化导致电压的变化很小,因此我们在后级放大,使电压范围为0-5v之间,电路图如下所示: 测温电路 5.显示电路 显示电路采用4位共阳极LED数码管,从P0口输出断码,列扫描P2.0~P2.3口分别作为LED的1、2、3、4。下为显示电路图: 6、报警模块 本模块通过软件设置上下限实现报警功能,硬件电路如下图: 四、 软件设计的思想及流程 系统程序主要包括主程序,读出温度子程序,温
15、度转换命令子程序,计算温度子程序,显示数据刷新子程序等。 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;
16、 //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;
17、 //读取结果 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的最温
18、度只能为-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; //第三位显示 Tempe
19、rature[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、显示部分源代码: unc
20、har 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]];
21、 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
22、) 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
23、50)return;} t=0; DelayMS(20); } 五、 硬件软件的的调试过程及调试方法 1.硬件系统调试 首先我们对测温部分进行调试,开始我们直接使用了AD590,但后来发现题目要求使用热敏类电阻,因此我们根据题目中所给的电路参考图进行改正,之后我们又对两级放大器中的反馈电阻进行修正,让温度从-50℃~110℃变化时最后输出端的电压变化范围为0.11V~4.86V。 之后我们又发现A/D模块不能进行转换,经过查阅ADC0808资料,根据它的时序图我们发现需要给START脚一个起始脉冲才能开始转换,然后我们在程序上修改使用中断给它提供了一个脉冲,ADC08
24、08就能工作了。 其次就是显示模块,这一部分主要涉及的是编程问题。 2. 软件部分调试 对于这个系统在程序部分可分为A/D转换模块,显示模块两个大块,开始我们使用汇编语言进行编程,但发现用汇编的浮点数太复杂,所以之后我们查阅了网上的C语言程序,进行更改,处理了这一问题;后来关于-50℃~0℃这一段的程序比较复杂,我们通过公式转换成正的,然后单独设置一个显示模块,首位直接取负号,完成了这一问题。关于报警模块我们也实现了,并且可以随意设置上下限。 3.仿真效果 ①设置温度 通过热敏电阻改变温度。 ②显示温度
25、 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℃之间
26、精确度很高,符合要求,但在两端存在一定误差,根据分析因为我们的温度范围为0.1V~4.89V,并非是0V~5V,这一点是因为在取反馈放大电阻时很难取到合适值,我们将进一步对我们的系统进行修正。 六、 课程设计的心得体会 经过为期两星期的设计,我们基本完成了题目所要求的设计任务。单片机课程设计作为独立的教学环节,是自动化及相关专业集中实践性环节,是学习完《单片机原理及应用》课程后,并在进行相关课程设计基础上进行的一次综合练习。使我们增进对单片机的感性认识,加深对单片机理论方面的理解,加深单片机内部功能模块的的应用,如中断,定时器/计时器,片外存储器,串行2接口等。使
27、我们了解和掌握单片机应用系统的软硬件设计过程,方法及实现,强化单片机的应用电路的设计与分析能力。提高了我们在单片机应用方面的实践技能和科学作风,培养了我们综合运用理论知识解决实际问题的能力。课程设计中充分体现了以我们的认知为主体,充分调动了我们的积极性和能动性。 本次课程设计还增强了我们克服困难的能力。克服困难的方法多种多样——集体讨论就是一个很好的办法,集体讨论(要构建一个小的团队,记住团队的力量远比一个人的强大)、查阅资料(查阅资料又包括到图书馆,或者是利用Internet上的资源等)、整合从各方获取的信息,并从中找到有利于解决问题的信息,最终得出解决问题的最佳方案。让我们深深体会到
28、团队配合的力量。一个人的力量是单薄的,但是大家团结在一起协同好各方的关系,让个体统一到整体中,那么团队才会充分发挥其作用,真正起到1+1>2团队效应。相信,这会给我以后的工作带来许多机会。因为这是我们新时代青年所必须具备的一项能力。 这样的实践教学活动对我们的帮助是很大的,对我们各方面能力有很大的提高。希望老师和学校多组织这样的活动! 七、 参考文献 [1] 马建国. 电子系统设计 北京: 高等教育出版社, 2004 [2] 杨素行. 模拟电子技术基础简明教程(第四版) 北京: 高等教育出版社, 2005 [3] 周润景 ,徐宏伟 单片机电路设计、分析与制作 北
29、京: 机械工程出版社, 2010
[4] 何立民 MCS-51系列 单片机应用系统设计系统配置与接口技术 北京: 航空航天大学出版社 ,1990
[5] 陈光东 ,赵性初 单片微型计算机原理与接口技术(第二版) 武昌: 华中科技大学出版社 ,1999
[6] 彭伟.单片机C语言程序设计实训100例.北京:电子工业出版社,2009
附录:
总程序
#include
30、脚定义 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; flo
31、at 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[
32、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&
33、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; whil
34、e(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
35、 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
36、 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






