这是自己做的一个小程序,用到了STC12C5160S2这块单片机芯片做控制,实现ADXL345倾角传感器模块测量角度
单片机源程序如下:
/********************************************************************
* 文件名 :GY-29 ADXL345 测角度,角度值显示
* 创建人 :飞翔的猫
* 描述 : 该文件实现了用GY-29 ADXL345角度的采集,并在数码管上显示出来。
使用单片机STC89C51
*晶振 :11.0592M
*显示 :LCD1602
*编译环境 :Keil uVision4
****************************************/
#include #include #include #include #define uchar unsigned char #define uint unsigned int //这个一定要根据自己接的引脚来改,否则不出数据 sbit SCL=P2^0; //IIC时钟引脚定义 sbit SDA=P2^1; //IIC数据引脚定义 #define DataPort P0 //LCD1602数据端口 sbit LCM_RS=P2^4; //LCD1602命令端口 sbit LCM_RW=P2^5; //LCD1602命令端口 sbit LCM_EN=P2^7; //LCD1602命令端口 #define SlaveAddress 0xA6 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改 //ALT ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A typedef unsigned char BYTE; typedef unsigned short WORD; BYTE BUF[8]; //接收数据缓存区 uchar ge,shi,bai,qian,wan; //显示变量 int dis_data; //变量 int data_xyz[3]; void delay(unsigned int k); void InitLcd(); //初始化lcd1602 void Init_ADXL345(void); //初始化ADXL345 void WriteDataLCM(uchar dataW); void WriteCommandLCM(uchar CMD,uchar Attribc); void DisplayOneChar(uchar X,uchar Y,uchar DData); void conversion(uint temp_data); void Single_Write_ADXL345(uchar REG_Address,uchar REG_data); //单个写入数据 uchar Single_Read_ADXL345(uchar REG_Address); //单个读取内部寄存器数据 void Mutiple_Read_ADXL345(void); void clear(void); //连续的读取内部寄存器数据 //------------------------------------ void Delay5us(); void Delay5ms(); void ADXL345_Start(); void ADXL345_Stop(); void ADXL345_SendACK(bit ack); bit ADXL345_RecvACK(); void ADXL345_SendByte(BYTE dat); BYTE ADXL345_RecvByte(); void ADXL345_ReadPage(); void ADXL345_WritePage(); //----------------------------------- //********************************************************* void conversion(uint temp_data) { 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%100; //取余运算 shi=temp_data/10+0x30 ; temp_data=temp_data%10; //取余运算 ge=temp_data+0x30; } /*******************************/ void delay(unsigned int k) { unsigned int i,j; for(i=0;i for(j=0;j<121;j++) {;}} } /*******************************/ void WaitForEnable(void) { DataPort=0xff; LCM_RS=0;LCM_RW=1;_nop_(); LCM_EN=1;_nop_();_nop_(); while(DataPort&0x80); LCM_EN=0; } /*******************************/ 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; } /*******************************/ void WriteDataLCM(uchar dataW) { WaitForEnable(); LCM_RS=1;LCM_RW=0;_nop_(); DataPort=dataW;_nop_(); LCM_EN=1;_nop_();_nop_();LCM_EN=0; } /***********************************/ void InitLcd() //液晶显示器的设置 { WriteCommandLCM(0x38,1); WriteCommandLCM(0x08,1); WriteCommandLCM(0x01,1); WriteCommandLCM(0x06,1); WriteCommandLCM(0x0c,1); } /***********************************/ void DisplayOneChar(uchar X,uchar Y,uchar DData) { Y&=1; X&=15; if(Y)X|=0x40; X|=0x80; WriteCommandLCM(X,0); WriteDataLCM(DData); } /************************************** 延时5微秒(STC90C52RC@12M) 不同的工作环境,需要调整此函数,注意时钟过快时需要修改 当改用1T的MCU时,请调整此延时函数 **************************************/ void Delay5us() { _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); } /************************************** 延时5毫秒(STC90C52RC@12M) 不同的工作环境,需要调整此函数 当改用1T的MCU时,请调整此延时函数 **************************************/ void Delay5ms() { WORD n = 560; while (n--); } /************************************** 起始信号 **************************************/ void ADXL345_Start() { SDA = 1; //拉高数据线 SCL = 1; //拉高时钟线 Delay5us(); //延时 SDA = 0; //产生下降沿 Delay5us(); //延时 SCL = 0; //拉低时钟线 } /************************************** 停止信号 **************************************/ void ADXL345_Stop() { SDA = 0; //拉低数据线 SCL = 1; //拉高时钟线 Delay5us(); //延时 SDA = 1; //产生上升沿 Delay5us(); //延时 } /************************************** 发送应答信号 入口参数:ack (0:ACK 1:NAK)
上一篇:keil软件错误总结
下一篇:DHT11驱动程序
推荐阅读最新更新时间:2024-11-10 17:15
设计资源 培训 开发板 精华推荐
- 鸿蒙智能WIFI开关
- 使用 LT1054CN8 100mA 稳压负倍增器的典型应用
- MIC2544A-1YMM 可编程限流高边开关的典型应用
- DC851A-A,使用 LTC2299IUP DeMUX 双通道、80Msps、14 位 ADC 的演示板
- LTC3725,完整的 100W 高效率、低成本、最少部件数隔离式电信转换器
- 使用 Richtek Technology Corporation 的 RT7297A 的参考设计
- 190V DC 至 DC 单输出便携式电源
- #第七届立创电赛#USB电压电流表
- 使用 ON Semiconductor 的 LV5215LF 的参考设计
- 可充电无外壳款雕刻立牌嘉然向晚小夜灯