




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、目录1.前言 22.总体设计框架 22.1 实现的功能 22.2 总体程序流程图 33.水温采集模块程序设计 53.1 DS18B20简介 53.2 DS18B20的初始化 63.3 DS18B20写周期 83.4 DS18B20读周期 93.5 温度读取程序 1.1.4. 显示模块程序设计 1.4.4.1 LCD1602 初始化 1.44.2 LCD1602 写周期 1.65. 定时模块程序设计 1.85.1 定时器设置 1.9.5.2 定时器中断子程序 2.06. 中断模块程序设计 2.2.6.1 外部中断设置 2.26.2键盘扫描中断子程序 237. 整体编程的实现258. 设计过程中的
2、问题及解决方案 259. 收获与感悟261. 刖言随着社会进步与经济发展,人们对生活质量的要求越来越高,每天的饮水量 是衡量健康的重要指标。但有多少人因为忙碌的工作而全天忘记喝水?当你感到 口渴想要喝水的时候,体内的失水已经达到 2%,口渴本身其实是体内已经严重 缺水的表现,这是造成 “亚健康”状态的致命习惯之一。同时,越不注意喝水, 喝水的欲望就会越低,人就会变得越来越缺水。研究表明,通常情况下,正常人 每次喝水应控制在300ml,间隔时间为30到60分钟。本课程设计就此设计出一款智能水杯, 用来智能显示水温和提醒喝水,既方 便了生活,又保持了健康。本报告针对智能水杯的软件系统进行阐述,软件
3、编程 在keil上操作。2. 总体设计框架2.1实现的功能硬件结构框架图如图1所示图1硬件结构简图(1 )水温检测使用DS18B20温度传感器,完成水温的时时检测功能。(2)水温及定时时间显示使用LCD1602液晶显示屏,完成水温及定时时间的显示功能。(3 )智能提醒使用定时器0,开启定时器中断,蜂鸣器提醒。(4) 定时时间设置使用外部中断0扩展电路,用三个按键触发中断,完成对应定时开启和定时 时间加减的功能。2.2总体程序流程图总体程序流程图分为主程序和中断程序两部分,其中中断程序分为外部中断 程序和定时器中断程序。流程图如下图所示图2主程序流程图图3外部按键中断流程图图4定时器中断程序设计
4、流程图3水温采集模块程序设计3.1 DS18B20 简介DS18B20单线数字温度传感器,即“一线器件”,其具有独特的优点:(1 )采用单总线的接口方式,与微处理器连接时,仅需要一条口线即可实 现微处理器与DS18B20的双向通讯。单总线具有经济性好,抗干扰能力强,适 合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网 络,为测量系统的构建引入全新概念。(2)测量温度范围宽,测量精度高 DS18B20的测量范围为-55 C +125 C ; 在-10+ 85 C 范围内,精度为 土 0.5 C。(4)持多点组网功能 多个DS18B20可以并联在惟一的单线上,实现多 点测温*
5、(5) 供电方式灵活DS18B20可以通过内部寄生电路从数据线上获取电源。因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更趋简单,可靠性更高。(6) 测量参数可配置DS18B20的测量分辨率可通过程序设定 912位。3.2 DS18B20 的初始化主机首先发出一个480 - 960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。若无低电平出现一直都是高电平说明总线上无器件应答。作为从图5 DS18B20初始化时序图器件的DS18B20在一上电后就一直在检测总线上是否有 480 960微秒的
6、 低电平出现,如果有,在总线转为高电平后等待 15 60微秒后将总线电平拉低 60 240微秒做出响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待。 初始化时序图如图5所示*函数名:Ds18b20I nit*函数功能:初始化*输入:无*输出:初始化成功返回1,失败返回0*unsigned char Ds18b20lnit()un sig ned int i;Desport=0;/将总线拉低480us960usi=70;while(i-);延时642usDsport=1;/然后拉高总线,若 DS18B20做出反应会将在15us60us后将总线拉低i=0;while(Despo
7、rt) / 等待 DS18B20 拉低总线 i+;if(i50000) 等待 50MSreturn 0;/初始化失败return 1;/初始化成功3.3 DS18B20 写周期写周期最少为60微秒,最长不超过120微秒。写周期一开始做为主机先把 总线拉低1微秒表示写周期开始。随后若主机想写 0,则将总线置为低电平,若 主机想写1,则将总线置为高电平,持续时间最少 60微秒直至写周期结束,然 后释放总线为高电平至少1微秒给总线恢复。而DS18B20则在检测到总线被 拉底后等待15微秒然后从15us到45us开始对总线米样,在米样期内总线为*函数名:Ds18b20WriteByte*函数功能:向1
8、8B20写入一个字节*输入:com输出:无void Ds18b20WriteByte(u nsig ned char dat)un sig ned int i,j;for(j=0;j=1;3.4 DS18B20 读周期读周期是从主机把单总线拉低1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。作为从机 DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束若要送出1则释放总线为高电平。主机在一开始拉低总线1微秒后释放总线,然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进 行采样检测,采样期内总线为低电平则
9、确认为 0。采样期内总线为高电平则确认 为1。完成一个读时序过程至少需要 60微秒才能完成。其读周期的时序图如图*/函数名:Ds18b20ReadByte函数功能:读取一个字节输入:com输出:无*un sig ned char Ds18b20ReadByte()un sig ned char byte,bi;un sig ned int i,j;for(j=8;j0;j-)Dsport=0; 先将总线拉低1usi+;Dsport=1;/然后释放总线i+;i+;延时6us等待数据稳定bi=Dsport; /读取数据,从最低位开始读取byte=(byte1)|(bi7); /*将byte左移一位
10、,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/i=4;/读取完之后等待48us再接着读取下一个数while(i-);return byte;3.5温度读取程序简单的读取温度值的步骤如下:跳过ROM操作-发送温度转换命令-跳过ROM操作-发送读取温度命令-读取温度值(1 )温度转换指令:*函数名:Ds18b20Cha ngTemp*函数功能:让18b20开始转换温度*输入:com*输出:无*void Ds18b20Cha ngTemp()Ds18b20I ni t();Delay1ms(1);Ds18b20WriteByte(0xcc);/ 跳过 ROM 操作命令Ds18b20Wri
11、teByte(0x44); / 温度转换命令Delay1ms(100);(2)温度读取指令/*函数名:Ds18b20ReadTempCom*函数功能:发送读取温度命令*输入:com*输出:无*void Ds18b20ReadT empCom()Ds18b20I ni t();/跳过ROM操作命令/发送读取温度命令Delay1ms(1);Ds18b20WriteByte(0xcc);Ds18b20WriteByte(0xbe);*/(3)读取温度:/*函数名:Ds18b20ReadTemp*函数功能:读取温度*输入:com*输出:无*int Ds18b20ReadTemp()un sig ned
12、 int temp=0;un sig ned char tmh,tml;Ds18b20ChangTemp(); /先写入转换命令Ds18b20ReadTempCom(); 然后等待转换完后发送读取温度命令tml=Ds18b20ReadByte(); /tmh=Ds18b20ReadByte(); temp=tmh;temp=8;temp|=tml;return temp;读取温度值共16位,先读低字节/再读高字节4.显示模块程序设计4.1 LCD1602 初始化表1 LCD1602 指令表指令码功能D=1 开显示;D=0关显示00001DCBC=1显示光标;C=0不显示光标B=1光标闪烁;B=
13、0光标不显示000001NSN=1当读或写一个字符后地址指针加一,且光标加一N=0当读或写一个字符后地址指针减一,且光 标减一S=1当写一个字符时,整屏显示左移(N=1) 或右移(N=0),以得到光标不移动而屏幕移动的效 果S=0当写一个字符,整屏显示不移动01H显示清屏:所有显示清零80H+ 地址码(0-27H ,40H-67H )设置数据地址*函数名:LcdI nit()*函数功能:初始化LCD屏*输入:无*输出:无*void Lcdlnit()/LCD初始化子程序LcdWriteCom(0x38);/设置显示模式LcdWriteCom(0x0c);/开显示不显示光标,光标不闪烁LcdWr
14、iteCom(0x06);/写一个指针加1LcdWriteCom(0x01);/清屏LcdWriteCom(0x80);/设置数据指针起点4.2 LCD1602 写周期时序图如图8所示,RS=0为写命令,RS=1为写数据。在写周期,R/W=0 ,E为写数据或命令使能输入。(1 )写命令:*/函数名:LcdWriteCom函数功能:向LCD写入一个字节的命令输入:com输出:无*void LcdWriteCom(unsigned char com)/ 写入命令RS=O;RW=O;GPIO_LCD=com;Delaylms(IO);E=1;Delay1ms(10);E=0;(2)写数据/*函数名:
15、LcdWriteData函数功能:向LCD写入一个字节的数据输入:dat输出:无*void LcdWriteData(unsigned char dat)/ 写入数据RS=1;RW=0;GPIO_LCD=dat;Delaylms(IO);E=1;Delay1ms(10);E=0;5.定时模块程序设计定时/计数器实质上是一个加1计数器。它随着计数器的输入脉冲进行自加1,也就是每来一个脉冲,计数器就自动加1,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使相应的中断标志位置1,向CPU发出中断请求(定时/计数器中断允许时)。如果定时/计数器工作于定时模式, 则表示定时时间已到;
16、如果工作于计数模式,则表示计数值已满。与定时器相关的寄存器如下:TCOND7D6D5D4D3D2D1D0功能TF1TR1TF0TR0IE1IT1IE0IT0TF1和TF0: T1和T0的溢出标志位,溢出后由硬件自动置1发出定时器中断请求。中断响应后标志位自动清零。IE1和IE0: INT1和INT0的标志位,引脚状态变化后由硬件自动置 1发出 外部中断请求,中断响应后标志位自动清零。IT1和IT0 : INT1和INT0的触发方式选择位。TMOD7D6D5D4D3D2D1D0D功能GATEC/TM1M0GATEC/TM1M0GATE:门控制为0时仅有运行控制位TRx来控制定时/计数器的开启。为
17、1时由TRx和外部中断脉冲计数。(用于计算外部中断负跳变 的次数)C/T :计数器模式和定时器模式选择为 0时选择定时器模式,为1时选为计数器模式。方式1的计数位数是16位,由TL0作为低8位、TH0作为高8位,组成了D0D716位加1计数器。如图9所示。图9定时器模式1示意图5.1定时器设置*函数名:Timer*函数功能:设置定时器并开始计时*输入:无/*输出:无*刘void Timer()TMOD=0X01;/定时器选择工作模式1TH0 = 0x3C;/定时器赋初值TL0 = OxBO;/定时50msEA = 1;/开启中断ET0 = 1;/开启定时器中断TR0=1;/启动定时器5.2定时
18、器中断子程序定时器中断子程序完成的功能有:(1) 定时器重新赋初值;(2) 统计中断次数,并在LCD上显示剩余时间;(3) 判断是否达到定时终点以启动蜂鸣器。/*函数名:Timer0() interrupt 1*函数功能:设置定时器中断执行程序,LCD显示定时剩余时间*输入:无*输出:无void Timer0() in terrupt 1*/TH0 = 0x3C;TL0 = OxBO;/疋时器重新赋值Time+;k+;/中断次数计数if(k=20)/20次中断,即1sLCDwritecom(0xc2);LCDwritedat(O+(-j)/10);LCDwritedat(0+(j)%10);
19、/ 定时显示剩余时间k=0;if (Time=full)/判断是否达到定时时间for(i=0;i100;i+)sound=1;/启用无源蜂鸣器Delay1ms(1);soun d=0;Delay1ms(1);Time=0;j=full/20; II计数初始化6中断模块程序设计中断是指CPU在执行当前程序的过程中,由于某种随机出现的外设请求或 CPU内部的异常事件,使CPU暂停正在执行的程序而转去 执行相应的服务处理 程序;当服务处理程序运行完毕后,CPU再返回到暂停处继续执行原来的程序。 51单片机的中断系统如图10所示。许A许尢离红中K 氏辺中rt LF !rlo/*图10中断系统结构图6.
20、1外部中断设置*函数名:IntConfiguration()*函数功能:设置外部中断*输入:无*输出:无*/void IntCon figurati on()IT0=1;外部中断0跳变沿触发方式(下降沿)EX0=1; 打开INTO的中断允许。EA=1;打开总中断6.2键盘扫描中断子程序中断程序完成的功能有:(1)判断按键是否按下;(2 )执行对应按键的功能。*函数名:Scan key()*函数功能:键盘扫描,并执行对应按键的程序*输入:无*输出:无voidScan key()*/if(key1=0)/判断按键是否按下Delaylms(IO);/ 延时消抖if(key仁=0)/判断按键是否按下f
21、or(;)if(key1=0)con ti nue;else break;for(;)while(key1=0);/检测按键是否松开if(key1=0) con ti nue;else break;/执行对应按键的程序7.整体编程的实现 -I - r IaI rJi l_I I -i ni-BJ II F: B 蛍上:J-7-7 7/.软件编程在keil上操作,在各个模块的子程序完成后,在主程序按照流程图图11 proteus 仿真效果图调用各个子函数即可完成最终的编程。在经过编译之后,将机器代码导入到实现 搭建好的硬件proteus仿真,其效果图11所示。8设计过程中的问题及解决方案在确定了各种所需的元器件之后,对各种元器件的资料文档进行了仔细研读。采用分模块的方式,分别编写了温度读取子函数,温度显示子函数,定时器 子函数,中断子函数,键盘扫描子函数。再用keil编写编译后,也出现了不少问题,但都问题不大,调试过后都编译成功了在用proteus搭建好了硬件电路之后,仿真时出现了一系列问题,第一, lcd1602没有显示。第二,有较大的噪音。第三,按键不
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生产工厂转让合同协议书
- 甲板船合同租赁合同范本
- 食品委托检验协议书范本
- 聘请演员演出的合同范本
- 活动卫生间租赁合同范本
- 私人自建套房买卖协议书
- 申请充电桩物业合同范本
- 铺面加仓储出租合同范本
- 第三方合同非法解除协议
- 网络游戏公司合同协议书
- 工程监理大纲监理方案服务方案
- 蛋白组学二维电泳
- GB/T 3372-2010拖拉机和农业、林业机械用轮辋系列
- GB/T 31848-2015汽车贴膜玻璃贴膜要求
- 一例糖尿病合并脑梗死-护理查房概要
- 2023年宝应县(中小学、幼儿园)教师招聘笔试题库及答案解析
- 公司制成检验记录表
- 全集举一反三课件奥数五年级(数学)
- 钳工实操评分表(凹凸配合)
- 《植物生理学》课件第三章+植物的光合作用
- 石河子大学化学化工学院学院综合测评方案-理学院
评论
0/150
提交评论