理工大学学士学位论文
变SDA线的工作方式,每读入一个字节均要依次检测应答信号;如果是输出数据,则首先要将SDA设置为输出方式,当发送完一个字节后,需要改变SDA线为输入方式,此时读入传感器的应答信号就完成了一个字节的传送。当所有数据传输完毕后,应向SDA发出一个停止信号,以结束该次数据传输。 3.2.2 液晶显示驱动程序设计
单片机通过对RS、R/W、使能端E和数据总线DB信号的控制,实现将单片机处理后的数据显示在屏幕上的功能。在本毕业设计中,LCD显示四行数据,这就要求不仅要成功控制四个信号,还需要设定合理的显示位置。表3.3是RS、R/W的配合选择决定控制界面的4种模式,表3.4是改变E引脚信号配合读写指令的执行。
表3.3 RS、R/W状态改变4种模式
RS L L H H
表3.4 E信号状态改变功能
E状态 高→低 高 低/低→高
执行动作 I/O缓冲→DR DR→I/O缓冲 无动作
结果
配合/W进行写数据或指令 配合R进行读数据或指令
R/W L H L H
功能说明
单片机写指令到指令暂存器(IR)
读出忙标志(BF)及地址计数器(AC)的状态 单片机写入数据到数据暂存器(DR) MCU从数据寄存器中读出数据
12864液晶显示屏总共有11条基本指令,在驱动程序初始化中只要实现六条指令就能成功显示符号[14]。这六条指令主要包括功能设置、清屏、显示开关控制、输入方式位置、DDRAM地址设置、写数据,它们的指令码描述如表3.5所示。
25
理工大学学士学位论文
表3.5 基本指令表
指令 清除显示 功能设置 显示状态开关 进入点设定 设定DDRAM地址 写数据到RAM 指令码 RS 0 0 0 0 0 1 R/W 0 0 0 0 0 0 D7 0 0 0 0 1 D6 0 0 0 0 0 D5 0 1 0 0 AC5 D4 0 DL 0 0 AC4 D3 0 - 1 0 AC3 数据 D2 0 RE D 1 AC2 D1 0 - C I/D AC1 D0 1 - B S AC0 在这些指令中,清除显示的功能是将DDRAM填满“20H”,并且设定DDRAM的地址计数器到“00H”。功能设置指令中DL=0时,选择4位数据,DL=1时,选择4位数据,RE=1时,选择扩充指令操作,而RE=0时,选择基本指令操作。显示状态开关中,D=1、C=1、B=1分别表示整体显示开关打开、游标打开和游标位置反白允许。进入点设定表示指令在数据读出与写入时,设定游标的移动方向及指令显示位置。设定DDRAM地址的第一行是80H-87H,第二行是90H-97H。写数据到RAM则代表将数据D7-D0的数据写入到内部的RAM中。
在熟悉了LCD显示屏的指令和引脚状态之后,设计该显示模块程序的时候还要遵循以下几点原则:
(1)欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。
(2)显示ASCII字符过程与显示中文字符过程相同。不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置。
(3)当字符编码为2字节时,应先写入高位字节,在写入低位字节。
(4)模块在接受指令前,向处理器必须先确认模块内部处于非忙状态,即读取BF标志时,BF需为“0”才可接受新指令。如果在送出一个指令前不检查BF标志,则在前一个指令和这个指令中间必须延迟一段较长的时间,即等待前一个指令确定执行完成。指令执行的时间要参考指令表中的指令执行时间说明。
液晶显示驱动程序: #ifndef __LCD12864_H__
26
理工大学学士学位论文
#define __LCD12864_H__ #include
/***************************延时1ms函数***************************/ void delay_ms(unsigned int k) //延时0.994us,晶振12M { }
/**************************查\忙\函数*************************/ void checkBusy(void) { RS=0; RW=1; E=1; lcd_data=0xff; while(lcd_data & 0x80);
3.2.3 ADXL345加速度传感器软件模块
要得到加速度传感器的数据,必须先对ADXL345进行初始化设置。在上面已经详
unsigned int x,y; for(x=k;x>0;x--) for(y=121;y>0;y--);
//复位引脚
//数据口
//选择寄存器(并行) 0:指令寄存器 1:数据寄存器;
//读写控制脚(并行) 0:写入 1:读出 //读写数据启始脚(并行)
//串并方式选择引脚,0 为串行模式,1 为8/4 位
27
理工大学学士学位论文
细描述了加速度传感器内部的寄存器,根据表2.1中各个寄存器对应的功能,通过I2C通信,在程序中设置寄存器。首先是设置寄存器0x31和0x2C,选择测量范围为±16g,分辨率13位模式和12.5Hz的速率。其次是选择电源模式和使能DATA_READY中断,最后是设置X、Y、Z轴的偏移量。这是最简单的初始化序列,但是已经足够达到本毕业设计的需求。
在初始化之后,单片机就要读取和处理传感器输出数据。DATA_READY中断信号表明数据寄存器中的三轴加速度数据已经有更新。当新数据就绪时,它就会被置为高电平,利用低-高电平跃迁来触发中断服务例程。接着单片机就能从DATAX0、DATAX1、DATAY0、DATAY1、DATAZ0和DATAZ1寄存器中读取数据。在程序设计中,使用了多字节连续读取传感器内部的加速度数据,地址范围是0x32~0x37,将数据存储在数组中。因为ADXL345输出的是16位二进制补码数据格式,所以从寄存器中获取加速度数据后,还必须在程序中对数据进行重建。在13位模式下,1LSB代表3.9mg,如16位代码为0000,则加速度值为0;代码为0001.则加速度值为+3.9mg;代码为FFFF,则加速度值为-3.9mg,一次类推。在程序中,依次将DATAX0和DATAX1寄存器中的数据合成,然后乘以3.9就能显示出正确的加速度值。
(natcra在计算出三个轴的加速度之后,根据公式(9):??Ax2?Ay2Az),在程
序中利用反三角函数arctan,再将弧度值γ转换成角度值即可达到本设计的需求。由于Az的值会出现正负两种情况,所有必须设置两种处理函数。当Az>=0时1,角度值=γ*180/3.14;当Az<0时,角度值=-γ*180/3.14。 3.2.4 ADXL345加速度传感器误差校准
加速度传感器是机械结构,包含可以自由移动的原件,这些运动部件对机械应力
非常灵敏。0g偏执或偏移是很重要的加速度传感器指标,在组装过程中难免会存在误差,因此必须对系统进行校准来补偿这些影响。最简单的校验方法是测量器件偏移,使用内置偏移寄存器记录偏移量,自动补偿DATA寄存器收集的数据[17]。校准过程如下:将Z轴置于±1g重力场,X和Y轴在0g场,测试10次分别记录±1g重力场下Z轴的加速度,取样本的平均值。X和Y轴分别重复上述动作,取平均值。然后取±1g重力场中,X、Y、Z轴的平衡值,如在本毕业设计中,X轴的+1g和-1g的值分别为1.07g和-1.01g,则取平衡值的绝对值为1.04,即偏差输出是7LSB。在全分辨率下,每个输出LSB(3.9mg/LSB)是偏移寄存器LSB(15.6mg/LSB)的四分之一。所以,Xoffset=-Round(7/4)=-2LSB,将这个
28

