STC89C52_HMC5983自測(cè)后工作程序.doc_第1頁(yè)
STC89C52_HMC5983自測(cè)后工作程序.doc_第2頁(yè)
STC89C52_HMC5983自測(cè)后工作程序.doc_第3頁(yè)
STC89C52_HMC5983自測(cè)后工作程序.doc_第4頁(yè)
STC89C52_HMC5983自測(cè)后工作程序.doc_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

/*/ HMC5883 IIC測(cè)試程序/ 使用單片機(jī)STC89C51 / 晶振:11.0592M/ 顯示:串口/ 編譯環(huán)境 Keil uVision5/2015/7/26/*#include #include #include #include #define uchar unsigned char#define uint unsigned int/*IIC定義*/sbitSCL=P12; /IIC時(shí)鐘引腳定義sbitSDA=P13; /IIC數(shù)據(jù)引腳定義typedef unsigned short WORD;/*IIC定義*/*磁力計(jì)定義*/#define SlaveAddress0x3C /定義器件在IIC總線中的從地址(0x3c是寫(xiě)入的地址。7bit地址是0x1E)/*磁力計(jì)定義*/*串口定義*/unsigned char Bufer=hello n;typedef unsigned char BYTE;BYTE BUF6; /接收數(shù)據(jù)緩存區(qū) uchar ge,shi,bai,qian,wan; /顯示變量/*串口定義*/*函數(shù)聲明*/延時(shí)void delay(unsigned int k);/串口void UART_init(void);void UART_send_byte(unsigned char dat);void UART_send_string(unsigned char *bufer);/轉(zhuǎn)換void conversion(uint temp_data);/磁力計(jì)void Init_HMC5883(void); /初始化5883/IICvoid Single_Write_HMC5883(uchar REG_Address,uchar REG_data); /單個(gè)寫(xiě)入數(shù)據(jù)uchar Single_Read_HMC5883(uchar REG_Address); /單個(gè)讀取內(nèi)部寄存器數(shù)據(jù)void Multiple_Read_HMC5883(); /連續(xù)的讀取內(nèi)部寄存器數(shù)據(jù)void Delay5us();void Delay5ms();void HMC5883_Start();void HMC5883_Stop();void HMC5883_SendACK(bit ack);bit HMC5883_RecvACK();void HMC5883_SendByte(BYTE dat);BYTE HMC5883_RecvByte();void HMC5883_ReadPage();void HMC5883_WritePage();/*函數(shù)聲明*/*函數(shù)定義*/UART初始化 波特率:9600void UART_init(void)SCON = 0x50; / 10位uart,允許串行接受 TMOD = 0x20; / 定時(shí)器1工作在方式2(自動(dòng)重裝) TH1 = 0xFD; TL1 = 0xFD; TR1 = 1;/UART 發(fā)送一字節(jié)void UART_send_byte(unsigned char dat)SBUF = dat;while (TI = 0);TI = 0;/UART 發(fā)送字符串void UART_send_string(unsigned char *bufer)while (*bufer != 0)UART_send_byte(*bufer+);/延時(shí)函數(shù) void delay(unsigned int k)unsigned int i,j;for(i=0;ik;i+)for(j=0;j121;j+);/轉(zhuǎn)換函數(shù)void conversion(uint temp_data) wan=temp_data/10000+0x30 ; temp_data=temp_data%10000; /取余運(yùn)算qian=temp_data/1000+0x30 ; temp_data=temp_data%1000; /取余運(yùn)算 bai=temp_data/100+0x30 ; temp_data=temp_data%100; /取余運(yùn)算 shi=temp_data/10+0x30 ; temp_data=temp_data%10; /取余運(yùn)算 ge=temp_data+0x30; /自測(cè)HMC5883 void Init_HMC5883() Single_Write_HMC5883(0x00,0x71);/Write CRA (00) send 0x3C 0x00 0x70 (8-average, 15 Hz default, normal measurement) Single_Write_HMC5883(0x01,0xA0);/Write CRB (01) send 0x3C 0x01 0xA0 (Gain=5, or any other desired gain) Single_Write_HMC5883(0x02,0x01);/Write Mode(02) send 0x3C 0x02 0x00 (Continuous-measurement mode)/離開(kāi)自測(cè)HMC5883 void leave_HMC5883() Single_Write_HMC5883(0x00,0xF0);/Write CRA (00) send 0x3C 0x00 0x70 (8-average, 15 Hz default, normal measurement) Single_Write_HMC5883(0x01,0xA0);/Write CRB (01) send 0x3C 0x01 0xA0 (Gain=5, or any other desired gain) Single_Write_HMC5883(0x02,0x00);/Write Mode(02) send 0x3C 0x02 0x00 (Continuous-measurement mode)/*延時(shí)5微秒(STC90C52RC12M)不同的工作環(huán)境,需要調(diào)整此函數(shù),注意時(shí)鐘過(guò)快時(shí)需要修改當(dāng)改用1T的MCU時(shí),請(qǐng)調(diào)整此延時(shí)函數(shù)*/void Delay5us()_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();/* 延時(shí)5毫秒(STC90C52RC12M)不同的工作環(huán)境,需要調(diào)整此函數(shù)當(dāng)改用1T的MCU時(shí),請(qǐng)調(diào)整此延時(shí)函數(shù)*/void Delay5ms() WORD n = 560; while (n-);/ 起始信號(hào)void HMC5883_Start() SDA = 1; /拉高數(shù)據(jù)線 SCL = 1; /拉高時(shí)鐘線 Delay5us(); /延時(shí) SDA = 0; /產(chǎn)生下降沿 Delay5us(); /延時(shí) SCL = 0; /拉低時(shí)鐘線/停止信號(hào)void HMC5883_Stop() SDA = 0; /拉低數(shù)據(jù)線 SCL = 1; /拉高時(shí)鐘線 Delay5us(); /延時(shí) SDA = 1; /產(chǎn)生上升沿 Delay5us(); /延時(shí)/發(fā)送應(yīng)答信號(hào) 入口參數(shù):ack (0:ACK 1:NAK)void HMC5883_SendACK(bit ack) SDA = ack; /寫(xiě)應(yīng)答信號(hào) SCL = 1; /拉高時(shí)鐘線 Delay5us(); /延時(shí) SCL = 0; /拉低時(shí)鐘線 Delay5us(); /延時(shí)/接收應(yīng)答信號(hào)bit HMC5883_RecvACK() SCL = 1; /拉高時(shí)鐘線 Delay5us(); /延時(shí) CY = SDA; /讀應(yīng)答信號(hào) SCL = 0; /拉低時(shí)鐘線 Delay5us(); /延時(shí) return CY;/向IIC總線發(fā)送一個(gè)字節(jié)數(shù)據(jù)void HMC5883_SendByte(BYTE dat) BYTE i; for (i=0; i8; i+) /8位計(jì)數(shù)器 dat = 1; /移出數(shù)據(jù)的最高位 SDA = CY; /送數(shù)據(jù)口 SCL = 1; /拉高時(shí)鐘線 Delay5us(); /延時(shí) SCL = 0; /拉低時(shí)鐘線 Delay5us(); /延時(shí) HMC5883_RecvACK();/從IIC總線接收一個(gè)字節(jié)數(shù)據(jù)BYTE HMC5883_RecvByte() BYTE i; BYTE dat = 0; SDA = 1; /使能內(nèi)部上拉,準(zhǔn)備讀取數(shù)據(jù), for (i=0; i8; i+) /8位計(jì)數(shù)器 dat = 1; SCL = 1; /拉高時(shí)鐘線 Delay5us(); /延時(shí) dat |= SDA; /讀數(shù)據(jù) SCL = 0; /拉低時(shí)鐘線 Delay5us(); /延時(shí) return dat;/單字節(jié)寫(xiě)入內(nèi)部寄存器 void Single_Write_HMC5883(uchar REG_Address,uchar REG_data) HMC5883_Start(); /起始信號(hào) HMC5883_SendByte(SlaveAddress); /發(fā)送設(shè)備地址+寫(xiě)信號(hào) HMC5883_SendByte(REG_Address); /內(nèi)部寄存器地址,請(qǐng)參考中文pdf HMC5883_SendByte(REG_data); /內(nèi)部寄存器數(shù)據(jù),請(qǐng)參考中文pdf HMC5883_Stop(); /發(fā)送停止信號(hào)/單字節(jié)讀取內(nèi)部寄存器uchar Single_Read_HMC5883(uchar REG_Address) uchar REG_data; HMC5883_Start(); /起始信號(hào) HMC5883_SendByte(SlaveAddress); /發(fā)送設(shè)備地址+寫(xiě)信號(hào) HMC5883_SendByte(REG_Address); /發(fā)送存儲(chǔ)單元地址,從0開(kāi)始 HMC5883_Start(); /起始信號(hào) HMC5883_SendByte(SlaveAddress+1); /發(fā)送設(shè)備地址+讀信號(hào) REG_data=HMC5883_RecvByte(); /讀出寄存器數(shù)據(jù)HMC5883_SendACK(1); HMC5883_Stop(); /停止信號(hào) return REG_data; /連續(xù)讀出HMC5883內(nèi)部角度數(shù)據(jù)void Multiple_read_HMC5883(void) uchar i; HMC5883_Start(); /起始信號(hào) HMC5883_SendByte(SlaveAddress); /發(fā)送設(shè)備地址+寫(xiě)信號(hào) HMC5883_SendByte(0x03); /發(fā)送存儲(chǔ)單元地址,從0x3開(kāi)始 HMC5883_Start(); /起始信號(hào) HMC5883_SendByte(SlaveAddress+1); /發(fā)送設(shè)備地址+讀信號(hào) for (i=0; i6; i+) /連續(xù)讀取6個(gè)地址數(shù)據(jù),存儲(chǔ)中BUF BUFi = HMC5883_RecvByte(); /BUF0存儲(chǔ)數(shù)據(jù) if (i = 5) HMC5883_SendACK(1); /最后一個(gè)數(shù)據(jù)需要回NOACK else HMC5883_SendACK(0); /回應(yīng)ACK HMC5883_Stop(); /停止信號(hào) Delay5ms();/*主程序*/void main() unsigned int i;int x,y,z;double angle;delay(500);UART_init();Init_HMC5883();delay(600);BUF0 = Single_Read_HMC5883(0x03);BUF1 = Single_Read_HMC5883(0x04);BUF2 = Single_Read_HMC5883(0x05);BUF3 = Single_Read_HMC5883(0x06);BUF4 = Single_Read_HMC5883(0x07);BUF5 = Single_Read_HMC5883(0x08);x=BUF0 8 | BUF1; /Combine MSB and LSB of X Data output registerz=BUF2 8 | BUF3; /Combine MSB and LSB of Z Data output registery=BUF4 8 | BUF5; /Combine MSB and LSB of Y Data output registerangle= atan2(double)y,(double)x) * (180 / 3.14159265) + 180; / angle in degreesangle*=10;conversion(angle); /計(jì)算數(shù)據(jù)和顯示Bufer0=(qian=,qian); Bufer1=(bai=,bai); Bufer2=(shi=,shi); Bufer3=(.); Bufer4=(ge=,ge); Bufer5=(,); UART_send_string(Bufer);for (i=0;i10000;i+); /延時(shí) UART_send_string(Bufer);for (i=0;i10000;i+); /延時(shí) UART_send_string(Bufer);for (i=0;i10000;i+); /延時(shí) UART_send_str

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論