智能水杯软件设计_第1页
智能水杯软件设计_第2页
智能水杯软件设计_第3页
智能水杯软件设计_第4页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录1.前言22.总体设计框架22.1 实现的功能22.2 总体程序流程图33.水温采集模块程序设计43.1 DS18B20 简介43.2 DS18B20 的初始化53.3 DS18B20 写周期63.4 DS18B20 读周期73.5 温度读取程序84.显示模块程序设计104.1 LCD1602 初始化104.2 LCD1602 写周期115. 定时模块程序设计125.1 定时器设置135.2 定时器中断子程序136.中断模块程序设计146.1 外部中断设置156.2 键盘扫描中断子程序157.整体编程的实现168.设计过程中的问题及解决方案179.收获与感悟17精选文库1.前言随着社会进步

2、与经济发展, 人们对生活质量的要求越来越高, 每天的饮水量是衡量健康的重要指标。 但有多少人因为忙碌的工作而全天忘记喝水?当你感到口渴想要喝水的时候,体内的失水已经达到 2%,口渴本身其实是体内已经严重缺水的表现,这是造成 “亚健康 ”状态的致命习惯之一。同时,越不注意喝水,喝水的欲望就会越低,人就会变得越来越缺水。研究表明,通常情况下,正常人每次喝水应控制在 300ml,间隔时间为 30到 60分钟。本课程设计就此设计出一款智能水杯, 用来智能显示水温和提醒喝水, 既方便了生活,又保持了健康。 本报告针对智能水杯的软件系统进行阐述, 软件编程在 keil 上操作。2.总体设计框架2.1 实现

3、的功能定时开启按键设置外部中断定时器中断蜂鸣器提醒STC89C51温度读入温度提示灯控制器DS18B20LCD 温度显示硬件结构框架图如图1 所示。图 1 硬件结构简图(1)水温检测使用 DS18B20 温度传感器,完成水温的时时检测功能。(2)水温及定时时间显示使用 LCD1602 液晶显示屏,完成水温及定时时间的显示功能。-2精选文库(3)智能提醒使用定时器 0,开启定时器中断,蜂鸣器提醒。(4)定时时间设置使用外部中断 0 扩展电路,用三个按键触发中断, 完成对应定时开启和定时时间加减的功能。2.2 总体程序流程图总体程序流程图分为主程序和中断程序两部分,其中中断程序分为外部中断程序和定

4、时器中断程序。流程图如下图所示。开始初始化DS18B20 检测水温外部 0中断?LCD1602 显示水温Y执行按键扫描程序N水温 >40?Y按键 1 按下?N高温提示灯红灯亮Y定时时间增加, LCD 显示N按键 2 按下?水温 <20?N按键 3 按下?YY定时时间减少, LCD 显示低温提示灯蓝灯亮TR0=0?N适宜水温黄灯亮Y关闭计时器开启计时器, LCD显示定时器符号结束图 2 主程序流程图图 3 外部按键中断流程图-3精选文库定时器中断 ?Y中断计数加 1定时时间到达 ?一分钟时间到达 ?YY蜂鸣器提醒, 计数清零LCD 显示定时时间减1图 4 定时器中断程序设计流程图3.

5、水温采集模块程序设计3.1 DS18B20 简介DS18B20 单线数字温度传感器,即“一线器件 ”,其具有独特的优点:(1)采用单总线的接口方式,与微处理器连接时,仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量, 使用方便等优点, 使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。(2)测量温度范围宽,测量精度高DS18B20 的测量范围为-55 +125 ; 在 -10+ 85 C° 范围内,精度为±0.5 C°。(4)持多点组网功能 多个 DS18B20 可以并联在惟一的

6、单线上,实现多点测温。(5)供电方式灵活 DS18B20 可以通过内部寄生电路从数据线上获取电源。因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而 使系统结构更趋简单,可靠性更高。(6)测量参数可配置DS18B20 的测量分辨率可通过程序设定912 位。-4精选文库3.2 DS18B20 的初始化主机首先发出一个480960 微秒的低电平脉冲, 然后释放总线变为高电平,并在随后的 480 微秒时间内对总线进行检测, 如果有低电平出现说明总线上有器件已做出应答。 若无低电平出现一直都是高电平说明总线上无器件应答。作为从图 5 DS18B20 初始化时序图器件的 DS18B20在一上

7、电后就一直在检测总线上是否有480960 微秒的低电平出现,如果有,在总线转为高电平后等待1560 微秒后将总线电平拉低 60 240 微秒做出响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待。初始化时序图如图 5 所示。/*函数名: Ds18b20Init*函数功能: 初始化*输入: 无*输出: 初始化成功返回1,失败返回 0*/unsigned char Ds18b20Init()unsigned int i;Desport=0;/将总线拉低 480us960usi=70;while(i-);/ 延时 642usDsport=1;/然后拉高总线,若DS18B20 做出反

8、应会将在15us60us后将总线拉低i=0;while(Desport)/等待 DS18B20 拉低总线i+;-5精选文库if(i>50000)/ 等待 >50MSreturn 0;/初始化失败return 1;/初始化成功3.3 DS18B20 写周期写周期最少为 60 微秒,最长不超过120 微秒。写周期一开始做为主机先把总线拉低 1 微秒表示写周期开始。随后若主机想写0,则将总线置为低电平,若主机想写 1,则将总线置为高电平,持续时间最少60 微秒直至写周期结束,然后释放总线为高电平至少 1 微秒给总线恢复 。而 DS18B20 则在检测到总线被拉底后等待 15 微秒然后从

9、15us 到 45us 开始对总线采样,在采样期内总线为高电平则为 1,若采样期内总线为低电平则为 0。写周期时序图如图 6 所示。图 6 DS18B20 写周期时序图/* 函数名: Ds18b20WriteByte* 函数功能: 向 18B20 写入一个字节* 输入: com*输出:无*/ void Ds18b20WriteByte(unsigned char dat) unsigned int i,j;for(j=0;j<8;j+)Desport=0;/每写入一位数据之前先把总线拉低1us-6精选文库i+;Desport=dat&0x01; /然后写入一个数据,从最低位开始

10、i=6;while(i-); / 延时 68us,持续时间最少60usDesport=1; /然后释放总线,至少 1us 给总线恢复时间才能接着写入第二个数值dat>>=1;3.4 DS18B20 读周期读周期是从主机把单总线拉低 1 微秒之后就得释放单总线为高电平,以让 DS18B20 把数据传输到单总线上。作为从机 DS18B20 在检测到总线被拉低1 微秒后,便开始送出数据, 若是要送出 0 就把总线拉为低电平直到读周期结束。若要送出 1 则释放总线为高电平。主机在一开始拉低总线 1 微秒后释放总线,然后在包括前面的拉低总线电平 1 微秒在内的 15 微秒时间内完成对总线进行

11、采样检测,采样期内总线为低电平则确认为 0。采样期内总线为高电平则确认为 1。完成一个读时序过程至少需要 60 微秒才能完成。其读周期的时序图如图 7 所示。图 7 DS18B20 读周期时序图/* 函数名: Ds18b20ReadByte* 函数功能: 读取一个字节* 输入: com*输出:无*/ unsigned char Ds18b20ReadByte() -7精选文库unsigned char byte,bi;unsigned int i,j;for(j=8;j>0;j-)Dsport=0;/先将总线拉低 1usi+;Dsport=1;/然后释放总线i+;i+;/ 延时 6us

12、等待数据稳定bi=Dsport;/读取数据,从最低位开始读取byte=(byte>>1)|(bi<<7); /* 将 byte 左移一位,然后与上右移7 位后的bi,注意移动之后移掉那位补0。*/i=4;/读取完之后等待48us 再接着读取下一个数while(i-);return byte;3.5 温度读取程序简单的读取温度值的步骤如下:跳过 ROM 操作 -发送温度转换命令 -跳过 ROM 操作 -发送读取温度命令-读取温度值(1)温度转换指令:/* 函数名: Ds18b20ChangTemp* 函数功能: 让 18b20 开始转换温度* 输入: com*输出:无*/

13、voidDs18b20ChangTemp()Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc);/跳过 ROM 操作命令Ds18b20WriteByte(0x44);/温度转换命令Delay1ms(100);(2)温度读取指令/*-8精选文库* 函数名: Ds18b20ReadTempCom* 函数功能: 发送读取温度命令* 输入: com*输出:无*/ void Ds18b20ReadTempCom() Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc);/跳过 ROM 操作命令Ds18b20Writ

14、eByte(0xbe);/发送读取温度命令(3)读取温度:/* * 函数名: Ds18b20ReadTemp* 函数功能: 读取温度* 输入: com*输出:无*/int Ds18b20ReadTemp()unsigned int temp=0;unsigned char tmh,tml;Ds18b20ChangTemp();/先写入转换命令Ds18b20ReadTempCom();/然后等待转换完后发送读取温度命令tml=Ds18b20ReadByte(); /读取温度值共 16 位,先读低字节tmh=Ds18b20ReadByte();/再读高字节temp=tmh;temp<<

15、=8;temp|=tml;return temp;-9精选文库4.显示模块程序设计4.1 LCD1602 初始化表 1 LCD1602 指令表指令码功能D=1 开显示;D=0 关显示00001DCBC=1 显示光标; C=0 不显示光标B=1 光标闪烁; B=0 光标不显示N=1 当读或写一个字符后地址指针加一,且光标加一N=0 当读或写一个字符后地址指针减一,且光000001NS标减一S=1 当写一个字符时,整屏显示左移(N=1)或右移( N=0),以得到光标不移动而屏幕移动的效果S=0 当写一个字符,整屏显示不移动01H显示清屏:所有显示清零80H+ 地 址 码 ( 0-27H ,设置数据

16、地址40H-67H)/*函数名: LcdInit()*函数功能: 初始化 LCD 屏*输入: 无*输出: 无*/void LcdInit()/LCD 初始化子程序LcdWriteCom(0x38);/设置显示模式LcdWriteCom(0x0c);/开显示不显示光标,光标不闪烁LcdWriteCom(0x06);/写一个指针加 1LcdWriteCom(0x01);/清屏LcdWriteCom(0x80);/设置数据指针起点-10精选文库4.2 LCD1602 写周期时序图如图 8 所示, RS=0 为写命令, RS=1 为写数据。在写周期, R/W=0,E 为写数据或命令使能输入。图 8 L

17、CD1602 写时序图(1)写命令:/* 函数名: LcdWriteCom* 函数功能: 向 LCD 写入一个字节的命令* 输入: com*输出:无*/void LcdWriteCom(unsigned char com)/写入命令RS=0;RW=0;GPIO_LCD=com;Delay1ms(10);E=1;Delay1ms(10);E=0;(2)写数据/* 函数名: LcdWriteData* 函数功能: 向 LCD 写入一个字节的数据* 输入: dat*输出:无*-11精选文库*/void LcdWriteData(unsigned char dat)/写入数据RS=1;RW=0;GPI

18、O_LCD=dat;Delay1ms(10);E=1;Delay1ms(10);E=0;5. 定时模块程序设计定时 /计数器实质上是一个加1 计数器。它随着计数器的输入脉冲进行自加1,也就是每来一个脉冲,计数器就自动加1,当加到计数器为全1 时,再输入一个脉冲就使计数器回零,且计数器的溢出使相应的中断标志位置1,向 CPU发出中断请求 (定时 /计数器中断允许时) 。如果定时 /计数器工作于定时模式, 则表示定时时间已到;如果工作于计数模式,则表示计数值已满。与定时器相关的寄存器如下:TCOND7D6D5D4D3D2D1D0功能TF1TR1TF0TR0IE1IT1IE0IT0TF1 和 TF0

19、:T1 和 T0 的溢出标志位,溢出后由硬件自动置1 发出定时器中断请求。中断响应后标志位自动清零。IE1 和 IE0:INT1 和 INT0 的标志位,引脚状态变化后由硬件自动置1 发出外部中断请求,中断响应后标志位自动清零。IT1 和 IT0: INT1 和 INT0 的触发方式选择位。TMODD7D6D5D4D3D2D1D0功能GATEC/TM1M0GATEC/TM1M0GATE:门控制为 0 时仅有运行控制位 TRx 来控制定时 /计数器的开启。 为 1时由 TRx 和外部中断脉冲计数。(用于计算外部中断负跳变的次数)C/T:计数器模式和定时器模式选择为0 时选择定时器模式,为1 时选

20、为计数器模式。-12精选文库方式 1 的计数位数是16 位,由 TL0 作为低 8 位、 TH0 作为高 8 位,组成了16 位加 1 计数器 。如图 9 所示。TCONTMOD申请TF1D7T0引脚1M0D0TR110M1中断溢出TF0TH0TL00C/TTR08位8位GATE&机器周期1M01M1C/TD0INT0引脚GATED7图 9定时器模式 1 示意图5.1 定时器设置/* 函数名: Timer* 函数功能: 设置定时器并开始计时*输入:无*输出:无*/void Timer()TMOD=0X01;/定时器选择工作模式1TH0 = 0x3C;/定时器赋初值TL0 = 0xB0;

21、/ 定时 50msEA = 1;/开启中断ET0 = 1;/开启定时器中断TR0=1;/启动定时器5.2 定时器中断子程序定时器中断子程序完成的功能有:(1)定时器重新赋初值;(2)统计中断次数,并在LCD 上显示剩余时间;(3)判断是否达到定时终点以启动蜂鸣器。/* 函数名: Timer0() interrupt 1* 函数功能: 设置定时器中断执行程序,LCD 显示定时剩余时间*输入:无-13精选文库*输出:无*/void Timer0() interrupt 1TH0 = 0x3C;TL0 = 0xB0;/ 定时器重新赋值Time+;k+;/中断次数计数if(k=20)/20 次中断,即

22、1sLCDwritecom(0xc2);LCDwritedat('0'+(-j)/10);LCDwritedat('0'+(j)%10);/定时显示剩余时间k=0;if (Time=full)/判断是否达到定时时间for(i=0;i<100;i+)sound=1;/ 启用无源蜂鸣器Delay1ms(1);sound=0;Delay1ms(1);Time=0;j=full/20;/计数初始化6.中断模块程序设计中断是指 CPU 在执行当前程序的过程中,由于某种随机出现的外设请求或CPU 内部的异常事件 ,使 CPU 暂停正在执行的程序而转去执行相应的服务处理

23、程序;当服务处理程序运行完毕后,CPU 再返回到暂停处继续执行原来的程序。51 单片机的中断系统如图10 所示。-14精选文库图 10 中断系统结构图6.1 外部中断设置/* 函数名: IntConfiguration()* 函数功能: 设置外部中断*输入:无*输出:无*/void IntConfiguration()IT0=1;/ 外部中断0 跳变沿触发方式(下降沿)EX0=1;/ 打开 INT0 的中断允许。EA=1;/ 打开总中断6.2 键盘扫描中断子程序中断程序完成的功能有:(1)判断按键是否按下;(2)执行对应按键的功能。/* 函数名: Scankey()* 函数功能: 键盘扫描,并

24、执行对应按键的程序*输入:无*输出:无-15精选文库*/voidScankey()if(key1=0)/ 判断按键是否按下Delay1ms(10);/延时消抖if(key1=0)/判断按键是否按下for(;)if(key1=0)continue;else break;for(;)while(key1=0);/ 检测按键是否松开if(key1=0) continue;else break; ./执行对应按键的程序7.整体编程的实现软件编程在 keil 上操作,在各个模块的子程序完成后,在主程序按照流程图图 11 proteus仿真效果图-16精选文库调用各个子函数即可完成最终的编程。在经过编译之后, 将机器代码导入到实现搭建好的硬件 proteus 仿真,其效果图11 所示。8.设计过程中的问题及解决方案在确定了各种所需的元器件之后,对各种元器件的资料文档进行了仔细研读。采用分模块的方式,分别编写了温度读取子函数,温度显示子函数,定时器子函数,中断子函数,键盘扫描子函数。再用 keil 编写编译后,也出现了不少问题,但都问题不大

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论