




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、/*/*大氣壓檢測GY68 BMP180 模塊編譯器編寫手頭上有塊BMP180氣壓傳感模塊,為了好玩,想用之作一車載氣壓表。在網上找AVR驅動未果,就用來自網絡BMP085模塊C51單片機IIC測試程序修改,測試成功,方便初學AVR的參考;聽說BMP180航模上也可以用。效果圖:模塊:GY68 BMP180 編譯器:winavr V2.0.8單片機:MEGA16作者:十堰供電 DXY*/* #include <avr/io.h> #include <util/delay.h>#include <math.h>#define SDA68_L PORTB &am
2、p;= (1<<PB0) #define SDA68_H PORTB |= (1<<PB0)#define SCL68_L PORTB &= (1<<PB1) #define SCL68_H PORTB |= (1<<PB1)#define SDA68_DDR_0 DDRB &= (1<<PB0)#define SDA68_DDR_1 DDRB |= (1<<PB0) #define SCL68_DDR_0 DDRB &= (1<<PB1)#define SCL68_DDR_1 DDRB
3、 |= (1<<PB1)#define SDA68_RD_VAL(PINB & _BV(PB0)#define BMP085_SlaveAddress 0xee /定義器件在IIC總線中的從地址 #define OSS 0 / Oversampling Setting (note: code is not set up to use other OSS values)#define uchar unsigned char int dis_data; /變量short ac1;short ac2; short ac3; unsigned short ac4;unsigned
4、short ac5;unsigned short ac6;short b1; short b2;short mb;short mc;short md;uchar HorL;uchar ge,shi,bai,qian,wan,shiwan;/*起始信號*/void BMP085_Start(void) SDA68_H; /拉高數據線 SCL68_H;SDA68_DDR_1;SCL68_DDR_1; /拉高時鐘線 _delay_us(5); /延時 SDA68_L; /產生下降沿 _delay_us(5); /延時 SCL68_L; /拉低時鐘線SDA68_DDR_1;/拉高,置為輸出SCL68_
5、DDR_1;/*停止信號*/void BMP085_Stop(void) SDA68_L; /拉低數據線 SCL68_H; SDA68_DDR_1;SCL68_DDR_1; /拉高時鐘線 _delay_us(5); /延時 SDA68_H; /產生上升沿 _delay_us(5); /延時SDA68_DDR_1;/拉高,置為輸出SCL68_DDR_1;/*發送應答信號入口參數:ack (0:ACK 1:NAK)*/void BMP085_SendACK(uchar ack)SDA68_DDR_1;/拉高,置為輸出SCL68_DDR_1;if (ack) SDA68_H;/寫應答else SDA
6、68_L; SCL68_H; /拉高時鐘線 _delay_us(5); /延時 SCL68_L; /拉低時鐘線 _delay_us(5); /延時SDA68_DDR_1;/拉高,置為輸出SCL68_DDR_1;/*接收應答信號*/uchar BMP085_RecvACK(void) SCL68_H; /拉高時鐘線 SDA68_DDR_0;/拉低,置為輸入SCL68_DDR_1;_delay_us(5); /延時 if (SDA68_RD_VAL) HorL =1;else HorL =0; SCL68_L; /拉低時鐘線 _delay_us(5); /延時SDA68_DDR_1;/拉高,置為輸
7、出SCL68_DDR_1;return HorL;/*向IIC總線發送一個字節數據*/void BMP085_SendByte(char dat) SDA68_DDR_1;/DDRA |=_BV(PA0);SCL68_DDR_1;uchar i; for (i=0; i<8; i+) /8位計數器 /dat <<= 1; /移出數據的最高位 /SDA68 = CY; /送數據口 if (dat&0x80) SDA68_H;else SDA68_L;dat <<= 1;SCL68_H; /拉高時鐘線 _delay_us(5); /延時 SCL68_L; /拉
8、低時鐘線 _delay_us(5); /延時 SDA68_DDR_1;/拉高,置為輸出SCL68_DDR_1; BMP085_RecvACK();/*從IIC總線接收一個字節數據*/uchar BMP085_RecvByte(void) uchar i,dat = 0; SDA68_H;SDA68_DDR_1; /使能內部上拉,準備讀取數據,for (i=0; i<8; i+) /8位計數器 dat<<=1;SCL68_H;SCL68_DDR_0;_delay_us(5);dat |= SDA68_RD_VAL;SCL68_L;SCL68_DDR_1;_delay_us(5)
9、;return dat;/*/讀出BMP085內部數據,連續兩個/*short Multiple_read(uchar ST_Address) uchar msb, lsb; short _data; BMP085_Start(); /起始信號 BMP085_SendByte(BMP085_SlaveAddress); /發送設備地址+寫信號 BMP085_SendByte(ST_Address); /發送存儲單元地址 BMP085_Start(); /起始信號 BMP085_SendByte(BMP085_SlaveAddress+1); /發送設備地址+讀信號 msb = BMP085_R
10、ecvByte(); /BUF0存儲 BMP085_SendACK(0); /回應ACK lsb = BMP085_RecvByte(); BMP085_SendACK(1); /最后一個數據需要回NOACK BMP085_Stop(); /停止信號 _delay_ms(5); _data = msb << 8; _data |= lsb; return _data;/*long bmp085ReadTemp(void) BMP085_Start(); /起始信號 BMP085_SendByte(BMP085_SlaveAddress); /發送設備地址+寫信號 BMP085_Se
11、ndByte(0xF4); / write register address BMP085_SendByte(0x2E); / write register data for temp BMP085_Stop(); /發送停止信號 _delay_ms(10); / max time is 4.5ms return (long) Multiple_read(0xF6);/*long bmp085ReadPressure(void) long pressure = 0; BMP085_Start(); /起始信號 BMP085_SendByte(BMP085_SlaveAddress); /發送設
12、備地址+寫信號 BMP085_SendByte(0xF4); / write register address BMP085_SendByte(0x34); / write register data for pressure BMP085_Stop(); /發送停止信號 _delay_ms(10); / max time is 4.5ms pressure = Multiple_read(0xF6); pressure &= 0x0000FFFF; return pressure; /return (long) bmp085ReadShort(0xF6);/*/初始化BMP085,根
13、據需要請參考pdf進行修改*void Init_BMP085(void) ac1 = Multiple_read(0xAA); ac2 = Multiple_read(0xAC); ac3 = Multiple_read(0xAE); ac4 = Multiple_read(0xB0); ac5 = Multiple_read(0xB2); ac6 = Multiple_read(0xB4); b1 = Multiple_read(0xB6); b2 = Multiple_read(0xB8); mb = Multiple_read(0xBA); mc = Multiple_read(0xBC
14、); md = Multiple_read(0xBE);/讀數分解void conver085(long temp_data) /long shiwan=temp_data/100000+0x30 ;temp_data=temp_data%100000; /取余運算 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%10
15、0; /取余運算 shi=temp_data/10+0x30 ; temp_data=temp_data%10; /取余運算 ge=temp_data+0x30; void bmp085Convert(void) long ut; long up; long x1, x2, b5, b6, x3, b3, p; unsigned long b4, b7; long temperature; long pressure;float altitude; /* ut = bmp085ReadTemp(); ut = bmp085ReadTemp(); / 讀取溫度 up = bmp085ReadPr
16、essure(); up = bmp085ReadPressure(); / 讀取壓強 /*/ x1 = (long)ut - ac6) * ac5 >> 15; x2 = (long) mc << 11) / (x1 + md); b5 = x1 + x2; temperature = (b5 + 8) >> 4; /* conver085(temperature); lcd_show_char(1,0,bai); /LCD顯示,根據顯示位置修改 lcd_show_char(1,1,shi); lcd_show_char(1,3,ge); /* b6 =
17、b5 - 4000; x1 = (b2 * (b6 * b6 >> 12) >> 11; x2 = ac2 * b6 >> 11; x3 = x1 + x2; b3 = (long)ac1 * 4 + x3) + 2)/4; x1 = ac3 * b6 >> 13; x2 = (b1 * (b6 * b6 >> 12) >> 16; x3 = (x1 + x2) + 2) >> 2; b4 = (ac4 * (unsigned long) (x3 + 32768) >> 15; b7 = (unsi
18、gned long) up - b3) * (50000 >> OSS); if( b7 < 0x80000000) p = (b7 * 2) / b4 ; else p = (b7 / b4) * 2; x1 = (p >> 8) * (p >> 8); x1 = (x1 * 3038) >> 16; x2 = (-7357 * p) >> 16; pressure = p + (x1 + x2 + 3791) >> 4);conver085(pressure);lcd_show_char(2,4,shiwan);
19、 /LCD顯示,根據顯示位置修改 lcd_show_char(2,5,wan); lcd_show_char(2,6,qian); lcd_show_char(2,7,bai); lcd_show_char(2,9,shi);lcd_show_char(2,10,ge);/* altitude=44330.0*(1.0-pow(float)(pressure)/101325.0,1.0/5.255); /根據芯片手冊提供的公式計算海拔高度altitude *= 100; /轉換成厘米單位的高度值,調用時再換算成帶小數的高度值,提高精度 conver085(altitude);lcd_show_char(1,8,shiwan); /LCD顯示,根據顯示位置修改 lcd_show_char(1,9,wan); lcd_sh
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 辦公資源的成本效益管理策略
- AI輔助診斷的倫理框架與實施策略研究
- 三年級數學(上)計算題專項練習附答案集錦
- 辦公用品生產商的快速響應策略-以市場為中心的優化方式
- 企業轉型之基區塊鏈AI驅動的數據生態保障
- 以科技力量推進公共服務的公開與透明-以區塊鏈為例5年
- 租賃林地搞養殖合同協議
- 租房提早退房合同協議
- 私人車輛贈送合同協議
- 砂石原料供應合同協議
- 綠化帶改停車位施工方案
- 2023-2024學年浙江省環大羅山聯盟高一下學期4月期中物理試題(解析版)
- 護理人員崗位績效考核評價標準
- 2024年04月陜西西安職業技術學院招考聘用25人筆試筆試歷年典型考題及考點研判與答案解析
- 2023年浙江省湖州市中考語文真題
- 企業制度-制藥集團新藥研發項目立項管理辦法
- DL/T 5352-2018 高壓配電裝置設計規范
- 合作取得更大成功的辯論材料三篇
- 廣東省深圳市2023年五年級下學期期中模擬試卷(一)(含答案)
- AQ∕T 7009-2013 機械制造企業安全生產標準化規范
- 地產企業草莓熊主題商業地產活動嘉年華活動方案
評論
0/150
提交評論