单片机课程设计1

更新时间:2024-05-19 04:00:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

湖南人文科技学院

课程设计报告

课程名称:单片机原理及应用课程设计

设计题目: 数字测温仪 系 别: 通信与控制工程系 专 业: 班 级: 学生姓名: 学 号: 起止日期: 2010年12月19日~ 2010年12月31日 指导教师: 教研室主任:

指导教师评语: 指导教师签名: 年 月 日 成项 目 权重 0.2 0.5 0.3 成绩 绩1、设计过程中出勤、学习态度等方面 评定 2、课程设计质量与答辩 3、设计报告书写及图纸规范程度 总 成 绩 教研室审核意见: 教研室主任签字: 年 月 日 教学系审核意见: 主任签字: 年 月 日

摘 要

随着时代的进步和发展,单片机技术已经普及到我们生活,工作,科研,各个领域,一种数字式温度计以数字温度传感器作感温元件,它以单总线的连接方式,使电路大大的简化;传统的温度检测大多以热敏电阻为传感器,这类传感器可靠性差,测量温度准确率低且电路复杂。因此,本温度计摆脱了传统的温度测量方法,利用单片机对传感器进行控制。这样易于智能化控制。 关键词:单片机技术、数字温度计、数字温度传感器

1

目 录

1.设计要求 ......................................................................................................................... 1

1.1设计目的: .............................................................................................................. 1 1.2基本任务与要求 ...................................................................................................... 1 2. 总体方案设计 .................................................................................................................. 1

2.1方案一:以热敏电阻为传感器检测温度 .............................................................. 1 2.2方案二:以温度芯片DS18B20 测量温度 ........................................................... 2 3. 单元电路的设计和元器件的选择 .................................................................................. 3

3.1微控制器模块 .......................................................................................................... 3 3.2温度采集模块 .......................................................................................................... 5 3.3报警模块 .................................................................................................................. 6 3.4温度显示模块 .......................................................................................................... 6 3.5 其它外围电路 ......................................................................................................... 7 3.6电源电路 .................................................................................................................. 8 4. 程序设计 .......................................................................................................................... 9

4.1流程图 ...................................................................................................................... 9 4.2程序分析 ................................................................................................................ 10 5. 调试与测试 .................................................................................................................... 13

5.1软件调试步骤 ........................................................................................................ 13 5.2程序调试步骤 ........................................................................................................ 14 5.3测试结果 ................................................................................................................ 14 6. 技术小结 ........................................................................................................................ 14 7. 致谢 ................................................................................................ 错误!未定义书签。 8. 详细程序 ........................................................................................................................ 15 9.参考文献 .......................................................................................................................... 20

数字测温仪

1.设计要求

1.1设计目的:

1)巩固、深化和拓展理论知识与初步的专业技能。

2)熟悉单片机的应用。

3)掌握温度传感器DS18B20的应用。 4)建立时序的基本概念。

1.2基本任务与要求

本课题以单片机为核心,设计并制作出一台数字测温仪,具有以下功能: 1) 单点温度测试; 2) 测温范围: 0℃~40℃; 3) 分辨率:0~1℃; 4) 温度输出显示:2 位;

5) 设定上下限,超出范围时报警。

2. 总体方案设计

2.1方案一:以热敏电阻为传感器检测温度

采用热电偶温差电路测温,温度检测部分可以使用低温热偶,热电偶由两个焊接在一起的异金属导线所组成(热电偶的构成如图 2.1),热电偶产生的热电势由两种

1

金属的接触电势和单一导体的温差电势组成。通过将参考结点保持在已知温度并测量该电压,便可推断出检测结点的温度。数据采集部分则使用带有A/D 通道的单片机,在将随被测温度变化的电压或电流采集过来,进行A/D 转换后,就可以用单片机进行数据的处理,在显示电路上,就可以将被测温度显示出来。热电偶的优点是工作温度范围非常宽,且体积小,但是它们也存在着输出电压小、容易遭受来自导线环路的噪声影响以及漂移较高的缺点,并且这种设计需要用到A/D 转换电路,感温电路比较麻烦。

图2-1 热电偶电路图

系统主要包括对A/D0809 的数据采集,自动手动工作方式检测,温度的显示等,这几项功能的信号通过输入输出电路经单片机处理。此外还有复位电路,晶振电路,启动电路等。故现场输入硬件有手动复位键、A/D转换芯片,处理芯片为52芯片,执行机构有6位数码管、报警器等。系统框图如图4-2所示:

图2-2 热电偶温差电路测温系统框图

2.2方案二:以温度芯片DS18B20 测量温度

采用数字温度芯片DS18B20 测量温度,输出信号全数字化。便于单片机处理及控制,省去传统的测温方法的很多外围电路。且该芯片的物理化学性很稳定,它能用

2

做工业测温元件,此元件线形较好。在0—100 摄氏度时,最大线形偏差小于1 ℃。DS18B20 的最大特点之一采用了单总线的数据传输,由数字温度计DS18B20和微控制器STC89C52构成的温度测量装置,它直接输出温度的数字信号,可直接与计算机连接。这样,测温系统的结构就比较简单,体积也不大。采用52 单片机控制,软件编程的自由度大,可通过编程实现各种各样的算术算法和逻辑控制,而且体积小,硬件实现简单,安装方便。既可以单独对多DS18B20

控制工作,还可以与PC 机通信上传数据,另外STC89C52在工业控制上也有着广泛的应用,编程技术及外围功能电路的配合使用都很成熟。

该系统利用STC89C52芯片控制温度传感器DS18B20进行实时温度检测并显示,能够实现快速测量环境温度,并可以根据需要设定上下限报警温度。

报警电路 晶振电路 复位电路

单驱动电路 显示电路图2-3 DS18B20温度测温系统框图

从以上两种方案,容易看出方案一的测温装置可测温度范围宽、体积小,但是线性误差较大。方案二的测温装置电路简单、精确度较高、实现方便、软件设计也比较简单,故本次设计采用了方案二。

3. 单元电路的设计和元器件的选择

3.1微控制器模块

STC89C52是一个低功耗,高性能CMOS 8位单片机,片内含8k Bytes ISP(In- system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用INTEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的STC89C52可为许多嵌入式控制应用系统提供高性价比的解决方案。STC89C52

3

片机 测温电路

具有如下特点:40个引脚,8k Bytes Flash片内程序存储器,256 bytes的随机存取数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器,2个全双工串行通信口,看门狗(WDT)电路,片内时钟振荡器。

此外,STC89C52设计和配置了振荡频率可为0Hz并可通过软件设置省电模式。空闲模式下,CPU暂停工作,而RAM定时计数器,串行口,外中断系统可继续工作,掉电模式冻结振荡器而保存RAM的数据,停止芯片其它功能直至外中断激活或硬件复位。同时该芯片还具有PDIP、TQFP和PLCC等三种封装形式,以适应不同产品的需求。

由于系统控制方案简单 ,数据量也不大 ,考虑到电路的简单和成本等因素 ,因此在本设计中选用INTEL公司的STC89C52单片机作为主控芯片。主控模块采用单片机最小系统是由于 STC89C52芯片内含有8kB的E2PROM ,无需外扩存储器 ,电路简单可靠 ,其时钟频率为 0~24 MHz ,并且价格低廉 ,批量价在 10元以内。 主要特性如下 ●与MCS-51 兼容

●8k可反复擦写(>1000次)Flash ROM ●寿命:1000写/擦循环 ●数据保留时间:10年 ●全静态工作:0Hz-24Hz ●三级程序存储器锁定 ●256*8位内部RAM ●32可编程I/O线

●3个16位可编程定时/计数器 ●6个中断源 ●可编程串行通道

●低功耗的闲置和掉电模式 图 3-1 STC89C52单片机引脚图 ●软件设置睡眠和唤醒功能

4

3.2温度采集模块

DS18B20是DALLAS公司生产的一线式数字温度传感器,它具有微型化、低功耗、高性能抗干扰能力、强易配处理器等优点,特别适合用于构成多点温度测控系统,可直接将温度转化成串行数字信号(按9位二进制数字)给单片机处理,且在同一总线上可以挂接多个传感器芯片,它具有三引脚TO-92小体积封装形式,温度测量范围-55~+125℃,可编程为9~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出,其工作电源既可在远端引入,业可采用寄生电源方式产生,多个DS18B20可以并联到三根或者两根线上,CPU只需一根端口线就能与多个DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。从而可以看出DS18B20可以非常方便的被用于远距离多点温度检测系统。

综上,在本系统中我采用温度芯片DS18B20测量温度。该芯片的物理化学性很稳定,它能用做工业测温元件,且此元件线形较好。在0—100摄氏度时,最大线形偏差小于1摄氏度。该芯片直接向单片机传输数字信号,便于单片机处理及控制。

图3-2 温度芯片DS18B20

DS18B20 最大的特点是单总线数据传输方式,DS18B20 的数据I/O 均由同一条线来完成。DS18B20 的电源供电方式有2 种: 外部供电方式和寄生电源方式。工作于寄生电源方式时, VDD 和GND 均接地, 他在需要远程温度探测和空间受限的场合特别有用, 原理是当1Wire 总线的信号线DQ 为高电平时, 窃取信号能量给DS18B20 供电, 同时一部分能量给内部电容充电, 当DQ为低电平时释放能量为DS18B20 供电。但寄生电源方式需要强上拉电路, 软件控制变得复杂(特别是在完成温度转换和拷贝数据到E2PROM 时) , 同时芯片的性能也有所降低。外部电源供电方式是DS18B20最佳的工作方式,工作稳定可靠,抗干扰能力强,而且电路也比较简单,可以开发出稳定可靠的多点温度监控系统。因此本设计采用外部供电方式。如下图所示:

5

图3-3 温度检测电路

温度传感器DS18B20的测量范围为-55℃~+125℃,在-10℃~+85℃时精度为±0.5℃。因为本设计只用于测量环境温度,所以只显示0℃~+40℃。

3.3报警模块

本设计采软件处理报警,利用有源蜂鸣器进行报警输出,采用直流供电。当所测温度超过获低于所预设的温度时,数据口相应拉高电平,报警输出。报警电路硬件连接见图3-4

图3-4 蜂鸣器电路连接图

3.4温度显示模块

本设计显示电路采用两位共阳极LED数码管来显示测量得到的温度值。LED数码管能在低电压下工作,而且体积小、重量轻、使用寿命长,因次本设计选用此数码管作为显示器件。

一个LED数码管只能显示一位的字符,如果字符位数不止一位,可以用几个数码管组成,但要控制多位的显示电路需要有字段控制和字位控制,字段控制是指控制所要显示的字符是什么,控制电路应将字符的七段码通过输出口连接到LED的a~g引脚,是某些段点亮,某些段处于熄灭状态。字位控制是指控制在多位显示器中,哪几位发光或那几位不发光,字位控制则需要通过字位码作用于LED数码管的公共引脚,是某一位或某几位的数码管可以发光。

6

数码管显示电路分为动态显示和静态显示。

静态显示方式是指每一个数码管的字段控制是独立的,每一个数码管都需要配置一个6位输出口来输出该字位的七段码。因此需要显示多位时需要多个输出口,通常片内并口不够用,需要在片外扩展。

动态显示又称为扫描显示方式,也就是在某一时刻只能让一个字位处于选通状态,其他字位一律断开,同时在字段线上发出该位要显示的字段码,这样在某一时刻某一位数码管就会被点亮,并显示出相应的字符。下一时刻改变所显示的字位和字段码,点亮另一个数码管,显示另一个字符。绕后一次扫描轮流点亮其他数码管,只要扫描速度快,利用人眼的视觉残留效应,会使人感觉到几位数码管都在稳定的显示。 本设计采用数码管动态显示,电路如下图所示:

图3-5显示部分电路

图中由单片机P0和P2口串接8255驱动六位共阳极数码管,上拉电阻排为1K。由8355的PA口通过PNP型三极管Q驱动其字位。三极管发射极接高电平,当8255的PA口为低电平时使三极管导通选通数码管的某一位。

3.5 其它外围电路

复位电路:在单片机的RST引脚引入高电平并保持2个机器周期时,单片机内部就执行复位操作。实际应用中,复位操作有两种形式:一种是上电复位,另一种是上电与按键均有效的复位。如下图所示

7

图3-6 复位电路

上电复位要求接通电源后,单片机自动实现复位操作。上电瞬间RST引脚获得高电平,随着电容的充电,RST引脚的高电平逐渐下降。只要RST引脚保持两个机器周期的高电平单片机就可以进行复位操作。该电路参数为:晶振为12MHz时,电容为30μF,电阻为1KΩ;晶振为6MHz时,电容为22μF,电阻为1 KΩ。本设计采用上电复位电路,电路参数为电容30μF,电阻1KΩ。

晶振电路:单片机的时钟信号通常有两种方式产生:一是内部时钟方式,二是外部时钟方式。

本设计采用内部时钟方式,在单片机内部有一震荡电路,只要在单片机的XTAL1和XTAL2脚外接石英晶体(简称晶振),就构成了自己震荡器并在单片机内部产生时钟脉冲信号

图3-7 晶振电路

图中电容器的作用是稳定频率和快速起振,电容值在5~30pF,典型值为30pF。晶振CYS的震荡频率范围在1.2~12MHz间选择,典型值为12MHz和6MHz。本设计采用12MHz晶振,电容值为20pF。

在电路总体设计中,EA\\Vpp脚用于是从外部程序存储器取指还是从内部程序存储器取指的选择信号。当EA\\Vpp接高电平时,先从片内程序存储器读取指令,读完4KB后,自动改为片外取指。若EA\\Vpp接低电平,则所有指令均从片外程序存储器读取。ALE脚用于输出允许地址所存信号。PSEN脚用于外部程序存储器选通信号,在对外部程序存储器取指操作时此引脚置低电平有效。在执行片内程序存储器取指时PESN脚无效。本设计无片外程序存储器扩展,所以将EA\\V pp脚接高电平,ALE及PSEN脚悬空。

3.6电源电路

电源电路为整个电路提供电源,电源直接由USB接入电路,电源电路由开关,

8

发光二极管,电阻等构成。按下按键S2二极管发光,电源接通。电源电路如图3.1所示:

图3-8 电源电路

4. 程序设计

用汇编语言完成对设计的软件编程,程序开始首先对温度传感器DS18B20进行复位,检测是否正常工作;接着读取温度数据,主机发出CCH指令与在线的DS18B20联系,接着向DS18B20发出温度A/D转换44H指令,再发出温度寄存器的温度值BEH指令,并反复调用复位,写入及读取数据子程序,之后再经过数据转换,由数码管显示出,不断循环。

4.1流程图

开始对温度传感器进行设置,读取温度数据转化判断温度是否大于0°或小于40°是否显示温度报警并显示

结束

9

4.2程序分析

①对DS18B20进行复位,写入和读取温度数据(在温度传感器DS18B20内部完成,并实现对温度信息的采集);读取温度流程如下:复位→发CCH命令(跳过ROM)→发44H命令→延时1s→复位→发CCH命令(跳过ROM)→发BEH命令(读内部RAM中9字节内容)→连接从总线上读出2个字节的数据(温度数据的低8位和高8位)→结束

部分程序代码:

(1)DS18B20的复位子程序部分: void Init_DS18B20(void) {

unsigned char x=0; DQ = 1; //DQ复位 delay(1); //稍做延时

DQ = 0; //单片机将DQ拉低 delay(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay(5);

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

注:根据DS18B20的通信协议,每一次读写数据之前都要对DS18B20进行复位,复位要求主机先发出复位低脉冲(大于48μs);然后释放,DS18B20收到信号后等待16~60μs,然后发出60~240μs的存在低脉冲,主机收到此信号表示复位成功。

while(x);

delay(15);

初始化时序

(2)DS18B20的写入子程序部分: void WriteOneChar(unsigned char dat) {

10

unsigned char i=0; for (i=8; i>0; i--) {

DQ = 0; DQ = dat&0x01; delay(2); DQ = 1; dat>>=1; } delay(2); }

注:当主机把数据从逻辑高电平拉到逻辑低电平的时候,写时间隙开始。有两种写时间隙,写1 时间隙和写0 时间隙。所有写时间隙必须最少持续60μs,包括两个写周期至少1μs 的恢复时间。I/O线电平变低后,DS18B20 在一个15μs 到60μs 的窗口内对I/O 线采样。如果线上事高电平,就是写1,如果是低电平,就是写0。主机要生成一个写时间隙,必须把数据线拉到低电平然后释放,在写时间隙开始后的15μs内允许数据线拉到高电平。主机要生成一个写0 时间隙,必须把数据线拉到低电平并保存60μs。

每个读时隙都由主机发起,至少拉低总线1μs,在主机发起读时序之后,单总线器件才开始在总线上发送0 或1。所有读时序至少需要60μs。

写时序 (3)DS18B20的读取子程序 unsigned char ReadTemp(void) {

unsigned char a=0; unsigned char b=0; unsigned char t=0;

Init_DS18B20(); //调用初始化函数

display();

11

WriteOneChar(0xCC);

// 跳过读序号列号的操作

//不需要验证序列号。

WriteOneChar(0x44); // 发送温度转换命令 启动温度转换 Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE);

a=ReadOneChar(); //读取温度值低位 b=ReadOneChar(); //读取温度值高位 a=a>>4; t=b<<4; t=t|a;

return(t); }

注:当从DS18B20 读数据时,主机生成读时间隙。当主机把数据从高电平拉到低电平时,读时间隙开始,数据线必须保持至少1μs;从DS18B20输出的数据在读时间隙的下降沿出现后15μs 内有效。

因此,主机在读时间隙开始后必须把I/O 脚驱动拉为的电平保持15μs,以读取I/O 脚状态。在读时间隙的结尾,I/O 引脚将被外部上拉电阻拉到高电平。所有读时间隙必须最少60μs,包括两个读周期至少1μs的恢复时间。读时间隙必须最少60μs,包括两个读周期至少1μs的恢复时间。

读时序

②将测量的温度数据在两位数码管上显示出来(单片机把数据信息传给LED数码

12

管显示器,实现温度的数字化显示)。数据转化子程序部分:

void display(void) {

unsigned char x0,x1; x0=wendu; x1=wendu/10; display1(1,x0); delay(30); display1(2,x1); delay(30); }

③设置门限温度,当超出或低于所设门限温度时喇叭报警。报警程序如下: if(wendu>40||wendu<0) // 判断温度范围 {

for(i=0;i<200;i++)

{

delay5(1); beng=!beng; } }

5. 调试与测试

5.1软件调试步骤

1、打开软件后,在Project菜单中选择New Project命令,打开一个新项目。保存此项目,输入工程文件名后,并保存工程文件的目录。

2、为项目文件选择一个目标器件,即选择8051的类型。在Data base 列表框中选择“ATML 89C52”,确定。

3、上述设置好后,创建源程序文件并输入程序代码。输入好代码后点击“文件/保存”。

13

4、把源文件添加到项目中,用鼠标指在目标工作区的目标1,点击右键在弹出的菜单中选择添加文件到源代码组,在弹出的添加文件框中,选择需要添加到项目中的文件。

5、开始编译,对项目文件进行编译。若没有错误后进行硬件调试

5.2程序调试步骤

程序调试应一个模块一个模块地进行,首先单独调试各功能子程序,检查程序是否能够实现预期的功能,接口电路的控制是否正常等;最后逐步将各子程序连接起来进行总调试。故调试步骤如下: a、温度显示程序调试

显示程序是整个程序的基础,我们必须保证其正确。调试方法:先把程序下载到单片机,让LED显示室内温度,看其是否和室内温度相符,然后用手握住温度传感器,观察LED显示值是否改变,直至可以实现该功能为止。 b、报警程序调试

报警程序的调试可以先根据室内温度设置门限温度开始,比如:室内温度是10℃,那么先设置当高温度大于13℃时报警,程序调试成功后再设置当温度小于17℃时报警。

5.3测试结果

实例测试:将写入程序的单片机插入实验板插座内,检查温度传感器DS18B20连接正常后接通电源,此时,在六位7段LED数码管上将会准确的显示环境温度,无需作任何调整。

为了观察温度传感器DS18B20对稳定变化的灵敏度,可以用手握住DS18B20管,会看到数码管上显示的稳定很快上升至人体温度值,再将手离开DS18B20管,温度又会很快降至环境温度值,温度传感器DS18B20的测量范围为0℃~+40℃,精度为1℃。

6. 技术小结及总结

6.1 技术小结

该课程设计中应用到了温度传感器、蜂鸣器、数码管,并且要求在一个电路板上

14

将各个功能集成在一起,也就是能实现温度传感器采集数据、数码管显示以及蜂鸣器发生。以前我们做试验都是一个功能一个功能的完成,从来没有一起实现过,这样问题就来了,比如三种程序放在一起相互冲突怎么办?经过老师的讲解和分析,我们将各个功能设置在不同的模块作为子程序一一调试,这样就可以实现全部功能并互不干扰。

之后我们在实验室进行调试,结果出了一些问题,比如说蜂鸣器有时它不工作,调试以后,它又响个不停无法停止。经过分析以后发现是时间设定的有问题,只需要加一个delay延时程序即可。

最后完成调试和下载,终于正常工作,但是还是有一些问题没有解决,但是整体上还是成功的,这些问题下去还会继续研究,直到将它消除。

7. 详细程序

#include

#include

15

#define a8255_PA XBYTE[0xD1FF] /*PA口地址*/ #define a8255_PB XBYTE[0xD2FF] /*PB口地址*/ #define a8255_PC XBYTE[0xD5FF] /*PC口地址*/ #define a8255_CON XBYTE[0xD7FF] /*控制字地址*/ void display(void);

unsigned char wendu=0; #define unint unsigned int

sbit DQ=P1^7; //定义18B20数据端口 sbit beng=P3^3; //定义蜂鸣器端口 unsigned char const dis_table[16]={ 0xA0, /*0*/ 0xBB, /*1*/ 0x62, /*2*/ 0x2A, /*3 */ 0x39, /*4*/ 0x2C, /*5 */ 0x24, /*6*/ 0xBA, /*7*/ 0x20, /*8*/ 0x28, /*9 */ 0x30, /*A*/ 0x25, /*B*/ 0xE4, /*C*/ 0x23, /*D */ 0x64, /*E*/ 0x74, /*F */ };

void delay1(unsigned int num) { unsigned int i = 0; for(i = 0; i

void display1(unsigned char place,unsigned char num) { unsigned char i = 0,display_num = 0; unsigned int test = 0; a8255_CON=0x89; a8255_PB=0xff; a8255_PA=0xff; delay1(100);

if(place == 1) test = ~(0x1<<2); else if(place == 2) test = ~(0x1<<1);

16

else if(place == 3) test = ~(0x1<<0); else if(place == 4) test = ~(0x1<<5); else if(place == 5) test = ~(0x1<<4); else if(place == 6) test = ~(0x1<<3); a8255_PA=test; if(num == 0) display_num = dis_table[0]; else if(num == 1) display_num = dis_table[1]; else if(num == 2) display_num = dis_table[2]; else if(num == 3) display_num = dis_table[3]; else if(num == 4) display_num = dis_table[4]; else if(num== 5) display_num = dis_table[5]; else if(num == 6) display_num = dis_table[6]; else if(num == 7) display_num = dis_table[7]; else if(num == 8) display_num = dis_table[5]; else if(num == 9) display_num = dis_table[9]; else if(num == 'a') display_num = dis_table[10]; else if(num == 'b') display_num = dis_table[11]; else if(num == 'c') display_num = dis_table[12]; else if(num == 'd') display_num = dis_table[13]; else if(num == 'e') display_num = dis_table[14]; else if(num == 'f') display_num = dis_table[15]; else if(num == ' ') display_num = 0xff; a8255_PB=display_num;

17

delay1(100); }

//延时函数

void delay(unsigned int i) {

while(i--); }

//初始化函数

void Init_DS18B20(void) {

unsigned char x=0; DQ = 1; //DQ复位 delay(1); //稍做延时

DQ = 0; //单片机将DQ拉低 delay(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay(5);

x=DQ; //稍做延时后 如果x=0则初始化成功 x=\则初始化失败\ while(x); delay(15); }

//读一个字节

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(2); }

return(dat); }

18

//写一个字节

void WriteOneChar(unsigned char dat) {

unsigned char i=0; for (i=8; i>0; i--) {

DQ = 0;

DQ = dat&0x01; delay(2); DQ = 1; dat>>=1; }

delay(2); }

/************************************ * * * 读取温度 * * * ************************************/ unsigned char ReadTemp(void) {

unsigned char a=0; unsigned char b=0; unsigned char t=0;

Init_DS18B20(); //调用初始化函数 display();

WriteOneChar(0xCC); // 跳过读序号列号的操作 //不需要验证序列号。

WriteOneChar(0x44); // 发送温度转换命令 启动温度转换 Init_DS18B20();

WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE);

a=ReadOneChar(); //读取温度值低位 b=ReadOneChar(); //读取温度值高位 a=a>>4; t=b<<4; t=t|a; return(t); }

/************************************ ************************************ 显示温度与档位

************************************ *************************************/

19

void display(void) {

unsigned char x0,x1; x0=wendu; x1=wendu/10; display1(1,x0); delay(30); display1(2,x1); delay(30); }

/*void delay5(unsigned int z) {

unsigned int t1,y; for(t1=z;t1>0;t1--) for(y=110;y>0;y--); }*/

void main() {

unsigned char uci; while(1) {

unsigned int i;

wendu=ReadTemp(); // 采集温度 for(uci=10;uci>0;uci--)

display(); // 显示温度与档位; delay(5); if(wendu>40||wendu<0) // 判断温度范围 { for(i=0;i<200;i++) {

delay(100); beng=!beng; } } } }

8. 参考文献

[1] 张鑫.单片机原理及应用.电子工业出版社,2005.8.

20

[2] 胡杰,吴磊,赵鸣.51单片机C语言应用与开发.北京航空航天大学出版社,2010.8. [3] 彭介华.电子技术课程设计指导.高等教育出版社,2007.10.

[4] 赵亮,侯国锐.单片机C语言编程与实例.人民邮电出版社,2007.9.

[5] 楼然苗,李光飞.单片机课程设计指导.北京航空航天大学出版社,2007.7

21

本文来源:https://www.bwwdw.com/article/mkm7.html

Top