《课程设计--基于AT89C51的单片机可调温度报警器设计.doc》由会员分享,可在线阅读,更多相关《课程设计--基于AT89C51的单片机可调温度报警器设计.doc(39页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、课程设计-基于AT89C51的单片机可调温度报警器设计 摘 要 在现代化的工业生产中,需要对周围环境的温度进行检测和控制。本小组针对温控报警问题展开思考,设计一个能根据需求设置低温到高温进行报警并通过液晶显示的系统。该系统使用89C51单片机,同时运用单线数字温度传感器DS18B20,LCD1602显示模块等模块可实现温度的检测。课题经过实验验证达到设计要求,具有一定的使用价值和推广价值。该作品使用液晶显示,可以清晰地显示当前的报警温度,使使用者使用时不会出错,安全可靠,可使用于各种食品储存室,植物养殖所等地方,使用性很高。关键字:温度报警器 温度上下限 AT89C51单片机 液晶LCD160
2、2 温度传感器DS18B20目 录一 课程设计任务21.1功能说明2二 整体设计方案22.1设计思路22.2整体框图22.3模块功能说明2三 硬件电路设计23.1各模块设计2的选择2的选择2选择23.2各模块分析289C51管脚图2 DS18B20引脚及管脚功能介绍2 LCD1602液晶显示介绍2四 控制软件设计及电路图24.1单片机模块电路图及分析24.2液晶显示模块电路图及分析24.3温度传感器模块电路图及分析2五 系统调试及遇到的问题2六 个人小结26.1组长 26.2 组员126.3组员22七 参考文献2八 附录28.1附录128.2附录228.3附录32一 课程设计任务1完成温度进行
3、测量,理论测量范围-55C+125C;2.将温度测量值通过LCD液晶显示模块显示;3.可以通过按键进行对上下限报警温度,自行设定并实现功能;二 整体设计方案根据功能要求,必须有单片机控制模块,LCD1602显示模块以及DS18B20的温度传感模块。各个模块都有其自己的功能。上电后,通过DS18B20可以检测到温度,并在显示器上显示。采用DS18B20的数字温度计结构框图 图1 温度报警器总电路图本系统共分为三块模块。单片机模块,这部分主要实现数据的处理,输出执行,报警设置功能显示模块可以分别显示实时温度值,温度上下限。温度传感模块的主要功能是通过DS18B20的强大功能实现对温度的采集及发送到
4、计算机。三 硬件电路设计 18B20简介DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。该装置信号线高的时候,内部电容器 储存能量通由1线通信线路给片子供电,而且在低电平期间为片子供电直至下一个高电平的到来重新充电。 DS18B20的电源也可以从外部3V-5 .5V的电压得到。 DS18B20采用一线通信接口。因为一线通信接口,必须在先完成ROM设定,否则记忆和控制功能将无法使用。主要首先提供以下功能命令之一: 1 )读ROM, 2 )ROM匹配, 3 )搜索ROM, 4 )跳过ROM, 5 )报警检查。这些指令操作作用在没有
5、一个器件的64位光刻ROM序列号,可以在挂在一线上多个器件选定某一个器件,同时,总线也可以知道总线上挂有有多少,什么样的设备。 若指令成功地使DS18B20完成温度测量,数据存储在DS18B20的存储器。一个控制功能指挥指示DS18B20的演出测温。测量结果将被放置在DS18B20内存中,并可以让阅读发出记忆功能的指挥,阅读内容的片上存储器。温度报警触发器TH和TL都有一字节EEPROM 的数据。如果DS18B20不使用报警检查指令,这些寄存器可作为一般的用户记忆用途。在片上还载有配置字节以理想的解决温度数字转换。写TH,TL指令以及配置字节利用一个记忆功能的指令完成。通过缓存器读寄存器。所有
6、数据的读,写都是从最低位开始。 89C51简介 89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROMFalsh Programmable and Erasable Read Only Memory)的低电压、高性能CMOS8位微处理器,俗称单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的89C51是一种高效微控制器。 LCD1602液晶简介采用LCD1602液晶显示模块,有体积小、功耗低、显示内容丰富、超薄轻巧等
7、优点,在袖珍式仪表和低功耗应用系统中得到广泛的应用。目前字符型液晶显示模块已经是单片机应用设计中最常用的信息显示器件。它可以显示两行,每行16个字符,采用单5V电源供电,外围电路配置简单,价格便宜,具有很高的性价比。89C51管脚图注:引脚说明:电源引脚Vcc(40脚):典型值5V。Vss(20脚):接低电平。外部晶振X1、X2分别与晶体两端相连接。当采用外部时钟信号时,X2接振荡信号,X1接地。输入输出口引脚:P0口:I/O双向口。作输入口时,应先软件置“ 1”。P1口:I/O双向口。作输入口时,应先软件置“ 1”。P2口:I/O双向口。作输入口时,应先软件置“ 1”。P3口:I/O双向口。
8、作输入口时,应先软件置“ 1”。控制引脚:RST/Vpd、ALE/-PROG、-PSEN、-EA/Vpp组成了MSC-51的控制总线。RST/Vpd(9脚):复位信号输入端(高电平有效)。第二功能:加+5V备用电源,可以实现掉电保护RAM信息不丢失。ALE/-PROG 30脚):地址锁存信号输出端。第二功能:编程脉冲输入。-PSEN(29脚):外部程序存储器读选通信号。-EA/Vpp 31脚):外部程序存储器使能端。第二功能:编程电压输入端(+21V)。 DS18B20引脚及管脚功能介绍注DQ:数字信号输入输出端。GND:电源地端。VDD:外接供电电源输入端 在寄生电源接线时此脚应接地 。 L
9、CD1602液晶显示介绍管脚功能1602采用标准的16脚接口第1脚:VSS为电源地第2脚:VDD接5V电源正极第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器 第5脚:RW为读写信号线,高电平 1 时进行读操作,低电平 0 时进行写操作第6脚:E 或EN 端为使能 enable 端 第714脚:D0D7为8位双向数据端 第1516脚:空脚或背灯电源。15脚背光正极,16脚背光负极 图3 单片机接线图P1接液晶数据口,P0接3个二极管,P2接8个按钮,P3.3接蜂鸣器,P3.4接液晶的RS
10、,P3.5接液晶的R/W,P3.6接液晶的EN,P3.7接温度传感器,其他按单片机最小系统连接。4.2液晶显示模块电路图及分析 图3 液晶接线图液晶显示模块的子程序:/*lcd1602程序*/ void delay1ms unsigned int ms /延时1毫秒(不够精确的) unsigned int i,j; for i 0;i ms;i+ for j 0;j 100;j+ ; void wr_com unsigned char com /写指令/ delay1ms 1 ; RS 0; RW 0; EN 0; P1 com; delay1ms 1 ; EN 1; delay1ms 1 ;
11、 EN 0; void wr_dat unsigned char dat /写数据/ delay1ms 1 ; RS 1; RW 0; EN 0; P1 dat; delay1ms 1 ; EN 1; delay1ms 1 ; EN 0; void lcd_init /初始化设置/ delay1ms 15 ; wr_com 0x38 ;delay1ms 5 ; wr_com 0x08 ;delay1ms 5 ; wr_com 0x0e ;delay1ms 5 ; wr_com 0x06 ;delay1ms 5 ; wr_com 0x01 ;delay1ms 5 ; void display u
12、nsigned char *p /显示/ while *p! 0 wr_dat *p ;p+;delay1ms 1 ; 图4温度传感器接线图温度传感器读取温度以及显示温度的子程序:/*ds1820程序*/ void delay_18B20 unsigned int i /延时1微秒 while i- ; void ds1820rst /*ds1820复位*/ unsigned char x 0; DQ 1; /DQ复位 delay_18B20 4 ; /延时 DQ 0; /DQ拉低 delay_18B20 100 ; /精确延时大于480us DQ 1; /拉高 delay_18B20 40
13、; uchar ds1820rd /*读数据*/ 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_18B20 10 ; return dat ; void ds1820wr uchar wdata /*写数据*/ unsigned char i 0; for i 8; i 0; i- DQ 0; DQ wdata&0x01; delay_18B20 10 ; DQ 1; wdata 1; read_temp /*读取温度值
14、并转换*/ uchar a,b; ds1820rst ; ds1820wr 0xcc ;/*跳过读序列号*/ ds1820wr 0x44 ;/*启动温度转换*/ ds1820rst ; ds1820wr 0xcc ;/*跳过读序列号*/ ds1820wr 0xbe ;/*读取温度*/ a ds1820rd ; b ds1820rd ; tvalue b; tvalue 8; tvalue tvalue|a; if tvalue 0x0fff tflag 0; else tvalue tvalue+1; tflag 1; tvalue tvalue* 0.625 ;/温度值扩大10倍,精确到1位
15、小数return tvalue ; /*/ void ds1820disp /温度值显示 uchar flagdat; disdata0 tvalue/1000+0x30;/百位数 disdata1 tvalue%1000/100+0x30;/十位数 disdata2 tvalue%100/10+0x30;/个位数 disdata3 tvalue%10+0x30;/小数位 if tflag 0 flagdat 0x20;/正温度不显示符号 else flagdat 0x2d;/负温度显示负号:- if disdata0 0x30 disdata0 0x20;/如果百位为0,不显示 if dis
16、data1 0x30 disdata1 0x20;/如果百位为0,十位为0也不显示 wr_com 0x89 ;wr_dat flagdat ;/显示符号位 wr_com 0x8a ; wr_dat disdata0 ;/显示百位 wr_com 0x8b ; wr_dat disdata1 ;/显示十位 wr_com 0x8c ; wr_dat disdata2 ;/显示个位 wr_com 0x8d ; wr_dat 0x2e ;/显示小数点 wr_com 0x8e ; wr_dat disdata3 ;/显示小数位 五 系统调试及遇到的问题开始我们只是做温度报警,因为温度传感器选择的是数字式温
17、度传感器,老师觉得过于简单,所以帮我们也想了很多其他功能。开机复位欢迎词的移动显示 unsigned char code str3 Welcome! ; unsigned char code str4 ; init_play /初始化显示 wr_com 0x80+0x10 ; /屏幕外等待 display str3 ; wr_com 0xc0+0x10 ; display str4 ; for num 0;num 16;num+ /屏幕左移 wr_com 0x18 ; delay1ms 200 ; 得到键盘值uchar GetKey /读取键值 uchar K; if P2 0xff retu
18、rn 0; /检查是否有键按下 delay1ms 10 ; switch P2 case 0xfe: K 1;break; case 0xfd: K 2;break; case 0xfb: K 3;break; case 0xf7: K 4;break; case 0xef: K 5;break; case 0xdf: K 6;break; case 0xbf: K 7;break; case 0x7f: K 8;break; default: K 0; while P2! 0xff ; Beep ; return K; 键盘值处理 void KeyProcess uchar Key /键盘处
19、理 uchar t 0; switch Key case 1:if h1 h2 & l h1 h1-; delay1ms 10 ;break;case 2:if h1 h2 & l h1 h1+;delay1ms 10 ;break; case 3:if h1 h2 & l h1 h2-;delay1ms 10 ;break; case 4:if h1 h2 & l h1 h2+;delay1ms 10 ;break;case 5:if h1 h2 & l h1 l-;delay1ms 10 ;break;case 6:if h1 h2 & l h1 l+;delay1ms 10 ;break
20、;case 7: lcd_init ;init_play2 ;delay1ms 10 ;break; 按键提示音 void Beep /蜂鸣器按键提示音 uchar i,j 70; for i 0;i 200;i+ while -j ; baojing 0; delay1ms 300 ; baojing 1; 温度比较以及处理都直接放在主程序中 void main uchar k; uchar Key; P2 0xff; lcd_init ;init_play ;/初始化显示 delay1ms 1000 ; lcd_init ;init_play2 ; while 1 read_temp ;/
21、读取温度 ds1820disp ;/显示Key GetKey ; if Key! 0 KeyProcess Key ;if Key! 7 lcd_init ;init_play1 ;delay1ms 10 ; k tvalue/10;if k h1 & k l /温度比较处理 led1 1;led2 0;led3 0;baojing 1; else if k h1 & k h2 while k h1 & k h2 led1 0;led3 0;led2 1;baojing 1;while k h1 & k h2 read_temp ;/读取温度 ds1820disp ;/显示Key GetKey
22、 ; if Key! 0 KeyProcess Key ;if Key! 7 lcd_init ;init_play1 ;delay1ms 10 ; k tvalue/10;delay1ms 600 ;led2 led2;baojing baojing; else if k h2 led1 0;led2 0;led3 1;baojing 0; else if k l led1 0;led2 0;led3 1;baojing 0; 一开始老师给我们加的功能让我们很为难,不知道怎么编所以我们都想推辞掉,不过在编写这些子程序的过程中慢慢的感觉很有趣,反而觉得挺简单的还是,但也会碰到很多问题,比如说显
23、示温度上下限的时候一开始无法显示数字出来的是乱码,重新编写后又变成了日文,后来看了参考书后,最后用了一个0到9的数组,要显示的数字从数组中取得,这样就好了,终于能显示出来了,但是发现它无法记时改变数字,要重新按键才会显示新的上下限温度,后来发现时键盘处理中有点问题,这个我们花了好久才解决的,就是把去掉一个按键处理,把它用if语句独立出来,这样后就能记时改变温度,还有一个问题是我们发现在报警时我们无法改变其温度上下限和其他按键,也就是报警时按键无效了,后来知道了我们的报警程序是用while组成,所以报警时一直在while语句中做循环,按键当然无效,这个的解决办法马上就能想到了,就是在while语
24、句中再加入读取键盘值和键盘值处理的子程序就ok了。其他别的小问题什么的我们组最后都很好的及时的解决了,这次的设计我们组觉得还是比较成功的,做出了比预期更好的设计来。六 个人小结从本次综合电子设计课程中,设计的结果基本符合设计的要求,我们也加了一些自己的想法。基本上算是比较满意的。在这次的设计的过程中我学到了很多,对很多相关的专业知识有了更深一层的理解,特别的对单片机这块。这次的设计,很好的将我们上学期学过的单片机进行复习并用于了实践之中,使我能更好的掌握其一般原理。另外,本次课程设计以小组的形式展开,这样一来不但提高了我们的动手能力,增强了团队合作的意识。在大学期间,从接触硬件的相关课程开始,
25、就已经对硬件产生了恐惧,不论是课程的学习,还是心中的看法。知道大三这学期开设了单片机课程,对我的人生观产生了巨大的影响。由于单片机是我们上学期学的,所以过了寒假过来开始以为特别难,因为一些知识有点忘记了。后来慢慢也就做下来了,虽然做的不是特别好。通过一个学期的学习发现单片机的确是一门很有用的课程,对今后的学习工作有很大的帮助,因为单片机目前在社会中有在和极其广泛的用途,各个地方都离不开它的。但是我觉得就我们在课堂上学到的这点知识还是极其有限的,更多的东西还靠我们自己去课下学习。老师只起到一个引导我们学习的作用,关键还是在于我们自己,这就是所谓的“师傅领进门,修行在个人”吧。冰冻三尺非一日之寒,
26、滴水穿石非一时之功,谨以此自勉!在我们三人小组里面,我负责的就是硬件这一块,由于我的焊接技术实在不怎么的,所以焊的很难看,因此还被老师批评工艺难看需改进,后来把硬件改进后的确是自己看的舒服别人也看的舒服。只有做不到,没有想不到,面对问题,我们不逃避。只有一步一步的去发现去探索才可以解决问题。在网上看到关于如何学习单片机的文章,里面说到,学习单片机一方面要提高自身的知识水平和编程能力,同是多看多学别人已经写好的模块也是一种好的方法。同是,小组里成员一起齐心协力分配好工作后一起努力就能把问题解决,所以合作也是很重要的。为期一周的单片机课程设计终于结束了,这一个星期真的蛮累的,大家都是忙忙碌碌的,我
27、也不例外,这次实训我被安排到了组长,因为寒假里带回家的面包板调试不出来,所以寒假里没怎么做,这礼拜就有点忙了,但还是感谢学校给我这次学习的机会,让我更加了解到单片机的有趣,和它的无穷魅力。 我给我的其他组员分别安排了工作,他们也积极地配合我一起完成这次的单片机设计,一开始我过了一个寒假有点生疏,想到编程就感觉自己这个不会那个不会的,后来慢慢的看点书慢慢的就开始有感觉了,老师觉得我们的设计太简单,不停地给我们组的设计加功能,一开始觉得挺为难的,不过还是会慢慢做出来,完成老师提的要求,并且也对自己的编程能力也得到了提高,几乎每天对我都有新的挑战,每天都要克服新的困难。 我在组中的工作主要是编程和监
28、制吧,帮助和监督他们焊接和调试还有拟论文等工作,大家学习和工作的都很融洽。 总而言之,单片机课程设计对于我们有很大的帮助,我们从中也受益匪浅。6.2 组员1在大学期间,从接触硬件的相关课程开始,就已经对硬件产生了恐惧,不论是课程的学习,还是心中的看法。知道大三这学期开设了单片机课程,对我的人生观产生了巨大的影响。由于单片机是我们上学期学的,所以过了寒假过来开始以为特别难,因为一些知识有点忘记了。后来慢慢也就做下来了,虽然做的不是特别好。通过一个学期的学习发现单片机的确是一门很有用的课程,对今后的学习工作有很大的帮助,因为单片机目前在社会中有在和极其广泛的用途,各个地方都离不开它的。但是我觉得就
29、我们在课堂上学到的这点知识还是极其有限的,更多的东西还靠我们自己去课下学习。老师只起到一个引导我们学习的作用,关键还是在于我们自己,这就是所谓的“师傅领进门,修行在个人”吧。冰冻三尺非一日之寒,滴水穿石非一时之功,谨以此自勉!在我们三人小组里面,我负责的就是硬件这一块,由于我的焊接技术实在不怎么的,所以焊的很难看,因此还被老师批评工艺难看需改进,后来把硬件改进后的确是自己看的舒服别人也看的舒服。只有做不到,没有想不到,面对问题,我们不逃避。只有一步一步的去发现去探索才可以解决问题。在网上看到关于如何学习单片机的文章,里面说到,学习单片机一方面要提高自身的知识水平和编程能力,同是多看多学别人已经
30、写好的模块也是一种好的方法。同是,小组里成员一起齐心协力分配好工作后一起努力就能把问题解决,所以合作也是很重要的。总的来说,本次课程设计对我而言,知识上的收获重要,精神上的丰收更加可喜。让我知道了学无止境的道理。我们每一个人永远不能满足于现有的成就,人生就像在爬山,一座山峰的后面还有更高的山峰在等着你。挫折是一份财富,经历是一份拥有。这次课程设计必将成为我人生旅途上一个非常美好的回忆!七 参考文献单片机C语言程序设计实训100例 编著 彭 伟流行单片机实用子程序及应用实例 编著 杨振江 杜铁军 李 群 C51基础与应用实例 编著 常喜茂 孔英会 付小宁单片机原理与接口技术 编著 刘 军单片机原
31、理与C51编程 编著 宋彩利 孙友仓 吴宏岐51单片机开发入门与经典实例 编著 王守中51单片机C语言教程 编著 郭天祥单片机程序设计及应用 编著 杨将新 李华军 刘东骏51单片机应用实例详解 编著 杨 欣 王玉凤 刘湘黔 张延强 w 百度文库 八 附录8.1附录1 总电路图温度报警器实物图器材清单名称型号数量液晶显示屏LCD1602c1数字温度传感器DS18B201单片机AT89C511二极管4键盘8电容147uF1电容220pF2复位开关1开关1晶振12MHz1蜂鸣器1三极管S90121电阻15106电阻210k1变压器PY-3981总程序图#include #define uchar u
32、nsigned char#define uint unsigned intsbit DQ P13;/ds18b20与单片机连接口sbit RS P24;sbit RW P25;sbit EN P26;sbit led1 P10;/绿灯sbit led2 P11;/白灯sbit led3 P12;/红灯sbit baojing P14; /蜂鸣器unsigned char code str1 Now temp: ;unsigned char code str2 Made by DJ SH AJ ; unsigned char code str3 Welcome! ; unsigned char
33、code str4 ; unsigned char code str5 L H1 H2 ; uchar shuzi 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39 ; /1602液晶09的显示uchar num;uchar l 8;h1 20;h2 22; /初始的L、H1、H2的值 void Beep ; /按键“滴”提示音函数uchar data disdata5;uint tvalue;/温度值uchar tflag;/温度正负标志/*lcd1602程序*/ void delay1ms unsigned int ms /延时1毫秒(不够
34、精确的) unsigned int i,j; for i 0;i ms;i+ for j 0;j 100;j+ ; void wr_com unsigned char com /写指令/ delay1ms 1 ; RS 0; RW 0; EN 0; P1 com; delay1ms 1 ; EN 1; delay1ms 1 ; EN 0; void wr_dat unsigned char dat /写数据/ delay1ms 1 ; RS 1; RW 0; EN 0; P1 dat; delay1ms 1 ; EN 1; delay1ms 1 ; EN 0; void lcd_init /初
35、始化设置/ delay1ms 15 ; wr_com 0x38 ;delay1ms 5 ; wr_com 0x08 ;delay1ms 5 ; wr_com 0x0e ;delay1ms 5 ; wr_com 0x06 ;delay1ms 5 ; wr_com 0x01 ;delay1ms 5 ; void display unsigned char *p /显示/ while *p! 0 wr_dat *p ;p+;delay1ms 1 ; init_play /初始化显示 wr_com 0x80+0x10 ; /屏幕外等待 display str3 ; wr_com 0xc0+0x10 ;
36、 display str4 ; for num 0;num 16;num+ /屏幕左移 wr_com 0x18 ; delay1ms 200 ; init_play1 /温度上下限的显示 uint a,b,c,d,e,f; a l/10; b l%10; c h1/10; d h1%10; e h2/10; f h2%10; wr_com 0x80 ; display str5 ; wr_com 0xc0 ; wr_dat shuzia ; wr_com 0xc1 ; wr_dat shuzib ; wr_com 0xc3 ; wr_dat shuzic ; wr_com 0xc4 ; wr_
37、dat shuzid ; wr_com 0xc6 ; wr_dat shuzie ; wr_com 0xc7 ; wr_dat shuzif ; init_play2 /当前温度显示 wr_com 0x80 ; display str1 ; wr_com 0xc0 ; display str2 ; /*ds1820程序*/ void delay_18B20 unsigned int i /延时1微秒 while i- ; void ds1820rst /*ds1820复位*/ unsigned char x 0; DQ 1; /DQ复位 delay_18B20 4 ; /延时 DQ 0; /D
38、Q拉低 delay_18B20 100 ; /精确延时大于480us DQ 1; /拉高 delay_18B20 40 ; uchar ds1820rd /*读数据*/ 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_18B20 10 ; return dat ; void ds1820wr uchar wdata /*写数据*/ unsigned char i 0; for i 8; i 0; i- DQ 0; DQ w
39、data&0x01; delay_18B20 10 ; DQ 1; wdata 1; read_temp /*读取温度值并转换*/ uchar a,b; ds1820rst ; ds1820wr 0xcc ;/*跳过读序列号*/ ds1820wr 0x44 ;/*启动温度转换*/ ds1820rst ; ds1820wr 0xcc ;/*跳过读序列号*/ ds1820wr 0xbe ;/*读取温度*/ a ds1820rd ; b ds1820rd ; tvalue b; tvalue 8; tvalue tvalue|a; if tvalue 0x0fff tflag 0; else tvalue tvalue+1; tflag 1; tvalue tvalue* 0.625 ;/温度值扩大10倍,精确到1位小数return