6050 STC89C52 單片機LCD調試程序.doc_第1頁
6050 STC89C52 單片機LCD調試程序.doc_第2頁
6050 STC89C52 單片機LCD調試程序.doc_第3頁
6050 STC89C52 單片機LCD調試程序.doc_第4頁
6050 STC89C52 單片機LCD調試程序.doc_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

/*MPU6050?IIC測試程序?使用單片機STC89C52晶振:11.0592M顯示:LCD1602功能:?顯示加速度計和陀螺儀的10位原始數(shù)據(jù)*/#include#include#include/Keil library #include /Keil library #include typedef unsigned char uchar;typedef unsigned short ushort;typedef unsigned int uint; /*?定義51單片機端口?*/#define DataPort P0 /LCD1602數(shù)據(jù)端口sbit SCL=P10; /IIC時鐘引腳定義sbit SDA=P11; /IIC數(shù)據(jù)引腳定義sbit LCM_RS=P24; /LCD1602命令端口sbit LCM_RW=P25; /LCD1602命令端口sbit LCM_EN=P26; /LCD1602命令端口 /* 定義MPU6050內(nèi)部地址?*/#define SMPLRT_DIV 0x19 /陀螺儀采樣率,典型值:0x07(125Hz)?#define CONFIG 0x1A /低通濾波頻率,典型值:0x06(5Hz)?#define GYRO_CONFIG 0x1B /陀螺儀自檢及測量范圍, /典型值:0x18(不自檢,2000deg/s)?#define ACCEL_CONFIG 0x1C /加速計自檢、測量范圍及高通濾波頻率 /典型值:0x01(不自檢,2G,5Hz)?#define ACCEL_XOUT_H 0x3B #define ACCEL_XOUT_L 0x3C#define ACCEL_YOUT_H 0x3D#define ACCEL_YOUT_L 0x3E#define ACCEL_ZOUT_H 0x3F#define ACCEL_ZOUT_L 0x40#define TEMP_OUT_H 0x41#define TEMP_OUT_L 0x42#define GYRO_XOUT_H 0x43#define GYRO_XOUT_L 0x44#define GYRO_YOUT_H 0x45#define GYRO_YOUT_L 0x46#define GYRO_ZOUT_H 0x47#define GYRO_ZOUT_L 0x48#define PWR_MGMT_1 0x6B /電源,典型值:0x00(正常啟用)#define WHO_AM_I 0x75 /IIC地址寄存器(默認數(shù)值0x68,只讀)?#define SlaveAddress 0xD0 /IIC寫入時的地址字節(jié)數(shù)據(jù),+1為讀取?/*?/定義類型及變量?/*?uchar dis4;/顯示數(shù)字(-511至512)的字符數(shù)組int dis_data;/變量/int?Temperature,Temp_h,Temp_l;?/溫度及高低位數(shù)據(jù)?/*?/函數(shù)聲明?/*?void delay(unsigned int k);/延時LCD相關函數(shù)?void InitLcd(); /初始化lcd1602?void lcd_printf(uchar *s,int temp_data);void WriteDataLCM(uchar dataW); /LCD數(shù)據(jù)?void WriteCommandLCM(uchar CMD,uchar Attribc); /LCD指令?void DisplayOneChar(uchar X,uchar Y,uchar DData); /顯示一個字符?void DisplayListChar(uchar X,uchar Y,uchar *DData,L); /顯示字符串MPU6050操作函數(shù)void InitMPU6050(); /初始化MPU6050?void Delay5us();void I2C_Start();void I2C_Stop();void I2C_SendACK(bit ack); bit I2C_RecvACK();void I2C_SendByte(uchar dat);uchar I2C_RecvByte();void I2C_ReadPage();void I2C_WritePage();void display_ACCEL_x();void display_ACCEL_y();void display_ACCEL_z();uchar Single_ReadI2C(uchar REG_Address); /讀取I2C數(shù)據(jù)?void Single_WriteI2C(uchar REG_Address,uchar REG_data); /向I2C寫入數(shù)據(jù)?/*?/整數(shù)轉字符串?/*?void lcd_printf(uchar *s,int temp_data) if(temp_data0) temp_data=-temp_data; *s=-; else *s=?; *+s=temp_data/100+0x30; temp_data=temp_data%100;/取余運算*+s=temp_data/10+0x30;temp_data=temp_data%10;/取余運算*+s=temp_data+0x30;/*/ 延時/*void delay(unsigned int k)unsigned int i,j;for(i=0;ik;i+)for(j=0;j121;j+);/*/LCD1602初始化/*void InitLcd()WriteCommandLCM(0x38,1); WriteCommandLCM(0x08,1); WriteCommandLCM(0x01,1); WriteCommandLCM(0x06,1); WriteCommandLCM(0x0c,1); DisplayOneChar(0,0,A); DisplayOneChar(0,1,G);/*/LCD1602寫允許/*void WaitForEnable(void)DataPort=0xff;LCM_RS=0;LCM_RW=1;_nop_();LCM_EN=1;_nop_();_nop_();while(DataPort&0x80);LCM_EN=0;/*/LCD1602寫入命令/*?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;/*/LCD1602寫入數(shù)據(jù)? /*void WriteDataLCM(uchar dataW)WaitForEnable();LCM_RS=1;LCM_RW=0;_nop_();DataPort=dataW;_nop_();LCM_EN=1;_nop_();_nop_();LCM_EN=0;/*/LCD1602寫入一個字符?/*void DisplayOneChar(uchar X,uchar Y,uchar DData)Y&=1;X&=15;if(Y)X|=0x40;X|=0x80;WriteCommandLCM(X,0);WriteDataLCM(DData);/*/LCD1602顯示字符串?/*void DisplayListChar(uchar X,uchar Y,uchar *DData,L)uchar ListLength=0; Y&=0x1; X&=0xF; while(L-) DisplayOneChar(X,Y,DDataListLength);ListLength+;X+; /*/延時5微秒(STC90C52RC12M)/不同的工作環(huán)境,需要調整此函數(shù)/當改用1T的MCU時,請調整此延時函數(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_(); /*?/I2C起始信號?/*?void I2C_Start()SDA=1; /拉高數(shù)據(jù)線SCL=1; /拉高時鐘線Delay5us(); /延時SDA=0; /產(chǎn)生下降沿Delay5us(); /延時SCL=0; /拉低時鐘線/*/I2C停止信號/*void I2C_Stop()SDA=0; /拉低數(shù)據(jù)線SCL=1; /拉高時鐘線Delay5us();/延時SDA=1; /產(chǎn)生上升沿Delay5us(); /延時/*/I2C發(fā)送應答信號/入口參數(shù):/ack(0:ACK 1:NAK)/*void I2C_SendACK(bit ack)SDA=ack; /寫應答信號SCL=1; /拉高時鐘線 Delay5us(); /延時SCL=0; /拉低時鐘線Delay5us(); /延時/*?/I2C接收應答信號?/*?bit I2C_RecvACK()SCL=1;/拉高時鐘線Delay5us(); /延時CY=SDA; /讀應答信號SCL=0; /拉低時鐘線Delay5us(); /延時return CY;/*?/向I2C總線發(fā)送一個字節(jié)數(shù)據(jù)?/*?void I2C_SendByte(uchar dat) uchar i; for(i=0;i8;i+) /8位計數(shù)器 dat=1; /移出數(shù)據(jù)的最高位 SDA=CY; /送數(shù)據(jù)口 SCL=1; /拉高時鐘線 Delay5us(); /延時 SCL=0; /拉低時鐘線 Delay5us(); /延時 I2C_RecvACK();/*?/從I2C總線接收一個字節(jié)數(shù)據(jù)?/*?uchar I2C_RecvByte()uchar i;uchar dat=0;SDA=1; /使能內(nèi)部上拉,準備讀取數(shù)據(jù), for(i=0;i8;i+)/8位計數(shù)器 dat=1; SCL=1; /拉高時鐘線 Delay5us();/延時 dat|=SDA; /讀數(shù)據(jù) SCL=0; /拉低時鐘線 Delay5us(); /延時 return dat;/*?/向I2C設備寫入一個字節(jié)數(shù)據(jù)?/*?void Single_WriteI2C(uchar REG_Address,uchar REG_data)I2C_Start(); /起始信號I2C_SendByte(SlaveAddress); /發(fā)送設備地址+寫信號I2C_SendByte(REG_Address); /內(nèi)部寄存器地址,I2C_SendByte(REG_data); /內(nèi)部寄存器數(shù)據(jù),I2C_Stop(); /發(fā)送停止信號/*?/從I2C設備讀取一個字節(jié)數(shù)據(jù)?/*?uchar Single_ReadI2C(uchar REG_Address)uchar REG_data;I2C_Start();/起始信號?I2C_SendByte(SlaveAddress); /發(fā)送設備地址+寫信號?I2C_SendByte(REG_Address); /發(fā)送存儲單元地址,從0開始?I2C_Start(); /起始信號?I2C_SendByte(SlaveAddress+1); /發(fā)送設備地址+讀信號REG_data=I2C_RecvByte(); /讀出寄存器數(shù)據(jù)?I2C_SendACK(1); /接收應答信號I2C_Stop(); /停止信號return REG_data;/*?/初始化MPU6050?/*?void InitMPU6050()Single_WriteI2C(PWR_MGMT_1,0x00); /解除休眠狀態(tài)Single_WriteI2C(SMPLRT_DIV,0x07);Single_WriteI2C(CONFIG,0x06);Single_WriteI2C(GYRO_CONFIG,0x18);Single_WriteI2C(ACCEL_CONFIG,0x01);/*?/合成數(shù)據(jù)?/*?int GetData(uchar REG_Address)char H,L;H=Single_ReadI2C(REG_Address);L=Single_ReadI2C(REG_Address+1);return (H8)+L; /合成數(shù)據(jù)/*?/在1602上顯示10位數(shù)據(jù)?/*?void Display10BitData(int value,uchar x,uchar y)value/=64;/轉換為10位數(shù)據(jù)lcd_printf(dis, value);/轉換數(shù)據(jù)顯示DisplayListChar(x,y,dis,4);/啟始列,行,顯示數(shù)組,顯示長度void main()delay(500); /上電延時InitLcd(); /液晶初始化InitMPU6050(); /初始化MPU6050 delay(150);while(1)Display10BitData(GetData(ACCEL_XOUT_H

溫馨提示

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

評論

0/150

提交評論