版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录摘要 2Abstract 31.实习任务及要求 4实习目的 4实习任务 4实习要求 52.基本原理 6数字时钟基本原理 6温度计工作基本原理 6频率计工作基本原理 63.方案论证 7键盘显示接口部分 7温度计部分 74.硬件设计 9最小系统设计 9晶振振荡器电路 9复位电路 9下载电路 11键盘电路 12显示电路 13数码管结构 13显示器工作原理 14温度传感器电路设计 16的工作原理 16的测温原理 19总电路 215.软件设计 22主程序流程图 22定时器0中断处理流程图 23时钟子程序 24温度子程序 25双机通信 26频率计子程序 28程序清单 286.仿真分析 41数字时钟仿真分析 41温度计仿真 43频率计仿真 457.实物运行照片 488小结 51参考文献 52摘要本次单片机实习的主要目的是巩固单片机的理论知识及锻炼实际动手能力。主要任务是在最小系统的基础上设计键盘显示电路,然后编程实现数字时钟,数字温度计和数字频率计。其中数字时钟要有调时调分调秒的功能;而温度计能完成串行通信,将温度显示在另一个单片机上.最后要求整个系统能通过按键实现数字时钟及温度计和频率计之间的相互切换。在实习过程要记录每天的实习内容包括方案的论证,硬件设计,软件设计,仿真分析及实物制作等。关键词:单片机,数字时钟,温度计,频率计AbstractThemaingoaloftheSingleChipMicrocomputerpracticeistorenforcethespeculativeknowledgeandtraintheabilityofhandwork.ThemaintaskistodesignthekeyboarddisplaycircuitonthebaseofDIY.Thenweshouldprogrammetorealizethedigitalclock,digtalthermometeranddigitalfrequencymeter.what’more,thedigitalclockisrequiredtohavethefunctionofadjustthesecond,muinuteandhour.TheDigtalthermometerisrequiredtoaccomplishthecommunicationoftwoSingleChipMicrocomputers,thetemperaturecanbedisplayedonthesecondSingleChipMicrocomputer.Atlast,thewholesystemisrequiredtorealizethemutualswitchbetweentheclockandthethermometer,theclockandthefrequencymeter.Inthepracticecourse,weshouldwritedownthepracticecontentseveryday,includingthechoiceofscheme,hardwaredesign,softwaredesign,simuationanalysis,makingmaterialobjectandsoon.Keywords:SingleChipMicrocomputer,digitalclock,digtalthermometer,digitalfrequencymeter1.实习任务及要求实习目的1、巩固《单片机原理及应用》理论课的理论知识;2、熟悉单片机应用系统的硬件设计及软件设计的基本方法;3、将《单片机原理及应用》理论课的理论知识应用于实际的应用系统中;4、训练单片机应用技术,锻炼实际动手能力。实习任务(1)利用上述材料完成单片机最小系统的设计、焊接、调试;(2)完成ISP下载电路的设计、焊接;(3)完成应用系统扩展电路部分的设计、焊接、调试,应用系统扩展电路的具体要求如下:1)键盘、显示电路利用单片机最小系统、6个7段LED数码管、12个按键,设计制作一个键盘、显示电路。可以使用8279键盘显示接口电路,也可以使用单片机的并行接口作为键盘显示接口。2)数字时钟在键盘、显示电路的基础上完成一个数字时钟的设计,完成以下功能:要求以24小时计时方式显示时、分、秒;时、分、秒可以通过按键分别调整。3)数字温度计在上题的硬基础上,制作一个数字温度计。完成以下功能:利用DS18B20可编程1-Wire数字温度传感器芯片,或利用AD590温度传感器芯片和A/D转换器芯片采集温度温度信号;当按下键盘上的温度显示按键时将实时温度信息显示在LED显示器上,当按下键盘上的时钟显示按键时,恢复时钟的正常显示;通过串行通信的方式,将采集到的实时温度信息送至第二个单片机系统,并在二个单片机系统显示实时温度。4)数字频率计在上题的硬基础上,制作一个数字频率计。完成以下功能:利用MCU设计一个数字频率计,用于检测0~500kHz周期信号的频率,输入信号幅度范围:0.1~10V;当按下键盘上的频率显示按键时将测量的频率信息显示在LED显示器上,当按下键盘上的时钟显示按键时,恢复时钟的正常显示;(4)利用仿真软件完成系统仿真工作;(5)完成系统软件的设计,包括程序结构设计、流程图绘制、程序设计。实习要求1)利用PROTEL等软件进行硬件设计;2)利用KeiluV2软件完成应用系统软件设计;3)利用PROTEUS软件进行仿真设计;4)完成单片机最小系统和应用系统电路板的焊接;5)对电路进行调试;6)利用stc-isp软件完成在系统编程、下载,并完成系统软件调试;7)题目由指导教师提供;8)要求每个学生单独完成硬件软件设计、仿真、焊接、调试任务;9)写出实习报告,实习报告主要包括以下内容:目录、摘要、关键词、基本原理、方案论证、硬件设计、软件设计(带流程图、程序清单)、仿真结果、实物运行结果照片、结论、参考文献等;10)实习完成后通过答辩;11)答辩时交实习报告电子文档,通过答辩后根据修改意见修改并打印、装订成册。2.基本原理数字时钟基本原理数字时钟是利用单片机的内部的定时/计数器工作及定时方式,对机器周期计数形成基准时间(如10ms),然后用另外一个计数器或软件计数的形式对基准时间里德计数形成秒(如对10ms计数100次),“秒”计数60次形式“分”,“分”计数60次形成“时”,然后通过软件程序使它们的内容在相应的位置显示出来。在具体设计时定时器采用中断方式工作,对时钟的形成在终中断程序中实现,在主程序中只是对定时/计数器的定义初始化,调用显示程序。并在设计中加入了按键,可以通过按键对时,分,秒进行调整。2.2温度计工作基本原理在单片机电路设计中,大多都是使用传感器,所以可以采用一个温度传感器,它会将温度转换成数字量后存贮在自身内部,将其连在单片机的一个IO口,即一种单总线串行接口,然后通过软件程序在数码管或液晶屏上显示出来就可以直接读取被测温度值。2.3频率计工作基本原理频率计的基本设计原理是直接用十进制数字显示被测信号频率。所谓频率,就是周期信号在单位时间(1s)内变化的次数。若在一定时间间隔T内测得这个周期信号的重复变化次数N,则其频率可表示为f=N/T。即可利用单片机内部的定时/计数器来对外部输入脉冲进行计数,从而测得频率。3.方案论证键盘显示接口部分方案一:使用8279键盘显示接口电路,即键盘和显示器通过8279芯片然后再接到单片机上,8279可以通过对键盘的自动扫描,将键盘信号存入FIFORAM里,再通过显示子程序显示按键的信息。具体来说,扫描输出线,通过138译码后,作为列及回送线交叉成键,输出数据分别用三位来体现扫描码和回送码,读键时屏蔽高两位,使键值正好等于输出数据的查表值,从而在数码管上显示出来。方案二:使用单片机的并行接口作为键盘显示接口,即键盘引脚直接接到单片机的IO口上。从以上两种方案可以看出,方案一占用的单片机IO口少,精度高,稳定性好,但导致整个电路所用芯片增加,成本提高。相比较而言方案二虽然占用单片机的IO口较多,但这个可以通过设计矩阵键盘来解决,并且也较方案一所用的芯片少,降低了成本。综合考虑选择方案二。方案一:采用热电偶温差电路测温,温度检测部分可以使用低温热偶,热电偶由两个焊接在一起的异金属导线所组成,热电偶产生的热电势由两种金属的接触电势和单一导体的温差电势组成。通过将参考结点保持在已知温度并测量该电压,便可推断出检测结点的温度。数据采集部分则使用带有A/D通道的单片机,在将随被测温度变化的电压或电流采集过来,进行A/D转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来。热电偶的优点是工作温度范围非常宽,且体积小,但是它们也存在着输出电压小、容易遭受来自导线环路的噪声影响以及漂移较高的缺点,并且这种设计需要用到A/D转换电路,感温电路比较麻烦。系统主要包括对A/D0809的数据采集,自动手动工作方式检测,温度的显示等,这几项功能的信号通过输入输出电路经单片机处理。此外还有复位电路,晶振电路,启动电路等。故现场输入硬件有手动复位键、A/D转换芯片,处理芯片为51芯片,执行机构有4位数码管、报警器等。方案二:采用数字温度芯片DS18B20测量温度,输出信号全数字化。便于单片机处理及控制,省去传统的测温方法的很多外围电路。且该芯片的物理化学性很稳定,它能用做工业测温元件,此元件线形较好。在0—100摄氏度时,最大线形偏差小于1摄氏度。DS18B20的最大特点之一采用了单总线的数据传输,由数字温度计DS18B20和微控制器AT89S51构成的温度测量装置,它直接输出温度的数字信号,可直接及计算机连接。这样,测温系统的结构就比较简单,体积也不大。采用51单片机控制,软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制,而且体积小,硬件实现简单,安装方便。既可以单独对多DS18B20控制工作,还可以及PC机通信上传数据,另外AT89S51在工业控制上也有着广泛的应用,编程技术及外围功能电路的配合使用都很成熟。【1】该系统利用AT89S51芯片控制温度传感器DS18B20进行实时温度检测并显示,能够实现快速测量环境温度,并可以根据需要设定上下限报警温度。该系统扩展性非常强,它可以在设计中加入时钟芯片DS1302以获取时间数据,在数据处理同时显示时间,并可以利用AT24C16芯片作为存储器件,以此来对某些时间点的温度数据进行存储,利用键盘来进行调时和温度查询,获得的数据可以通过MAX232芯片及计算机的RS232接口进行串口通信,方便的采集和整理时间温度数据。从以上两种方案,容易看出方案一的测温装置可测温度范围宽、体积小,但是线性误差较大。方案二的测温装置电路简单、精确度较高、实现方便、软件设计也比较简单,故本次设计采用了方案二。4.硬件设计晶振振荡器电路单片机是一个复杂的同步时序电路,为了保证同步工作方式的实现,其所有的工作都在唯一的时钟信号控制下严格的按时序进行的。时序就是单片机内部以及内部及外部互联必须遵守的规律。单片机的时序可以通过两种方式产生:内部振荡方式和外部振荡方式。外部振荡方式需要引入外部时钟信号作为单片机的时钟信号,它可以使各单片机之间的时钟信号同步,常用于多片单片机组成的系统中,而本次设计只需使用一片单片机,所以本次系统设计采用了内部振荡方式。单片机内部有一个用于构成振荡器的高增益反相放大器,引脚X1和X2分别是该放大器的输入端和输出端。这个放大器及作为反馈原件的片外石英晶体及电容一起构成一个自激振荡器。电容C1和C2通常取30pF,对振荡器有微调的作用。晶振的实际频率及标称频率的关系为:ƒx为实际频率,ƒ0为标称频率,ƒ0~12MHz。所以本设计晶振Y采用12HMz,电容C1和C2取30pF,则ƒx为12MHZ。图4-1振荡电路4.复位电路单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。除了进入系统的正常初始化之外,由于程序运行出错或者操作出错而使单片机系统处于死锁状态,为了摆脱死锁状态,也需要使单片机重新启动。单片机的复位操作一般有上电自动复位和按键电平复位两种方式。本设计采用上电自动复位和按键电平复位都有的复位电路。手动按键复位需要人为在复位输入端RESET上通过按钮加入高电平,其复位过程是:当按下按键S时,RESET端直接及VCC相连,从按下按键到松开按键的时间内,能使RESET端维持一段时间的高电平,这段时间的高电平使单片机复位。当按键被松开后,RESET端回到低电平,单片机系统完成复位,恢复正常工作状态。上电复位电路是在RESET复位输入引脚上接一电容至VCC端,下接一个电阻到地。上电复位的工作过程是:在系统上电瞬间,电容相当于短路,电源电压通过电容加给RESET引脚以高电平信号,此高电平信号随着VCC对电容的充电过程而逐渐回落,在其高电平期间,系统复位;当电容两端电压达到电源电压时,电容充电电流为零,电容相当于开路,RESET端为低电平,单片机复位完成,恢复正常工作状态。这里要注意的是,要想实现复位,必须保证复位信号高电平持续时间大于两个机器周期,而。本设计的单片机机器周期为:。而,所以满足要求。图4-2复位电路图4-3最小系统电路4.2下载电路MAX232是电平转换芯片。1970年,美国电气学会规定“RS232”串口通信协议。规定逻辑“1”,-5—-15V;逻辑“0”,+5—+15.噪声容限为2V.要实现利用串口及单片机进行通信,就要进行电平转换,把标准转化成单片机可以识别的。MAX220—MAX249都是电平转换芯片,在单片机最小系统中,使用MAX232.图4-4下载电路4.3键盘电路键盘分编码键盘和非编码键盘,键盘上闭合键的识别由专用的硬件编码器实现,并产生按键编码号或键值的称为编码键盘,如计算机键盘。而靠软件编程来识别的称为非编码键盘,在单片机组成的各种系统中,用的最多的是非编码键盘,也有用到编码键盘的,我们这里用的就是非编码键盘。在这种非编码键盘的单片机系统中,键盘处理程序首先执行有无按键按下的程序段,当确认有按键按下后,下一步就要识别哪一个按键被按下,对键的识别常采用逐行(逐列)扫描的方法。单片机检测按键是否被按下的依据是检测及该键对应的I/O口是否为低电平。判断键盘哪一个键被按下。方法是:一次给行线送低电平,然后查所有列线状态,称为行扫描,如果全为1,则所按下键不在此行,如果不全为1,则所按下键必在此行,而且是在及零电平列线相交的交点上的那个键。本设计中有2*4矩阵键盘和独立键盘。矩阵键盘可以有效的减少键盘及单片机接口时所占用的I/O接口。图4-5键盘电路如图所示,2*4矩阵键盘的行线和列线者接到了单片机的P3口。S1,S2,S3,S4为独立键盘。4.4显示电路4.4.1数码管结构数码管内部有8个发光二极管,公共端由8个发光二极管的阴极并接而成,正常显示时公共端接低电平(GND),各发光二极管是否点亮取决于a-dp各引脚上是否是高电平。LED数码管的外形结构如图4-5,外部有10个引脚,其中3,8脚为公共端也称位选端,其余8个引脚称为段选端,当要使某一位数码管显示某一数字((0-9中的一个)必须在这个数码管的段选端加上及数字显示数字对应的8位段选码(也称字形码),在位选端加上低电平即可。LED有共阴极和共阳极两种。如图4-5所示。二极管的阴极连接在一起,通常此公共阴极接地,而共阳极则将发光二极管的阳极连接在一起,接入+5V的电压。一位显示器由8个发光二极管组成,其中7个发光二极管构成字型“8”的各个笔划(段)a~g,另一个小数点为dp发光二极管。当在某段发光二极管施加一定的正向电压时,该段笔划即亮;不加电压则暗。符号和引脚共阴极共阳极图4-6LED结构图表4-1LED显示段码字型共阳极段共阴极段字型共阳极段共阴极段0C0H3FH990H6FH1F9H06HA88H77H2A4H5BHB83H7CH3B0H4FHCC6H39H499H66HDA1H5EH592H6DHE86H79H682H7DHF84H71H7F8H07H空白FFH00H880H7FHP8CH73H4.4.2LED显示器工作原理:(1)LED静态显示方式LED显示器工作于静态显示方式时,各位的共阴极连接在一起并接地;每位的段码分别及8位的锁存器输出相连。各个LED的显示字符一经确定,相应锁存的段码输出将维持不变,直到送入另一个字符为止,故静态显示器的亮度较高。(2)LED动态显示方式 在多位LED显示时,为简化硬件电路,通常将所有的段码线相应段并联在一起,由1个8位I/0口控制,形成段码线的多路复用,而各位的共阴极分别由相应的I/O线控制,形成各位的分时选通。设计中采用八个共阴LED管,其中段码线采用CD4511译码占用4位I/O口,而位选信号使用74LS138占用3个I/O口,则只要7个I/O口。由于各位的段码线并联,4位I/O口输出的段码对各个显示位来说都是相同的。因此,在同一时刻,如果各位选线都处于选通状态的话,8位LED将显示相同的字符。若要各位LED能够同时显示出及本位相应的显示字符,就必须采用动态显示方式,即在某一时刻,只让某一位的位选线处于选通状态,而其它各位的位选线处于关闭状态,同时,段码线上输出相应位要显示的字符的段码。这样,在同一时刻,8位LED中只有选通的那1位显示出字符,而其他7位则是熄灭的。同样,在下一时刻,只让下一位的位选线处于选通状态,而其他各位的位选线处于关闭状态,在段码线上输出将要显示字符的段码,则同一时刻,只有选通位显示出将要显示的字符,而其他各位则是熄灭的。如此循环下去,就可以使各位显示出将要显示的字符。虽然这些字符是在不同时刻出现的,而在同一时刻,只有一位显示,其他各位熄灭,但由于LED显示器的余辉和人眼的视觉暂留作用,只要每位显示间隔足够短,则可以造成多位同时亮的假象,达到同时显示的效果。发光二极管从导通到发光有一定的延时,导通时间太短,则发光太弱,人眼无法看清;但也不能太长,因为要受限于临界闪烁频率,而且此时间越长,占用CPU时间也越多。另外,显示位数增多,也将占用大量的CPU时间,因此动态显示的实质是以牺牲CPU时间来换取器件的减少。本次设计中,6位LED七段数码管采用共阴极接法。图4-7显示电路如图所示,单片机的P0口通过U2锁存器(74HC573)及数码管相连,来实现位选;通过U3及数码管相连来实现段选。4.5温度传感器电路设计根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:1.每一次读写之前都必须要对DS18B20进行复位;2.复位成功后发送一条ROM指令;3.最后发送RAM指令,这样才能对DS18B20进行预定的操作。复位要求主CPU将数据线下拉500微秒,然后释放,DS18B20收到信号后等待15~60微秒左右后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。其工作时序包括初始化时序、写时序和读时序,具体工作方法如图4-8,4-9,4-10所示。初始化时序图4-8初始化时序Ω上拉电阻将总线拉高,延时15~60us,并进入接受模式,以产生低电平应答脉冲,若为低电平,再延时480us。(2)写时序图4-9写时序写时序包括写0时序和写1时序。所有写时序至少需要60us,且在2次独立的写时序之间至少需要1us的恢复时间,都是以总线拉低开始。写1时序,主机输出低电平,延时2us,然后释放总线,延时60us。写0时序,主机输出低电平,延时60us,然后释放总线,延时2us。(3)读时序图4-10读时序总线器件仅在主机发出读时序是,才向主机传输数据,所以,在主机发出读数据命令后,必须马上产生读时序,以便从机能够传输数据。所有读时序至少需要60us,且在2次独立的读时序之间至少需要1us的恢复时间。每个读时序都由主机发起,至少拉低总线1us。主机在读时序期间必须释放总线,并且在时序起始后的15us之内采样总线状态。主机输出低电平延时2us,然后主机转入输入模式延时12us,然后读取总线当前电平,然后延时50us。当主机收到DSl8B20的响应信号后,便可以发出ROM操作命令之一,这些命令如表4-2所示。RAM指令集如表4-3所示。主机控制DS18B20完成温度转换过程是:每一次读写之前都要对DS18B20进行复位,即将数据总线下拉500us,然后释放,DS18B20收到信号后等待16-60us左右,之后发出60-240us的存在低脉冲,主CPU收到此此信号表示复位成功;复位成功后发送一条ROM指令,然后发送RAM指令,这样才能对DS18B20进行预订的读写操作。表4-2ROM操作命令指令约定代码功能读ROM33H读DS18B20中的编码符合ROM55H发出此命令后,接着发出64位ROM编码,访问单线总线上及该编辑相对应的DS18B20使之做出响应,为下一步对该DS18B20的读写作准备搜索ROM0F0H用于确定挂接在同一总线上的DS18B20个数和识别64位ROM地址,为操作各器件作准备跳过ROM0CCH忽略64位ROM地址,直接向DS18B20发送温度变换指令告警搜索命令0ECH执行后,只有温度跳过设定值上限或下限的片子才能做出反应表4-3RAM指令集指令约定代码功能温度转换44H启动DS18B20进行温度转换读暂存器0BEH读暂存器9个字节内容写暂存器4EH将数据写入暂存器的TH、TL字节复制暂存器48H把暂存器的TH、TL字节写到E2RAM中重调E2RAM0B8H把E2RAM中的TH、TL字节写到暂存器TH、TL字节读供电方式0B4H启动DS18B20发送电源供电方式的信号给主CPUDS18B20的测温原理DS18B20的测温原理是这这样的,器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将最低温所对应的一个基数分别置入减法计数器1、温度寄存器中,计数器1和温度寄存器被预置在最低温所对应的一个基数值。减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。减法计数器减法计数器斜坡累加器减到0减法计数器预置低温度系数振荡器高温度系数振荡器计数比较器预置温度寄存器减到0图4-11测温原理图初始化初始化DS18B20跳过ROM匹配温度变换延时1S跳过ROM匹配读暂存器转换成显示码数码管显示图测温流程图图4-13温度传感电路4.6总电路图4-14总电路图(1)当给单片机上电后,其为时钟模式,按一次S1实现对“秒”的调整,按两次S1实现对“分”的调整,按三次S1实现对“时”调整;按S2实现增1,按S3实现减1.(2)按S2实现时钟到温度计的切换,按S4恢复时钟。(3)按S3实现时钟到频率计的切换,按S4恢复时钟。5.软件设计主程序流程图定时器0中断处理流程图重装初值重装初值保护现场保护现场计数单元加1计数单元加1到1秒?N到1秒?N秒加1秒加1N到60秒?N到60秒?秒清0,分加1秒清0,分加1N到60分?N到60分?分清0,时加1分清0,时加1N到24时?N到24时?小时清0小时清0恢复现场恢复现场中断返回中断返回时钟子程序5.4温度子程序双机通信(1)发送(2)接收5.6频率计子程序开始开始频率测量计数器计数测量数据显示程序清单:#include<reg52.h>#include<stdio.h>#defineuintunsignedint#defineucharunsignedcharsbitdula=P2^6;sbitwela=P2^7;sbitkey1=P3^4;sbitkey2=P1^7;sbitkey3=P3^6;sbitkey4=P3^7;sbitds=P2^2;uinttemp;floatf_temp;ucharbuf[3];uchari,num,hour,min,sec,num1,num2,num3,num4;unsignedlongintfre;ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, //带小数点的0~9编码0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //不带小数点的0~9的编码voiddelayms(uintxms) uinti,j; for(i=xms;i>0;i--) for(j=110;j>0;j--);voiddisplay(ucharnum1,uchardat) //数据显示程序{ //num是第几个数码管,dat是要显示的数字 uchari; i=0xff; i=i&(~((0x01)<<(num1))); //用I来存储位选数据,只有一位为0 wela=1; P0=i;wela=0;P0=0xff; dula=1;P0=table[dat]; //编码赋给P0口 dula=0; delayms(3);voiddis_time(ucharhour,ucharmin,ucharsec) //显示时间函数 display(0,hour/10);display(1,hour%10+10); display(2,min/10);display(3,min%10+10); display(4,sec/10);display(5,sec%10);voidkeyscan() if(key1==0) delayms(10); if(key1==0) { num=4; TR0=0;num--;while(!key1);delayms(10);while(!key1); while(num) dis_time(hour,min,sec); if(key1==0){delayms(10);if(key1==0)num--;}while(!key1); if(key4==0){delayms(10);if(key4==0)num=0;}while(!key4); switch(num) case3:if(key2==0){delayms(10);if(key2==0){sec++;if(sec==60)sec=0;while(!key2)display(4,sec/10);display(5,sec%10);}} if(key3==0){delayms(10);if(key3==0){sec--;if(sec==255)sec=59;while(!key3)display(4,sec/10);display(5,sec%10);}} break; case2:if(key2==0){delayms(10);if(key2==0){min++;if(min==60)min=0;while(!key2)display(2,min/10);display(3,min%10+10);}} if(key3==0){delayms(10);if(key3==0){min--;if(min==255)min=59;while(!key3)display(2,min/10);display(3,min%10+10);}} break; case1: if(key2==0){delayms(10);if(key2==0){hour++;if(hour==24)hour=0;while(!key2)display(0,hour/10);display(1,hour%10+10);}} if(key3==0){delayms(10);if(key3==0){hour--;if(hour==255)hour=23;while(!key3)display(0,hour/10);display(1,hour%10+10);}} break; TR0=1;voidinit_t() TH0=(65536-4597)/256; TL0=(65536-4597)%256; TMOD=0x51;EA=1;ET0=1;ET1=1;TR0=1;TR1=0;voiddsreset() //DS18B20复位,初始化函数 uinti;ds=0;i=103; while(i>0)i--; ds=1;i=4;while(i>0)i--;bittempreadbit(void) //读1位数据函数 uinti;bitdat;ds=0;i++; //i++起延时作用 ds=1;i++;i++; dat=ds;i=8;while(i>0)i--; return(dat);uchartempread(void) //读一个字节数据函数 uchari,j,dat; dat=0; for(i=1;i<=8;i++) j=tempreadbit(); dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在dat里 return(dat);voidtempwritebyte(uchardat) //向DS18B20写一个字节数据函数 uinti;ucharj; bittestb; for(j=1;j<=8;j++) testb=dat&0x01; dat=dat>>1; if(testb) ds=0;i++;i++;ds=1; i=8;while(i>0)i--; else ds=0; i=8;while(i>0)i--; ds=1;i++,i++;voidtempchange(void) //DS18B20开始获取温度并转换 dsreset();delayms(1); tempwritebyte(0xcc); //写跳过读ROM指令 tempwritebyte(0x44); //写温度转换指令uintget_temp() //读取寄存器中存储的温度数据 uchara,b; dsreset();delayms(1); tempwritebyte(0xcc); tempwritebyte(0xbe); a=tempread(); //读低8位 b=tempread(); //读高8位 temp=b;temp<<=8; //两个字节组合为1个字 temp=temp|a; f_temp=temp*0.0625; //温度在寄存器中为12位,分辨率为度 temp=f_temp*10+0.5; //乘以10表示小数点后面只取1位,加是四舍五入 f_temp=f_temp+0.05; returntemp; //temp是整型voiddis_temp(uintt) //显示温度数值函数t传递的是整型的温度值 uchari; i=t/100; //除以100得到商,为温度的十位 display(0,i); // 在第1个数码管上显示 i=t%100/10; //100取余再除以10得到商,为温度的个位 display(1,i+10); //在第2个数码管上显示 i=t%100%10; //100取余再用10取余,为温度的小数位 display(2,i); //在第3个数码管上显示voiddis_fre(unsignedlongintk) //显示频率函数 uchari; i=k/100000;display(0,i); i=k/10000%10;display(1,i); i=k/1000%10;display(2,i+10); i=k/100%10;display(3,i); i=k/10%10;display(4,i); i=k%10;display(5,i);voiddeal() buf[0]=temp/100;buf[1]=temp%100/10;buf[2]=temp%10;voidinit_com(void)SCON=0x50;//串行口工作方式1,允许接收PCON=0x00;//波特率不倍增TMOD=0x21;//定时器1工作于8位自动重载模式,用于产生波特率TH1=0xfd;TL1=0xfd;//T1赋初值,11.0592M晶振,TR1=1;//启动定时器1EA=1;ET1=0;ES=1;voidmain(){ init_t(); while(1) num2=1; dis_time(hour,min,sec); keyscan(); if(key2==0) delayms(8); if(key2==0) while(num2) init_com(); tempchange(); dula=0;wela=0; // for(i=5;i>0;i--) dis_temp(get_temp()); deal(); delayms(5); SBUF=buf[i]; if(key4==0) delayms(10); if(key4==0) ES=0;num2=0;TR1=0;TMOD=0x51; ET1=1; if(key3==0) delayms(10); if(key3==0) TH1=(65536-1)/256; TL1=(65536-1)%256; fre=0;TR1=1; while(num2) while(TR1); dis_fre(fre); if(key3==0) delayms(10); if(key3==0) fre=0;TR1=1; if(key4==0) delayms(10); if(key4==0) num2=0;voidtimer0()interrupt1 TH0=(65536-4597)/256; TL0=(65536-4597)%256; num++; if(TR1)num3++; if(num3==200) num3=0; TR1=0; if(num==200) num=0; sec++; if(sec==60) sec=0; min++; if(min==60) min=0; hour++; if(hour==24) hour=0;voidtimer1()interrupt3 TH1=(65536-1)/256; TL1=(65536-1)%256; fre++;voidzd()interrupt4//当进入中断,要么RI=1,要么TI=1if(RI)i=SBUF;RI=0;elseTI=0;2.双工接收程序:#include<reg51.h>#include<stdio.h>#defineuintunsignedint#defineucharunsignedcharucharget[3];sbitdula=P2^6;sbitwela=P2^7;sbitkey1=P3^4;sbitkey2=P3^5;sbitkey3=P3^6;sbitkey4=P3^7;sbitds=P2^2;uchari,j;ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, //带小数点的0~9编码0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //不带小数点的0~9的编码voiddelayms(uintxms) uinti,j; for(i=xms;i>0;i--) for(j=110;j>0;j--);voiddisplay(ucharnum1,uchardat) //数据显示程序{ //num是第几个数码管,dat是要显示的数字 uchari; i=0xff; i=i&(~((0x01)<<(num1))); //用I来存储位选数据,只有一位为0 wela=1; P0=i;wela=0;P0=0xff; dula=1;P0=table[dat]; //编码赋给P0口 dula=0; delayms(10);voidinit(void)SCON=0x50;//串行口工作方式1,允许接收PCON=0x00;//波特率不倍增TMOD=0x20;//定时器1工作于8位自动重载模式,用于产生波特率TH1=0xfd;TL1=0xfd;//T1赋初值,11.0592M晶振,TR1=1;//启动定时器1 EA=1;ET1=0; ES=1;voidmain(void)init();while(1)display(0,get[0]);display(1,get[1]+10);display(2,get[2]);voidzd()interrupt4if(RI)get[j]=SBUF;if(j==3)j=0;j++;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 9、2025年度绿色建筑模板单项劳务分包合同3篇
- 个人宅基及房屋销售协议版B版
- 2025版门面租赁合同签订流程及注意事项4篇
- 游戏化教学增强小学生注意力的教育模式
- 2025版化妆品销售代理合同范本6篇
- 美容院与互联网平台2025年度线上推广服务合同4篇
- 智能化学习环境下的学生思维升级
- 二零二五年度汽车美容服务合同范本4篇
- 科技产品的动态视觉设计实践分享
- 时间管理对学习态度的积极影响
- 教师招聘(教育理论基础)考试题库(含答案)
- 2024年秋季学期学校办公室工作总结
- 铺大棚膜合同模板
- 长亭送别完整版本
- 智能养老院视频监控技术方案
- 你比我猜题库课件
- 无人驾驶航空器安全操作理论复习测试附答案
- 建筑工地春节留守人员安全技术交底
- 默纳克-NICE1000技术交流-V1.0
- 蝴蝶兰的简介
- 老年人心理健康量表(含评分)
评论
0/150
提交评论