智能水杯软件设计docxWord下载.docx
《智能水杯软件设计docxWord下载.docx》由会员分享,可在线阅读,更多相关《智能水杯软件设计docxWord下载.docx(45页珍藏版)》请在冰豆网上搜索。
16
5.
定时模块程序设计..................................................................................................................
18
5.1
定时器设置
...........................................................................................................................
19
5.2
定时器中断子程序.............................................................................................................
20
6.
中断模块程序设计....................................................................................................................
22
6.1外部中断设置.......................................................................................................................22
.
6.2键盘扫描中断子程序23
7.整体编程的实现25
8.设计过程中的问题及解决方案25
9.收获与感悟26
1.前言
随着社会进步与经济发展,人们对生活质量的要求越来越高,每天的饮水量
是衡量健康的重要指标。
但有多少人因为忙碌的工作而全天忘记喝水?
当你感到
口渴想要喝水的时候,体内的失水已经达到2%,口渴本身其实是体内已经严重
缺水的表现,这是造成“亚健康”状态的致命习惯之一。
同时,越不注意喝水,
喝水的欲望就会越低,人就会变得越来越缺水。
研究表明,通常情况下,正常人
每次喝水应控制在300ml,间隔时间为30到60分钟。
本课程设计就此设计出一款智能水杯,用来智能显示水温和提醒喝水,既方
便了生活,又保持了健康。
本报告针对智能水杯的软件系统进行阐述,软件编程
在keil上操作。
2.总体设计框架
2.1实现的功能
定时开启按键
设置
外部中断
定时器中断
蜂鸣器提醒
STC89C51
温度读入
温度提示灯
控制器
DS18B20
LCD温度显示
硬件结构框架图如图1所示。
图1硬件结构简图
(1)水温检测
使用DS18B20温度传感器,完成水温的时时检测功能。
(2)水温及定时时间显示
使用LCD1602液晶显示屏,完成水温及定时时间的显示功能。
(3)智能提醒
使用定时器0,开启定时器中断,蜂鸣器提醒。
(4)定时时间设置
使用外部中断0扩展电路,用三个按键触发中断,完成对应定时开启和定时
时间加减的功能。
2.2总体程序流程图
总体程序流程图分为主程序和中断程序两部分,其中中断程序分为外部中断
程序和定时器中断程序。
流程图如下图所示。
开始
初始化
DS18B20检测水温
LCD1602显示水温
N
水温>
40℃?
Y
高温提示灯红灯亮
水温<
20℃?
低温提示灯蓝灯亮
外部0中断?
执行按键扫描程序
按键1按下?
定时时间增加,LCD显示
按键2按下?
适宜水温黄灯亮
结束
图2主程序流程图
按键3按下?
Y
定时时间减少,LCD显示
TR0=0?
关闭计时器
开启计时器,LCD
显示定时器符号
图3外部按键中断流程图
定时器中断?
中断计数加1
定时时间到达?
一分钟时间到达?
蜂鸣器提醒,计数清零
LCD显示定时时间减1
图4定时器中断程序设计流程图
3.水温采集模块程序设计
3.1DS18B20简介
DS18B20单线数字温度传感器,即“一线器件”,其具有独特的优点:
(1)采用单总线的接口方式,与微处理器连接时,仅需要一条口线即可实
现微处理器与DS18B20的双向通讯。
单总线具有经济性好,抗干扰能力强,适
合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网
络,为测量系统的构建引入全新概念。
(2)测量温度范围宽,测量精度高DS18B20的测量范围为-55℃~+
125℃;
在-10~+85°
C范围内,精度为±
0.5°
C。
(4)持多点组网功能多个DS18B20可以并联在惟一的单线上,实现多
点测温。
(5)供电方式灵活DS18B20可以通过内部寄生电路从数据线上获取电源。
因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统
结构更趋简单,可靠性更高。
(6)测量参数可配置DS18B20的测量分辨率可通过程序设定9~12位。
3.2DS18B20的初始化
主机首先发出一个480-960微秒的低电平脉冲,然后释放总线变为高电
平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线
上有器件已做出应答。
若无低电平出现一直都是高电平说明总线上无器件应答。
作为从
图5DS18B20初始化时序图
器件的DS18B20在一上电后就一直在检测总线上是否有480-960微秒的
低电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低
60-240微秒做出响应存在脉冲,告诉主机本器件已做好准备。
若没有检测到
就一直在检测等待。
初始化时序图如图5所示。
/****************************************************************
*函数名:
Ds18b20Init
*函数功能:
初始化
*输入:
无
*输出:
初始化成功返回1,失败返回0
****************************************************************/
unsignedcharDs18b20Init()
{
unsignedinti;
Desport=0;
//将总线拉低480us~960us
i=70;
while(i--);
//延时642us
Dsport=1;
//然后拉高总线,若DS18B20做出反应会将在15us~60us
后将总线拉低
i=0;
while(Desport)//等待DS18B20拉低总线
i++;
if(i>
50000)//等待>
50MS
return0;
//初始化失败
}
return1;
//初始化成功
3.3DS18B20写周期
写周期最少为60微秒,最长不超过120微秒。
写周期一开始做为主机先把
总线拉低1微秒表示写周期开始。
随后若主机想写0,则将总线置为低电平,若
主机想写1,则将总线置为高电平,持续时间最少60微秒直至写周期结束,然
后释放总线为高电平至少1微秒给总线恢复。
而DS18B20则在检测到总线被
拉底后等待15微秒然后从15us到45us开始对总线采样,在采样期内总线为
高电平则为1,若采样期内总线为低电平则为0。
写周期时序图如图6所示。
图6DS18B20写周期时序图
Ds18b20WriteByte
*函数功能:
向18B20写入一个字节
*输入:
com
voidDs18b20WriteByte(unsignedchardat)
unsignedinti,j;
for(j=0;
j<
8;
j++)
//每写入一位数据之前先把总线拉低1us
Desport=dat&
0x01;
//然后写入一个数据,从最低位开始
i=6;
//延时68us,持续时间最少60us
Desport=1;
//然后释放总线,至少1us给总线恢复时间才能接
着写入第二个数值
dat>
>
=1;
3.4DS18B20读周期
读周期是从主机把单总线拉低1微秒之后就得释放单总线为高电平,以让
DS18B20把数据传输到单总线上。
作为从机DS18B20在检测到总线被拉
低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期
结束。
若要送出1则释放总线为高电平。
主机在一开始拉低总线1微秒后释放总
线,然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进
行采样检测,采样期内总线为低电平则确认为0。
采样期内总线为高电平则确认
为1。
完成一个读时序过程至少需要60微秒才能完成。
其读周期的时序图如图
7所示。
图7DS18B20读周期时序图
/*******************************************************************
Ds18b20ReadByte
读取一个字节
unsignedcharDs18b20ReadByte()
unsignedcharbyte,bi;
for(j=8;
j>
0;
j--)
Dsport=0;
//先将总线拉低1us
//然后释放总线
//延时6us等待数据稳定
bi=Dsport;
//读取数据,从最低位开始读取
byte=(byte>
1)|(bi<
<
7);
/*将byte左移一位,然后与上右移7位
后的bi,注意移动之后移掉那位补0。
*/
i=4;
//读取完之后等待48us再接着读取下一个数
returnbyte;
3.5温度读取程序
简单的读取温度值的步骤如下:
跳过ROM操作---发送温度转换命令---跳过ROM操作---发送读取温度命
令---读取温度值
(1)温度转换指令:
/************************************************************
Ds18b20ChangTemp
让18b20开始转换温度
************************************************************/
voidDs18b20ChangTemp()
Ds18b20Init();
Delay1ms
(1);
Ds18b20WriteByte(0xcc);
//跳过ROM操作命令
Ds18b20WriteByte(0x44);
//温度转换命令
Delay1ms(100);
(2)温度读取指令
Ds18b20ReadTempCom
发送读取温度命令
voidDs18b20ReadTempCom()
Ds18b20WriteByte(0xbe);
//发送读取温度命令
(3)读取温度:
/**********************************************************************
***
Ds18b20ReadTemp
读取温度
***********************************************************************
**/
intDs18b20ReadTemp()
unsignedinttemp=0;
unsignedchartmh,tml;
Ds18b20ChangTemp();
//先写入转换命令
Ds18b20ReadTempCom();
//然后等待转换完后发送读取温度命令
tml=Ds18b20ReadByte();
//读取温度值共16位,先读低字节
tmh=Ds18b20ReadByte();
//再读高字节
temp=tmh;
temp<
=8;
temp|=tml;
returntemp;
4.显示模块程序设计
表1LCD1602指令表
指令码
功能
D=1
开显示;
D=0
关显示
00001DCB
C=1
显示光标;
C=0
不显示光标
B=1
光标闪烁;
B=0
光标不显示
000001NS
N=1
当读或写一个字符后地址指针加一,且光
标加一
N=0
当读或写一个字符后地址指针减一,且光
标减一
S=1
当写一个字符时,整屏显示左移(
N=1)
或右移(N=0),以得到光标不移动而屏幕移动的效
果
S=0
当写一个字符,整屏显示不移动
01H
显示清屏:
所有显示清零
80H+地址码(0-27H,
设置数据地址
40H-67H
)
LcdInit()
初始化LCD屏
voidLcdInit()//LCD初始化子程序
LcdWriteCom(0x38);
//设置显示模式
LcdWriteCom(0x0c);
//开显示不显示光标,光标不闪烁
LcdWriteCom(0x06);
//写一个指针加1
LcdWriteCom(0x01);
//清屏
LcdWriteCom(0x80);
//设置数据指针起点
4.2LCD1602写周期
时序图如图8所示,RS=0为写命令,RS=1为写数据。
在写周期,R/W=0,
E为写数据或命令使能输入。
图8LCD1602写时序图
(1)写命令:
LcdWriteCom
向LCD写入一个字节的命令
voidLcdWriteCom(unsignedcharcom)//写入命令
RS=0;
RW=0;
GPIO_LCD=com;
Delay1ms(10);
E=1;