您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 数电课程设计-数字温度计-
11.设计务任和要求1.1、基本范围-55℃——125℃1.2、精度误差小于0.5℃1.3、LED数码直读显示1.4、可以任意设定温度的上下限报警功能2.系统总体方案及硬件设计2.1数字温度计设计方案论证2.1.1方案一由于本设计是测温电路,可以使用热敏电阻之类的器件利用其感温效应,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来,这种设计需要用到A/D转换电路,其中还涉及到电阻与温度的对应值的计算,感温电路比较麻烦。而且在对采集的信号进行放大时容易受温度的影响从而出现较大的偏差。2.1.2方案二考虑到用温度传感器,在单片机电路设计中,大多都是使用传感器,所以这是非常容易想到的,所以可以采用一只温度传感器DS18B20,此传感器,可以很容易直接读取被测温度值,进行转换,电路简单,精度高,软硬件都以实现,而且使用单片机的接口便于系统的再扩展,满足设计要求。从以上两种方案,很容易看出,采用方案二,电路比较简单,费用较低,可靠性高,软件设计也比较简单,故采用了方案二。2.2系统总体设计温度计电路设计总体设计方框图如图2.1所示,控制器采用单片机STC89C52,温度传感器采用DS18B20,用4位LED数码管以串口传送数据实现温度显示。图2.1有了总体设计方案后,下面就是原理图的制作了。原理图如下图2.2及图2.3示。2将数码管电路与主控制电路分开画,最后两者是用导线连接。数码管位选接P20—P23,段选接P0口。图2.2数码管电路图2.3单片机控制电路2.3模块简介系统由单片机最小系统、显示电路、按键、温度传感器等组成。32.3.1主控制器单片机STC89C52具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。晶振采用12MHZ。复位电路采用上电加按钮复位。图2.4晶振电路图2.5复位电路2.3.2显示电路显示电路采用4位共阴极LED数码管,P0口由上拉电阻提高驱动能力,作为段码输出并作为数码管的驱动。P2口的低四位作为数码管的位选端。采用动态扫描的方式显示。2.3.3温度传感器DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。DS18B20的性能特点如下:1、独特的单线接口仅需要一个端口引脚进行通信;2、多个DS18B20可以并联在惟一的三线上,实现多点组网功能3、无须外部器件;4、可通过数据线供电,电压范围为3.0~5.5V;5、零待机功耗;6、温度以9或12位数字;7、用户可定义报警设置;8、报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;9、负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最大为10us。采用寄生电源供电方式时VDD端接地。由于单线制只有一根线,因此发送接口必须是三态的。图2.6温度传感器与单片机的连接2.3.4报警温度调整按键本系统设计三个按键,采用查询方式,一个用于选择切换设置报警温度和当前温度,另外两个分别用于设置报警温度的加和减。均采用软件消抖。4图2.7按键电路3.系统软件算法分析系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序,按键扫描处理子程序等。3.1主程序流程图主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。这样可以在一秒之内测量一次被测温度,其程序流程见图3.1所示。图3.1主程序流程图3.2读出温度子程序读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。其程序流程图如图3.2示3.3温度转换命令子程序温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。温度转换命令5子程序流程图如图3.3所示图3.2读文读流程图图3.3温度转换流程图3.4计算温度子程序计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图3.4所示。3.5显示数据刷新子程序显示数据刷新子程序主要是对分离后的温度显示数据进行刷新操作,当标志位位为1时将符号显示位移入第一位。程序流程图如图3.5。图3.4计算温度流程图图3.5显示数据刷新流程图3.6按键扫描处理子程序按键采用扫描查询方式,设置标志位,当标志位为1时,显示设置温度,否则显示当前温度。如下图3.6示。6图3.6按键扫描处理流程图4.电路仿真通过仿真软件验证该原理图的可行性。采用protues软件对电路仿真,可以得到预期效果。因protues软件中没有STC89C52故用AT89C52代替。仿真图如图4.1示。图4.1电路仿真图7右图4.2为温度传感器的仿真效果图,此图验证了传感器的温度与数码管显示的数字一致。当按下SET键一次时,进入温度报警上线调节,此时显示软件设置的温度报警上线,按ADD或DEC分别对报警温度进行加一或减一。当再次按下SET键时,进入温度报警下线调节,此时显示软件设置的温度报警下线,按ADD或DEC分别对报警温度进行加一或减一。当第三次按下SET键时,退出温度报警线设置。显示当前温度。共阳极七段式数码管上拉电阻一般多少欧?可以使470欧姆控制在5mA到10mA之间就好了。电流大了亮度就高。共阴极数码管共阴就把黑表笔(地)随便接一个管脚上,然后用红表笔在其他管脚上试没有亮的就把黑表笔换个管脚,有亮的记得是第几个数码管亮。在电路图中,数码管左下端由ABCDEFGDP字母,把他们所对应的数码管上的脚与单片机32-39脚相连,数码管有下端有1234,它们就是COM1234.注意单片机插座AT89C52复位系统10K电阻10uF、2M的晶振、30pF×2按钮开关4位共阴极数码管DS18B20按键4,1K电阻3个、10K一个,三极管8550200欧姆12个蜂鸣器杜邦线20根8程序源代码#includereg52.h#includeintrins.h//_nop_();延时函数用#definedmP0//段码输出口#defineucharunsignedchar#defineuintunsignedintsbitDQ=P2^7;//温度输入口sbitw0=P2^0;//数码管4sbitw1=P2^1;//数码管3sbitw2=P2^2;//数码管2sbitw3=P2^3;//数码管1sbitbeep=P1^7;//蜂鸣器和指示灯sbitset=P2^6;//温度设置切换键sbitadd=P2^4;//温度加sbitdec=P2^5;//温度减inttemp1=0;//显示当前温度和设置温度的标志位为0时显示当前温度uinth;uinttemp;ucharr;ucharhigh=35,low=20;ucharsign;ucharq=0;uchartt=0;ucharscale;//**************温度小数部分用查表法***********//ucharcodeditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};//小数断码表ucharcodetable_dm[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};//共阴LED段码表0123456789不亮-uchartable_dm1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//个位带小数点的断码表uchardatatemp_data[2]={0x00,0x00};//读出温度暂放uchardatadisplay[5]={0x00,0x00,0x00,0x00,0x00};//显示单元数据,共4个数据和一个运算暂用/*****************11us延时函数*************************/voiddelay(uintt){for(;t0;t--);}voidscan(){9intj;for(j=0;j4;j++){switch(j){case0:dm=table_dm[display[0]];w0=0;delay(50);w0=1;//xiaoshucase1:dm=table_dm1[display[1]];w1=0;delay(50);w1=1;//geweicase2:dm=table_dm[display[2]];w2=0;delay(50);w2=1;//shiweicase3:dm=table_dm[display[3]];w3=0;delay(50);w3=1;//baiwei//else{dm=table_dm[b3];w3=0;delay(50);w3=1;}}}}//***************DS18B20复位函数************************/ow_reset(void){charpresence=1;while(presence){while(presence){DQ=1;_nop_();_nop_();//从高拉倒低DQ=0;delay(50);//550usDQ=1;delay(6);//66uspresence=DQ;//presence=0复位成功,继续下一步}delay(45);//延时500uspresence=~DQ;}DQ=1;//拉高电平}/****************DS18B20写命令函数************************///向1-WIRE总线上写1个字节voidwrite_byte(ucharval){uchari;for(i=8;i0;i--){DQ=1;_nop_();_nop_();//从高拉倒低DQ=0;_nop_();_nop_();_nop_();_nop_();//5usDQ=val&0x01;//最低位移出delay(6);//66us10val=val/2;//右移1位}DQ=1;delay(1);}/****************DS18B20读1字节函数************************///从总线上取1个字节ucharread_byte(void){uchari;ucharvalue=0;for(i=8;i0;i--){DQ=1;_nop_();_nop_();value=1;DQ=0;_nop_();_nop_();_nop_();_nop_();//4usDQ=1;_nop_();_nop_();_nop_();_nop_();//4usif(DQ)value|=0x80;delay(6);//66us}DQ=1;return(value);}/*****************读出温度函数************************/read_temp(){ow_reset();//总线复位delay(200);write_byte(0xcc);//发命令write_byte(0x44);//发转换命令ow_reset();delay(1);write_byte(0xcc);//发命令write_byte
本文标题:数电课程设计-数字温度计-
链接地址:https://www.777doc.com/doc-5845067 .html