基于单片机的数字温度计设计方案1.1 数字式温度计的设计目的与要求要想基于AT89C51系列单片机的应用与开发,就要了解单片机的构造及原理,熟悉单片机最小系统及其应用。
同时巩固和加强“单片机接口技术”课程的理论知识,掌握单片机系统一般的设计方法,并了解电子产品研制开发过程。
在设计完成过程中,学会培养独立分析问题和解决问题的能力以及创新能力和创新思维。
不断提高自身分析问题和解决问题的能力以及创新能力和创新思维。
作为此次毕业设计的最终成果,本文对数字式温度计的设计要求如下:1、数字式温度计的基本围在-50℃-110℃之间;2、数字式温度计的精度误差小于0.5℃;3、数字式温度计要用LED数码管直读显示;4、同时要具有支持扩展的相关功能;5、要具有任意设定数字式温度计温度上下限功能;6、超过温度计上下限,要具有报警功能。
1.2 数字式温度计设计思路本次设计将以AT89C51单片机作为核心器件,组成一个具有多种拓展功能的数字式温度计。
此次设计采用模块化编程方法,将各个功能细化,逐个完成,最终实现整个温度计功能。
在最初的设计方案中,有两种方式可供选择:一种是可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路。
另外一种则是考虑到用温度传感器。
采用一只温度传感器DS18B20,可以很容易直接读取被测温度值,进行转换,就可以满足设计要求。
以上两种方案第二种更为简单明了,避免了AD转换电路的复杂应用。
因此本次设计采用了第二种方案。
1.3 数字式温度计设计原理框图图1.1 数字式温度计设计原理框图1.4 数字式温度计工作过程简要分析当系统启动后,各模块电路开始工作,温度传感器随机提供一个温度值,生成的温度信号脉冲经过AT89C51单片机处理显示在LED数码显示管上。
此时可以通过手动设置整个系统的上限温度、下限温度,也可以调整实时温度。
当上限温度、下限温度以及实时温度调整完毕后,经过AT89C51的处理,当此时的实时温度达到或者超过上限与下限温度值时,报警模块启动对当前整个系统温度进行报警。
若要重新整个过程,可以通过复位键进行系统复位,重新开始测定当前整个系统的温度。
2数字式温度计的硬件电路2.1 数字式温度计的系统电路图2.1 数字式温度计主板电路图图2.1中蜂鸣器可以在被测温度不在上下限围时,发出报警鸣叫声音,同时LED数码管将没有被测温度值显示,这时可以调整报警上下限,从而测出被测的温度值。
按健复位电路是上电复位加手动复位,使用比较方便,在程序跑飞时,可以手动复位,这样就不用在重起单片机电源,就可以实现复位。
2.2 AT89C51单片机AT89C51单片机是一个集成电路芯片,它是由微处理器CPU、数据存储器(RAM)、程序存储器(ROM)、并行I/O口(4个8位I/O口)、串行口、定时器/计数器、中断系统及特殊功能寄存器。
图2.2 AT89C51单片机这些都是通过片单一总线连接而成。
其基本结构依旧是微处理器CPU,加上外围芯片的传统结构模式。
但对各种功能部件的控制是采用特殊功能寄存器的集中控制方式以实现不同的功能。
2.3 数字式温度计数码显示电路本次设计采用的显示电路是4位共阴极LED数码管,从P0口输出段码。
显示电路是使用的动态显示,这种显示最大的优点就是使用资源比较少,功耗低,但显示清晰度不如静态显示。
图2.3 数字式温度计数码显示电路2.4 数字式温度计传感器DS18B20DS18B20是美国DALLAS公司生产的单总线数字温度传感器,它具有微型化、功耗低、高性能、抗干扰能力强、易于与微处理器方便接口等优点。
图2.3 DS18B20数字温度传感器该器件将半导体温敏器件、A/D转换器、存储器等做在一个很小的集成电路芯片上。
传感器直接输出温度信号数字值。
信号的传输采用两芯或者三芯电缆构成的单总线结构。
一条单总线上可以挂接若干个数字温度传感器,每个传感器有唯一一个唯一的地址编码。
微控制器通过对器件的寻址,就可以读取某一个传感器的温度值,从而简化了信号采集系统的电路结构。
其部结构框图如图2.4所示:图2.4 DS18B20部结构图64位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。
温度报警触发器TH和TL,可通过软件写入户报警上下限。
下表表示温度和数字量的关系:温度/℃二进制表示十六进制表示+125 0000 0111 1101 0000 07D0H+85 0000 0101 0101 0000 0550H +25.0625 0000 0001 1001 0000 0191H+10.125 0000 0000 1010 0001 00A2H+0.5 0000 0000 0000 0010 0008H0 0000 0000 0000 1000 0000H-0.5 1111 1111 1111 0000 FFF8HDS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。
因此,在实际应用中要将分辨率和转换时间权衡考虑。
高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。
第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。
当DS18B20接收到温度转换命令后,开始启动转换。
转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。
单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB 形式表示。
2.5 时钟振荡电路与复位电路设计本次基于单片机数字式温度计的设计中,我采用了12M的晶振设计,这样有利于提高整个系统的性能。
AT89C51的部有反向放大器,在经过相应针脚的接入后,与反馈元件结合组成振荡器,所产生的时钟脉冲传递到各个部件,从而构成了部振荡。
电平复位是通过RST端经电阻和电源VCC接通而实现,本论文过手动按钮复位实现整个系统的复位功能。
图2.5 数字式温度计时钟振荡电路与复位电路设计2.6 温度调整电路与报警电路的设计通过对AT89C51单片机P3口的拓展,接入按钮进行脉冲调整实现对温度的加减控制。
P3.7口接入扬声器接收AT89C51的脉冲信号,通过蜂鸣声警示现系统实时温度的预警,黄色LED同时亮起起到警示作用。
图2.6 数字式温度计温度调整电路与报警电路设计3数字式温度计软件程序设计3.1 数字式温度计的程序划分本文的数字式温度计程序主要包括主程序、读出温度子程序、温度转换命令子程序、计算温度子程序,显示数据刷新子、报警子程序、延时子程序等。
3.2 数字式温度计的主程序主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。
这样可以实时刷新当前温度,更好的实现对温度的监控。
图3.1 数字式温度计主程序流程框图程序:void main(void){uint i,z;InitTimer(); //初始化定时器EA=1; //全局中断开关TR0=1;ET0=1; //开启定时器0IT0=1;IT1=1;//check_wendu();for(z=0;z<200;z++){Disp_init();}while(1){if(SET==0){Delay_DS18B20(2000);do{}while(SET==0);set_st++;x=0;shanshuo_st=1;if(set_st>2)set_st=0;}if(set_st==0){EX0=0; //关闭外部中断0EX1=0; //关闭外部中断1//check_wendu();i=ReadTemperature();Disp_Temperature(i);Alarm(); //报警检测}else if(set_st==1){BEEP=1; //关闭蜂鸣器EX0=1; //开启外部中断0EX1=1; //开启外部中断1if(x>=10){shanshuo_st=~shanshuo_st;x=0;} if(shanshuo_st) {Disp_alarm(shangxian);} }else if(set_st==2){BEEP=1; //关闭蜂鸣器EX0=1; //开启外部中断0EX1=1; //开启外部中断1if(x>=10){shanshuo_st=~shanshuo_st;x=0;}if(shanshuo_st) {Disp_alarm(xiaxian);}}}}3.2 数字式温度计的读出温度子程序出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
其程序流程图如图3.2所示:图3.2 数字式温度计读出温度子程序流程框图程序:unsigned int ReadTemperature(void){unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=0;Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0x44); //启动温度转换Init_DS18B20();Delay_DS18B20(100);Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器a=ReadOneChar(); //读低8位b=ReadOneChar(); //读高8位t=b;t<<=8;t=t|a;return(t);}3.3 数字式温度计的温度转换命令子程序温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。
温度转换命令子程序流程图如图 3.3所示:图3.3 数字式温度计温度转换命令子程序流程框图程序:1.初始化DS18B20void Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位Delay_DS18B20(8); //稍做延时DQ = 0; //单片机将DQ拉低Delay_DS18B20(80);//精确延时,大于480usDQ = 1; //拉高总线Delay_DS18B20(14);x = DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败Delay_DS18B20(20);}2.向DS18B20写一个字节void WriteOneChar(unsigned char dat) {unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;Delay_DS18B20(5);DQ = 1;dat>>=1;}}3.从DS18B20读一个字节unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 给脉冲信号dat>>=1;DQ = 1; // 给脉冲信号if(DQ)dat|=0x80;Delay_DS18B20(4);}return(dat);}3.4 数字式温度计的计算温度子程序计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图3.4所示:图3.4 数字式温度计计算温度子程序流程框图程序:Disp_Temperature(uint k){uchar i,tmph,tmpl,sign;k=ReadTemperature( );sign=(uchar)((k>>8)&0xf0);if(sign==0xf0){k=(~k)+1;Sign_Port=0;fu=1;}else {Sign_Port=1,fu=0;}tmpl=(uchar)(k&0x0f);tmph=(uchar)((k>>4)&0xff);tmpl=tmpl*0.625+0.5;tmpbuf[3]=tmpl/10;tmpbuf[2]=tmph%10;tmpbuf[1]=(tmph%100)/10;tmpbuf[0]=tmph/100;if(fu==1){if (tmpbuf[1]==0){tmpbuf[1]=11,tmpbuf[0]=10;}elsetmpbuf[0]=11;}else{if(tmpbuf[0]==0){tmpbuf[0]=10;if(tmpbuf[1]==0)tmpbuf[1]=10;}}for(i=0;i<40;i++){Display();}}3.5 数字式温度计的显示数据刷新子程序显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位。