基于MATLAB在数理方程的应用精品资料.doc
目录摘要 31系统构成 42硬件部分 52.1电源电路52.2感温模块72.3按键模块92.4时钟模块 102.5单片机 102.6显示模块 162.7报警模块 173软件部分183.1主程序 183.2读出温度子程序 193.3温度转换命令子程序 203.4计算温度子程序 223.5显示温度子程序 23附 单片机程序254设计小结315参考资料31摘要 当今世界已进入信息时代,以计算机技术、电子和通信技术为代表的新技术正在迅速渗透到工业生产的各个领域,而计算机技术的飞速发展,对人类社会的发展起到了极大的推动作用。在现代化的工业生产中,需要对周围环境的温度进行检测和控制。本课程是基于单片机控制设计,设计一个能根据需求设置低温、高温上下限进行报警并通过液晶显示温度的系统。该系统使用AT89S52单片机,同时运用单线数字温度传感器DS18B20,LED显示模块,声音报警模块,按键设置,电源电路等模块,可实现对温度的检测报警。温度测量范围099.9摄氏度,设置上限报警温度、下限报警温度,当超出上下限时会报警,电源电压VCC为5V。课题经过实验验证达到设计要求,具有一定的使用价值和推广价值。该作品使用数码管显示,可以清晰地显示当前的温度,使用者使用时不会出错,安全可靠,可使用于各种食品储存室,植物养殖所等地方,使用性很高。关键字DS18B20 单片机 温度显示 温度报警一 系统构成系统结构主要由两大分组成,硬件部分和软件部分,硬件部分由电源电路,感温模块,时钟模块,按键模块,单片机,显示模块,报警模块组成。如图1.1 图1.1电路图 图1.2 如图1.2采用本单片机 AT89S52 处理采集信息,数字温度采集传感器 DS18B20 进行温度采集,及 LED 数码管温度显示,蜂鸣器温度报警。元器件清单 如表1.1名称型号参数说明电阻R110K1个电阻R2R91008个电阻R10R141K上拉电阻电容C1101个电容C2C330pF2个瓷片电容三极管Q1Q585004个晶振Y1120M1个数码管LED4个七段数码管按键K1K33个温度传感器U2DS18B201个蜂鸣器1个表1.1二 硬件部分2.1电源电路电源电路由变压器,单相桥式整流电路,型滤波,三端稳压器。如图2.1如图2.1变压器是这一电源电路起始部分,将220V的电网电压转变为本设计所需的较低的电压,就可以进行下一阶段的整流部分。一般规定v1为变压器的高压侧,v2为变压器的低压侧,v1侧的线圈要比v2侧的线圈要多,这样就可以将220V的电网电压降低,单相桥式整流电路,就是将交流电网电压转换为所需电压,整流电路由四只整流二极管组成。下面简单介绍一下单相桥式整流电路的工作原理,为简便起见,这里所选的二极管都是理想的二极管,二极管正向导通时电阻为零,反向导通时电阻无穷大。在v2的正半周,电流从变压器副边线圈的上端流出,经过二极管D1,再由二极管D4流回变压器,所以D1、D4正向导通,D2、D3反向截止,产生一个极性为上正下负的输出电压。在v2的负半周,其极性正好相反,电流从变压器副边线圈的下端流出,经过二极管D2,再由二极管D3流回变压器,所以D1、D4反向截止,D2、D3正向导通。桥式整流电路利用了二极管的单向导电性,利用四个二极管,是它们交替导通,从而负载上始终可以得到一个单方向的脉动电压滤波电路采用的是电解电容和陶瓷电容并联方式滤波,简单的讲就是电容两端电压升高时,电容充电,电压降低时,电容放电,让电压降低时的坡度变得平缓,从而起到滤波的作用。这里选用电解电容是因为电解电容单位体积的电容量非常大,能比其它种类的电容大几十到数百倍,并且其额定的容量可以做到非常大,价格比其它种类相比具有相当大的优势,因为其组成材料都是普通的工业材料,比如铝等等。三端稳压器MC78M05CT将输出电压稳定在+5V上2.2 感温模块采用一线制数字温度传感器DS18B20来作为温度传感器。传感器输出信号直接接到单片机的P3.6引脚上,如图2.2-图2.2DS18B20温度传感器是美国达拉斯(DALLAS)半导体公司推出的应用单总线技术的数字温度传感器。该器件将半导体温敏器件、A/D转换器、存储器等做在一个很小的集成电路芯片上。本设计中温度传感器之所以选择单线数字器件DS18B20,是在经过多方面比较和考虑后决定的,主要有以下几方面的原因:(1)系统的特性:测温范围为-55+125 ,测温精度为士0.5;温度转换精度912位可变,能够直接将温度转换值以16位二进制数码的方式串行输出;12位精度转换的最大时间为750ms;可以通过数据线供电,具有超低功耗工作方式。(2)系统成本:由于计算机技术和微电子技术的发展,新型大规模集成电路功能越来越强大,体积越来越小,而价格也越来越低。一支DS18B20的体积与普通三极管相差无几,价格只有十元人民币左右。(3)系统复杂度:由于DS18B20是单总线器件,微处理器与其接口时仅需占用1个I/O端口且一条总线上可以挂接几十个DS18B20,测温时无需任何外部元件,因此,与模拟传感器相比,可以大大减少接线的数量,降低系统的复杂度,减少工程的施工量。(4)系统的调试和维护:由于引线的减少,使得系统接口大为简化,给系统的调试带来方便。同时因为DS18B20是全数字元器件,故障率很低,抗干扰性强,因此,减少了系统的日常维护工作。DS18B20温度传感器只有三根外引线:单线数据传输总线端口DQ ,外供电源线VDD,共用地线GND。DS18B20有两种供电方式:一种为数据线供电方式,此时VDD接地,它是通过内部电容在空闲时从数据线获取能量,来完成温度转换,相应的完成温度转换的时间较长。这种情况下,用单片机的一个I/O口来完成对DS18B20总线的上拉。另一种是外部供电方式(VDD接+5V),相应的完成温度测量的时间较短。2.3 按键模块为了向单片机输入数据,控制系统的工作状况,本设计用到了三个按键接口,K1为进入/退出设置键;K2为增加键;K3为减少。如图2.3图2.3按键电路主要考虑的问题是按键开关去抖动问题,当按键未按下时,电位为高电平,按下时为低电平,但是由于按键开关的结构为机械弹性元器件,在按键按下和断开时,触点在闭合和断开瞬间会产生接触不稳定,引起电平不稳产生尖峰波,使CPU误认为按键数次接触和断开,引起一次操作进行多次处理,从而产生错误。为了消除抖动的不良后果,有硬件消除和软件消除两种,本课题采用硬件消除方法,且利用RC滤波电路来去抖动,RC滤波电路具有吸收干扰脉冲的作用,只要适当选择RC电路的时间常数,便可消除抖动的不良后果。当按键未按下时,电容C两端电压为零;当按键按下后,电容C两端电压不能突变,CPU不会立即接受信号,电源经R1向C充电,即使在按键按下的过程中出现抖动,只要RC电路的时间常数大于抖动电平变化周期,门的输出将不会改变。且VccR2/(R1+R2)值应大于门的高电平,R2C应大于抖动波形周期。2.4 时钟模块单片机内有一高增益反相放大器,连接即可构成自激震荡电路,震荡频率取决于石英晶体的震荡频率,范围可取1.212MHz,C1、C2主要起频率微调和稳定作用,电容值可取1030pF。如图2.4图2.42.5 单片机AT89S52是一种带8K字节闪烁可编程可擦除只读存储器(FPEROMFalsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。AT89S52是一种带8K字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89S52是它的一种精简版本。如图2.5 图2.5(1)主要特性:·与MCS-51 兼容 ·4K字节可编程闪烁存储器 ·寿命:1000写/擦循环·数据保留时间:10年·全静态工作:0Hz-24Hz·三级程序存储器锁定·128*8位内部RAM·32可编程I/O线·两个16位定时器/计数器·5个中断源 ·可编程串行通道·低功耗的闲置和掉电模式·片内振荡器和时钟电路(2)管脚说明:VCC:供电电压。GND:接地。P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P1口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为第八位地址接收。 P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口也可作为AT89S52的一些特殊功能口,如下表3-1所示:表2.1 P3口口管脚备选功能P3.0/RXD(串行输入口)P3.1/ TXD(串行输出口)P3.2/INT0(外部中断0)P3.3/INT1(外部中断1)P3.4 T0(记时器0外部输入)P3.5 T1(记时器1外部输入)P3.6/WR(外部数据存储器写选通)P3.7/RD(外部数据存储器读选通)表2.1P3口同时为闪烁编程和编程校验接收一些控制信号。RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次PSEN有效。但在访问外部数据存储器时,这两次有效的PSEN信号将不出现。EA/VPP:当EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,EA将内部锁定为RESET;当EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。(3)振荡器特性:XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。(4)芯片擦除:整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms 来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。此外,AT89S52设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,CPU停止工作。但RAM,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。2.6显示模块显示模块采用的4位动态共阳极数码管显示电路,如图2.6图2.6用数码管显示信息时,由于每个数码管至少需要8 个I/O 口,如果需要多个数码管,则需要太多I/O 口,而单片机的I/O 口是有限的。在实际应用中,一般采用动态显示的方式解决此问题。数码管动态显示的连接方式如图2.6所示。思考:所有数码管的段选全部连接在一起,如何能显示不同的内容呢?动态显示是多个数码管,交替显示,利用人的视觉暂留作用使人看到多个数码管同时显示。在编程时,需要输出段选和位选信号,位选信号选中其中一个数码管,然后输出段码,使该数码管显示所需要的内容,延时一段时间后,再选中另一个数码管,再输出对应的段码,高速交替。例如需要显示数字“12”时,先输出位选信号,选中第一个数码管,输出1 的段码,延时一段时间后选中第二个数码管,输出2 的段码。把上面的流程以一定的速度循环执行就可以显示出“12”,由于交替的速度非常快,人眼看到的就是连续的“12”在动态显示程序中,各个位的延时时间长短是非常重要的,如果延时时间长,则会出现闪烁现象;如果延时时间太短,则会出现显示暗且有重影。2.7报警模块由PNP三极管与扬声器组成接单片机的P3.7端口。如图3.7图3.7声报警电路采用蜂鸣器与单片机相连接,蜂鸣器要用三极管驱动,通过改变单片机P3.7口的电位,就可以达到控制蜂鸣器的目的。三 软件部分本课题采用C语言编写,主要用到单片机的端口是,感温模块的P3.6口,按键模块的P3.1到P3.3口,报警模块的P3.7口,显示模块的P1.0到P1.3口与P2.0口到P2.7口。使用 DS18B20 集成温度传感器, 采用循环扫描的方 法进行测温,由七段数码管做显示,AT89S52 单片机做处理控制,该电路 最大的特点是用可以直观方便的调节所要限定的温度值,上电后会显示当 前的温度值,按设定键时会显示设定温度值,这时可以按上/下调节键调整 设定温度值,再次按下设定键时返回当前温度显示同时会对设定温度值进 行保存,超过温度限制则进入报警程序。系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,按键扫描。3.1主程序主程序主要功能是负责温度的实时显示,读出并处理DS18B20测量当前的数量值,温度测量每1秒进行一次,这样可以在一秒内测量一次。四位动态显示初始调用显示子程序读出温度值温度转换开始命令温度计算处理显示数据1S到初次上电NYYN 图3.13.2读出温度子程序器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将55所对应的一个基数分别置入减法计数器1、温度寄存器中,计数器1和温度寄存器被预置在55所对应的一个基数值。减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。DS18B20复位命令跳过ROM命令读取温度命令读取操作,CRC校验移入温度暂存器9字节完CRC校验结束YNYN3.3温度转换命令子程序由表3.1可见,DS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。因此,在实际应用中要将分辨率和转换时间权衡考虑。高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。当DS18B20接收到温度转换命令后,开始启动转换。转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625LSB形式表示。当符号位S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。表2是一部分温度值对应的二进制温度数据。一部分温度对应值表温度/二进制表示十六进制表示+1250000 0111 1101 000007D0H+850000 0101 0101 00000550H+25.06250000 0001 1001 00000191H+10.1250000 0000 1010 000100A2H+0.50000 0000 0000 00100008H00000 0000 0000 10000000H-0.51111 1111 1111 0000FFF8H-10.1251111 1111 0101 1110FF5EH-25.06251111 1110 0110 1111FE6FH-551111 1100 1001 0000FC90H表3.1DS18B20温度转换时间表R1R0分辨率/位温度最大转向时间/ms00993.750110187.510113751112750表3.2温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。如图3.3DS18B20复位开始跳过ROM命令温度转换命令结束图3.33.4计算温度子程序DS18B20完成温度转换后,就把测得的温度值与RAM中的TH、TL字节内容作比较。若TTH或TTL,则将该器件内的报警标志位置位,并对主机发出的报警搜索命令作出响应。因此,可用多只DS18B20同时测量温度并进行报警搜索。在64位ROM的最高有效字节中存储有循环冗余检验码(CRC)。主机ROM的前56位来计算CRC值,并和存入DS18B20的CRC值作比较,以判断主机收到的ROM数据是否正确。计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图3.4开始温度零下温度取值补码“-”计算小数BCD值计算整数BCD值结束温度取值补码“+”XY 如图3.43.5显示温度子程序数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为12ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。如图主程序跳过ROM发送温度变换指令延时等待温度转换完成发送储存器命令传输得到的温度值显示处理得到显示后的值DS18B20初始化成功XY图3.5附 单片机程序#include <AT89X52.h>#include "DS18B20.h" #define uint unsigned int#define uchar unsigned char /宏定义#define SET P3_1 /定义调整键#define DEC P3_2 /定义减少键#define ADD P3_3 /定义增加键#define BEEP P3_7 /定义蜂鸣器bit shanshuo_st; /闪烁间隔标志bit beep_st; /蜂鸣器间隔标志sbit DIAN = P27; /小数点uchar x=0; /计数器signed char m; /温度值全局变量uchar n; /温度值全局变量uchar set_st=0; /状态标志signed char shangxian=38; /上限报警温度,默认值为38signed char xiaxian=5; /下限报警温度,默认值为38uchar code LEDData=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff;/*延时子程序*/void Delay(uint num) while( -num );/*初始化定时器0*/void InitTimer(void) TMOD=0x1; TH0=0x3c; TL0=0xb0; /50ms(晶振12M)/*定时器0中断服务程序*/void timer0(void) interrupt 1 TH0=0x3c; TL0=0xb0; x+;/*外部中断0服务程序*/void int0(void) interrupt 0 EX0=0; /关外部中断0 if(DEC=0&&set_st=1) shangxian-; if(shangxian<xiaxian)shangxian=xiaxian; else if(DEC=0&&set_st=2) xiaxian-; if(xiaxian<0)xiaxian=0; /*外部中断1服务程序*/void int1(void) interrupt 2 EX1=0; /关外部中断1 if(ADD=0&&set_st=1) shangxian+; if(shangxian>99)shangxian=99; else if(ADD=0&&set_st=2) xiaxian+; if(xiaxian>shangxian)xiaxian=shangxian; /*读取温度*/void check_wendu(void) uint a,b,c; c=ReadTemperature()-5; /获取温度值并减去DS18B20的温漂误差 a=c/100; /计算得到十位数字 b=c/10-a*10; /计算得到个位数字 m=c/10; /计算得到整数位 n=c-a*100-b*10; /计算得到小数位 if(m<0)m=0;n=0; /设置温度显示上限 if(m>99)m=99;n=9; /设置温度显示上限 /*显示开机初始化等待画面*/Disp_init() P2 = 0xbf; /显示- P1 = 0xf7; Delay(200); P1 = 0xfb; Delay(200); P1 = 0xfd; Delay(200); P1 = 0xfe; Delay(200); P1 = 0xff; /关闭显示/*显示温度子程序*/Disp_Temperature() /显示温度 P2 =0xc6; /显示C P1 = 0xf7; Delay(300); P2 =LEDDatan; /显示个位 P1 = 0xfb; Delay(300); P2 =LEDDatam%10; /显示十位 DIAN = 0; /显示小数点 P1 = 0xfd; Delay(300); P2 =LEDDatam/10; /显示百位 P1 = 0xfe; Delay(300); P1 = 0xff; /关闭显示/*显示报警温度子程序*/Disp_alarm(uchar baojing) P2 =0xc6; /显示C P1 = 0xf7; Delay(200); P2 =LEDDatabaojing%10; /显示十位 P1 = 0xfb; Delay(200); P2 =LEDDatabaojing/10; /显示百位 P1 = 0xfd; Delay(200); if(set_st=1)P2 =0x89; else if(set_st=2)P2 =0xc7; /上限H、下限L标示 P1 = 0xfe; Delay(200); P1 = 0xff; /关闭显示/*报警子程序*/void Alarm() if(x>=10)beep_st=beep_st;x=0; if(m>=shangxian&&beep_st=1)|(m<xiaxian&&beep_st=1)BEEP=0; else BEEP=1;/*主函数*/void main(void) uint z; InitTimer(); /初始化定时器 EA=1; /全局中断开关 TR0=1; ET0=1; /开启定时器0 IT0=1; IT1=1; check_wendu(); check_wendu(); for(z=0;z<300;z+) Disp_init(); while(1) if(SET=0) Delay(2000); dowhile(SET=0); set_st+;x=0;shanshuo_st=1; if(set_st>2)set_st=0; if(set_st=0) EX0=0; /关闭外部中断0 EX1=0; /关闭外部中断1 check_wendu(); Disp_Temperature(); Alarm(); /报警检测 else if(set_st=1) BEEP=1; /关闭蜂鸣器 EX0=1; /开启外部中断0 EX1=1; /开启外部中断1 if(x>=10)shanshuo_st=shanshuo_st;x=0; if(shanshuo_st) Disp_alarm(shangxian); else if(set_st=2) BEEP=1; /关闭蜂鸣器 EX0=1; /开启外部中断0 EX1=1; /开启外部中断1 if(x>=10)shanshuo_st=shanshuo_st;x=0; if(shanshuo_st) Disp_alarm(xiaxian); /*END*/DS18B20.h:#include <AT89X52.h>#define DQ P3_6 /定义DS18B20总线I/O/*延时子程序*/void Delay_DS18B20(int num) while(num-) ;/*初始化DS18B20*/void Init_DS18B20(void) unsigned char x=0; DQ = 1; /DQ复位 Delay_DS18B20(8); /稍做延时 DQ = 0; /单片机将DQ拉低 Delay_DS18B20(80); /精确延时,大于480us DQ = 1; /拉高总线 Delay_DS18B20(14); x = DQ; /稍做延时后,如果x=0则初始化成功,x=1则初始化失败 Delay_DS18B20(20);/*读一个字节*/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);/*写一个字节*/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; /*读取温度*/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(); WriteOneChar(0xCC); /跳过读序号列号的操作 WriteOneChar(0xBE); /读取温度寄存器 a=ReadOneChar(); /读低8位 b=ReadOneChar(); /读高8位 t=b; t<<=8; t=t|a; tt=t*0.0625; t= tt*10+0.5; /放大10倍输出并四舍五入 return(t);/*END*/序四 设计小结通过本次单片机设计,我学到了很多,对很多相关的专业知识有了更深一层的理解掌握,特别是对单片机嵌入式系统开发。这次的设计,很好的将我们第二学期学过的单片机课程进行复习并用于了实践之中,使我能更好的掌握其一般原理。本次课程设计使我理解单片机是一门很有意义的课程,特别是近几年单片机的应用已经融入到了我们人类生活中,各个地方都离不开它的。今后工作或者学习我们更应该重视它,它不仅仅只是一门课程,也是一门学问。本次单片机设计我觉得我只看到了单片机的一角,所以我们