版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、基于stc12c5a60s2的adxl345z程序(12t單片機未測試)頭文件i2c.h#ifndef _i2c_h_#define _i2c_h_#include /-重定義關(guān)鍵詞-/#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沒有應答發(fā)送失敗,或者為非應答,表示接收結(jié)束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;/起始和發(fā)送一個字節(jié)之后i2c_scl都是0i2c_delay10us();for(a=0; a8; a+)/接收8個字節(jié)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;/不產(chǎn)生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/用戶配置,跟硬件電路有關(guān),vdd-io接高電平則為此地址,接地請查看數(shù)據(jù)手冊#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);/連續(xù)讀取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位全分辨率,輸出數(shù)據(jù)右對齊,16g量程 adxl345_wr_reg(bw_rate,0x0a);/數(shù)據(jù)輸出速度為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);/發(fā)送寫器件指令,等待應答i2c_sendbyte(addr,1);/發(fā)送寄存器地址i2c_sendbyte(val,1);/發(fā)送要寫入的值i2c_stop();u8 adxl345_rd_reg(u8
13、 addr)u8 temp;i2c_start(); i2c_sendbyte(adxl_write,1);/發(fā)送寫器件指令,等待應答i2c_sendbyte(addr,1);/發(fā)送寄存器地址i2c_start();/重新開始起始信號,無需發(fā)送結(jié)束信號i2c_sendbyte(adxl_read,1);/發(fā)送寫器件指令,等待應答temp=i2c_readbyte(0);/讀取寄存器內(nèi)容i2c_stop();return temp;/讀取3個軸的數(shù)據(jù)/x,y,z:讀取到的數(shù)據(jù)void adxl345_rd_xyz(short *x,short *y,short *z)u8 buf6;u8 i;i
14、2c_start(); i2c_sendbyte(adxl_write,1);/發(fā)送寫器件指令i2c_sendbyte(data_x0,1); i2c_start(); /重新啟動i2c_sendbyte(adxl_read,1);/發(fā)送讀器件指令for(i=0;i6;i+) if(i=5) bufi=i2c_readbyte(0);/讀取一個字節(jié),不繼續(xù)再讀,發(fā)送nack else bufi=i2c_readbyte(1); i2c_stop();/產(chǎn)生一個停止條件*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)/讀取次數(shù)不為0for(i=0;itimes;i+)/連續(xù)讀取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方向的重力加速度分量(不需要單位,直接數(shù)值即可)/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位全分辨率,輸出數(shù)據(jù)右對齊,16g量程 adxl345_wr_reg(bw_rate,0x0a);/數(shù)據(jù)輸出速度為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;/轉(zhuǎn)為正數(shù)else oled_showchar(x,y, );/去掉負號oled_shownum(x+8,y,num,4,16);/顯示值 else /顯示角度值if(num0)oled_sho
21、wchar(x,y,-);/顯示負號num=-num;/轉(zhuǎn)為正數(shù)else oled_showchar(x,y, );/去掉負號 oled_shownum(x+8,y,num/10,2,16);/顯示整數(shù)部分 oled_showchar(x+24,y,.);/顯示小數(shù)點oled_shownum(x+32,y,num%10,1,16); /顯示小數(shù)部分 頭文件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/寫數(shù)據(jù)#define oled_mode 0 /0:4線串行模式 1:并行8080模式/-oled端口定義- sbit oled_cs=p00; /片選sbit oled_rst =p15;/復位sbit oled_dc =p22;/數(shù)據(jù)/命令控制sbit oled_scl=p20;/時鐘 d0(sclk)sbit oled_sdin=p21;/d1(mosi) 數(shù)據(jù)/信號控制函數(shù)#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控制用函數(shù)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寫入一個字節(jié)。/dat:要寫入的數(shù)據(jù)/命令/cmd:數(shù)據(jù)/命令標志 0,表示命令;1,表示數(shù)據(jù);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寫入一個字節(jié)。/dat:要寫入的數(shù)據(jù)/命令/cmd:數(shù)據(jù)/命令標志 0,表示命令;1,表示數(shù)據(jù);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/關(guān)閉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 /清屏函數(shù),清完屏,整個屏幕是黑色的!和沒點亮一樣! 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函數(shù)u32 oled_pow(u8 m,u8 n)u32 result=1; while(n-)result*=m; return result; /顯示2個數(shù)字/x,y :起點坐標 /len :數(shù)字的位數(shù)/size:字體大小/mode:模式0,填充模式;1,疊加模式/num:數(shù)值(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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度船舶拆解與回收利用合同范本4篇
- 二零二五年度生態(tài)園區(qū)車位出售及綠化養(yǎng)護服務合同4篇
- 2024版模板工單項工程合同范本
- 《疫細胞因子》課件
- 2025至2030年中國就地顯示側(cè)裝翻板液位計數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國雙層不銹鋼保溫煙囪數(shù)據(jù)監(jiān)測研究報告
- 2025年金屬惰性氣體保護焊機項目可行性研究報告
- 2025年脫水防銹油項目可行性研究報告
- 2025年箱形車固定器項目可行性研究報告
- 2025年特殊焊條項目可行性研究報告
- 沖壓生產(chǎn)的品質(zhì)保障
- 《腎臟的結(jié)構(gòu)和功能》課件
- 2023年湖南聯(lián)通校園招聘筆試題庫及答案解析
- 上海市徐匯區(qū)、金山區(qū)、松江區(qū)2023屆高一上數(shù)學期末統(tǒng)考試題含解析
- 護士事業(yè)單位工作人員年度考核登記表
- 天津市新版就業(yè)、勞動合同登記名冊
- 產(chǎn)科操作技術(shù)規(guī)范范本
- 人教版八年級上冊地理全冊單元測試卷(含期中期末試卷及答案)
- 各種焊工證件比較和釋義
- 感染性疾病標志物及快速診斷課件(PPT 134頁)
- 2022年煤礦地面消防應急預案范文
評論
0/150
提交評論