1、165.定时模块程序设计 .185.1定时器设置.195.2定时器中断子程序 .206.中断模块程序设计 .226.1 外部中断设置 .22,.6.2 键盘扫描中断子程序 237. 整体编程的实现 258. 设计过程中的问题及解决方案 259. 收获与感悟 261.前言随着社会进步与经济发展, 人们对生活质量的要求越来越高, 每天的饮水量是衡量健康的重要指标。 但有多少人因为忙碌的工作而全天忘记喝水?当你感到口渴想要喝水的时候,体内的失水已经达到 2% ,口渴本身其实是体内已经严重缺水的表现,这是造成 “亚健康”状态的致命习惯之一。同时,越不注意喝水,喝水的欲望就会越低,人就会变得越来越缺水。
2、研究表明,通常情况下,正常人每次喝水应控制在 300ml ,间隔时间为 30 到60 分钟。本课程设计就此设计出一款智能水杯, 用来智能显示水温和提醒喝水, 既方便了生活,又保持了健康。 本报告针对智能水杯的软件系统进行阐述, 软件编程在keil 上操作。2.总体设计框架2.1 实现的功能定时开启按键设置外部中断定时器中断蜂鸣器提醒STC89C51温度读入温度提示灯控制器DS18B20LCD 温度显示硬件结构框架图如图 1 所示。图 1 硬件结构简图(1)水温检测使用 DS18B20 温度传感器,完成水温的时时检测功能。(2)水温及定时时间显示使用 LCD1602 液晶显示屏,完成水温及定时时
3、间的显示功能。(3)智能提醒使用定时器 0 ,开启定时器中断,蜂鸣器提醒。(4)定时时间设置使用外部中断 0 扩展电路,用三个按键触发中断, 完成对应定时开启和定时时间加减的功能。2.2 总体程序流程图总体程序流程图分为主程序和中断程序两部分, 其中中断程序分为外部中断程序和定时器中断程序。流程图如下图所示。开始初始化DS18B20 检测水温LCD1602 显示水温N水温 40?Y高温提示灯红灯亮水温 50000)/ 等待 50MSreturn 0;/ 初始化失败return 1;/ 初始化成功3.3 DS18B20 写周期写周期最少为 60 微秒,最长不超过 120 微秒。写周期一开始做为主
4、机先把总线拉低 1 微秒表示写周期开始。随后若主机想写 0 ,则将总线置为低电平,若主机想写 1,则将总线置为高电平,持续时间最少 60 微秒直至写周期结束,然后释放总线为高电平至少 1 微秒给总线恢复 。而 DS18B20 则在检测到总线被拉底后等待 15 微秒然后从 15us 到 45us 开始对总线采样,在采样期内总线为高电平则为 1 ,若采样期内总线为低电平则为 0。写周期时序图如图 6 所示。图6 DS18B20 写周期时序图 Ds18b20WriteByte*函数功能: 向 18B20 写入一个字节*输入: comvoid Ds18b20WriteByte(unsigned cha
5、r dat)unsigned int i,j;for(j=0;j=1;3.4 DS18B20 读周期读周期是从主机把单总线拉低 1 微秒之后就得释放单总线为高电平,以让DS18B20 把数据传输到单总线上。作为从机 DS18B20 在检测到总线被拉低 1 微秒后,便开始送出数据,若是要送出 0 就把总线拉为低电平直到读周期结束。若要送出 1 则释放总线为高电平。主机在一开始拉低总线 1 微秒后释放总线,然后在包括前面的拉低总线电平 1 微秒在内的 15 微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为 0。采样期内总线为高电平则确认为 1。完成一个读时序过程至少需要 60 微秒才
6、能完成。其读周期的时序图如图7 所 示 。图7 DS18B20 读周期时序图/* Ds18b20ReadByte 读取一个字节unsigned char Ds18b20ReadByte()unsigned char byte,bi;for(j=8;j0;j-)Dsport=0;/ 先将总线拉低 1us/ 然后释放总线/ 延时 6us 等待数据稳定bi=Dsport; / 读取数据,从最低位开始读取byte=(byte1)|(bi7); /* 将 byte 左移一位,然后与上右移 7 位后的 bi ,注意移动之后移掉那位补 0 。 */i=4; / 读取完之后等待 48us 再接着读取下一个数r
7、eturn byte;3.5 温度读取程序简单的读取温度值的步骤如下:跳过 ROM 操作 - 发送温度转换命令 - 跳过 ROM 操作 - 发送读取温度命令 - 读取温度值(1)温度转换指令:/* Ds18b20ChangTemp 让 18b20 开始转换温度*/void Ds18b20ChangTemp()Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc); / 跳过 ROM 操作命令Ds18b20WriteByte(0x44); / 温度转换命令Delay1ms(100);(2)温度读取指令 Ds18b20ReadTempCom 发送读取温度命
8、令void Ds18b20ReadT empCom()Ds18b20WriteByte(0xbe); / 发送读取温度命令(3)读取温度:/* Ds18b20ReadTemp 读取温度*/int Ds18b20ReadTemp()unsigned int temp=0;unsigned char tmh,tml;Ds18b20ChangTemp(); / 先写入转换命令Ds18b20ReadTempCom();/ 然后等待转换完后发送读取温度命令tml=Ds18b20ReadByte(); / 读取温度值共 16 位,先读低字节tmh=Ds18b20ReadByte(); / 再读高字节tem
9、p=tmh;temp=8;temp|=tml;return temp;4.显示模块程序设计表 1 LCD1602 指令表指令码功能D=1开显示;D=0关显示00001DCBC=1显示光标; C=0不显示光标B=1光标闪烁; B=0光标不显示000001NSN=1当读或写一个字符后地址指针加一, 且光标加一N=0当读或写一个字符后地址指针减一, 且光标减一S=1当写一个字符时,整屏显示左移(N=1 )或右移( N=0 ),以得到光标不移动而屏幕移动的效果S=0当写一个字符,整屏显示不移动01H显示清屏:所有显示清零80H+ 地址码( 0-27H ,设置数据地址40H-67H) LcdInit()
10、 初始化 LCD 屏void LcdInit() /LCD 初始化子程序LcdWriteCom(0x38); / 设置显示模式LcdWriteCom(0x0c); / 开显示不显示光标,光标不闪烁LcdWriteCom(0x06); / 写一个指针加 1LcdWriteCom(0x01); / 清屏LcdWriteCom(0x80); / 设置数据指针起点4.2 LCD1602 写周期时序图如图 8 所示,RS=0 为写命令,RS=1 为写数据。在写周期, R/W=0 ,E为写数据或命令使能输入。图 8 LCD1602 写时序图(1)写命令: LcdWriteCom 向 LCD 写入一个字节的命令void LcdWriteCom(unsigned char com) / 写入命令RS=0;RW=0;GPIO_LCD=com;Delay1ms(10);E=1;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1