




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于stc12c5a60s2的adxl345z程序(12t单片机未测试)头文件i2c.h#ifndef _i2c_h_#define _i2c_h_#include /-重定义关键词-/#ifndef uchar#define uchar unsigned char#endif#ifndef uint #define uint unsigned int#endif/-定义使用的io口-/sbit i2c_scl = p02;sbit i2c_sda = p01;/-声明全局变量-/void i2c_delay10us();void i2c_start();void i2c_stop();uch
2、ar i2c_sendbyte(uchar dat, uchar ack);/ uchar i2c_readbyte();uchar i2c_readbyte(uchar ack);void i2c_ack(void);void i2c_nack(void);#endif源文件i2c.c#include i2c.hvoid i2c_delay10us()/12.000mhzunsigned char i;i = 12;while (-i);void i2c_start()i2c_sda = 1;i2c_delay10us();i2c_scl = 1;i2c_delay10us();/建立时间是
3、i2c_sda保持时间4.7usi2c_sda = 0;i2c_delay10us();/保持时间是4usi2c_scl = 0;i2c_delay10us();void i2c_stop()i2c_sda = 0;i2c_delay10us();i2c_scl = 1;i2c_delay10us();/建立时间大于4.7usi2c_sda = 1;i2c_delay10us();uchar i2c_sendbyte(uchar dat, uchar ack)uchar a = 0,b = 0;/最大255,一个机器周期为1us,最大延时255us。for(a=0; a 7; /起始信号之后i
4、2c_scl=0,所以可以直接改变i2c_sda信号dat = dat 4.7usi2c_scl = 0;i2c_delay10us();/时间大于4usi2c_sda = 1;i2c_delay10us();i2c_scl = 1;while(i2c_sda & (ack = 1)/等待应答,也就是等待从设备把i2c_sda拉低b+;if(b 200) /如果超过200us没有应答发送失败,或者为非应答,表示接收结束i2c_scl = 0;i2c_delay10us();return 0;i2c_scl = 0;i2c_delay10us(); return 1;uchar i2c_read
5、byte(unsigned char ack)uchar a = 0,dat = 0;i2c_sda = 1;/起始和发送一个字节之后i2c_scl都是0i2c_delay10us();for(a=0; a8; a+)/接收8个字节i2c_scl = 1;i2c_delay10us();dat = 1;dat |= i2c_sda;i2c_delay10us();i2c_scl = 0;i2c_delay10us();if(!ack)i2c_nack();elsei2c_ack();return dat;void i2c_ack(void)i2c_scl=0;i2c_sda=0;i2c_del
6、ay10us();i2c_scl=1;i2c_delay10us();i2c_scl=0;/不产生ack应答 void i2c_nack(void)i2c_scl=0;i2c_sda=1;i2c_delay10us();i2c_scl=1;i2c_delay10us();i2c_scl=0;头文件adxl345z.h#ifndef _adxl345z_h#define _adxl345z_h#include #include i2c.h#ifndef u8#define u8 unsigned char#endif#ifndef u16 #define u16 unsigned int#end
7、if#define device_id0x00 /器件id,0xe5#define thresh_tap0x1d /敲击阀值#define ofsx0x1e#define ofsy0x1f#define ofsz0x20#define dur0x21#define latent0x22#define window 0x23 #define thresh_ack0x24#define thresh_inact0x25 #define time_inact0x26#define act_inact_ctl0x27 #define thresh_ff0x28#define time_ff0x29 #
8、define tap_axes0x2a #define act_tap_status 0x2b #define bw_rate0x2c #define power_ctl0x2d #define int_enable0x2e#define int_map0x2f#define int_source 0x30#define data_format 0x31#define data_x00x32#define data_x10x33#define data_y00x34#define data_y10x35#define data_z00x36#define data_z10x37#define
9、fifo_ctl0x38#define fifo_status0x39/用户配置,跟硬件电路有关,vdd-io接高电平则为此地址,接地请查看数据手册#define adxl_read 0x3b#define adxl_write 0x3au8 adxl345_init(void); /初始化adxl345void adxl345_wr_reg(u8 addr,u8 val);/写adxl345寄存器u8 adxl345_rd_reg(u8 addr);/读adxl345寄存器void adxl345_rd_xyz(short *x,short *y,short *z);/读取一次值void a
10、dxl345_rd_avval(short *x,short *y,short *z);/读取平均值void adxl345_auto_adjust(char *xval,char *yval,char *zval);/自动校准void adxl345_read_average(short *x,short *y,short *z,u8 times);/连续读取times次,取平均short adxl345_get_angle(float x,float y,float z,u8 dir);void adxl_show_num(u16 x,u16 y,short num,u8 mode);#e
11、ndif源文件adxl345z.c#include adxl345z.h#include oled.h#include u8 adxl345_init(void) u8 temp=adxl345_rd_reg(device_id);if(temp=0xe5)/读取器件id adxl345_wr_reg(data_format,0x2b);/低电平中断输出,13位全分辨率,输出数据右对齐,16g量程 adxl345_wr_reg(bw_rate,0x0a);/数据输出速度为100hzadxl345_wr_reg(power_ctl,0x28); /链接使能,测量模式adxl345_wr_reg(
12、int_enable,0x00);/不使用中断 adxl345_wr_reg(ofsx,0x00);adxl345_wr_reg(ofsy,0x00);adxl345_wr_reg(ofsz,0x00);return 0;else return 1;void adxl345_wr_reg(u8 addr,u8 val)i2c_start();i2c_sendbyte(adxl_write,1);/发送写器件指令,等待应答i2c_sendbyte(addr,1);/发送寄存器地址i2c_sendbyte(val,1);/发送要写入的值i2c_stop();u8 adxl345_rd_reg(u8
13、 addr)u8 temp;i2c_start(); i2c_sendbyte(adxl_write,1);/发送写器件指令,等待应答i2c_sendbyte(addr,1);/发送寄存器地址i2c_start();/重新开始起始信号,无需发送结束信号i2c_sendbyte(adxl_read,1);/发送写器件指令,等待应答temp=i2c_readbyte(0);/读取寄存器内容i2c_stop();return temp;/读取3个轴的数据/x,y,z:读取到的数据void adxl345_rd_xyz(short *x,short *y,short *z)u8 buf6;u8 i;i
14、2c_start(); i2c_sendbyte(adxl_write,1);/发送写器件指令i2c_sendbyte(data_x0,1); i2c_start(); /重新启动i2c_sendbyte(adxl_read,1);/发送读器件指令for(i=0;i6;i+) if(i=5) bufi=i2c_readbyte(0);/读取一个字节,不继续再读,发送nack else bufi=i2c_readbyte(1); i2c_stop();/产生一个停止条件*x=(short)(u16)buf18)+buf0); *y=(short)(u16)buf38)+buf2); *z=(sh
15、ort)(u16)buf58)+buf4); void adxl345_read_average(short *x,short *y,short *z,u8 times)u8 i;short tx,ty,tz;*x=0;*y=0;*z=0;if(times)/读取次数不为0for(i=0;itimes;i+)/连续读取times次adxl345_rd_xyz(&tx,&ty,&tz);*x+=tx;*y+=ty;*z+=tz;delay_ms(1);*x/=times;*y/=times;*z/=times;/得到角度/x,y,z:x,y,z方向的重力加速度分量(不需要单位,直接数值即可)/d
16、ir:要获得的角度.0,与z轴的角度;1,与x轴的角度;2,与y轴的角度./返回值:角度值.单位0.1.short adxl345_get_angle(float x,float y,float z,u8 dir)float temp; float res=0;switch(dir)case 0:/与自然z轴的角度 temp=sqrt(x*x+y*y)/z; res=atan(temp); break;case 1:/与自然x轴的角度 temp=x/sqrt(y*y+z*z); res=atan(temp); break; case 2:/与自然y轴的角度 temp=y/sqrt(x*x+z*
17、z); res=atan(temp); break; return res*1800/3.14;/读取adxl的平均值/x,y,z:读取10次后取平均值void adxl345_rd_avval(short *x,short *y,short *z)short tx=0,ty=0,tz=0; u8 i; for(i=0;i10;i+)adxl345_rd_xyz(x,y,z);delay_ms(10);tx+=(short)*x;ty+=(short)*y;tz+=(short)*z; *x=tx/10;*y=ty/10;*z=tz/10; /自动校准/xval,yval,zval:x,y,z
18、轴的校准值void adxl345_auto_adjust(char *xval,char *yval,char *zval)short tx,ty,tz;u8 i;short offx=0,offy=0,offz=0;adxl345_wr_reg(power_ctl,0x00); /先进入休眠模式.delay_ms(100);adxl345_wr_reg(data_format,0x2b);/低电平中断输出,13位全分辨率,输出数据右对齐,16g量程 adxl345_wr_reg(bw_rate,0x0a);/数据输出速度为100hzadxl345_wr_reg(power_ctl,0x28
19、); /链接使能,测量模式adxl345_wr_reg(int_enable,0x00);/不使用中断 adxl345_wr_reg(ofsx,0x00);adxl345_wr_reg(ofsy,0x00);adxl345_wr_reg(ofsz,0x00);delay_ms(12);for(i=0;i10;i+)adxl345_rd_avval(&tx,&ty,&tz);offx+=tx;offy+=ty;offz+=tz; offx/=10;offy/=10;offz/=10;*xval=-offx/4;*yval=-offy/4;*zval=-(offz-256)/4; adxl345_
20、wr_reg(ofsx,*xval);adxl345_wr_reg(ofsy,*yval);adxl345_wr_reg(ofsz,*zval); /mode:0,显示加速度;1,显示角度void adxl_show_num(u16 x,u16 y,short num,u8 mode)if(mode=0)/显示加速度值if(num0)oled_showchar(x,y,-);/显示负号num=-num;/转为正数else oled_showchar(x,y, );/去掉负号oled_shownum(x+8,y,num,4,16);/显示值 else /显示角度值if(num0)oled_sho
21、wchar(x,y,-);/显示负号num=-num;/转为正数else oled_showchar(x,y, );/去掉负号 oled_shownum(x+8,y,num/10,2,16);/显示整数部分 oled_showchar(x+24,y,.);/显示小数点oled_shownum(x+32,y,num%10,1,16); /显示小数部分 头文件oled.h#ifndef _oled_h#define _oled_h#include #define u8 unsigned char #define u32 unsigned int #define oled_cmd 0/写命令#def
22、ine oled_data 1/写数据#define oled_mode 0 /0:4线串行模式 1:并行8080模式/-oled端口定义- sbit oled_cs=p00; /片选sbit oled_rst =p15;/复位sbit oled_dc =p22;/数据/命令控制sbit oled_scl=p20;/时钟 d0(sclk)sbit oled_sdin=p21;/d1(mosi) 数据/信号控制函数#define oled_cs_clr() oled_cs=0#define oled_cs_set() oled_cs=1#define oled_rst_clr() oled_rs
23、t=0#define oled_rst_set() oled_rst=1#define oled_dc_clr() oled_dc=0#define oled_dc_set() oled_dc=1#define oled_sclk_clr() oled_scl=0#define oled_sclk_set() oled_scl=1#define oled_sdin_clr() oled_sdin=0#define oled_sdin_set() oled_sdin=1;/#define size 16#define xlevell0x02#define xlevelh0x10#define m
24、ax_column128#define max_row64#definebrightness0xff #define x_width 128#define y_width 64 void delay_ms(unsigned int ms); /oled控制用函数void oled_wr_byte(u8 dat,u8 cmd); void oled_display_on(void);void oled_display_off(void); void oled_init(void);void oled_clear(void);void oled_drawpoint(u8 x,u8 y,u8 t);
25、void oled_fill(u8 x1,u8 y1,u8 x2,u8 y2,u8 dot);void oled_showchar(u8 x,u8 y,u8 chr);void oled_shownum(u8 x,u8 y,u32 num,u8 len,u8 size2);void oled_showstring(u8 x,u8 y, u8 *p); void oled_set_pos(unsigned char x, unsigned char y);void oled_showchinese(u8 x,u8 y,u8 no);void oled_drawbmp(unsigned char
26、x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char bmp);#endif 源文件oled.c#include oled.h#include oledfont.h void delay_ms(unsigned int ms) unsigned int a;while(ms)a=1800;while(a-);ms-;return;#if oled_mode=1/向ssd1106写入一个字节。/dat:要写入的数据/命令/cmd:数据/命令标志 0,表示命令;1,表示数据;void oled_wr_byte(u
27、8 dat,u8 cmd)dataout(dat); if(cmd) oled_dc_set();else oled_dc_clr(); oled_cs_clr();oled_wr_clr(); oled_wr_set();oled_cs_set(); oled_dc_set(); #else/向ssd1306写入一个字节。/dat:要写入的数据/命令/cmd:数据/命令标志 0,表示命令;1,表示数据;void oled_wr_byte(u8 dat,u8 cmd)u8 i; if(cmd) oled_dc_set();else oled_dc_clr(); oled_cs_clr();fo
28、r(i=0;i8;i+) oled_sclk_clr();if(dat&0x80) oled_sdin_set();else oled_sdin_clr();oled_sclk_set();dat4)|0x10,oled_cmd);oled_wr_byte(x&0x0f)|0x01,oled_cmd); /开启oled显示 void oled_display_on(void)oled_wr_byte(0x8d,oled_cmd); /set dcdc命令oled_wr_byte(0x14,oled_cmd); /dcdc onoled_wr_byte(0xaf,oled_cmd); /disp
29、lay on/关闭oled显示 void oled_display_off(void)oled_wr_byte(0x8d,oled_cmd); /set dcdc命令oled_wr_byte(0x10,oled_cmd); /dcdc offoled_wr_byte(0xae,oled_cmd); /display off /清屏函数,清完屏,整个屏幕是黑色的!和没点亮一样! void oled_clear(void) u8 i,n; for(i=0;i8;i+) oled_wr_byte (0xb0+i,oled_cmd); /设置页地址(07)oled_wr_byte (0x00,oled
30、_cmd); /设置显示位置列低地址oled_wr_byte (0x10,oled_cmd); /设置显示位置列高地址 for(n=0;nmax_column-1)x=0;y=y+2;if(size =16)oled_set_pos(x,y);for(i=0;i8;i+)oled_wr_byte(f8x16c*16+i,oled_data);oled_set_pos(x,y+1);for(i=0;i8;i+)oled_wr_byte(f8x16c*16+i+8,oled_data);else oled_set_pos(x,y+1);for(i=0;i6;i+)oled_wr_byte(f6x8
31、ci,oled_data);/mn函数u32 oled_pow(u8 m,u8 n)u32 result=1; while(n-)result*=m; return result; /显示2个数字/x,y :起点坐标 /len :数字的位数/size:字体大小/mode:模式0,填充模式;1,叠加模式/num:数值(04294967295); void oled_shownum(u8 x,u8 y,u32 num,u8 len,u8 size2) u8 t,temp;u8 enshow=0; for(t=0;tlen;t+)temp=(num/oled_pow(10,len-t-1)%10;i
32、f(enshow=0&t120)x=0;y+=2;j+;/显示汉字void oled_showchinese(u8 x,u8 y,u8 no) u8 t,adder=0;oled_set_pos(x,y); for(t=0;t16;t+)oled_wr_byte(hzk2*not,oled_data);adder+=1; oled_set_pos(x,y+1); for(t=0;t16;t+)oled_wr_byte(hzk2*no+1t,oled_data);adder+=1; /*功能描述:显示显示bmp图片12864起始点坐标(x,y),x的范围0127,y为页的范围07*/void o
33、led_drawbmp(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char bmp) unsigned int j=0; unsigned char x,y; if(y1%8=0) y=y1/8; else y=y1/8+1;for(y=y0;yy1;y+)oled_set_pos(x0,y); for(x=x0;xx1;x+) oled_wr_byte(bmpj+,oled_data); /初始化ssd1306 void oled_init(void) oled_rst_set
34、();delay_ms(100);oled_rst_clr();delay_ms(100);oled_rst_set(); oled_wr_byte(0xae,oled_cmd);/-turn off oled paneloled_wr_byte(0x00,oled_cmd);/-set low column addressoled_wr_byte(0x10,oled_cmd);/-set high column addressoled_wr_byte(0x40,oled_cmd);/-set start line address set mapping ram display start l
35、ine (0x000x3f)oled_wr_byte(0x81,oled_cmd);/-set contrast control registeroled_wr_byte(0xcf,oled_cmd); / set seg output current brightnessoled_wr_byte(0xa1,oled_cmd);/-set seg/column mapping 0xa0左右反置 0xa1正常oled_wr_byte(0xc8,oled_cmd);/set com/row scan direction 0xc0上下反置 0xc8正常oled_wr_byte(0xa6,oled_c
36、md);/-set normal displayoled_wr_byte(0xa8,oled_cmd);/-set multiplex ratio(1 to 64)oled_wr_byte(0x3f,oled_cmd);/-1/64 dutyoled_wr_byte(0xd3,oled_cmd);/-set display offsetshift mapping ram counter (0x000x3f)oled_wr_byte(0x00,oled_cmd);/-not offsetoled_wr_byte(0xd5,oled_cmd);/-set display clock divide
37、ratio/oscillator frequencyoled_wr_byte(0x80,oled_cmd);/-set divide ratio, set clock as 100 frames/secoled_wr_byte(0xd9,oled_cmd);/-set pre-charge periodoled_wr_byte(0xf1,oled_cmd);/set pre-charge as 15 clocks & discharge as 1 clockoled_wr_byte(0xda,oled_cmd);/-set com pins hardware configurationoled_wr_byte(0x12,oled_cmd);oled_wr_byte(0xdb,oled
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年广州市天河区御景小学招聘聘用制专任教师考试笔试试题(含答案)
- 机器人零部件打磨抛光创新创业项目商业计划书
- 园林植物与文学艺术创作结合创新创业项目商业计划书
- 智能车辆定位与导航系统创新创业项目商业计划书
- 功能性水产饲料创新创业项目商业计划书
- 现场总线课件
- 现场急救知识培训内容课件
- 2025年工业废气深度净化技术在环保产业的风险管理与战略规划
- 2025年工业互联网平台网络安全态势感知技术安全防护体系构建与应用报告
- 2025年汽车行业智能车灯技术发展趋势及市场分析报告
- 粮油保管员(高级)职业技能鉴定参考试题(附答案)
- GB/T 196-2025普通螺纹基本尺寸
- 新课标下初高中数学教学的衔接研究
- 2024-2025学年人教版二年级体育下册全册教案
- 2025年初升高高中自主招生考试化学试卷试题(含答案详解)
- 劳务施工施工方案
- 新部编版五年级语文上册第八单元课件
- 中国急性缺血性卒中诊治指南(2023)解读
- 加入音乐家协会申请书
- 2025年高二开学第一课主题班会:扬帆砥砺行奋斗正当时
- 华住收益管理
评论
0/150
提交评论