单片机课程设计报告-基于AT89C51单片机的数显温度传感器设计.docx_第1页
单片机课程设计报告-基于AT89C51单片机的数显温度传感器设计.docx_第2页
单片机课程设计报告-基于AT89C51单片机的数显温度传感器设计.docx_第3页
单片机课程设计报告-基于AT89C51单片机的数显温度传感器设计.docx_第4页
单片机课程设计报告-基于AT89C51单片机的数显温度传感器设计.docx_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课题二: 基于at89c51单片机的数显温度传感器设计一、设计目的1、掌握51单片机最小系统的设计;2、掌握温度传感器ds18b20的使用;3、掌握c51的编程方式。二、 设计任务与要求基于at89c51单片机的数显温度传感器设计主要具有如下功能,具体要求如下:1. 温度传感器ds18b20检测环境温度。2. 用4位数码管显示温度;3. 设定一个温度,当检测的温度达到这个设定值时,用蜂鸣器实现报警。三、 设计步骤1 根据课题,查阅相关资料。2 画出系统原理框图,确定基本电路。(电路图不能在protuse里画,在a4纸上或者用dxp画电路图)3 在protuse里进行仿真。(仿真结果出来后,才发放元件)4 按电路原理图在板子上焊接电路。5 调试硬件。6 撰写电子综合设计报告:字数约20003000字(不包括程序清单),格式见附件2)。7 最后一个下午,制作ppt进行答辩。题目二:基于at89c51单片机的数显温度传感器设计元件名称型号数量单片机最小开发板stc89c521温度传感器ds18b201三极管88501蜂鸣器1led 红1电阻10k、3k、2k、1k、510、330各5各2位一体数码管共阳2ac/dc(5v/1a)电源1单排插针 402双排插针 4029x15cm万用板(3连孔)1杜邦线15附件2:单片机原理及其应用课程设计设计报告格式课 题: 基于at89c51的数显温度传感器专 业: 电气工程及其自动化班 级: 1班学 号: 13155747 姓 名: 薛 皓指导教师: 李 敏设计日期: 2015年6月19日成 绩:重庆大学城市科技学院电气学院基于at89c51单片机的数显温度传感器设计报告一、设计目的作用本设计是一款简单实用的小型数字温度计,所采用的主要元件有传感器ds18b20,单片机at89c52,四位共阴极数码管一个,电容电阻若干。ds18b20支持“一线总线”接口,测量温度范围-55 +125。在-10 +85范围内,精度为0.5。18b20的精度较差,为 2 。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测温类消费电子产品等。本次数字温度计的设计共分为五部分,主控制器,led显示部分,传感器部分,复位部分,按键设置部分,时钟电路。主控 制器即单片机部分,用于存储程序和控制电路;led显示部分是指四位共阴极数码管,用来显示温度;传感器部分,即温度传感器,用来采集温度,进行温度转换;复位部分,即复位电路,按键部分用来设置上下限报警温度。测量的总过程是,传感器采集到外部环境的温度,并进行转换后传到单片机,经过单片机处理判断后将温度传递到数码管显示。二、设计要求基于at89c51单片机的数显温度传感器设计主要具有如下功能,具体要求如下:(1)温度传感器ds18b20检测环境温度。(2)用两个2位一体共阳数码管显示温度;(3)通过按键开关设定一个上限温度和一个下限温度,当检测的温度达到这个设定值时,用蜂鸣器实现报警,同时led灯闪烁。三、设计的具体实现1、设计原理用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器ds18b20,此传感器,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。(ds18b20数字温度传感器具有单总线的独特优点,可以使用户轻松地组建起传感器网络,并可使多点温度测量电路变得简单、可靠,所以在该设计中采用ds18b20数字温度传感器测量温度。)实验名称是“基于at89c51单片机的数显温度传感器设计”,涉及到mcs-51系列的单片机,我们首先有设计一个能使单片机工作的最小系统,然后温度传感器将实时温度值送给单片机,通过对单片机进行软件编程实现数据处理,然后送给led共阴数码管显示,在对单片机编程时要考虑到要使得能通过按键开关设置上限报警温度及下限报警温度,通过蜂鸣器报警,在报警的同时led灯同步闪烁。设计任务书中已给出了元件清单,但是我们需要在软件中对自己设计的电路进行仿真我们还需要画出单片机的最小系统电路。总体电路结构框图所示:共阳数码管显示模块at89c51单片机单片机时钟电路及复位电路ds18bb20温度传感器模块蜂鸣器报警及led显示模块按键控制模块电源2、系统设计(详细介绍各单元电路的选择、设计及工作原理分析,并介绍有关参数的计算及元器件参数的选择等,要求有原理图。)(1)、硬件设计硬件电路设计通过单片机仿真软件proteus 8.0进行原理图的编辑,根据实验要求及所给出的元件设计出如下电路原理图,并进行了仿真时钟及复位模块实验所给的元件中直接已给出了at89c51的最小系统板,但是我们在设计电路时还是你需要画出该部分电路,时钟复位为能使单片机工作的最简单的电路,又称最小系统。具体实验电路如下: 时钟电路有12mhz的晶振及两个2030pf的瓷片电容(无极性)连接在单片机的xtal1及xtal2连个端口;复位电路由10k的电阻,10uf电解电容(有极性)以及按键开关组成,接在单片机的rst口。当系统出现故障错误,我想让系统恢复初始化状态可以通过对按动按键开关实现对电容的充放电从而实现系统的复位。蜂鸣器报警及led显示模块蜂鸣器用于当温度传感器的输入的温度数值大于认为设定的上限温度或者小于下限温度时,系统会给出相应的信号使得蜂鸣器发出声音同时让led灯闪烁显示,从听觉和视觉上同时提出报警信号。电路图如下: 蜂鸣器由一个pnp型的三极管驱动接在单片机的p1.0口,当p1.0口输出低电平是蜂鸣器发出声音;led灯正极通过1k的电阻上拉接vcc,负极接在单片机的p1.1口,当系统在p1.1口输出低电平时led灯亮。共阳数码管显示显示模块实验给出的数码管为2位一体共阳的数码管,在实验显示中我们需要四个数码管去显示相应的温度,所以采用两个2位一体共阳数码管并联当做一个4位一体的共阳数码管。电路原理图如下:数码管的使用设计到了段选及位选,我们把段选接在单片机的p0口 ,位选接在数码管的p2.4p2.7口,需要注意的是此数码管为共阳的,所以p0口输出的低电平完全可以驱动数码管的段选显示,但是位选输出高电平不足以驱动数码管显示导致数码管的亮度不够,此时我们需要在数码管的位选段接上相应的1k的上拉电阻,这样数码管的亮度就可以明显的得到提升。ds18bb20温度传感器模块ds18b20温度传感器是美国dallas半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现912位的数字值读数方式。电路图如下:接在单片机的p2.3口,ds18b20的dq端需要接一个4.7k左右的上拉电阻。按键控制模块按键是用来设置报警的上下限温。k1是用 来进入上下限调节模式的,当按一下k1进入上限调节模式,再按一下进入下限调节模式。在正常模式下,按一下k2进入查看上限温度模式,显示1s左右自动退出;按一下k3进入查看下限温度模式,显示1s左右自动退出;按一下k4消除按键音,再按一下启动按键音。在调节上下限温度模式下,k2是实现加1功能, k1是实现减1功能,k3是用来设定上下限温度正负的。(2)、软件设计通过单片机编程软件keil 4进行编程,程序部分通过一个主函数和自定义的三个#includeds18b20.h #includekeyscan.h #includedisplay.h 头文件,分别完成温度的采集转化、通过键盘设定上下限报警温度以及模式的切换、通过定时器0延时使数码管动态显示温度系统的主流程图:3、 系统实现(详细介绍实物连接图及运行程序时的每种结果,要求有图为证,并对每张图片进行简单的说明)根据系统的设计框图,查找相关资料,在proteus 8.0中画出原理图,在keil 4软件中编写好程序,然后将这两个软件结合,将写好的程序在proteus 8.0中烧录进单片机,然后开启仿真开关,即可显示设计效果,通过修改硬件电路的同时结合程序,实现实验要求。然后开始焊接硬件电路,在多孔板上焊出相应的电路,用杜邦线将各个模块与单片机最小系统板连接在一起得到最终电路,用烧录软件将程序烧录进单片机,最终以实际电路的形式展现出成果。系统的调试及性能分析:硬件调试,首先检查电感的焊接是否正确,然后可用万用表测试或通电检测。软件调试可以先编写显示程序并进行硬件的正确性检验,然后分别进行主程序、读出温度子程序、温度转换命令子程序、计算温度子程序和现实数据刷新子程序等的编程及调试四、总结(对整个设计工作过程进行归纳和综合,对设计中所存在的问题和不足进行分析和总结,提出解决的方法、措施、建议和对这次设计实践的认识、收获和提高。) 通过本次课程设计使我收获很多,从一开始对单片机仿真软件的使用到后来渐渐的熟悉,深深感觉到了我们在设计电路的时候为了验证我们方案的可行性,我们必须借助一些仿真软件,来模拟我们设计的电路,这样既可以节省本也使得我们焊接实物时有了很好的依据,要学会以这种方法为基础再来焊接电路。通过系统仿真软件proteus和编译软件keil,使我们进一步了解了 单片机的设计制作过程,其中最为困难的是软件部分,即编程部分,我们上网找了好多资料,虽然经过自己的修改,但还是有很多功能不能实现,如温度上下限设置。由于proteus并不是很熟练,在使用的过程中有很多原件的名称不知道,从而花费了大量的时间查阅资料。在应用仿真的过程中,还出现了仿真软件出现问题,不管怎样修改程序,结果在仿真软件上还是出现错误,后来发现是我们使用的软件是盗版的所以他可能在仿真过程中出现错误,最终决定先将硬件焊接出来将程序写进去看看结果,再对软件进行相应的调整,最后焊接出来将程序写进单片机经过简单的调整实现了实验要求。最后一步的焊接硬件也遇到了不少麻烦。综上所述我们得出这样的结论,应该借助软件仿真证明我们方案的可行性,设计时实际电路和我们理论上的数值是有所差别的,我们也要学会将理论知识与实际结合起来,这样我们才能在实际中提高自我能力,我们才能真正理解并在实际中运用我们的知识。五、附录附录一:元件清单元件名称型号数量单片机最小开发板stc89c521温度传感器ds18b201三极管88501蜂鸣器1led 红1电阻10k、3k、2k、1k、510、330各5各2位一体数码管共阳2ac/dc(5v/1a)电源1单排插针 402双排插针 4029x15cm万用板(3连孔)1杜邦线15附录二:实物焊接图附录三:程序/* 程序名; 基于51单片机的温度计* 功 能: 实时测量温度,超过上下限报警,报警温度可手动调整。 k1是用来进入上下限调节模式的,当按一下k1进入上限 调节模式,再按一下进入下限调节模式。在正常模式下, 按一下k2进入查看上限温度模式,显示1s左右自动退出; 按一下k3进入查看下限温度模式,显示1s左右自动退出; 按一下k4消除按键音,再按一下启动按键音。在调节上 下限温度模式下,k2是实现加1功能,k1是实现减1功能, k3是用来设定上下限温度正负的。 */#include #include /将intrins.h头文件包含到主程序(调用其中的_nop_()空操作函数延时)#define uint unsigned int #define uchar unsigned char uchar max=0x00,min=0x00; /max是上限报警温度,min是下限报警温度bit s=0; /s是调整上下限温度时温度闪烁的标志位,s=0不显示200ms,s=1显示1s左右bit s1=0; /s1标志位用于上下限查看时的显示void display1(uint z); /声明display1()函数(display.h头文件中的函数,ds18b20.h要用应先声明)#includeds18b20.h #includekeyscan.h #includedisplay.h /*/*主函数/*/void main() beer=1; /关闭蜂鸣器 led=1; /关闭led灯 timer1_init(0); /初始化定时器1(未启动定时器1) get_temperature(1); /首次启动ds18b20获取温度(ds18b20上电后自动将eeprom中的上下限温度复制到th和tl寄存器) while(1) keyscan(); get_temperature(0); display(temp,temp_d*0.625); alarm(); /* 程序名; ds18b20keyscan函数* 功 能: 通过键盘设定设定上下限报警温度*/#ifndef _keyscan_h_/定义头文件#define _keyscan_h_sbit key1=p22; sbit key2=p21; sbit key3=p20;sbit key4=p33;uchar i=0;/定义全局变量i用于不同功能模式的选择,0正常模式,1上限调节模式,2下限调节模式uchar a=0; /定义全局变量a用于不同模式下数码管显示的选择bit k4=0;/k4按键双功能选择位,k4=0时k4按键选择消按键音的功能,k4=1时k4按键选择正负温度设定功能bit v=0;/k2、k3按键双功能选择位,v=0时选择上下限查看功能,v=1时选择上下限温度加减功能bit v1=0;/v1=1时定时1250ms时间到自动关闭报警上下限查看功能bit v2=0; /消按键音功能调整位,为0时开按键音,为1时关按键音/*/*读键盘延时子函数/*/void keyscan_delay(uint z)/延时1ms左右 uint i,j; for(i=z;i0;i-)for(j=120;j0;j-);/*/*温度调节函数 /*/int temp_change(int count,bit f)/上下限温度调整 if(key2=0)/判断k2是否按下 if(v2=0)beer=0;/v2=0开按键音,否则消按键音keyscan_delay(10);/延时10msif(key2=0)/再次判断k2是否按下(实现按按键时消抖) beer=1;/k2按下关按键音 if(f=0)/若温度为正 count+;/每按一下k2温度上调1 if(a=1)if(count125) count=125;/当温度值大于125时不上调 if(a=2)if(count125) count=125; if(f!=0)/若温度为负 count+;/每按一下k2温度下调1 if(a=1)if(count55) count=55;/当温度值小于-55时不再下调 if(a=2)if(count55) count=55; while(key2=0);/k2松开按键时消抖keyscan_delay(10);if(key3=0) if(v2=0)beer=0;keyscan_delay(10);if(key3=0) /k3按按键时消抖 beer=1; count-;/每按一下k3温度为正时下调1,为负时上调1if(a=1)if(count0) count=0;/当温度值达到0时不再调if(a=2)if(count2)/k1按下三次后退出调节模式 i=0;/进入正常模式 tr1=0;/关定时器1 k4=0;/在正常模式下选择k4的消按键音功能 v=0;/在正常模式下选择k2、k3的查看上下限报警温度功能 store_t();/存储调整后的上下限报警温度 switch(i)/显示选择 case 0:a=0;break;/a=0选择显示测得的温度 case 1:a=1;break; /a=1选择显示上限温度 case 2:a=2;break; /a=2选择显示下限温度 default:break; while(key1=0);/k1松按键时消抖keyscan_delay(10);if(a=1&v=1)/a=1选择显示上限温度且v=1时选择上下限温度加功能led=0;max=temp_change(max,f_max);/显示上限温度else if(a=2&v=1)/a=2选择显示下限温度且v=1时选择上下限温度减功能led=1;min=temp_change(min,f_min);else;if(k4=1)/k4=1时k4按键选择正负温度设定功能if(key4=0) if(v2=0)beer=0;keyscan_delay(5);if(key4=0) beer=1; if(a=1) if(max55) f_max=0;else f_max=f_max;/当温度大于55度时,只能设定为正温度 if(a=2) if(min55) f_max=0;else f_min=f_min;/当温度大于55度时,只能设定为正温度 while(key4=0);keyscan_delay(10);if(v=0) /v=0时选择上下限查看功能if(key2=0) if(v2=0)beer=0;keyscan_delay(10);if(key2=0) beer=1; a=1;/选择上限显示 tr1=1;/开定时器1开始定时一分钟左右 s1=1; /上限显示不闪烁,显示一分钟左右自动退出while(key2=0);keyscan_delay(10);if(key3=0) if(v2=0)beer=0;keyscan_delay(10);if(key3=0) beer=1; a=2;/选择下限显示 tr1=1;/开定时器1开始定时1s s1=1; /下限显示不闪烁,显示1s自动退出 while(key3=0);keyscan_delay(10);if(v1=1) /v1=1时定时1s时间到自动关闭报警上下限查看功能a=0;v1=0;tr1=0; /a=0显示实测温度,v1清零,关定时器1if(k4=0) /k4=0时k4按键选择消按键音的功能 if(key4=0)if(v2=0)beer=0;keyscan_delay(10);if(key4=0) beer=1; v2=v2;/为0时开按键音,为1时关按键音 while(key4=0);keyscan_delay(10); #endif/* 程序名; ds18b20头文件 * 说 明:用到的全局变量是:无符号字符型变量temp(测得的温度整数部分), temp_d(测得的温度小数部分),标志位f(测量温度的标志位0表 示“正温度”1表示“负温度”),标志位f_max(上限温度的标志位 0表示“正温度”、1表示“负温度”),标志位f_min(下限温度的 标志位0表示“正温度”、1表示“负温度”),标志位w(报警标志位 1启动报警0关闭报警)。 */#ifndef _ds18b20_h_ /定义头文件#define _ds18b20_h_#define uint unsigned int #define uchar unsigned char sbit dq= p23; /ds18b20接口sbit beer=p10; /用beer表示p1.0sbit led=p11; /用led表示p1.1uchar temp=0; /测量温度的整数部分uchar temp_d=0; /测量温度的小数部分bit f=0; /测量温度的标志位0表示“正温度” 1表示“负温度”)bit f_max=0; /上限温度的标志位0表示“正温度” 1表示“负温度”)bit f_min=0; /下限温度的标志位0表示“正温度” 1表示“负温度”)bit w=0; /报警标志位1启动报警,0关闭报警;/*/*延时子函数/*/void ds18b20_delayus(uint t) /延时几s while(t-);void ds18b20_delayms(uint t) /延时1ms左右uint i,j;for(i=t;i0;i-) for(j=120;j0;j-);/*/*ds18b20初始化函数/*/void ds18b20_init() uchar c=0; dq=1;dq=0; /控制器向ds18b20发低电平脉冲ds18b20_delayus(80); /延时15-80sdq=1;/控制器拉高总线,while(dq); /等待ds18b20拉低总线,在60-240s之间ds18b20_delayus(150);/延时,等待上拉电阻拉高总线dq=1;/拉高数据线,准备数据传输;/*/*ds18b20字节读函数 /*/uchar ds18b20_read() uchar i;uchar d=0;dq = 1;/准备读;for(i=8;i0;i-) d = 1; /低位先发;dq = 0;_nop_();_nop_();dq = 1;/必须写1,否则读出来的将是不预期的数据;if(dq)/在12us处读取数据;d |= 0x80;ds18b20_delayus(10);return d; /返回读取的值/*/*ds18b20字节写函数 /*/void ds18b20_write(uchar d) uchar i; for(i=8;i0;i-) dq=0; dq=d&0x01; ds18b20_delayus(5); dq=1; d = 1; /*/*获取温度函数 /*/ void get_temperature(bit flag)uchar a=0,b=0,c=0,d=0; uint i;ds18b20_init(); ds18b20_write(0xcc);/向ds18b20发跳过读rom命令ds18b20_write(0x44);/写启动ds18b20进行温度转换命令,转换结果存入内部ramif(flag=1)/首次启动ds18b20进行温度转换需要500ms,若转换时间不够就出错,读出的是85度的错误值。 display1(1);/用开机动画耗时elseds18b20_delayms(1);ds18b20_init(); ds18b20_write(0xcc); ds18b20_write(0xbe);a=ds18b20_read();/读内部ram (lsb)b=ds18b20_read();/读内部ram (msb)if(flag=1)/局部位变量f=1时读上下线报警温度 max=ds18b20_read(); /读内部ram (th) min=ds18b20_read(); /读内部ram (tl)if(max&0x80)=0x80) /若读取的上限温度的最高位(符号位)为1表明是负温度f_max=1;max=(max-0x80); /将上限温度符号标志位置1表示负温度,将上限温度装换成无符号数。 if(min&0x80)=0x80) /若读取的下限温度的最高位(符号位)为1表明是负温度f_min=1;min=(min-0x80); /将下限温度符号标志位置1表示负温度,将下限温度装换成无符号数。 i=b;i=4;if (i=0) f=0; /i为0,正温度,设立正温度标记 temp=(a4)|(b4)|(b4);/整数部分 a=(a&0x0f);/小数部分 temp_d=a; /*/*存储极限温度函数 /*/void store_t() if(f_max=1) /若上限温度为负,将上限温度转换成有符号数(最高位为1是负,为0是正)max=max+0x80;if(f_min=1) /若下限温度为负,将上限温度转换成有符号数min=min+0x80; ds18b20_init(); ds18b20_write(0xcc); ds18b20_write(0x4e); /向ds18b20发写字节至暂存器2和3(th和tl)命令ds18b20_write(max); /向暂存器th(上限温度暂存器)写温度ds18b20_write(min); /向暂存器tl(下限温度暂存器)写温度ds18b20_write(0xff); /向配置寄存器写命令,进行温度值分辨率设置ds18b20_init(); ds18b20_write(0xcc); ds18b20_write(0x48); /向ds18b20发将ram中2、3字节的内容写入eeprom /ds18b20上电后会自动将eeprom中的上下限温度拷贝到th、tl暂存器 /*/*温度超限报警函数 /*/ void alarm() /若上限值是正值 if(f_max=0) if(f_min=0) /若下限值是正值 if(f=0) /若测量值是正值 if(temp=max) w=1;tr1=1; /当测量值小于最小值或大于最大值时报警 if(tempmin) w=0; /当测量值大于最小值且小于最大值时不报警 if(f=1)w=1;tr1=1; /若测量值是负值时报警 if(f_min=1) /若下限值是负值 if(f=0) /若测量值是正值 if(temp=max)/当测量值大于最大值时报警 w=1;tr1=1; if(temp=min)/当测量值大于最小值时报警 w=1;tr1=1; if(tempmin)/当测量值小于最小值时不报警 w=0; if(f_max=1) /若下限值是负值 if(f_min=1) /若下限值是负值 if(f=1) /若测量值是负值 if(temp=min) w=1;tr1=1; /当测量值小于最大值或大于最小值时报警 if(tempmax) w=0; /当测量值小于最小值且大于最大值时不报警 if(f=0)w=1;tr1=1; /若测量值是正值时报警 #endif/* 程序名; ds18b20数码管动态显示头文件* 功 能: 通过定时器0延时使数码管动态显示*/#ifndef _ds18b20_display_h_ #define _ds18b20_display_h_#define uint unsigned int /变量类型宏定义,用uint表示无符号整形(16位)#define uchar unsigned char /变量类型宏定义,用uchar表示无符号字符型(8位)sbit wei1=p24; /可位寻址变量定义,用wei1表示p2.4口sbit wei2=p25; /用wei2表示p2.5口

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论