已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2015级单片机加速度传感器课程设计论文 学院: 专业: 名字 目 录0 概述21 系统组成与功能21.1 系统组成2 1.1.1 STC89C52单片机2 1.1.2 ADXL345 模块4 1.1.3 1602液晶显示屏41.1.4最小系统61.2 系统功能72 系统原理72.1实物照片73 布线图84 具体程序代码95 焊接总结196 扩展部分心得207 参考资料20概述ADXL345是一款小而薄的超低功耗3轴加速度计,分辨率高(13位),测量范围达 16g。数字输出数据为16位二进制补码格式,可通过SPI(3线或4线)或I2C9数字接口访问。AD9XL345非常适合移动设备应用。它可以在倾斜检测应用中测量静态重力加速度,还可以测量运动或冲击导致的动态加速度。其高分辨率(3.9mg/LSB),能够测量不到1.0的倾斜角度变化。 该器件提供多种特殊检测功能。活动和非活动检测功能通过比较任意轴上的加速度与用户设置的阈值来检测有无运动发生。敲击检测功能可以检测任意方向的单振和双振动作。自由落体检测功能可以检测器件是否正在掉落。这些功能可以独立映射到两个中断输出引脚中的一个。正在申请专利的集成式存储器管理系统采用一个32级先进先出(FIFO)缓冲器,可用于存储数据,从而将主机处理器负荷降至最低,并降低整体系统功耗。 低功耗模式支持基于运动的智能电源管理,从而以极低的功耗进行阈值感测和运动加速度测量。 ADXL345采用3 mm 5 mm 1 mm,14引脚小型超薄塑料封装。1 系统组成与功能 1.1 系统组成1.1.1 STC89C52单片机STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有 8K可编程Flash存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM, MAX810复位电路, 3个16 位定时器计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外 STC89X52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。参数:1. 增强型8051 单片机,6 时钟/机器周期和12 时钟/机器周期可以任意 选择,指令代码完全兼容传统8051.2?2. 工作电压:5.5V3.3V(5V 单片机)/3.8V2.0V(3V 单片机)3. 工作频率范围:040MHz,相当于普通8051 的080MHz,实际工作 频率可达48MHz4. 用户应用程序空间为8K 字节5. 片上集成512 字节RAM6. 通用I/O 口(32 个),复位后为:P0/P1/P2/P3 是准双向口/弱上拉, P0 口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为 I/O 口用时,需加上拉电阻。7. ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无 需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程 序,数秒即可完成一片8. 具有EEPROM 功能9. 具有看门狗功能10. 共3 个16 位定时器/计数器。即定时器T0、T1、T211. 外部中断4 路,下降沿中断或低电平触发电路,Power Down 模式可 由外部中断低电平触发中断方式唤醒12. 通用异步串行口(UART),还可用定时器软件实现多个UART13. 工作温度范围:-40+85(工业级)/075(商业级)14. PDIP 封装 1.1.2 ADXL345 模块1.1.3 1602液晶显示屏硬件原理图:1602液晶显示模块可以和单片机STC89C52直接接口,电路如图:1602引脚图如图:液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,表3是DM-162的内部显示地址1602采用标准的16脚接口,其中: 第1脚:VSS为地电源第2脚:VDD接5V正电源第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第714脚:D0D7为8位双向数据线。第1516脚:空脚1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”1.1.4最小系统最小系统原理图如下1.2 系统功能此实验电路板由ADXL345加速度传感器对数据进行采集,STC89C52单片机对数据进行运算处理,经由P0口与液晶显示屏1602对数据进行显示,可以加速度进行精确地计算显示。2 系统原理 系统实物图如下: 正面:反面:电脑显示结果3 布线图4 程序:ADXL345模块 用途:ADXL345模块IIC测试程序 #include #include /Keil library #include /Keil library#include #define uchar unsigned char#define uint unsigned int#define DataPort P2 /LCD1602数据端口sbit SCL=P10; /IIC时钟引脚定义sbit SDA=P11; /IIC数据引脚定义sbit LCM_RS=P07; /LCD1602命令端口sbit LCM_RW=P06; /LCD1602命令端口sbit LCM_EN=P05; /LCD1602命令端口sfr T2MOD = 0xC9;sbit x1=P20;sbit x2=P22;#defineSlaveAddress 0xA6 /定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改 /ALT ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3Atypedef unsigned char BYTE;typedef unsigned short WORD;BYTE BUF8=0xe8,0x83,0xe8,0x03,0xe8,0x03,0xe8,0x03; /接收数据缓存区 uchar ge,shi,bai,qian,wan; /显示变量int dis_data; /变量void delay(unsigned int k);void InitLcd(); /初始化lcd1602void Init_ADXL345(void); /初始化ADXL345void WriteDataLCM(uchar dataW);void WriteCommandLCM(uchar CMD,uchar Attribc);void DisplayOneChar(uchar X,uchar Y,uchar DData);void conversion(uint temp_data);void Single_Write_ADXL345(uchar REG_Address,uchar REG_data); /单个写入数据uchar Single_Read_ADXL345(uchar REG_Address); /单个读取内部寄存器数据void Multiple_Read_ADXL345(); /连续的读取内部寄存器数据void Delay5us();void Delay5ms();void ADXL345_Start();void ADXL345_Stop();void ADXL345_SendACK(bit ack);bit ADXL345_RecvACK();void ADXL345_SendByte(BYTE dat);BYTE ADXL345_RecvByte();void ADXL345_ReadPage();void ADXL345_WritePage();void conversion(uint temp_data) wan=temp_data/10000+0x30 ; temp_data=temp_data%10000; /取余运算qian=temp_data/1000+0x30 ; temp_data=temp_data%1000; /取余运算 bai=temp_data/100+0x30 ; temp_data=temp_data%100; /取余运算 shi=temp_data/10+0x30 ; temp_data=temp_data%10; /取余运算 ge=temp_data+0x30; void delay(unsigned int k)unsigned int i,j;for(i=0;ik;i+)for(j=0;j121;j+);void WaitForEnable(void)DataPort=0xff;LCM_RS=0;LCM_RW=1;_nop_();LCM_EN=1;_nop_();_nop_();while(DataPort&0x80);LCM_EN=0;void WriteCommandLCM(uchar CMD,uchar Attribc)if(Attribc)WaitForEnable();LCM_RS=0;LCM_RW=0;_nop_();DataPort=CMD;_nop_();LCM_EN=1;_nop_();_nop_();LCM_EN=0;void WriteDataLCM(uchar dataW)WaitForEnable();LCM_RS=1;LCM_RW=0;_nop_();DataPort=dataW;_nop_();LCM_EN=1;_nop_();_nop_();LCM_EN=0;void InitLcd()WriteCommandLCM(0x38,1);WriteCommandLCM(0x08,1);WriteCommandLCM(0x01,1);WriteCommandLCM(0x06,1);WriteCommandLCM(0x0c,1);void DisplayOneChar(uchar X,uchar Y,uchar DData)Y&=1;X&=15;if(Y)X|=0x40;X|=0x80;WriteCommandLCM(X,0);WriteDataLCM(DData);/延时5微秒(STC90C52RC12M)不同的工作环境,需要调整此函数,注意时钟过快时需要修改当改用1T的MCU时,请调整此延时函数void Delay5us() _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();/延时5毫秒(STC90C52RC12M)不同的工作环境,需要调整此函数当改用1T的MCU时,请调整此延时函数void Delay5ms() WORD n = 560; while (n-);/起始信号void ADXL345_Start() SDA = 1; /拉高数据线 SCL = 1; /拉高时钟线 Delay5us(); /延时 SDA = 0; /产生下降沿 Delay5us(); /延时 SCL = 0; /拉低时钟线/停止信号void ADXL345_Stop() SDA = 0; /拉低数据线 SCL = 1; /拉高时钟线 Delay5us(); /延时 SDA = 1; /产生上升沿 Delay5us(); /延时/发送应答信号入口参数:ack (0:ACK 1:NAK)void ADXL345_SendACK(bit ack) SDA = ack; /写应答信号 SCL = 1; /拉高时钟线 Delay5us(); /延时 SCL = 0; /拉低时钟线 Delay5us(); /延时/接收应答信号bit ADXL345_RecvACK() SCL = 1; /拉高时钟线 Delay5us(); /延时 CY = SDA; /读应答信号 SCL = 0; /拉低时钟线 Delay5us(); /延时 return CY;/向IIC总线发送一个字节数据void ADXL345_SendByte(BYTE dat) BYTE i; for (i=0; i8; i+) /8位计数器 dat = 1; /移出数据的最高位 SDA = CY; /送数据口 SCL = 1; /拉高时钟线 Delay5us(); /延时 SCL = 0; /拉低时钟线 Delay5us(); /延时 ADXL345_RecvACK();/从IIC总线接收一个字节数据BYTE ADXL345_RecvByte() BYTE i; BYTE dat = 0; SDA = 1; /使能内部上拉,准备读取数据, for (i=0; i8; i+) /8位计数器 dat = 1; SCL = 1; /拉高时钟线 Delay5us(); /延时 dat |= SDA; /读数据 SCL = 0; /拉低时钟线 Delay5us(); /延时 return dat;/*单字节写入*void Single_Write_ADXL345(uchar REG_Address,uchar REG_data) ADXL345_Start(); /起始信号 ADXL345_SendByte(SlaveAddress); /发送设备地址+写信号 ADXL345_SendByte(REG_Address); /内部寄存器地址,请参考中文pdf22页 ADXL345_SendByte(REG_data); /内部寄存器数据,请参考中文pdf22页 ADXL345_Stop(); /发送停止信号/*单字节读取*uchar Single_Read_ADXL345(uchar REG_Address) uchar REG_data; ADXL345_Start(); /起始信号 ADXL345_SendByte(SlaveAddress); /发送设备地址+写信号 ADXL345_SendByte(REG_Address); /发送存储单元地址,从0开始 ADXL345_Start(); /起始信号 ADXL345_SendByte(SlaveAddress+1); /发送设备地址+读信号 REG_data=ADXL345_RecvByte(); /读出寄存器数据ADXL345_SendACK(1); ADXL345_Stop(); /停止信号 return REG_data; /连续读出ADXL345内部加速度数据,地址范围0x320x37void Multiple_read_ADXL345(void) uchar i; ADXL345_Start(); /起始信号 ADXL345_SendByte(SlaveAddress); /发送设备地址+写信号 ADXL345_SendByte(0x32); /发送存储单元地址,从0x32开始 ADXL345_Start(); /起始信号 ADXL345_SendByte(SlaveAddress+1); /发送设备地址+读信号 for (i=0; i6; i+) /连续读取6个地址数据,存储中BUF BUFi = ADXL345_RecvByte(); /BUF0存储0x32地址中的数据 if (i = 5) ADXL345_SendACK(1); /最后一个数据需要回NOACK else ADXL345_SendACK(0); /回应ACK ADXL345_Stop(); /停止信号 Delay5ms();/初始化ADXL345,根据需要请参考pdf进行修改*void Init_ADXL345() Single_Write_ADXL345(0x31,0x0B); /测量范围,正负16g,13位模式 Single_Write_ADXL345(0x2C,0x08); /速率设定为12.5 参考pdf13页 Single_Write_ADXL345(0x2D,0x08); /选择电源模式 参考pdf24页 Single_Write_ADXL345(0x2E,0x80); /使能 DATA_READY 中断 Single_Write_ADXL345(0x1E,0x00); /X 偏移量 根据测试传感器的状态写入pdf29页 Single_Write_ADXL345(0x1F,0x00); /Y 偏移量 根据测试传感器的状态写入pdf29页 Single_Write_ADXL345(0x20,0x05); /Z 偏移量 根据测试传感器的状态写入pdf29页/显示x轴void display_x() float temp; dis_data=(BUF18)+BUF0; /合成数据 if(dis_data0)dis_data=-dis_data; DisplayOneChar(10,0,-); /显示正负符号位else DisplayOneChar(10,0, ); /显示空格 temp=(float)dis_data*3.9; /计算数据和显示,查考ADXL345快速入门第4页 conversion(temp); /转换出显示需要的数据DisplayOneChar(8,0,X); DisplayOneChar(9,0,:); DisplayOneChar(11,0,qian); DisplayOneChar(12,0,.); DisplayOneChar(13,0,bai); DisplayOneChar(14,0,shi); DisplayOneChar(15,0, ); /显示y轴void display_y() float temp; dis_data=(BUF38)+BUF2; /合成数据 if(dis_data0)dis_data=-dis_data; DisplayOneChar(2,1,-); /显示正负符号位else DisplayOneChar(2,1, ); /显示空格 temp=(float)dis_data*3.9; /计算数据和显示,查考ADXL345快速入门第4页 conversion(temp); /转换出显示需要的数据DisplayOneChar(0,1,Y); /第1行,第0列 显示y DisplayOneChar(1,1,:); DisplayOneChar(3,1,qian); DisplayOneChar(4,1,.); DisplayOneChar(5,1,bai); DisplayOneChar(6,1,shi); DisplayOneChar(7,1, ); /显示z轴void display_z() float temp; dis_data=(BUF58)+BUF4; /合成数据 if(dis_data0)dis_data=-dis_data; DisplayOneChar(10,1,-); /显示负符号位else DisplayOneChar(10,1, ); /显示空格 temp=(float)dis_data*3.9; /计算数据和显示,查考ADXL345快速入门第4页 conversion(temp); /转换出显示需要的数据DisplayOneChar(8,1,Z); /第0行,第10列 显示Z DisplayOneChar(9,1,:); DisplayOneChar(11,1,qian); DisplayOneChar(12,1,.); DisplayOneChar(13,1,bai); DisplayOneChar(14,1,shi); DisplayOneChar(15,1, ); void SeriPushSend(uchar send_data) SBUF=send_data; while(!TI);TI=0; void timinit() /定时器2 EA = 1; /打开总中断; TMOD |= 0x01; /选定定时/计数器0的工作的方式 TH0 = (65536 - 20000) / 256; TL0 = (65536 - 20000) % 256; /初始化定时/计数器的值 ET0 = 1; /打开中断服务程序 TR0 = 1; /打开计数器 void chuankou() RCAP2L=0xD9;/9600波特率对应 FFD9,低位为D9 RCAP2H=0xFF;/高位为FF T2CON=0x34;/RCLK、TCLK、TR2置1 SCON=0x50;/串口工作模式1,接收使能 ES=1;/打开接收中断 EA=1;/打开总中断 TI=0; void chuankouchuli(uchar i)/0X 1Y 2Zfloat temp; dis_data=(BUF(i*2+1)8)+BUFi*2; /合成数据 switch(i)case 0:SeriPushSend(X);break;case 1:SeriPushSend(Y);break;case 2:SeriPushSend(Z);break;default:break;if(dis_data0)dis_data=-dis_data;SeriPushSend(-);elseSeriPushSend(+); temp=(float)dis_data*3.9; /计算数据和显示,查考ADXL345快速入门第4页 conversion(temp); /转换出显示需要的数据 SeriPushSend(qian); SeriPushSend(.); SeriPushSend(bai); SeriPushSend(shi); SeriPushSend(,); void chuankoutongxin()chuankouchuli(0);/Xchuankouchuli(1);/Ychuankouchuli(2);/ZSBUF=0x0a;while(!TI); TI=0; /*主程序*void main() uchar devid;x1=0;delay(500); /上电延时InitLcd(); /液晶初始化ADXL345x1=0;chuankou(); timinit();/串口初始化DisplayOneChar(0,0,A);DisplayOneChar(1,0,D); DisplayOneChar(2,0,X); DisplayOneChar(3,0,L); DisplayOneChar(4,0,3); DisplayOneChar(5,0,4); DisplayOneChar(6,0,5); Init_ADXL345(); /初始化ADXL345devid=Single_Read_ADXL345(0X00);/读出的数据为0XE5,表示正确while(1) /循环 Multiple_Read_ADXL345(); /连续读出数据,存储在BUF中display_x(); /-显示X轴display_y(); /-显示Y轴display_z(); /-显示Z轴delay(200); x1=x1;/延时 void timer2(void) interrupt 1 static uchar tim=0;TH0 = (65536 - 10000) / 256; TL0 = (65536 - 10000) % 256; /初始化定时/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山东省2026年春考《畜牧养殖类》专业知识模拟试题及答案解析
- 2024-2025学年河北省邯郸市高二下学期期末政治试题含答案
- 平面艺术设计就业方向
- 预应力筋张拉千斤顶校验周期
- 2026陕西汉中市汉台区河东店镇中心卫生院招聘专业技术人员1人笔试模拟试题及答案解析
- 2026年金华兰溪市市属国企(城发集团)春季公开招聘工作人员27人笔试备考题库及答案解析
- 2026晋中寿阳县国有资本运营有限公司及下属公司招聘(40人)考试模拟试题及答案解析
- 2026届河南名校联盟高三二模生物试卷(试卷+解析)
- 2026云南交通技师学院丘北联办点招聘24人笔试参考题库及答案解析
- 2026年甘肃省武威市城镇公益性岗位工作人员招聘30人笔试备考试题及答案解析
- 喀什地区2025新疆维吾尔自治区喀什地区“才聚喀什智惠丝路”人才引进644人笔试历年参考题库典型考点附带答案详解
- 2026LME与上海期货交易所价格引导关系研究
- 健康人口与社会经济协同发展策略
- 2026江苏无锡市惠山区教育局招聘教师41人备考题库及答案详解(历年真题)
- 八省八校T8联考2026届高三下学期第二次质量检测(4月联合测评)数学试卷(含解析)
- 银行信贷业务操作流程及风险管理手册
- 2026浙江凯航物产有限公司招聘31人备考题库及完整答案详解【有一套】
- 二十届四中全会模拟100题(带答案)
- 2026年苏教版二年级科学下册(全册)教学设计(附教材目录)
- 福建福州地铁招聘笔试题库2026
- 腾讯收购案例分析
评论
0/150
提交评论