文档库 最新最全的文档下载
当前位置:文档库 › 基于51的时钟与温度

基于51的时钟与温度

目录

一、前言 (1)

二、系统方案对比论证 (1)

2、1 系统总体方案设计论证 (1)

2、2 总体设计背景分析 (1)

2、3 设计目标分析 (1)

方案一:基于AD590温度传感器温度计设计 (2)

方案二:基于热敏电阻的温度计设计 (2)

方案三:基于DS18B20的数字温度计设计 (2)

三、硬件系统模块 (4)

3、1 单元模块设计 (4)

3、1、1 时钟、复位电路 (4)

3、1、2 电源模块 (4)

3、1、3 数码显示电路 (5)

3、1、4 单片机与DS18B20 (5)

STC LE89C58RD+简介 (6)

DS18B20介绍 (6)

四、软件设计 (6)

4、1 时钟模块 (6)

4、2 温度模块 (6)

4、2、1 温度采集模块 (7)

4、2、2温度显示模块 (7)

五、系统整合调试 (8)

5、1硬件调试 (9)

5、2软件调试 (9)

六、系统功能及参数 (10)

6、1 系统功能 (10)

6、2 系统指标参数测试 (10)

6、3 系统功能及指标参数分析 (12)

七、结论 (12)

八、心得体会 (13)

九、参考文献 (13)

附录

附录一:基于DS18B20数字温度计的整体设计原理图 (14)

附录二:基于DS18B20数字温度计的PCB设计图 (14)

附录三:部分程序 (15)

一、前言

单片机在日用电子产品中的应用越来越广泛,对各种测量仪器、测量装置的测量精度要求也越来越高,尤其是对温度的测量非但要准确,而且需要读取数值更直观、更方便,随着科学研究、工业和家用电器等方面对策问和控制的需求,各种新型的集成电路温度传感器不断研制出来。本设计旨在学生学完《综合电子系统设计》和电子学相关课程的基础上,结合测控技术与仪器和机电子信息科学与技术和信息工程专业的特点进行的具有一定难度和覆盖面的综合性实践环节。故本设计选用测量误差小,价格低,响应速度快,传输距离远,微功耗、适合远距离测温无需非线性校准、外部电路简单的DS18B20温度传感器,配合STCLE89C58RD+单片机实现时钟温度显示。

二、系统方案对比论证

2、1 系统总体方案设计论证

本系统有四个基本模块组成:传感器模块,信号放大处理部分,主控制模块和显示模块,设计关键在于温度传感器的选择。

2、2 总体设计背景分析

随着现代信息技术的飞速发展和传统工业改造的逐步实现,能够独立工作的温度检测与显示系统应用于诸多领域。传统的温度检测以热敏电阻为温度敏感元件。热敏电阻的成本低,需要外加信号处理电路,而且可靠性相对较差,测温准确度低,检测系统也有一定的误差。与传统的温度计相比,这次设计的是基于DS18B20的数字温度计,它具有读数方便,测温范围广,测温精确,数字显示,适用范围宽等特点。同时加上实时时钟显示,更方便操作人员记录实时温度。

2、3 设计目标分析

在本设计中选用STC LE89C58RD 型单片机作为主控制器件,采用DS18B20数字温度传感器作为测温元件,通过8位共阴极LED 数码显示管实现温度显示。本设计的内容主要分为三部分,一是系统硬件设计,包括温度采集电路和显示电路;二是对系统软件部分的设计,应用C 语言实现温度的采集与显示;三是通

过与设定温度比较,不在此范围内时实现报警功能。通过DS18B20直接读取被测温度值,送入单片机进行数据处理,之后进行输出显示,最终完成了数字温度计的总体设计。其系统构成简单,信号采集效果好,数据处理速度快,便于实际检测使用。

2、4 具体方案比较

实现温度采集功能有三种方案:方案一基于AD590的数字温度计设计;方案二基于热敏电阻的温度计设计;方案三是基于DS18B20的数字温度计设计。

方案一:基于AD590温度传感器温度计设计

主要由AD590温度传感器、单片机控制电路、数码显示电路组成。AD590是一种电流型集成温度传感器,具有准确度高,动态电阻打、响应速度快、线性度好等优点。单片机只需将读取传输的数据通过驱动数码管显示即可。

方案二:基于热敏电阻的温度计设计

主要由温度传感器、A/D转换电路、单片机控制电路、数码显示电路组成。热敏电阻采集的模拟温度值输入A/D转换电路,A/D转换采用LM331型U/f变换器来实现。U/f变换器把电压信号转换为频率信号。由热敏电阻的电阻温度特性表可以求出每个温度点所对应的UIN,再由公式FOUT=256*UIN计算出每个温度点所对应的输出频率,进而由单片机处理显示被测量的温度值。温度信号处理由于热敏电阻是非线性的器件,所以温度与频率输出成非线性,需要补偿温度。单片机利用查表法实现温度补偿。所谓查表法是把事先计算或测量的数据按一定的顺序排列成表格的形式,固化在单片机内。只要测量出LM331的频率值,就可以通过查表法准确的得出环境的温度值。再交由单片机驱动数码管显示温度。这样就实现了温度的采集与显示。基于SHT71的数字温度计设计

方案三:基于DS18B20的数字温度计设计

主要也由数字温度传感器、单片机控制电路、数码显示电路组成。DS18B20 测量温度采用了特有的温度测量技术。它是通过计数时钟周期来实现的。低温度系数振荡器输出的时钟信号通过由高温度系数振荡器产生的门周期而被计数。计数器被预置在与- 55 ℃相对应的一个基权值。如果计数器在高温度系数振荡周期结束前计数到零,表示测量的温度值高于- 55℃,被预置在- 55 ℃的温度寄存器的值就增加1℃,然后重复这个过程,直到高温度系数振荡周期结为止这时温度寄存器中的值就是被测温度值,这个值以16 位形式存放在便笺式存贮器中,此温度值可由主机通过发存贮器读命令而读出,读取时低位在前,高位在后。斜率累加器用于补偿温度振荡器的抛物线特性。读出的二进制数可以直接转换为十进制由单片机驱动数码管显示输出。

2、5 方案论证

方案一:AD590是一种电流型集成温度传感器,具有准确度高,动态电阻打、响应速度快、线性度好等优点。单片机只需将读取传输的数据通过驱动数码管显示即可。但AD590需要和高精度ADC配合使用才能得到数据,其优点是速度快,

编程简单,缺点是需要校准,电路复杂,成本高。

方案二:热敏电阻温度传感器的特点是自身的电阻值随温度而变化。它的测量范围一般为-10~+300℃,也可做到-200~+10℃,甚至可用于+300~+1200℃环境中作测温用。热敏电阻器温度计的精度可以达到0.1℃,感温时间可少至10s以下。其优点是灵敏度高,体积小,寿命长,工作稳定,易于实现远距离测量。但热敏电阻是利用半导体材料制成的敏感组件,通常所有的热敏电阻温度传感器都是具有负温度系数的热敏电阻,它的电阻率受温度的影响很大,而且随温度的升高而减小。其致命缺点是互换性差,非线性严重。且采用热敏电阻,电压信号转换电路过于繁琐。

方案三:DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃;可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温,典型的转换时间为200ms;用户可以设定温度的上下限;独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。DS1820具有测温系统简单、测温精度高、连接方便、占用口线少等优点,所以在测量领域得到广泛的运用。

2、6 方案选择

现代传感器在原理和结构上千差万别,如何根据具体的测量目的、测量对象以及测控环境合理地选择传感器,是单片机测控系统首先要解决的问题。当传感器选定后,与之相配套的测控电路也就可以确定了。测控结果的成败,在很大程度上取决于传感器的选择是否合理。作为单片机控制系统的前向通道的关键部件,在选择传感器时应考虑以下几个方面的:①根据测控对象与测控环境确定传感器的类型;②灵敏度的选择,通常情况下,在传感器的线性范围内,希望传感器的灵敏度越高越好;③频率响应特性,频率响应特性决定了被测量的频率范围,频率响应好,可测信号的频率范围就越宽;④线性范围,线性范围越宽,其量程越大,并且能保证一定的精度;⑤稳定性,稳定性是指其性能保持不变化的能力;

⑥精度的选择,传感器的精度越高,其价格越贵,因此传感器的精度只是满足整个测控系统的精度要求就可以了,不必选得过高。

方案的选择即是传感器的选择。对比三种方案可以得知,方案二是采用模拟式温度传感器,方案一和方案三都采用数字式温度传感器。模拟式温度传感器输出的是随温度变化的模拟量信号。其特点是输出响应速度较快和MPU接口复杂。热敏电阻精度低,灵敏度高,价格最低。数字式温度传感器输出的是随温度变化的数字量,更直观,与模拟输出相比,它输出速度响应较慢,但容易与MPU接口。能输出温度数据及相关的温度控制量;能以最简方式构成高性价比、多功能的智能化温度控制系统;能在硬件的基础上通过软件编程来实现测试功能。所以数字式温度传感器才是今后发展的方向。而AD590与DS18B20相比,前者精度较高,转换速度较快,但性价比不高,单片价格在一百左右,DS18B20相对而言价格较低在十块左右。考虑到我们设计的目的和要求不是很精密严格。所以我们选择方案三以DS18B20数字温度传感器进行后续设计。

C2

三、硬件系统模块

本节主要介绍系统中单片STC LE89C58RD+外围电路重要模块的功能和电路原理图分析。并对电路中的核心器件进行必要的说明。

3、1 单元模块设计

3、1、1 时钟、复位电路

图(2)晶振电路 图(3)复位电路

单片机STC LE89C58RD+使用的时钟电路比较简单,我们采用的是晶体振荡器产生时钟源。XTAL1(X1)为反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2(X2)是来自反向振荡器的输出,分别接到单片机的19脚和18脚。为了方便使用其他晶振,所以我们使用插座来安装晶振,其电路原理图如图(2)所示。单片机复位电路的设计如图(3)所示。该复位电路采用手动复位与上电复位相结合的方式。当按下按键SJ17时,VCC 通过R4电阻给复位输入端口一个高电平,实现复位功能,即手动复位这样就不用在重起单片机电源。上电复位就是VCC 通过电阻R4和电容C1构成回路,该回路是一个对电容C1充电和放电的电路,所以复位端口得到一个周期性变化的电压值,并且有一定时间的电压值高于CPU 复位电压,实现上电复位功能。

3、1、2 电源模块

图(4) 5V 电源电路

电源电路主要是为系统提供电源,因为单片机STC LE89C58RD+需要供电5V ,而外围电路可以用5V 电源。电路可以由电源变压器T 、电桥U 、电容C 以及芯片7805组成。电源是由电源变压器T 降压后送入电桥U 整流再经C 滤波,然后由CW7805稳定后提供给电路工作。由于我们需要在通过计算机下载程序,

而USB输出电压也刚好是5V,所以我们为了方便采用USB供电。原理图如图(4)所示。

3、1、3 数码显示电路

图(5)数码显示电路

数码显示电路主要作用是用来显示实际的环境温度值。通过单片机控制实现数码管动态显示,即温度值实时刷新。但本设计同时需要完成时钟显示。故实际电路中采用两个4位8段共阴数码管,这样程序电路都比较简单,显示亮度也高,但占用的I/O口比较多。P2口驱动连接数码管的位码,即选通4个数码管;P0口驱动连接数码管的段码,即输出要显示的温度值。饱和导通就相当于开关开路;在数码管动态显示中,只要扫描的时间足够快,虽然在一个时刻只有一位数码管发光,但却可以看到8 位数码管“同时”显示的效果。电路原理图如图(5)所示。

3、1、4 单片机与DS18B20

图(6)STC LE89C58RD+与DS18B20及报警接口电路

STC LE89C58RD+简介

单片机STC LE89C58RD+是8位高性能MCU,超低功耗:掉电模式下典型功耗<0.1 LLA,空闲模式下典型功耗2 mA.正常工作模式下典型功耗4 7 mA 具有8kF1ash存储器、512 kB RAM、2k E2pROM、降低EMI功能、ISP(在系统可编程)功能单片机内部的看门狗电路经过特殊处理.是真正的看门狗.可放心省去外部看门狗缺省为关闭.打开后无法关闭,单倍速和双倍速可反复设置。STC LE89C58RD+和各个模块的接口主要是对STC LE89C58RD+的I/O口进行约束,规定其为输出还是输入,输入主要是按键电路部分和时钟,输出则为报警和显示部分,其I/O分配如图(6)所示。

DS18B20介绍

DS18B20是DALLAS公司生产的一线式传感器,具有3引脚TO-92小体积封装形式;温度测量范围为-55摄氏度到+128摄氏度,可编程为9到12位A/D 转换精度,测温分辨率可达0.0625摄氏度,被侧温度用符号扩展的16位数字量方式串行输出;其工作电源既可在远端引入,也可采用寄生电源方式产生。CPU 只需一根端口线就能与诸多DS18B20通信,占用问处理器的端口较少,可节省大量的引线和逻辑电路。

DS18B20主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH个TL、配置寄存器。DS18B20中的温度传感器可完成对温度的测量,用16位符号扩展的二进制补码读数形式提供,以0.0625摄氏度/LSB形式表达,其中S为符号位。例如+125摄氏度的数字输出为07DOH,+25.0625摄氏度的数字输出为0191H,-25.0625摄氏度的数字输出为FF6FH,-55摄氏度的数字输出为FC90H.

DS18B20采用一线通信接口。因为一线通信接口,必须在先完成ROM设定,否则记忆和控制功能将无法使用。主要首先提供以下功能命令之一:⑴读ROM 指令0X33,⑵ROM匹配指令0X55,⑶搜索ROM指令0XF0,⑷跳过ROM 指令0XCC,⑸报警检查指令0XEC。这些指令操作作用在没有一个器件的64位光刻ROM序列号。

四、软件设计

4、1 时钟模块

可采用计数器模式,完成记满60秒则分加一,分记满60则时加一,但采用计数器直接计数方式误差较大,故本设计采用中断方式,便于程序编写和阅读。

4、2 温度模块

软件设计关键在于DS18B20的使用。DS18B20属于单线式器件,它在一根数据线上实现数据的双向传输,这就需要一定的协议,来对读写数据提出严格的

时序要求,而STC89C52单片机并不支持单线传输,因此必须采用软件的方法来模拟单线的协议时序。DS18B20有严格的通信协议来保证各为数据传输的正确性和完整性。主机操作单线器件DS18B20必须遵循一定的顺序。系统的主程序主要通过初始化,键盘扫描,获取温度,显示温度,报警等子程序实现。通过一个循环设置,使系统不断地进行对温度的检测。下图为本系统主程序的设计流程,各个模块的设计见下文。

4、2、1 温度采集模块

温度采集包括初始化DS18B20子程序;读DS18B20子程序;写DS18B20子程序;获得温度子程序。DS18B20初始化需要这几个过程先将数据线置高电平“1”,延时10 us;再将数据线拉到低电平“0”延时500 us;然后再数据线拉到高电平“1”,高电平保持60us,判断DS18B20是否发出低电平信号,跟据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时控制;若CPU读到了数据线上的低电平“0”后,根据时序要求还要做延时,其延时的时间从发出的高电平算起最少要480 us时间;最后将数据线再次拉高到高电平“1”后结束。需要注意的是每次采集温度的时候都需要初始化。DS18B20发出高电平初始化成功,返回flag=1表示DS18B20初始化成功。

读DS18B20也需要几个流程:先将数据线拉高“1”延时2us时间;再将数据线拉低“0”延时10 us;然后将数据线拉高“1”延时8us读取1位数据,读取1位数据后延时50us时间;最后通过读取1位右移1位循环进行分别读出8位即一个字节的数据。程序中我们把读取的第一字节存templ中,读取的第二字节存temph中。如果需要读出设定的TH和TL值用于报警,这时也需将数据读出。我们把读取的第3字节存tempth 即TH的值;把读取的第4个字节存temptl 即TL的值。由于读出的数据时二进制数显示的时候是十进制。所以必须将读出的数据进行处理。先判断符号位将temph的高5位与0xf8相与就可以知道正负。若为负值f=1,将templ和temph取反。转换的时候我们将小数部分和整数部分分别转换,小数部分templ与0x0f相与后的值乘以625就是小数部分的值,需要注意的是小数部分的值是用整数形式表示的;整数部分temph左移四位和templ右移四位合并为一个字节就是整数部分的值。

4、2、2 温度显示模块

获得温度就是在前面操作的基础上调用。先初始化DS18B20,发出跳过ROM 匹配命令;再向DS18B20发温度转换命令显示温度,等待AD转换,发跳过ROM 匹配命令;最后发出读温度命令将读出的温度数据保存到tempint和tempdf处为显示做准备。

温度显示模块主要包括显示温度子程序和延迟子程序。显示温度即把读出的温度传递过来分别显示。我们是将数码分为各个位动态扫描显示。读温度程序中将小数部分和整数部分的值分别存放在tempint和tempdf中,符号位存放在f 中。由于是分各个位显示,所以必须对数进行取模运算,C语言提供了整除和求余数运算,两者相结合就可以取出各个位的模。由于我们是用数码管显示,第一位显示符号位,f=0表示正温度用“0”表示,f=1表示负温度用“-”表示,“-”

值可以用0xbf送到数码管显示。第四个数码管需要显示小数位,我们采用查表的方法将要显示的带小数的数模放在ledmap1中,需要显示的时候再调用;一般数模放在ledmap中。显示的时候采用循环的方式进行,先判断符号位显示在第一个数码管,之后分别为百位、十位、个位、个分位、十分位、百分位和千分位。先送位码再送段码,每一位显示完后延迟2us时间。在数码管动态显示中,由于扫描的时间足够快,虽然在一个时刻只有一位数码管发光,却可以看到8 位数码管“同时”显示的效果。

下图为温度显示流程框图

图(7)温度显示流程图

五、系统整合调试

调试方法:写好程序后不能急于上机调试,而是先进行逻辑分析、可行性分析。用KeilμVision 4软件进行调试,不能出现错误,警告可以有,只要不影响生成HEX文件即可。理解其实现的功能,预想程序应该出现的结果。先进行软件仿真,出现错误马上修改,不断进行。先一个模块一个模块的仿真,准确后再连线总体仿真。仿真完后出现预期的效果后再下载程序到硬件进行验证,往往还有问题,还得反复修改,编译,调试,下载,验证。可以一个模块一个模块的下载调试这样就可以知道问题的所在。采用Proteus和Keil结合仿真的可以大大

简化软、硬件电路的设计过程。

5、1 硬件调试

Proteus是英国Labeenter electronics公司研发的EDA工具软件。Proteus不仅是模拟电路、数字电路、模/数混合电路的设计与仿真平台,更是目前世界最先进、最完整的多种型号微控制器系统的设计与仿真平台。它真正实现了在计算机上完成从原理图设计、电路分析与仿真、单片机代码级调试与仿真、系统测试与功能验证到形成PCB的完整电子设计与研发过程。Proteus产品系列也包含了革命性的VSM技术,可以对基于微控制器的设计连同所有的外围电子器件一起仿真。由于我们的设计外围电路比较简单实现的功能叶不是很复杂,所以在Proteus仿真时我们是将主程序直接下载到芯片中仿真,主要是验证是否采集到温度还有温度是否显示正确。仿真可以在实物没有出来前进行先期的验证。最后加上我们的扩展功能一起仿真调试。需要说明的是仿真正确不代表最后的下载程序不会出错。我们在下载程序的时候也遇到一点小问题。比如在仿真的时候,三极管始终处于导通状态,后来通过努力解决了这个问题。

在实物做出来之前,我们采用Proteus仿真调试,通过将软件编译通过的程序下载到画好的仿真图中,这样便于检查软、硬件设计的不足。但是Proteus仿真也存在不足的情况,仿真模拟的是理想的环境,不会差生误差但是实际的测试会出现一定的误差。通过硬件仿真可以查找出硬件设计的不足。

5、2 软件调试

KeilμVision 4是Keil公司关于8051系列MCU的开发工具,可以用来编译C源码、汇编源程序、连接和重定位目标文件和库文件、创建HEX文件、调试目标程序等,是一种集成化的文件管理编译环境。它集成了文件编辑处理、编译连接、项目管理、窗口、工具引用和软件仿真调试等多种功能,是相当强大的开发工具。实验中我们采用KeilμVision 4来对我们编写的程序进行编译、链接和生成HEX 文件。在下载程序出错时进行必要的调试,再下载验证。同时采用Proteus和Keil 结合仿真的方法对设计的单片机测温系统进行了虚拟仿真和性能检测,得到了比较好的仿真结果和分析结果。结果证明采用Proteus和Keil结合仿真的可以大大简化硬件电路的设计过程,可以降低单片机系统的开发成本、提高效率和开发速度,具有很好的实际应用和指导意义。

软件仿真的优势在于,可以设置断点、单步运行等,这在用实物调试是不能实现的,通过软件仿真,可以知道程序哪儿出错了,便于及时改正。若直接下载在芯片中用实物调试,只能知道程序错了,只能去盲目查找程序的错误之处。在程序的编写之中难免会出现一些无法错误,用KeilμVision 4编译会得到及时的提示,方便立即修改,大大缩短了设计的时间,提高设计效率。

在设计初期,我们通过软件仿真发现了很多错误,比如语法错误,乱码,字符闪烁问题,后来这些问题都一一克服,语法错误一样是缺少括号,乱码是由于共阴、共阳译码的错误,还有就是由于人眼的“滞留”问题,必须要位选,在进行译码。字符闪烁一般是由于延时过短等问题。这些问题都是通过软件调试找出来的,从而说明软件调试的必要性。

六、系统功能及参数

6、1 系统功能

本设计实现的主要功能是通过DS18B20温度传感器采集温度并通过4位七段数码管显示所测温度,可显示零度以下温度,温度测量范围为-55℃-128℃,后四位显示小数位。可以精确到小数点后4位,测量精度为0.0625℃,并可以产生报警。通过三个按键的配合使用可以设定温度报警的上限值和下限值,当所测的温度超过所设定的上限或下限温度时产生报警信号,在报警的同时,系统处于正常的测温模式,当温度回到所设定的范围时,报警停止。

6、2 系统指标参数测试

图(8)是采用Proteus软件对本系统温度测量范围的仿真,仿真模拟温度输入为-55℃,系统4位七段显示数码管显示的也为-55℃,由于仿真软件不考虑测量误差,所以测量的温度没有误差,做出的实物出现了一点误差,但误差在允许的范围内。

图(8)对系统测量最低温度仿真

图(9)是采用Proteus软件对本系统温度测量范围的仿真,仿真模拟温度输入为99℃,系统4位七段显示数码管显示的为99℃,DS18B20的测量温度上限为128℃,但考虑实际测温基本不会超过100℃,故温度上限处理设置为99℃,当超过100℃是不显示将最高位。当所测的温度刚好为128时,128用二进制表示为11111111,本传感器处理数据的高五位为符号位,当出现11111111时,系统默认所测温度为负数。

图(9)对系统测量最高温度仿真

图(10)时钟显示仿真

通过以上两个仿真验证了本系统的温度测量范围,由于软件仿真对报警的仿真不容易观察,也不太容易记录,所以我们对报警没有通过软件仿真,而是通过对事物的调试来实现。由于对温度上下限的设定是一个动态的实现,所以我们也是通过实物演示来实现。对于时钟显示,经计算得出的延时只是一个较精确的值,只有通过与标准时间比对、调试才能获得精准时钟。

6、3 系统功能及指标参数分析

本设计满足实验要求,可以测量的温度范围是-55℃-128℃,并通过4位七段数码管显示,显示的第一位为符号位,后1位为小数位,由于DS18B20的分辨率很高,其固有分辨率为0.5℃。在本设计中,我们充分利用了DS18B20的具有TH、TL寄存器的优势,通过对TH,TL寄存器进行赋值,可以实现设定温度范围,这样可以使本系统不仅具有测温的功能,还具备超过温度范围报警的功能,这样的设计在实际工程中运用更加广泛。

七、结论

经过两周的电子系统课程设计,终于完成了我们的实时时钟及温度显示系统的设计。不仅完全达到设计要求温度的采集和显示,还在此基础上增加了扩展功能超温报警,就是采集的温度不在我们自己设定的范围内时驱动蜂鸣器输出报警信号。不仅利用Proteus完成了硬件仿真,还把实物都做了出来,并下载程序验证成功,高兴之余不得不深思呀!

在本次设计的过程中,我们发现很多的问题。比如在硬件仿真时往往出现乱码的情况,原因在于共阳数码管和共阴数码管显示时所送的段码是不一样的,所以我们将段码取反,但仍然没有成功,网上查阅资料找到问题的关键在于如果采用动态扫描的方法,控制程序先送段码再送位码,由于人眼的“滞留”效应,将会产生乱码现象;为了让显示器不显示乱码,其控制程序要么在每次显示更新前先关闭显示器再送段位及位码,要么先送位码再送段码,都可解决这一问题。所以我们采用先送位码再送段码的方法解决了此问题。智能化课程设计重点就在于软件算法的设计,虽然以前还做过这样的设计但这次设计,但都比较简单程序也不是很长也不需要有很巧妙的程序算法。这次软件设计中让我充分理解到了利用子程序的好处。在设计中也遇到很多问题比如温度转化的时候我们的程序看起来是合乎逻辑的但始终没有小数部分的值,经过多次调试修改终于显示成功。还有很多下问题则不必累述。下载程序验证的时候也出现问题,并没有显示实际的温度,全是“0”,究其原因在于参数传递并没有传递到显示程序中。

在这次的智能化课程设计中,虽然我们已经做出结果,但仍然有很多问题未得到解决。一是Proteus仿真正确但下载到实际的电路板中却存在问题。二是当我们增加了扩展功能温度报警后,温度的分辨率却减小了由原来的12位减小到9位,通过修改仍没有解决。三是小组联合调试没有完成。我们可以将采集的温度放到24C02存储,在输出在液晶屏上显示,还可以利用采集的温度大小来控制电机的转速等等。希望以后有机会再次深入学习。这次设计让我真真正正的意识到,在以后的学习中,要理论联系实际,把我们所学的理论知识用到实际当中,学习单机片机更是如此,程序只有在经常的写与读的过程中才能提高,这就是我在这次课程设计中的最大收获。

八、心得体会

通过这两个星期的课程设计课,我从中感触很深,收获也很多。

首先,在老师的精心指导之下,我们小组很顺利的完成了设计课题。从选题,设计,编程,仿真,画pcb,制版,焊接,到最后调试成功,这一系列过程中少不了老师的帮助还有小组成员的协同合作,同时也遇到过很多困难,特别是最后调试阶段,深深体会了,仿真与实物之间的差别。

其次,在这次设计课程中,系统的学了从理论到实践的整个过程,并将以前学的很多知识在实际操作中也得以体现,特别是经常使用的protel软件,在这次设计中占据了大大的分量,现在能熟练的使用该软件。

再次,通过两个周的实践,我学到了不少书本上没有的理论知识,并且极大程度的提高了自己的自学能力,同时提升了实际操作能力。再有就是懂得了运用学习方法同时注重独立思考。但同时还要注重团队合作。要想学好只埋头苦学是不行的,要有一套自己做事的方法。在学习时,以“独立、思考、创新”作为自己的座右铭,时刻不忘警戒。两个周下来,我不止是学到了很多专业知识,还学到了公共基础学科知识。同时,团队合作和人际交往能力也得到了提升。

最后,这两个星期的学习,也让我发现了很多自己以前不知道或者忘记的东西,在发现后能在同学的帮助下及时的了解其缘由。我相信在这虽短短的两个星期中所学的东西,不仅在今后的工作还是生活中,都会发挥很大的作用。

九、参考文献

[1] 于永.51单片机C语言常用模块与综合系统设计实例精讲[M].北京:电子工业出版社,2008

[2]戴永成等.基于DS18B20的数字温度测量仪[J].北华航天工业学院学报,2008

[3]甘勇等. 数字温度传感器DS18B20 在多点测温系统中的应用. 河南农业大学学报,2001

[4]张越等.基于DS18B20温度传感器的数字温度计[J].微电子学,2007

[5]李朝青.单片机原理及接口技术(简明修订版).杭州:北京航空航天大学出版社,1998

[6]黄河.基于DS18B20的单总线数字温度计[J].湘潭师范学院学报,2008

[7]李广弟.单片机基础[M].北京:北京航空航天大学出版社,1994

[8] 王建强等.基于DSP控制器与DS18B20的温度测量方法[J]. 仪器仪表与检测技术,2009

[9] 雷建龙等.数码管动态显示乱码现象分析[J].液晶与显示,2009

[10] 孙安清等.AT89S52单片机实验与实践教程[M].单片机实验板配套教程

[11] 赵亮等.单片机C语言编程和实例[M].人民邮电出版社,2003

[12] 张毅刚等.单片机原理及运用[M].高等教育出版社,2003

附录

附录一:基于DS18B20数字温度计的整体设计原理图

附录二:基于DS18B20数字温度计的PCB 设计图

附录三:部分程序

#include

#include "duank.h"

#include

#define uchar unsigned char

#define uint unsigned int

sbit DATA = P3^1; //DS18B20接入口//不带小数点

unsigned char code table[]

={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d ,0x07,0x7f,0x6f,0x77,0x7c,0x3

9,0x5e,0x79,0x71,0x00,0x40}; //带小数点

unsigned char code table1[]

={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd, 0x87,0xff,0xef};

char bai,shi,ge; //定义变量

char bai,shi,ge; //定义变量

/*延时子函数*/

void delay2(uint num)

{

while(num--) ;

}

/*************DS18b20温度传感器函数*********************/

void Init_DS18B20(void) //传感器初始化

{

uchar x=0;

DATA = 1; //DQ复位

delay2(10); //稍做延时

DATA = 0; //单片机将DQ拉低

delay2(80); //精确延时大于480us //450

DATA = 1; //拉高总线delay2(20);

x=DATA; //稍做延时后如果x=0则初始化成功x=1则初始化失败

delay2(30);

}

//读一个字节

ReadOneChar(void)

{

uchar i=0;

uchar dat = 0;

for (i=8;i>0;i--)

{

DATA = 0; // 给脉冲信号

dat>>=1;

DATA = 1; // 给脉冲信号

if(DATA)

dat|=0x80;

delay2(8);

}

return(dat);

} //写一个字节

void WriteOneChar(unsigned char dat) {

uchar i=0;

for (i=8; i>0; i--)

{

DATA = 0;

DATA = dat&0x01;

delay2(10);

DATA = 1;

dat>>=1;

}

delay2(8);

}

//读取温度

int ReadTemperature(void)

{

uchar a=0;

uchar b=0;

int t=0;

float tt=0;

Init_DS18B20();

WriteOneChar(0xCC); // 跳过读

序号列号的操作

WriteOneChar(0x44); // 启动温度转换

Init_DS18B20();

WriteOneChar(0xCC); //跳过读序

号列号的操作

WriteOneChar(0xBE); //读取温度

寄存器等(共可读9个寄存器)前

两个就是温度

a=ReadOneChar();//低位

b=ReadOneChar();//高位

if(b>127)

{

a=256-a;

b=255-b;

t=b;

t<<=8;

t=t|a;

tt=t*0.0625;

t= tt*10+0.5;

c=17;

}

else

{

t=b;

t<<=8;

t=t|a;

tt=t*0.0625;

t= tt*10+0.5;

c=16;

}

return(t);

}

/*显示子函数*/

void display(int bai,int shi,int ge) {

P2=0xf7;

P0=table[bai];//显示1位

delay2(300);//一小段延时动态显示

P2=0xfb;

P0=table1[shi];//显示2位

delay2(300);

P2=0xfd;

P0=table[ge];//显示3位

delay2(300);

P2=0xef;

P0=table[c];//显示+/-位

delay2(300);

P2=0xfe;

P0=table[12];//显示c'位

delay2(300);

}

void wendu()

{

int temp;

temp=ReadTemperature();//读温度

bai=temp%1000/100;//显示百位

shi=temp%100/10;//显示十位

ge=temp%10;//显示个位

delay2(30);

display(bai,shi,ge);//显示函数}

void delay(char x)

{

char i,j;

for(i=0;i

void hanshu(void) {

second();

WXZ=0xfb; LED=TAB[10]; delay(10);

LED=0x00; minute();

WXZ=0xdf; LED=TAB[10]; delay(10);

LED=0x00;

hour();

delay(10);

}

void second(void) {

char i,j;

if(k3==0)

{

TR0=0;

delay(20);

while(k3==0) {

char k,e;

k=SEC/10;

e=SEC%10; display1(k,e); WXZ=0xfb; LED=TAB[10]; delay(7);

LED=0x00; minute();

WXZ=0xdf; LED=TAB[10]; delay(7); LED=0x00; hour();

}

SEC++;

TR0=1;

}

if(SEC>59)

{

SEC=0;

S_M=1;

}

i=SEC/10;

j=SEC%10; display1(i,j);

}

void minute(void) {

char i,j;

if(k2==0)

{

TR0=0;

delay(20);

while(k2==0) {

char k,e; second();

WXZ=0xfb; LED=TAB[10]; delay(7);

LED=0x00;

k=MIN/10;

e=MIN%10; display2(k,e); WXZ=0xdf; LED=TAB[10]; delay(7);

LED=0x00; hour();}

MIN=MIN+1; TR0=1;

}

if(MIN>59)

{

MIN=0;

M_H=1;

}

if(S_M==1) {

MIN++;

i=MIN/10;

j=MIN%10; display2(i,j);

}

else

{

i=MIN/10;

j=MIN%10; display2(i,j);

}

if(S_M==1)

S_M=0;

}

void hour(void) {

char i,j;

if(k1==0)

{

TR0=0;

delay(20); while(k1==0) {

char k,e; second(); WXZ=0xfb; LED=TAB[10]; delay(7);

LED=0x00; minute(); WXZ=0xdf; LED=TAB[10]; delay(7);

LED=0x00;

k=HOU/10;

e=HOU%10; display3(k,e);} HOU=HOU+1;

TR0=1;

}

if(HOU>=24)

{

HOU=0;

MIN=0;

SEC=0;

}

if(M_H==1)

{

HOU++;

i=HOU/10;

j=HOU%10;

display3(i,j);

}

else

{

i=HOU/10;

j=HOU%10;

display3(i,j);

}

if(M_H==1)

M_H=0;

}

void my_dingshi(void)interrupt 1 {

if(++count==20)

{

SEC++;

count=0;

}

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

}

void display1(char i,char j)

{

WXZ=0xfe;

LED=TAB[j];

delay(7);

LED=0x00;

WXZ=0xfd;

LED=TAB[i];

delay(7);

LED=0x00;

}

void display2(char i,char j)

{

WXZ=0xf7;

LED=TAB[j];

delay(7);

LED=0x00;

WXZ=0xef;

LED=TAB[i];

delay(7);

LED=0x00;

}

void display3(char i,char j)

{

WXZ=0xbf;

LED=TAB[j];

delay(7);

LED=0x00;

WXZ=0x7f;

LED=TAB[i];

delay(7);

LED=0x00;

}

void my_int1(void)interrupt 2 using 1 {

EA=0;

Q++;

delay(20);

if(Q==1)

TR0=0;

else

{

TR0=1;

Q=0;

}

EA=1;

} main()

{

unsigned int jj;

TMOD=0x01;

IE=0x87;

IP=0x05;

TCON=0x05;

TR0=1;

TH0=(65536-50000)/256; TL0=(65536-50000)%256; while(1)

{

hanshu();

if(k4==0)

{

while(k4!=0);

for(jj=200;jj>0;jj--) wendu();

}

}

}

基于51单片机及DS18B20温度传感器的数字温度计程序(详细注释)

基于51单片机及DS18B20温度传感器的数字温度计程序(详细注释)

电路实物图如下图所示: C 语言程序如下所示: /******************************************************************** zicreate ----------------------------- Copyright (C) https://www.wendangku.net/doc/786974727.html, -------------------------- * 程序名; 基于DS18B20的测温系统 * 功 能: 实时测量温度,超过上下限报警,报警温度可手动调整。K1是用来 * 进入上下限调节模式的,当按一下K1进入上限调节模式,再按一下进入下限 * 调节模式。在正常模式下,按一下K2进入查看上限温度模式,显示1s 左右自动 * 退出;按一下K3进入查看下限温度模式,显示1s 左右自动退出;按一下K4消除 * 按键音,再按一下启动按键音。在调节上下限温度模式下,K2是实现加1功能, * K1是实现减1功能,K3是用来设定上下限温度正负的。 * 编程者:Jason * 编程时间:2009/10/2 *********************************************************************/ #include //将AT89X52.h 头文件包含到主程序 #include //将intrins.h 头文件包含到主程序(调用其中的_nop_()空操作函数延时) #define uint unsigned int //变量类型宏定义,用uint 表示无符号整形(16位) #define uchar unsigned char //变量类型宏定义,用uchar 表示无符号字符型(8位) uchar max=0x00,min=0x00; //max 是上限报警温度,min 是下限报警温度 bit s=0; //s 是调整上下限温度时温度闪烁的标志位,s=0不显示200ms ,s=1显示1s 左右 bit s1=0; //s1标志位用于上下限查看时的显示 void display1(uint z); //声明display1()函数 #include"ds18b20.h" //将ds18b20.h 头文件包含到主程序 #include"keyscan.h" //将keyscan.h 头文件包含到主程序 #include"display.h" //将display.h 头文件包含到主程序

实时时钟设计实验报告

实验报告

源代码: #pragma sfr //使用特殊功能寄存器 #pragma EI //开中断 #pragma DI //关中断 #pragma access //使用绝对地址指令 #pragma interrupt INTTM000 Time //定义时间中断函数为Time #pragma interrupt INTKR OnKeyPress //定义按键中断为OnKeyPress #pragma interrupt INTP5 OnKeyOver //定义INT中断为OnKeyOver void Init_Led(); void InitKey_INTKR(); void Init_Lcd(); void Init_Inter(); void LightOneLed(unsigned char ucNum); void LightOff(); int Count_Day(int month); char i=0; //定义变量i,是切换时间的标志 int key=0; //定义key=0 int temp=1; //用于存放当前月的天数 int temp1=1; int second=0; //默认的秒second=0 int minute=0; //默认的分minute=0 int hour=12; //默认的时hour=12 int day=1; //默认的天day=1 int month=5; //默认的月month=5 int year=2014; //默认的年year=2014 int c_hour=1; //默认的闹钟时=1 int c_minute=1; //默认的闹钟分=1 int buffs[2]; //秒的数码显示缓存区 int buffm[2]; //分的数码显示缓存区 int buffh[2]; //时的数码显示缓存区 int buffday[2]; //天的数码显示缓存区 int buffmonth[2]; //月的数码显示缓存区 int buffyear[4]; //年的数码显示缓存区 int buffmd[4]; //月,天的数码显示缓存区 int buffhm[4]; //时,分的数码显示缓存区 int buffms[4]; //分,秒的数码显示缓存区 int buffch[2]; //闹钟时的数码显示缓存区 int buffcm[2]; //闹钟分的数码显示缓存区 unsigned char Que = 0; //INT中断中间变量 int LCD_num[10]={0X070d,0x0600,0x030e,0x070a,0x0603,0x050b,0x050f,0x0700,0x070f,0x070b};// 数字0~~9的显示码 unsigned char Scond; //…………………………延时函数1……………………// void Delay(int k){ i nt i,j; f or(i=0;i

微机原理课程设计数字时钟程序

河北科技大学 课程设计报告 学生姓名:学号: 专业班级: 电子信息科学与工程 课程名称:微型计算机原理及应用 学年学期: 2 01 1 —2012 学年第1 学期 指导教师: 20 0 1 1年 1 2月 课程设计成绩评定表

目录 一、课设题目及目的………………………………….4 二、设计任务………………………………………….4 三、总框图及设计流程 (4) 四、?源程序清单 (6) 五、?调试结果及显示 (19) 六、?个人贡献………………………………………….19 七、课程设计总结及体会 (21) 一、课设题目及目的 实习题目:数字时钟程序 实习目的:通过实习,使我们进一步弄懂所学到的课本知识,巩固和深化对8086系统的指令系统、中断系统、键盘/显示系统、程序设计、应用开发等基本理论知识的理解,提高汇编语言应用于技术的实践操作技能,掌握汇编语言应用系统设计、研制的方法,培养利用科技革新、开发和创新的基本能力,为毕业后从事与其相关的工作打下一定的基础。

二、课设任务 本课题为利用汇编语言设置时钟程序,其显示效果为:截取系统时间,能以时、分、秒(其中时为24小时制)的形式显示,并且通过合理的操作能修改时和分的内容来修改时间。再有,可以给它设定一个ALARM时间,到这个时间它就能产生信号,起到定时作用,。除此之外还能显示日期,日期分为年、月、日,其显示方式为xxxx年xx 月xx日。 ' *

DB '***********PRESS ESCBUTTON TO EXIT**************',0AH,0DH,'$' TN DB'PLEASE INPUT THE NEW TIME(HH:MM:SS):',0DH,0AH,'$' TMDB'PLEASE INPUT THE ALARM TIME (HH:MM:SS):',0DH,0AH,'$' MUSICMESS DB'PLEASE CHOOSE THE TYPE OF MUSIC:1(FAST) 2(MIDDLE) 3(SLOW)',0DH,0AH,'$' MESS2DB'TIME IS:',0AH,0DH,'$' MESS3DB 'TODAY IS:',0AH,0DH,'$' DBUFFER1DB20DUP('') T_BUFFD B 40 ;在数据段开一段时间显示缓冲区 DB ? DB 40DUP(?) HOR DB? MIN DB? SEC DB? TEMPHOR DB ? TEMPMIN DB? TEMPSEC DB? MUSIC DW 800;存放音乐的频率数DATA ENDS STACK SEGMENT DB 100 DUP(?) STACK ENDS CODESEGMENT ASSUME CS:CODE,SS:STACK,DS:DATA START: CALL CLEAR ;调用清屏子程序 DISPLAY:;时间显示部分 MOV AX,DATA MOVDS,AX MOVBX,OFFSETT_BUFF;送T_BUFF的偏移地址到BX MOV AH,2CH;调用DOS时间调用功能,功能号:2CH,小时,分钟,秒数分别保存在CH,CL,DH中 INT 21H ;判断时间是否相等SUB DH,1;秒数+1修正 CALL CHECK ;.........................................................................

基于AT89C51单片机的温度传感器

基于AT89C51单片机的温度传感器 目录 摘要.............................................................. I ABSTRACT........................................................... I I 第一章绪论 (1) 1.1 课题背景 (1) 1.2本课题研究意义 (2) 1.3本课题的任务 (2) 1.4系统整体目标 (2) 第二章方案论证比较与选择 (3) 2.1引言 (3) 2.2方案设计 (3) 2.2.1 设计方案一 (3) 2.2.2 设计方案二 (3) 2.2.3 设计方案三 (3) 2.3方案的比较与选择 (4) 2.4方案的阐述与论证 (4) 第三章硬件设计 (6) 3.1 温度传感器 (6) 3.1.1 温度传感器选用细则 (6) 3.1.2 温度传感器DS18B20 (7) 3.2.单片机系统设计 (13)

3.3显示电路设计.................................错误!未定义书签。 3.4键盘电路设计................................错误!未定义书签。 3.5报警电路设计.................................错误!未定义书签。 3.6通信模块设计.................................错误!未定义书签。 3.6.1 RS-232接口简介..............................错误!未定义书签。 3.6.2 MAX232芯片简介.............................错误!未定义书签。 3.6.3 PC机与单片机的串行通信接口电路.............错误!未定义书签。 第四章软件设计..................................错误!未定义书签。 4.1 软件开发工具的选择..........................错误!未定义书签。 4.2系统软件设计的一般原则.......................错误!未定义书签。 4..3系统软件设计的一般步骤......................错误!未定义书签。 4.4软件实现....................................错误!未定义书签。 4.4.1系统主程序流程图.........................错误!未定义书签。 4.4.2 传感器程序设计...........................错误!未定义书签。 4.4.3 显示程序设计.............................错误!未定义书签。 4.4.4 键盘程序设计.............................错误!未定义书签。 4.4.5 报警程序设计.............................错误!未定义书签。 4.4.6 通信模块程序设计.........................错误!未定义书签。 第五章调试与小结..................................错误!未定义书签。致谢...............................................错误!未定义书签。参考文献...........................................错误!未定义书签。附录...............................................错误!未定义书签。系统电路图.......................................错误!未定义书签。系统程序.........................................错误!未定义书签。

51定时器和lcd12864做的实时时钟显示(附图)

#include #include"intrins.h" #define uchar unsigned char #define uint unsigned int sbit rs=P1^0; sbit rw=P1^1; sbit e=P2^5; sbit psb=P1^2; sbit rst=P1^4; uchar hour,fen,miao,num; uchar code table[]="时间:"; uchar sbuf[]={0,0,0,0,0,0}; void delay(uint x) { uchar i,j; for(i=x;i>0;i--) for(j=110;j>0;j--); } void Timer0Init(void) //50??@11.0592MHz { TMOD |= 0x01; //??????? TL0 = 0x00; //??????

TH0 = 0x4C; //?????? EA=1; ET0=1; TR0=1; //???0???? } void Delay2ms() //@11.0592MHz { unsigned char i, j; _nop_(); i = 4; j = 146; do { while (--j); } while (--i); } void Delay100us() //@11.0592MHz { unsigned char i, j; i = 2; j = 109; do { while (--j); } while (--i);

void Delay50ms() //@11.0592MHz { unsigned char i, j, k; i = 3; j = 207; k = 28; do { do { while (--k); } while (--j); } while (--i); } void write_12864com(uchar com) { rs=0; rw=0; Delay100us(); P0=com; e=1; Delay100us(); e=0; Delay100us(); }

数字时钟程序

#define uchar unsigned char #define unit unsigned int #include #include #include void 1cd_putchar(uchar 1cdchar) void 1cd_putsf(uchar code *chars) uchar code http[ ]={"current time is:"} sbit KEY1=P3^3; // sbit KEY2=p3^4; // ///////////////////////////////////////// uchar t50ms,ts,tm,th; uchar DISP_BUFFER[6]=0; void timer0(void) interrupt 1 using1 { THO=0x3c; TLO=0xbo; //50ms t50ms++; if(t50ms==20) { t50ms=0; ts++; if(ts==60) {tm=0; th++; if(th==24) {th=0; } } } } } void main (void) { p0=OXFF; P1=OXFF; P2=OXFF; P3=OXFF; TMOD=0X01;//T0 THO=0X3C; TLO=0XB0;//50ms EA=1 ETO=1; initialise();

1cd_setxy(0,0); 1cd_putsf(http); TRO=1; while(1) { DISP_BUFFER[0]=th/10; DISP_BUFFER[1]=th%/10; DISP_BUFFER[2]=tm/10; DISP_BUFFER[3]=tm%/10; DISP_BUFFER[4]=ts/10; DISP_BUFFER[5]=ts%/10; 1cd_setxy(1,0); 1cd_putchar(DISP_BUFFER[0]+0X30; 1cd_putchar(DISP_BUFFER[1]+0X30; 1cd_putchar(':'); 1cd_putchar(DISP_BUFFER[2]+0X30; 1cd_putchar(DISP_BUFFER[3]+0X30; 1cd_putchar(':'); 1cd_putchar(DISP_BUFFER[4]+0X30; 1cd_putchar(DISP_BUFFER[5]+0X30; if(!KEY1) {TM++; delay_ms(100);} } } //display one char void 1cd_putchar(uchar 1cdchar) { output(1cdchar); } //display a sting void 1cd_putsf(uchar code *chars) { uchar i=0; while(chars[i]>=0x20&chars[i]<0x7f) {if (i<0x0f) {output (chars[i]); i++; } else { 1cd_setxy(1,0); while( (chars[i]>0x20&chars[i]<0x7f) ) {output(chars[i]);

实时时钟实验报告

嵌入式系统开发实验报告 实验四:实时时钟实验 班级:应电112 姓名:张志可 学号: 110415151 指导教师:李静 实验日期: 2013年9月25日

实验四:实时时钟实验 一、实验目的 1. 了解实时时钟的硬件控制原理及设计方法。 2. 掌握 S3C2410X 处理器的 RTC 模块程序设计方法。 二、实验设备 硬件:Embest ARM 教学实验系统,ULINK USB-JTAG 仿真器套件,PC 机。 软件:MDK 集成开发环境,Windows 98/2000/NT/XP。 三、实验原理 1. 实时时钟(RTC) 实时时钟(RTC)器件是一种能提供日历/时钟、数据存储等功能的专用集成电路,常用作各种计算机系统的时钟信号源和参数设置存储电路。RTC 具有计时准确、耗电低和体积小等特点,特别是在各种嵌入式系统中用于记录事件发生的时间和相关信息,如通信工程、电力自动化、工业控制等自动化程度高的领域的无人值守环境。随着集成电路技术的不断发展,RTC 器件的新品也不断推出,这些新品不仅具有准确的 RTC,还有大容量的存储器、温度传感器和 A/D 数据采集通道等,已成为集 RTC、数据采集和存储于一体的综合功能器件,特别适用于以微控制器为核心的嵌入式系统。 RTC 器件与微控制器之间的接口大都采用连线简单的串行接口,诸如 I2C、SPI、MICROWIRE 和CAN 等串行总线接口。这些串口由2~3 根线连接,分为同步和异步。 2. S3C2410X 实时时钟(RTC)单元 S3C2410X 实时时钟(RTC)单元是处理器集成的片内外设。由开发板上的后备电池供电,可以在系统电源关闭的情况下运行。RTC 发送8 位BCD 码数据到CPU。传送的数据包括秒、分、小时、星期、日期、月份和年份。RTC 单元时钟源由外部32.768KHz 晶振提供,可以实现闹钟(报警)功能。 四、实验内容 学习和掌握 Embest ARM 教学实验平台中 RTC 模块的使用,编写应用程序,修改时钟日期及时间的设置,以及使用 EMBEST ARM 教学系统的串口,在超级终端显示当前系统时间。

基于51单片机DS18B20温度传感器的C语言程序和电路

基于51单片机DS18B20温度传感器的C语言程序和电路 DS18B20在外形上和三极管很像,有三只脚。电压范围为3.0 V至5.5 V 无需备用电源测量温度位温度转换为12位数字格式最大值为750毫秒用户可定义的非易失性温度报警设置应用范围包敏感系统。 下面是DS18B20的子程序,本人用过完全可行的: #include #include #define uchar unsigned char #define uint unsigned int sbit DQ=P2^0; void reset(); //DS18B20 void write_byte(uchar val); //DS18B20写命令函数 uchar read_byte(void); //DS18B20读1字节函数 void read_temp(); //温度读取函数 void work_temp(); //温度数据处理函数 uchar data temp_data[2]={0x00,0x00}; uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; //对于温度显示值值 uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x0数部分查表 main() { while(1) { 自己添加; } } void delay1(uint t) { for(;t>0;t--); } ///////温度控制子函数 void reset() { uchar presence=1; while(presence) { while(presence) {

电子综合设计-基于单片机多功能数字时钟的设计(附完整程序)

课题:基于51单片机的多功能数字时钟系统设计 一、概述、设计思路 该设计方案是以MC51单片机为核心,采用LCD液晶屏幕显示系统,辅以闹钟模块,温度采集模块、日期提醒、键盘时间调整预设置等模块,所构建的数字时钟系统,能动态显示实时时钟的时、分、秒,数据显示(误差限制在30每天),对闹铃方式与温度调节模块进行了重点设计实现SB0、SB1、SB2、SB3四个键实现时钟正常显示,调时,及闹钟时间设置。本系统设计大部分功能有软件来实现,使电路简单明了,系统稳定性也得大大提高。 二、系统组成与工作原理 1、工作原理: 本设计采用STC89C51单片机作为本次课程设计的控制模块。单片机可把由DS18B20、DS1302、AT24C02中的数据利用软件来进行处理,从而把数据传输到显示模块,实现温度、日历和闹铃的显示。以LCD液晶显示器为显示模块,把单片机传来的的数据显示出来,并且显示多样化,在显示电路中,主要靠按键来实现各种显示要求的选择与切换。 2、总是设计框架图:

图二:系统总体电路图 三、单元电路的设计与分析 整个电子时钟系统电路可分为六大部分:中央处理单元(CPU)、复位电路部分、显示部分、键盘输入部分、温度采集部分。 1、MCS-51单片机 VCC: 89S51 电源正端输入,接+5V。 VSS: 电源地端。

XTAL1: 单芯片系统时钟的反相放大器输入端。 XTAL2: 系统时钟的反相放大器输出端,一般在设计上只要在XTAL1 和XTAL2 上接上一只石英振荡晶体系统就可以动作了,此外可以在两引脚与地之间加入一20PF 的小电容,可以使系统更稳定,避免噪声干扰而死机。 RESET: 89S51的重置引脚,高电平动作,当要对晶片重置时,只要对此引脚电平提升至高电平并保持两个机器周期以上的时间,AT89S51便能完成系统重置的各项动作,使得内部特殊功能寄存器之内容均被设成已知状态,并且至地址0000H处开始读入程序代码而执行程序。 EA/Vpp: "EA"为英文"External Access"的缩写,表示存取外部程序代码之意,低电平动作,也就是说当此引脚接低电平后,系统会取用外部的程序代码(存于外部EPROM中)来执行程序。因此在8031及8032中,EA引脚必须接低电平,因为其内部无程序存储器空间。如果是使用8751 内部程序空间时,此引脚要接成高电平。此外,在将程序代码烧录至8751内部EPROM时,可以利用此引脚来输入21V的烧录高压(Vpp)。 ALE/PROG: 端口3的管脚设置: P3.0:RXD,串行通信输入。 P3.1:TXD,串行通信输出。 P3.2:INT0,外部中断0输入。

嵌入式ARM实时时钟实验报告

嵌入式ARM实时时钟实验报告 实验二实时时钟实验1 实验目的(1) 了解实时时钟在嵌入式系统中的作用;(2) 掌握实时时钟的使用。 2 实验设备(1) S3C2410嵌入式开发板,JTAG仿真器。 (2) 软件:PC机操作系统Win98、Win2000或Windows XP,集成开发环境,仿真器驱动程序,超级终端通讯程序。 3 实验内容(1) 编程实现实时时钟功能,每秒显示实时时钟;(2) 编程实现实时时钟告警功能。 4 实验步骤(1) 参照模板工程,新建一个工程RTC,添加相应的文件,并修改RTC 的工程设置;(2) 创建并加入到工程RTC中;(3) 编写程序每秒钟读取时钟滴答;关键代码如下:old_index=led_index; Uart_Printf; While{ /*每隔1秒更新一次数据*/ if { rtc_get_data;

old_index=led_index; /*实时时钟数据为BCD码格式,以16进制显示*/ Uart_Printf; } }; (4) 编写程序实现时间告警功能;关键代码如下; a.首先设置告警时间,如下例程设置每分钟的第5秒告警m_=0x05; rtc_alalm_set; 模式0x41表示使能RTC告警,以及使能秒时钟告警b.注册中断例程,打开中断install_isr_handlerrtc_int_isr); rINTMSK=; c.中断服务例程中清除中断事件rI_ISPC=BIT_RTC; if *0x20000000=0x0f; else *0x20000000=0xff; alarm_count++; (5) 编译RTC;(6) 运行超级终端,选择正确的串口号,并将串口设置位:波特率、奇偶校验、数据位数和停止位数,无流控,打开串口;(7) 装载程序并运行,如果运行正确,在超级终端中将会显示如图所示内容。图运行结果 5 实验总结通过这次实验我进一步掌握了RTCCON控制

基于51单片机的数字温度报警器

摘要:随着传感器在生产生活中更加广泛的应用,一种新型的数字式温度传感器实现对温度的测试与控制得到了更快的开发。本文设计了一种基于单片机AT89C52的温度检测及报警系统。该系统将温度传感器DS18B20接到单片机的一个端口上,单片机对温度传感器进行循环采集。将采集到的温度值与设定的上下限进行比较,当超出设定范围的上下限时,通过单片机控制的报警电路就会发出报警信号,从而实现了本次课程设计的要求。该系统设计和布线简单、结构紧凑、体积小、重量轻、抗干扰能力较强、性价比高、扩展方便,在工农业等领域的温度检测中有广阔的应用前景。本次课程设计的测量范围为0℃--99℃,测量误差为±2℃。 关键字:温度传感器、单片机、报警、数码管显示 一、概述 本次设计可以应用到许多我们用过的软件设计,将前面所学的知识融汇在一起实现温度监测及其报警的功能,来提醒农民当前大棚内温度是否适合农作物的生长。 电子技术是在十九世纪末、二十世纪初开始发展起来的新兴技术,在二十世纪发展最迅速,应用最广泛,成为近代科学技术发展的一个重要标志。 随着电子技术的飞速发展,电子技术在日常生活中得到了广泛的应用,各类转换电路的不断推出以及电子产品的快速更新,电子技术已成为世界发展和人们生活中必不可少的工具。 本次课设应用Protues软件设计一个温度检测报警系统,用温度传感器DS18B20采集大棚内的温度,当大棚内的温度高于30℃。或低于15℃。时,电路发出报警信号并显示当前温度,达到提醒农民的效果。 本次课设要求设计一个温度监测报警显示电路,要求温度范围:0℃--99℃;测量误差为±2℃;报警下限温度为:15℃;报警上限温度为:30℃。 二、方案论证 设计一个用于温室大棚温度监测系统。大棚农作物生长时,其温度不能太低,也不能太高,太低或太高均不适合农作物生长。该系统可实时测量、显示大棚的温度,当大棚温度超过农作物生长的温度范围时,报警提醒农民。 方案一: 方案一原理框图如图1所示。 图1 大棚温度检测系统的原理框图 方案二: 方案二原理框图如图2所示。

基于ds1302的51单片机简易实时时钟-1602显示-源程序

。 ==================主程序================= #include

。#include "ds1302.h" #include "LCD1602.h" void change(); uchar times[9]; uchar date[9]; main() {LCD_init();//LCD初始化 init_1302(time_1302); gotoxy(1,1); LCD_display("Time:"); gotoxy(1,2); LCD_display("Date:"); times[8]='\0';// date[8]='\0'; while(1) {get_1302(time_1302); change(); gotoxy(7,1); LCD_display(times); gotoxy(7,2); LCD_display(date);

} } /*=========================== 转换子程序 ===========================*/ void change() { // 时间的转换 times[0]=time_1302[2]/10+'0'; times[1]=time_1302[2]%10+'0'; times[2]=':'; times[3]=time_1302[1]/10+'0'; times[4]=time_1302[1]%10+'0'; times[5]=':'; times[6]=time_1302[0]/10+'0'; times[7]=time_1302[0]%10+'0'; // 日期的转换 date[0]=time_1302[6]/10+'0'; date[1]=time_1302[6]%10+'0'; date[2]='-';

数字电子时钟源程序

#include "2407c.h" //数字电子时钟按Key1启动、Key2暂停、Key3复位、Key4调时 #define disable() asm(" setc INTM") //禁止全局中断 #define enable() asm(" clrc INTM") //允许全局中断 unsigned int k=0,s=30,m=59,h=23,j=1; unsigned int d[8] = {0x0100,0x0200,0x030a,0x0400,0x0500,0x060a,0x0700,0x0800}; unsigned int w[8] = {0x0101,0x0204,0x030a,0x0400,0x0503,0x060a,0x0700,0x0804}; //系统初始化子程序 void chushihua (void) { asm (" clrc SXM"); //抑制符号位扩展 asm (" clrc OVM"); //累加器正常溢出 asm (" clrc CNF"); //B0被配置为数据存储空间 *WDCR=0x00E8; //关闭看门狗 *SCSR1=0X00FC; //CLKIN=10M,CLKOUT=CLK*4=40M *IMR=0x0002; //开INT2 *IFR=0xFFFF; //清全部中断,写1清0,参见P43 *MCRB=0xFE3C; //启用SPI功能引脚 *MCRA=0; //IOPA、IOPB配置为一般I/O功能 *MCRC=0; //IOPE、IOPF配置为一般I/O功能 *PFDATDIR=0x00FF; //IOPF设置为输入,并上拉 *SPICCR=0x0F; //SPI软复位、上升沿输出数据、16位数据长度 *SPICTL=0x0E; //禁止过冲中断、允许TALK(发送)数据、主机模式、禁止SPI中断//上升沿有延时 *SPIBRR=0x0F; //SPI波特率=SYSCLK/(SPIBRR+1)=2.5M *SPICCR=*SPICCR|0x80; //SPI恢复操作,准备发送、接收下一个字符 WSGR=0x00; //禁止所有的等待状态 } //延时子程序 void delay(unsigned int pp) { unsigned int k,i; for(k=0;k

嵌入式软件开发基础实验报告 实时时钟

上海电力学院 嵌入式软件开发基础实验报告 题目:【ARM】实时时钟实验 专业:电子科学与技术 年级: 姓名: 学号:

一、实验目的 1、了解实时时钟的硬件控制原理及设计方法。 2、掌握S3C44B0X 处理器的RTC 模块程序设计方法。 二、实验设备 1、硬件:Embest EduKit-III 实验平台,Embest ARM 标准/增强型仿真器套件,PC 机。 2、软件:Embest IDE Pro ARM 集成开发环境,Windows 98/2000/NT/XP。 三、实验内容 学习和掌握 Embest EduKit-III 实验平台中RTC 模块的使用,进行以下操作: 1、编写应用程序,修改时钟日期及时间的设置。 2、使用EMBEST ARM 教学系统的串口,在超级终端显示当前系统时间。 四、实验原理 1. 实时时钟(RTC) 实时时钟(RTC)器件是一种能提供日历/时钟、数据存储等功能的专用集成电路,常用作各种计算机系统的时钟信号源和参数设置存储电路。RTC 具有计时准确、耗电低和体积小等特点,特别是在各种嵌入式系统中用于记录事件发生的时间和相关信息,如通信工程、电力自动化、工业控制等自动化程度高的领域的无人值守环境。随着集成电路技术的不断发展,RTC 器件的新品也不断推出,这些新品不仅具有准确的RTC,还有大容量的存储器、温度传感器和A/D 数据采集通道等,已成为集RTC、数据采集和存储于一体的综合功能器件,特别适用于以微控制器为核心的嵌入式系统。 RTC 器件与微控制器之间的接口大都采用连线简单的串行接口,诸如I2C、SPI、MICROWIRE和CAN 等串行总线接口。这些串口由2~3 根线连接,分为同步和异步。 2. S3C44B0X 实时时钟(RTC)单元 S3C44B0X 实时时钟(RTC)单元是处理器集成的片内外设。由开发板上的后备电池供电,可以在系统电源关闭的情况下运行。RTC 发送8 位BCD 码数据到CPU。传送的数据包括秒、分、小时、星期、日期、月份和年份。RTC 单元时钟源由外部32.768KHz 晶振提供,可以实现闹钟(报警)功能。 S3C44B0X 实时时钟(RTC)单元特性: BCD 数据:秒、分、小时、星期、日期、月份和年份 1、闹钟(报警)功能:产生定时中断或激活系统 2、自动计算闰年 3、无2000 年问题 4、独立的电源输入 5、支持毫秒级时间片中断,为RTOS 提供时间基准 读/写寄存器 访问 RTC 模块的寄存器,首先要设RTCCON 的bit0 为1。CPU 通过读取RTC 模块中寄存器BCDSEC、BCDMIN、BCDHOUR、BCDDAY、BCDDATE、BCDMON 和 BCDYEAR 的值,得到当前的相应时间值。然而,由于多个寄存器依次读出,所以有可能产生错误。比如:用户依次读取年(1989)、月(12)、日(31)、时(23)、分(59)、秒(59)。当秒数为1 到59 时,没有任何问题,但是,当秒数为0 时,当前时间和日期就变成了1990 年1 月1 日0 时0 分。这种情况下(秒数为0),用户应该重新读取年份到分钟的值(参考程序设计)。

实时日历时钟显示系统的设计

微机原理及应用课程设计任务书 20 xx -20 xx 学年第 x 学期第 xx 周- xx 周 题目实时日历时钟显示系统的设计 内容及要求 内容:实时日历时钟显示系统 要求:设计一个实时日历时钟显示系统的程序。用“年/月/日”,“时:分:秒”(都是两位)的形式连续显示系统时间 进度安排 课程设计内容时间分配 方案论证1天 分析、设计、调试、运行3天 检查、整理、写设计报告、小结1天 合计5天 学生姓名: xx 指导时间: xxxx 指导地点: xxxx 任务下达任务完成 考核方式 1.评阅√ 2.答辩√ 3.实际操作□ 4.其它□指导教师系(部)主任 注:1、此表一组一表二份,课程设计小组组长一份;任课教师授课时自带一份备查。 2、课程设计结束后与“课程设计小结”、“学生成绩单”一并交院教务存档。

此次微机原理课程设计要求设计一个实时日历时钟显示系统。 本程序利用DOS中断2AH号功能调用取系统年月日,再逐个显示各数据,利用2CH号功能调用取系统时间,逐个显示各数据。用“时:分:秒”(都是两位)的形式连续显示系统时间,并利用计算机提供的软件调试工具对所编写程序进行调试,记录下整个调试分析的过程与运行结果。 任务安排: 主程序: xx:主体程序和流程设计 xx:日历调用显示系统 xx:时间调用显示系统 子程序: xx:显示两位数字的子程序

一、课程名称 (2) 二、课程内容及要求 (2) 三、小组组成 (2) 四、设计思路 (3) 五、程序流程图及介绍 (4) 六、调试 (5) 七、总结 (7) 八、参考资料 (9) 附录 (9)

一、课程名称:实时日历时钟显示系统的设计 二、课程内容及要求 课程内容:实时日历时钟显示系统 要求:设计一个实时日历时钟显示系统的程序。用“年/月/日”,“时:分:秒”(都是两位)的形式连续显示系统时间 三、小组组成: 成员: xx, xx, xx, xx 任务安排: 主程序: xx:主体程序和流程设计 xx:日历系统 xx:时间系统 子程序: xx:显示两位数字的子程序

基于单片机的温度传感器的设计说明

基于单片机的温度传感器 的设计 目录 第一章绪论-------------------------------------------------------- ---2 1.1 课题简介 ----------------------------------------------------------------- 2 1.2 设计目的 ----------------------------------------------------------------- 3 1.3 设计任务 ----------------------------------------------------------------- 3 第二章设计容与所用器件 --------------------------------------------- 4第三章硬件系统设计 -------------------------------------------------- 4 3.1单片机的选择------------------------------------------------------------- 4 3.2温度传感器介绍 ---------------------------------------------------------- 5 3.3温度传感器与单片机的连接---------------------------------------------- 8 3.4单片机与报警电路-------------------------------------------------------- 9 3.5电源电路----------------------------------------------------------------- 10 3.6显示电路----------------------------------------------------------------- 10 3.7复位电路----------------------------------------------------------------- 11 第四章软件设计 ----------------------------------------------------- 12 4.1 读取数据流程图--------------------------------------------------------- 12 4.2 温度数据处理程序的流程图 -------------------------------------------- 13 4.3程序源代码 -------------------------------------------------------------- 14

FPGA可调数字时钟实验报告

一、实验要求 1、用vhdl编程,实现10进制计数器 2、用vhdl编程,实现60进制计数器 3、用vhdl编程,实现数字时钟,时、分、秒、毫秒分别显示在数码管上。 4、实现可调数字时钟的程序设计,用按键实现时、分、秒、毫秒的调整。 二、实验原理 用VHDL,行为级描述语言实现实验要求。思路如下: 1、分频部分:由50MHZ分频实现1ms的技术,需要对50MHZ采取500000分 频。 2、计数部分:采用低级影响高级的想法,类似进位加1的思路。对8个寄存器进 行计数,同步数码管输出。 3、数码管输出部分:用一个拨码开关控制显示,当sw0=0时,四位数码管显示 秒、毫秒的计数。当sw0=1时,四位数码管显示时、分得计数。 4、调整部分:分别用四个按键控制时、分、秒、毫秒的数值。先由一个开关控制 计数暂停,然后,当按键按下一次,对应的数码管相对之前的数值加1,,通过按键实现时间控制,最后开关控制恢复计数,完成时间调整。 5、整个实现过程由一个文件实现。 三、实验过程 各个引脚说明: Clk:50MHZ SW:数码管切换,SW=’0’时,数码管显示为秒,毫秒。SW=’1’时,数码管显示为时,分。 SW1:暂停与启动。SW1=’0’时,时钟启动,SW=’1’时,时钟暂停。 SW2:时钟调整接通按钮,当SW2=’0’时,不进行调整,当SW=’1’时,通过按键调整时间。 KEY0:毫秒调整,按一次实现+1功能 KEY1:秒调整,按一次实现+1功能

KEY2:分调整,按一次实现+1功能 KEY3:时调整,按一次实现+1功能 Q0;第一个数码管 Q1; 第二个数码管 Q2: 第三个数码管 Q3: 第四个数码管 1、源代码如下: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity paobiao is port(clk,sw,key0,key1,key2,key3,sw1,sw2:in std_logic; q0:out std_logic_vector(6 downto 0); q1:out std_logic_vector(6 downto 0); q2:out std_logic_vector(6 downto 0); q3:out std_logic_vector(6 downto 0)); end paobiao; architecture behave of paobiao is signal cntt1 :integer range 0 to 10; signal cntt2 :integer range 0 to 10; signal cntt3 :integer range 0 to 10; signal cntt4 :integer range 0 to 6; signal cntt5 :integer range 0 to 10; signal cntt6 :integer range 0 to 10; signal cntt7 :integer range 0 to 10; signal cntt8 :integer range 0 to 6;

相关文档
相关文档 最新文档