一次完整的按键过程,包含以下几个阶段:如图4-7所示。 1) 等待阶段:此时按键尚未按下,处于空闲阶段;
2) 闭合抖动阶段:此时键刚刚按下,但信号处于抖动状态,系统在检测时应消抖延时,约5ms到20ms;
3) 有效闭合阶段:此时抖动己经结束,一个有效按键动作己经产生,系统应该在此时执行按键功能,或将按键编码记录下来,待键弹起时再执行其功能;
4) 释放抖动阶段:许多时候编程人员并不在此时消抖延时,但最好也执行一次消抖延时,以防止误操作;
5) 有效释放阶段:若设计要求在按键抬起时才执行功能,则应当在此时进行按键功能的处理。
软件上对闭合阶段的抖动一般采取延时再次确认按键是否按下的方式消除抖动。 如上图所示,完成系统的最高温度和最低温度的高低调整的四个按键分别加上拉电阻接到单片机的P1.1-P1.4口上,供单片机查询,当没有按键按下时,单片机I/O口输入高电平,当有按键按下时,对应的单片机端口变为低电平,单片机通过检测这种电平的变化确定按键的状态。
4.2 软件系统设计
4.2.1 系统程序流程图
系统程序流程图如图4.8所示。
开 始 初始化
高于高限3度或 低于低限3度
显示高低限和当前值 Y 控制加热,报警 N 读取温度值 启动DS18B20 Y 高低限增减 是否高低限调整 N 图4.8 系统程序流程图
4.2.2 单片机软件开发语言
对于8051单片机,现有四种语言支持,即汇编、FI/M、C和BASIC。C是一种源于编写UNIX操作系统的语言,它是一种结构化语言,可产生紧凑代码。C可以进行许多机器级函数控制而不用汇编语言。与汇编相比,有如下优点:
(1)对单片机的指令系统不要求了解,仅要求对8051的存贮器结构有初步了解; (2)寄存器分配、不同存贮器的寻址及数据类型等细节可由编译器管理; (3)程序有规范的结构,可分为不同的函数,这种方式可使程序结构化; (4)具有将可变的选择与特殊操作组合在一起的能力,改善了程序的可读性; (5)关键字及运算函数可用近似人的思维过程方式使用; (6)编程及程序调试时间显著缩短,从而提高效率;
(7)提供的库包含许多标准子程序,具有较强的数据处理能力;
(8)已编好程序可容易地植入新程序,因为它具有方便的模块化编程技术。
4.2.3 DS18B20驱动程序
根据DS18B20的通讯协议,主机(单片机)控制DS18B20完成温度转换必须经过三个步骤:每一次读写之前都要对DS18B20进行复位操作,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。复位要求主CPU将数据线下拉500微秒,然后释放,当DS18B20收到信号后等待16~60微秒左右,后发出60~240微秒的存在低脉冲,主CPU收到此信号表示复位成功。
DS18B20中的温度传感器可完成对温度的测量,以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以0.0625℃/LSB形式表达,其中S为符号位。
表4.1 DS18B20温度值格式表
这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。
DSl820工作过程包括;初始化、ROM操作命令、存储器操作、命令处理数据。 1、初始化
单总线上的所有处理均从初始化开始 2、ROM操作指令:
总线主机检测到DSl820的存在,便可以发出ROM操作命令之一,这些命令如: 指令 代码 Read ROM(读ROM) [33H] Match ROM(匹配ROM) [55H] Skip ROM(跳过ROM) [CCH] Search ROM(搜索ROM) [F0H] Alarm search(告警搜索) [ECH] 3、存储器操作命令:
指令 代码 Write Scratchpad(写暂存存储器) [4EH] Read Scratchpad(读暂存存储器) [BEH] Copy Scratchpad(复制暂存存储器) [48H] Convert Temperature(温度变换) [44H] Recall EPROM(重新调出) [B8H] Read Power supply(读电源) [B4H]
4、时 序
主机使用时间隙(time slots)来读写DSl820的数据位和写命令字的位 (1)初始化
时序见图4.9主机总线to时刻发送一复位脉冲(最短为480us的低电平信号)接着在tl时刻释放总线并进入接收状态DSl820在检测到总线的上升沿之后等待15-60us,接着DS1820在t2时刻发出存在脉冲(低电平)如图中虚线所示:
图4.9 初始化时序
(2)写时间隙
当主机总线t0时刻从高拉至低电平时就产生写时间隙,从to时刻开始15us之内应将所需写的位送到总线上,DSl820在t0后15-60us间对总线采样若低电平写入的位是0,若高电平写入的位是1,见图4.10,连续写2位间的间隙应大于1us。
图4.10 写时序
(3)读时间隙
见图4.11,主机总线t0时刻从高拉至低电平时总线只须保持低电平l5us之后在t1时刻将总线拉高产生读时间隙读时间隙。在t1时刻后t2时刻前有效,t2距to为15us,也就是说t2时刻前主机必须完成读位, 并在t0后的60us一120us内释放总线.
图4.11 读时序
根据数字温度传感器的工作时序及原理进行软件的设计,DS18B20的C51程序代码如下:
sbit DQ =P1^0; //DS18B20端口
typedef unsigned char byte; typedef unsigned int word;
void delay(word useconds) //延时子函数 {
for(;useconds>0;useconds--); }
byte ow_reset(void) //复位DS18B20 {
byte presence;
DQ = 0; //送出低电平 delay(29); // 延时 480us DQ = 1; // 送出高电平
delay(3); // 等到DS18B20存在脉冲
presence = DQ; // 读存在脉冲(低电平有效) delay(25); //延时 return(presence); }
byte read_byte(void) //从 1-wire 总线上读取一个字节 {
byte i;
byte value = 0; for (i=8;i>0;i--) {
value>>=1;
DQ = 0; // 输出一脉冲 DQ = 1; delay(1); if(DQ)
value|=0x80; delay(6); }
return(value);