1、 1目 录1 引言 .22 设计要 求 .22.1 设计目的 .22.2 基本要求 .33 方案设计 33.1 温度传感器方案论证 .33.1.1 方案一 .33.1.2 方案二 .33.2 总体设计框图 .34 硬件 设计 .44.1 单片机系统 .44.2 数字温度传感器模块 .54.2.1 DS18B20 性能 64.2.2 DS18B20 外形及引脚说明 64.2.3 DS18B20 接线原理图 64.2.4 DS18B20 时序图 74.2.5 数据处理 .84.3 L298 电机驱动模块 .94.4 LCD 显示电路模块 .95 应用软件介绍 105.1 Proteus 仿软真件的
2、介绍 .105.2 Keil 软件 .106 软件 设计 .106.1 主程序模块 .106.2 读温度值模块 .116.3 中断模块 .136.4 仿真模块 .147 源 程序 168 总 结 .19参考 文献: .2021 引言随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便是不可否定的,各种数字系统的应用也使人们的生活更加舒适。数字化控制、智能控制为现代人的工作、生活、科研等方面带来方便。其中温度控制电机转速就是利用单片机实现的典型实例。测量温度时使用数字温度计,其与传统的温度计相比,具有读数方便、测温范围广、测温精确、功能多样话等优点。其主要用于对测温
3、要求准确度比较高的场所,或科研实验室使用,该设计使用 STC89C51 单片机作控制器,数字温度传感器 DS18B20 测量温度,单片机接受传感器输出,经处理用 LCD 实现温度值显示。 电机由 L298 电机驱动芯片控制,实现电机的正反转和加速减速.2 设计要求2.1 设计目的设计一个基于温度的电动机转速控制电路,在相应的软件控制下可以完成要求的功能,即外部温度大于 65C 时,直流电动机在 L298 驱动下加速正转,温度大于 75C 全速正转,当外部温度小于 0C 时电动机加速反转,温度小于-10C时电动机全速反转。温度回到 0C-65C 时电动机逐渐停止转动。在液晶显示屏1602LCD
4、上显示当前的温度值。2.2 基本要求控制电机正反转即加速减速,实现实时温度显示,测温范围 -55128 0C,误差 50C 以内。画出基于温度的电动机转速控制电路的原理图,通过仿真软件来检测所写程序实现功能的正确与否.33 方案设计3.1 温度传感器方案论证3.1.1 方案一由于本设计是测温电路,可以使用热敏电阻之类的器件,将随被测温度变化的电压或电流采样,进行 A/D 转换后就可以用单片机进行数据处理,实现温度显示。这种设计需要用到 A/D 转换电路,增大了电路的复杂性,而且要做到高精度也比较困难。3.1.2 方案二考虑到在单片机属于数字系统,容易想到数字温度传感器,可选用DS18B20 数
5、字温度传感器,此传感器为单总线数字温度传感器,起体积小、构成的系统结构简单,它可直接将温度转化成串行数字信号给单片机处理,即可实现温度显示。另外 DS18B20 具有 3 引脚的小体积封装,测温范围为 -55+125摄氏度,测温分辨率可达 0.0625 摄氏度,其测量范围与精度都能符合设计要求。以上两种方案相比较,第二种方案的电路、软件设计更简单,此方案设计的系统在功耗、测量精度、范围等方面都能很好地达到要求,故本设计采用方案二。3.2 总体设计框图本方案设计的系统由单片机系统、DS18B20 数字温度传感器、LCD 温度显示模块、L298 电机驱动模块、电机组成,其总体架构如下图 1。单片机
6、测温电路时钟、复位电路L298 电机驱动LULU 路电路电机转动电路LCD 温度显示电路4图 1 系统总体方框图4 硬件设计4.1 单片机系统1. 本设计采用 STC89C52 单片机作为控制器,完成所有功能的控制,包括: DS18B20 数字温度传感器的初始化和读取温度值 LCD 显示驱动与控制 L298 电机驱动芯片驱动电机 温度值的存储和读取2. 单片机系统电路原理图:5图 2 单片机系统原理图4.2 数字温度传感器模块4.2.1 DS18B20 性能 独特的单线接口仅需一个端口引脚进行通信 简单的多点分布应用 无需外部器件 可通过数据线供电 零待机功耗 测温范围-55+128,以 1递
7、增 可编程的分辨率为 912 位,对应的可分辨温度分别为 0.5、0.25、0.125和 0.0625 温度数字量转换时间 200ms,12 位分辨率时最多在 750ms 内把温度转换为数字 应用包括温度控制、工业系统、消费品、温度计和任何热感测系统 负压特性:电源极性接反时,传感器不会因发热而烧毁,但不能正常工作64.2.2 DS18B20 外形及引脚说明图 3 DS18B20 外形及引脚 GND:地 DQ:单线运用的数据输入/输出引脚 VD:可选的电源引脚4.2.3 DS18B20 接线原理图单总线通常要求接一个约 4.7K 左右的上拉电阻,这样,当总线空闲时,其状态为高电平。图 4 DS
8、18B20 接线原理图4.2.4 DS18B20 时序图主机使用时间隙来读写 DS18B20 的数据位和写命令字的位。1. 初始化时序如下图:7图 5 DS18B20 初始化时序2. DS18B20 读写时序:8图 6 DS18B20 读写时序4.2.5 数据处理高 速 暂 存 存 储 器 由 9 个 字 节 组 成 , 其 分 配 如 表 5 所 示 。 当 温 度 转 换 命 令发 布 后 , 经 转 换 所 得 的 温 度 值 以 二 字 节 补 码 形 式 存 放 在 高 速 暂 存 存 储 器 的第 0 和 第 1 个 字 节 。 单 片 机 可 通 过 单 线 接 口 读 到 该
9、数 据 , 读 取 时 低 位 在 前 ,高 位 在 后 。图 7 字节分配下 表 为 12 位 转 化 后 得 到 的 12 位 数 据 , 存 储 在 18B20 的 两 个 8 比 特 的RAM 中 , 二 进 制 中 的 前 面 5 位 是 符 号 位 , 如 果 测 得 的 温 度 大 于 0, 这 5位 为 0, 只 要 将 测 到 的 数 值 乘 于 0.0625 即 可 得 到 实 际 温 度 ; 如 果 温 度 小 于0, 这 5 位 为 1, 测 到 的 数 值 需 要 取 反 加 1 再 乘 于 0.0625 即 可 得 到 实 际 温度 。 例 如 +125 的 数 字
10、 输 出 为 07D0H,实 际 温 度 =07D0H*0.0625=2000*0.0625=125 。例 如 -55 的 数 字 输 出 为 FC90H, 则 应 先 将 11 位 数 据 位 取 反 加 1 得370H( 符 号 位 不 变 , 也 不 作 运 算 ) ,实 际 温 度 =370H*0.0625=880*0.0625=55 。可 见 其 中 低 四 位 为 小 数 位 。图 8 DS18B20 温度数据表94.3 关于 L298 电机驱动芯片的简介 L298 是 ST 公司生产的一种高电压、大电流电机驱动芯片。该芯片的主要特点是 :工作电压高,最高工作电压可达 46V;输出
11、电流大,瞬间峰值电流可达 3A,持续工作电流为2A;内含两个 H 桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器、线圈等感性负载;采用标准 TTL 逻辑电平信号控制;具有两个使能控制端,在不受输入信号影响的情况下允许或禁止器件工作;有一个逻辑电源输入端,使内部逻辑电路部分在低电压下工作;可以外接检测电阻,将变化量反馈给控制电路。4.4 显示电路LCD 显示简单明了,可以直接读出温度值。图 9 LCD 驱动显示电路105 应用软件介绍 5.1Proteus 仿软真件的介绍 Proteus 是一款 Labcenter 出品的电路分析实物仿真系统,可仿真各种电路和 IC,并
12、支持单片机,元件库齐全,使用方便,是不可多得的专业的单片机软件仿真系统。 该软件的特点: (1)全部满足我们提出的单片机软件仿真系统的标准,并在同类产品中具有明显的优势。 (2)具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS 一 232 动态仿真、1 C 调试器、SPI 调试器、键盘和 LCD 系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。 目前支持的单片机类型有:68000 系列、8051 系列、AVR 系列、PIC12 系列、PIC16 系列、 PIC18 系列、Z80 系列、 HC11 系列以及各种外围芯片。 支持大量的存储器和外围芯片。总
13、之该软件是一款集单片机和 SPICE 分析于一身的仿真软件,功能极其强大 ,可仿真 51、AVR、PIC。5.2 Keil 软件 Keil C51 是美国 Keil Software 公司出品的 51 系列兼容单片机 C 语言软件开发系统,与汇编相比,C 语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。用过汇编语言后再使用 C 来开发,体会更加深刻。Keil C51 软件提供丰富的库函数和功能强大的集成开发调试工具,全 Windows界面。另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51 生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容
14、易理解。在开发大型软件时更能体现高级语言的优势。6 软件设计6.1 主程序模块主程序流程图:11主程序流程图6.2 读温度值模块读温度值模块需要调用 4 个子程序,分别为: DS18B20 初始化子程序:让单片机知道 DS18B20 在总线上且已准备好操作 DS18B20 写字节子程序:对 DS18B20 发出命令 DS18B20 读字节子程序:读取 DS18B20 存储器的数据 延时子程序:对 DS18B20 操作时的时序控制1. 读温度值模块流DS18B20 初始化延时DS18B20 初始化跳过读序列号读取温度值高低位数据转换处理入口12读温度值子程序流程图 2. DS18B20 初始化子
15、程序流程图:NYDS18B20 初始化子程序流程图3. DS18B20 写字节和读字节子程序流程图:跳过读序列号启动温度转换返回DQ 置高电平稍延时DQ 复位 0延时480msDQ 拉高电平延时 1560msDQ 为低电平?返回入口13DS18B20 写字节子程序流程图 DS18B20 读字节子程序流程图6.3 中断模块中断采用 T0 方式 1,初始值定时为 50ms。中断模块需调用两个子程序: 读温度值子程序:定时读取温度值,实时更新温度值 记录温度值子程序:定时记录温度值,供查询使用把这两个子程序放在中断的原因是,不会因为调整报警温度或查询历史温度值而停止更新温度值和记录温度值。中断模块流
16、程图:14YN中断模块流程图6.3 中断模块仿真图中断入口定时器重置初值计数值加 11 秒?记录温度值读温度值中断返回1565 - 1250 - 651635 - 07 源程序#include#include#include#define INT8U unsigned char#define INT16U unsigned intextern INT8U Temp_Value;extern INT8U read_Temperature();extern void delay_ms(INT16U x);extern void LCD_Initialise();extern void LCD_Sh
17、owString(INT8U,INT8U,INT8U*) reentrant;sbit MA=P10;sbit MB=P11;sbit PWM1=P12;INT8U Back_Temp_Value=0xFF,0XFF;char Temp_Disp_Buff17;float f_Temp=35.0;void T0_INT() interrupt 1 static INT8U t_Count=0;17TH0=(INT16U)(-11.0592/12*500)/256;TL0=(INT16U)(-11.0592/12*500)%256;if(+t_Count=100)t_Count=0;if(Rea
18、d_Temperature() ) if(Temp_Value0!=Back_Temp_Value0|Temp_Value1=Back_Temp_Value1) Back_Temp_Value0=Temp_Value0;Back_Temp_Value1=Temp_Value1;f_Temp=(int)(Temp_Value1=75) f_Temp=75;if (f_Temp=45) MA=1;MB=0;#include#include#include#define INT8U unsigned char#define INT16U unsigned intextern INT8U Temp_V
19、alue;extern INT8U read_Temperature();extern void delay_ms(INT16U x);extern void LCD_Initialise();extern void LCD_ShowString(INT8U,INT8U,INT8U*) reentrant;sbit MA=P10;sbit MB=P11;sbit PWM1=P12;INT8U Back_Temp_Value=0xFF,0XFF;char Temp_Disp_Buff17;float f_Temp=35.0;void T0_INT() interrupt 1 static INT
20、8U t_Count=0;TH0=(INT16U)(-11.0592/12*500)/256;TL0=(INT16U)(-11.0592/12*500)%256;18if(+t_Count=100)t_Count=0;if(Read_Temperature() if(Temp_Value0!=Back_Temp_Value0|Temp_Value1!=Back_Temp_Value1) Back_Temp_Value0=Temp_Value0;Back_Temp_Value1=Temp_Value1;f_Temp=(int)(Temp_Value10)i-;return (dat);uchar
21、 tmpread(void) uchar i,j,dat;dat=0;for(i=1;i1); return(dat);void tmpwritebyte(uchar dat) uint i;uchar j;bit testb;for(j=1;j1;if(testb) /write 1DS=0;i+;i+;DS=1;i=8;while(i0)i-;elseDS=0; i=8;while(i0)i-;/write 0 DS=1;i+;i+;if (f_Temp=75) f_Temp=75;if (f_Temp=45) MA=1;MB=0;if(f_Temp=45) PWM1=0;delay_ms
22、(30);return;elseif(f_Temp=75) PWM1=1;delay_ms(30);return;PWM1=1;delay_ms(f_Temp-45);PWM1=0;delay_ms(75-f_Temp);else if(f_Temp=10)MA=0;MB=1;if (f_Temp=10)PWM1=0;delay_ms(10);return;else if(f_Temp=0)PWM1=1;delay_ms(10);return;PWM1=1;delay_ms(10-f_Temp);PWM1=0;delay_ms(f_Temp);else MA=0;MB=0;20void mai
23、n()LCD_Initialise();LCD_ShowString(0,0,“Curren Temp:“);Read_Temperature();delay_ms(800);TMOD=0x01;TH0=(INT16U)(-11.0592/12*500)/256;TL0=(INT16U)(-11.0592/12*500)%256;IE=0x82;TR0=1;while(1);8 总结此次课程设计中,难点在于 DS18B20 的使用,即对它的时序控制、初始化以及字节读写方法,任何一个环节出错或是时序控制不到位的话就不能得到正确的数据。一旦学会了正确的使用方法,就能感觉到它带来的便利是热电偶不能比
24、拟的,以后再次使用的话就能很快上手了。软件设计中,把程序按功能分模块的话能提高编程效率,把问题一一解决,同时画流程图能帮助理清思路,使问题简单化。另一方面,取变量名时也要讲究技巧,应尽量使其见名知意,同样地,写程序时加注释确是非常必要的,否则隔一段时间后,想再改进或做扩展的话就比较困难了,因为即使是自己写的程序也变得难读难懂了。 参考文献:1. 徐玮. C51 单片机高效入门(第 2 版). 北京:机械工业出版社,2010.2. 龙脉工作室,刘鲲,孙春亮(修订版). 北京:人们邮电出版社,2010.3. 彭伟,单片机 C 语言程序设计实训 100 例(第二版) 。北京:电子工业出版社,2012.4. 朱清慧,Proteus 教程电子线路设计,制版与仿真. 北京:清华大学出版社,2008.5. 江世明,基于 Proteus 的单片机应用技术. 北京:电子工业出版社,2009.21