基于单片机的身高体重测量仪毕业论文(编辑修改稿)内容摘要:
主 函数 的流程图 郑州铁路职业技术学院 2020届 自考 本科生毕业论文(设计) 12 主程序: void main(void) { lcdreset()。 //初始化液晶屏 system_init()。 //初始化串口 定时器 clrscreen()。 //清屏 while(1) //循环 { switch(pattern) //状态查询 { //正常测 量模式 case 1: if(Key_Scan(2)||weight4000)//人体秤校准 Correct_w++。 if(Key_Scan(3)) Correct_w。 if(Key_Scan(1)) //发送键按下 { beep=0。 //开蜂鸣器提示 Number++。 //编号加 1 for(i=0。 i4。 i++) //发 送数据到上位机 { SBUF=Number_data[i]。 while(!TI)。 TI=0。 } beep=1。 //关蜂鸣器提示音 } if(Key_Scan(4)) //”保持“按键按下 pattern=2。 //状态变量变为保持状态 weight = Read_Count()。 //读取体重值 hzkdis(p)。 //显示体重值 height = sonic()。 //读取身高值 hzkdis(p)。 //显示身高值 break。 case 2: //保持状态 if(Key_Scan(4)) //“保持”键按下 pattern=1。 //状态 变量变为正常状态 break。 default: break。 } } } 郑州铁路职业技术学院 2020届 自考 本科生毕业论文(设计) 13 系统初始化函数的编写 本设计中因为超声波模块需要用定时器来测量超声波脉冲的传播时间,另外系统工作时需要向上位机发送数据,所以在程序开始时需先初始化单片机定时器和串行端口相应的寄存器 [12]。 系统的初始化程序如下: void system_init(void) { SM0=0。 //设置串口工作模式 SM1=1。 TMOD = 0x21。 //设置定时器工作模式 TH1=0xfd。 //设置波特 率为 9600 TR1=1。 //开定时器 1 } HX711 AD 转换器通信函数的编写 HX711 AD 转换芯片的串行通讯线由管脚 SCK 和 DT 组成, DT 为数据线, SCK 用于时钟信号的输入和选择输入通道和增益的大小。 当 HX711 芯片数据输出管脚 DT 输出高电平时,表示 AD 转换器还没有准备好输出数据,此时时钟输入信号 SCK 应为低电平。 当 DT 变为低电平后,表示 AD 转换器准备好输出数据,这时 SCK 应输入 25 到 27 个不等的时钟脉冲。 第一个时钟脉冲的上升沿后可读取输出 24 位数据的最高位,直至第 24 个时钟脉冲完成,24 位输出数据从最高位至最低位逐位输出完成。 第 25 到 27 个时钟脉冲用来选择下一次转换的输入通道和增益。 本设计使用 AD 转换器的 A 通道,增益为 128,所以输入 25 个时钟脉冲 [11]。 HX711 AD 转换器芯片的读写时序如图 43所示。 图 43 HX711读写时序 郑州铁路职业技术学院 2020届 自考 本科生毕业论文(设计) 14 HX711 AD 转换芯片通信函数: unsigned long Read_Count(void) { unsigned long Count。 unsigned char i。 ADSK=0。 //先将时钟线拉低 Count=0。 //将存储转换值的中间变量清零 while(ADDO)。 //等待 HX711 准备好输出数据 for(i=0。 i24。 i++) //逐位读取 24 位 AD转换器转换好的值 { ADSK=1。 //时钟线拉高 Count=Count1。 //变量左移一位 ADSK=0。 //信号线拉低 if(ADDO) //数据输入为高电平 { Count++。 //最低位置一 } } ADSK=1。 //时钟线拉高 Count=Count^0x800000。 //最高位取反 ADSK=0。 //信号线拉低 Count=Count*。 //转为实际的重量值 Count=Correct_wCount。 //调零 return(Count)。 //重量值返回 } 按键检测函数的编写 在本文 节可知,按键的检测主要是检测单片机 IO 是否出现低电平。 本设计中将所有按键的检测写在了一个函数中,函数的参数为要检测的按键的编号,返回值为真( 1)时说明相应的按键按下,返回值为假( 0)时则说明按键没有按下。 在理想情况下若单片机的 IO 口出现低电平即可认为是对应的按键按下,但在实际情况下由于按键在闭合和断开的瞬间触点会存在抖动现象,所以按键所连接的 IO 口上就会出现一些杂波信号造成单片机的检测错误,如图 44所示。 另外主程序中对按键的检测是循环进行的,若按键按下的时间较长会造成单片机多次检测到按键按下的情况从而造成程序的混乱 [13]。 本设计在按键按下后以及松手后的瞬 间加入了一个短时间的延时函数来滤除这段时间内的杂波信号,该滤波程序对高频杂波信号的滤除具有很好的效果,另外通过在程序中加入松手检测有效的避免了单片机多次检测的情况。 郑州铁路职业技术学院 2020届 自考 本科生毕业论文(设计) 15 图 44 按键的抖动 按键检测函数: unsigned char Key_Scan(unsigned char key_num) { switch(key_num) //key_num 为选择要检测的按键 { case 1: //第一个按键 if(key1==0) //第一个按键按下 { delay_ms(5)。 //延时滤波 if(key1==0) //滤波后再次检测 { while(!key1)。 //松手检测 return 1。 //认为按键按下 返回值为真 1 } else { return 0。 //若滤波后检测没有按下判断为杂波 返回 0 } } else { return 0。 //若第一个按键没有按下 返回 0 } break。 default: break。 } } 郑州铁路职业技术学院 2020届 自考 本科生毕业论文(设计) 16 超声波模块函数的编写 超声波模块的控制端口 Trig 产生一个 10us以上的高电平该模块内部将自动发出 8 个周期频率为 40KHz 的超声波脉冲信号。 信号发出后超声波模块将自动检测超声波回波信号,若检测到超声波回波信号超声波模块的 Echo 引脚变为低电平。 若在超声波脉冲发射后打开单片机的定时器开始计时收到超声波回波信号后关闭定时器那么定时间即为超声波脉冲在空气中的传播时间,通过公式:测量距离 =(传播时间 *声速 (340m/s))/2 即可算出传播距离。 如图 45 为 超声波模块时序 图。 图 45 超声波模块时序 图 读取距离的函数: int sonic(void) { unsigned int n。 RX=1。 //将 RX(接收引脚 )置为高电平 TR0=0。 //定时器 0关闭 TH0=TL0=0。 //定时器清零 Pulse()。 //发射超神波脉冲信号 TR0=1。 //定时器开始计时 TF0=0。 //定时器溢出标志位置零 for(n=0。 n70。 n++)。 //延时 while( RX ==1 amp。 amp。 TF0 == 0 )。 //等待收到回波信号或定时器溢出 TR0=0。 //关定时器停止计时 if(TFO) //定时器溢出则判断为无信号返回 n=999。 //无信号返回时把距离值赋为 999cm else //定时器没有溢出 计算传播距离 { 郑州铁路职业技术学院 2020届 自考 本科生毕业论文(设计) 17 n=(TH08)+TL0。 //整合定时时间 n=(unsigned int)( n*)。 //换算为实际距离 n=n3。 //减去承重板到地面距离 } return n。 //返回高度值 } 液晶屏驱动函数的编写 单片机与 液晶间的通信主要有三种情况即写数据、写命令、读状态。 写数据的作用是将想要显示的字符、汉字写入液晶进行显示。 写命令的作用是向液晶屏幕发送各种指令如设置显示坐标、清屏、设置游标等。 读状态操作的作用是查看液晶的状态,液晶屏幕在接受指令前,单片机需要先确认液晶屏幕内部处于非忙碌状态,即读取 BF标志时 BF需为 0,方可接受新的指令。 液晶的这三种操作是由 RS 和 RW 引脚决定的。 液晶的读写时序如图461 和 462 所示。 写数据:输入: RS=H,RW=L,D0D7=数据 ,E=H 输出:无 写命令:输入: RS=L,RW=L,D0D7=数据 ,E=H 输出:无 图 461 液晶的写操作 void write_(unsigned char cmdcode) { chk_busy()。 //检查是否可以接收指令 RS=0。 //RS 为指令 /数据选择信号,写命令 RS=0 RW=0。 //RW 为读写选择信号 写命令 RW=0 E=1。 //液晶使能 Lcd_Bus=cmdcode。 //将命令送到数据总线 delay(5)。 //在数据写入的时候加入适当的延时 E=0。 //禁止使能 delay(5)。 //延时 } 郑州铁路职业技术学院 2020届 自考 本科生毕业论文(设计) 18 void write_data(unsigned char Dispdata) //写数据到 LCD { chk_busy()。 //检查是否可以接收指令 RS=1。 //RS 为指令 /数据选择信号 写数据 RS=1 RW=0。 //RW 为读写选择信号 写数据 RW=0 E=1。 //液晶使能 Lcd_Bus=Dispdata。 //将数据送到数据总线 delay(5)。 //在数据写入的时候加入适当的延时 E=0。 //禁止使能 delay(5)。 //延时 } 读状态:输入: RS=L,RW=H,E=H 输出: DOD7=状态字 图 46。基于单片机的身高体重测量仪毕业论文(编辑修改稿)
相关推荐
部程序存储器时, P0 口输出低 8 位地址信息后,将变为数据总线,以便读指令码(输入)。 在取指令期间, “ 控制 ” 信号为 “0” , V1 管截止,多路开关也跟着 转向锁存器反相输出端 Q非; CPU 自动将 0FFH( 11111111,即向 D锁存器写入一个高电平 ‘1’ )写入 P0口锁存器,使 V2 管截止,在读引脚信号控制下,通过读引脚三态门电路将指令码读到内部总线,这个过程和
本世纪 40年代,为了解决火力控制系统精确跟踪问题,维纳( )于 1942年提出了维纳滤波理论。 维纳根据有用信号和干扰信号的功率谱确定出线性滤波器的频率特性,首次将数理统计理论与线性系统理论有机的联系在一起,形成了对随机信号作平滑、估计或预测的最优估计新理论。 比维纳稍早,前苏联科学家戈尔莫克罗夫( )于1941年也曾提出过类似的理论。 维纳给
使用的遥控器控制系统,第二套是出门在外时使用的手机控制系统,第三套是在家中控制智能管家。 系统总体结构 根 据总体方案画出了系统的总体设计图,如图 31 所示。 按照结构层次系统划分为三层:数据感知层(协调器和终端节点)、网络层和应用层(智能终端)。 图 31 智能家居 系统的结构图 数据感知层的终端是 系统的前线,它起着数据供给的作用。 它在系统的边缘,是数据采集终端,算是拥有独立系统的单元
uvuD 表示点 vu, 到滤波中心 vu 00, 的距离。 vuH , H L vuD, 图 同态滤波处理示意图 利用 vuH , 对( 6)式进行滤波 ,可得 vuRvuHvuIvuHvuZvuHvuS ,, ( 6) ⑤ 最后对滤波结果进行傅立叶反变换和 ⑥ 指数运算
支持远程通信唤醒。 LD3320 是一颗由 ICRouat 公司生产的基于非特定人语音识别 (SIASR, Speaker Independent Automatic Speech Recognition)技术的语音识别 /声控芯片。 该芯片集成了语音处理器和一些外部电路,包括 AD、 DA 转换、麦克风接口、声音输出接口等, LD3320 芯片是一款“语音识别”专用芯片。
数 Count%50==0 继续计数 初始化 显示步数 预采样 清零按键按下 Y Y N 基于 51 单片机计步器的设计 12 计步器算法的实现 在可用于分析跑步或步行的特征当中,我们选择“加速度”作为相关参数。 个体(及其相关轴)的运动包括三个分量,分别是前向(“滚动”)、竖向(“偏航”)和侧向(“俯仰”),如图 9所示。 ADXL345 检测其三个轴 — x、 y和 z上的加速度。