本帖最后由 hceng 于 2013-12-14 17:24 编辑
keil警告
Build target 'Target 1'
compiling Main.c...
compiling UART.c...
linking...
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?_PRINTSHORTINT?UART
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
SYMBOL: DISPLAY_X
MODULE: Main.obj (MAIN)
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
SYMBOL: DISPLAY_Y
MODULE: Main.obj (MAIN)
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
SYMBOL: DISPLAY_Z
MODULE: Main.obj (MAIN)
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
SYMBOL: INIT_ADXL345
MODULE: Main.obj (MAIN)
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
SYMBOL: MULTIPLE_READ_ADXL345
MODULE: Main.obj (MAIN)
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
SYMBOL: _SINGLE_READ_ADXL345
MODULE: Main.obj (MAIN)
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
SYMBOL: _DELAY
MODULE: Main.obj (MAIN)
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL: _DELAY
MODULE: Main.obj (MAIN)
ADDRESS: 0141H
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL: INIT_ADXL345
MODULE: Main.obj (MAIN)
ADDRESS: 0147H
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL: _SINGLE_READ_ADXL345
MODULE: Main.obj (MAIN)
ADDRESS: 014CH
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL: MULTIPLE_READ_ADXL345
MODULE: Main.obj (MAIN)
ADDRESS: 0168H
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL: DISPLAY_X
MODULE: Main.obj (MAIN)
ADDRESS: 016BH
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL: DISPLAY_Y
MODULE: Main.obj (MAIN)
ADDRESS: 016EH
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL: DISPLAY_Z
MODULE: Main.obj (MAIN)
ADDRESS: 0171H
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
SYMBOL: _DELAY
MODULE: Main.obj (MAIN)
ADDRESS: 0178H
Program Size: data=18.0 xdata=0 code=514
"ADXL345_Test" - 0 Error(s), 16 Warning(s).
main文件
#include <REG51.H>
#include "MyType.h"
#include "ADXL345.h"
#include "UART.h"
#include "Config.h"
void main(void)
{
uchar8 ADXL345_ID;
Delay(500);//上电延时
Init_UART();
Init_ADXL345(); //初始化ADXL345
ADXL345_ID=Single_Read_ADXL345(0X00); //读出的数据为0XE5,表示正确
Prints("ADXL345的ID号是:");
PrintHex(ADXL345_ID);
Prints("\r\n");
while(1) //循环
{
Multiple_Read_ADXL345(); //连续读出数据,存储在BUF中
Display_X(); //---------显示X轴
Display_Y(); //---------显示Y轴
Display_Z(); //---------显示Z轴
Delay(200); //延时
}
}
adxl345.h文件
/********************************************************************
程序功能说明说明:
程 序 版 本 号:
开 发 日 期:
开 发 者 姓 名:
********************************************************************/
#include <REG51.H>
#include <INTRINS.H>
#include "ADXL345.h"
#include "MyType.h"
#include "UART.h"
#include "config.h"
uchar8 BUF[8];
int16 dis_data;
/********************************************************************
函数功能:
入口参数:
返 回:
备 注:
********************************************************************/
void Delay(uint16 k)
{
uint16 i,j;
for(i=0;i<k;i++)
for(j=0;j<121;j++);
}
/********************************************************************
延时5毫秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数
当改用1T的MCU时,请调整此延时函数
********************************************************************/
void Delay5ms(void)
{
uint16 n = 560;
while (n--);
}
/********************************************************************
函数功能: 延时5微秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数,注意时钟过快时需要修改
当改用1T的MCU时,请调整此延时函数
入口参数:
返 回:
备 注:
********************************************************************/
void Delay5us(void)
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
/********************************************************************
函数功能:IIC停止信号
入口参数:
返 回:
备 注:
********************************************************************/
void ADXL345_Stop(void)
{
SDA = 0; //拉低数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时
SDA = 1; //产生上升沿
Delay5us(); //延时
}
/********************************************************************
函数功能:IIC开始信号
入口参数:
返 回:
备 注:
********************************************************************/
void ADXL345_Start(void)
{
SDA = 1; //拉高数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时
SDA = 0; //产生下降沿
Delay5us(); //延时
SCL = 0; //拉低时钟线
}
/********************************************************************
函数功能:发送应答信号
入口参数:ack (0:ACK 1:NAK)
返 回:
备 注:
********************************************************************/
void ADXL345_SendACK(bit ack)
{
SDA = ack; //写应答信号
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
/********************************************************************
函数功能:接收应答信号
入口参数:
返 回:
备 注:
********************************************************************/
bit ADXL345_ReceiveACK(void)
{
SCL = 1; //拉高时钟线
Delay5us(); //延时
CY = SDA; //读应答信号
SCL = 0; //拉低时钟线,释放总线
Delay5us(); //延时
return CY;
}
/********************************************************************
函数功能:向IIC总线发送一个字节数据
入口参数:dat 要发送的数据
返 回:
备 注:
********************************************************************/
void ADXL345_SendByte(uchar8 dat)
{
uchar8 i;
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1; //移出数据的最高位
SDA = CY; //送数据口
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
ADXL345_ReceiveACK();
}
/********************************************************************
函数功能:从IIC总线接收一个字节数据
入口参数:
返 回:dat返回的数据
备 注:
********************************************************************/
uchar8 ADXL345_ReceiveByte(void)
{
uchar8 i;
uchar8 dat = 0;
SDA = 1; //使能内部上拉,准备读取数据,
for (i=0; i<8; i++) //8位计数器
{
dat<<= 1;
SCL = 1; //拉高时钟线
Delay5us(); //延时
dat|= SDA; //读数据
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
return dat;
}
/********************************************************************
函数功能:写ADXL345命令1字节
入口参数:REG_Address ADXL345寄存器地址,REG_Data 设置的数值
返 回:
备 注:
********************************************************************/
void Single_Write_ADXL345(uchar8 REG_Address,uchar8 REG_Data)
{
ADXL345_Start(); //起始信号
ADXL345_SendByte(WRITE_ADXL345); //发送设备地址+写信号
ADXL345_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf22页
ADXL345_SendByte(REG_data); //内部寄存器数据,请参考中文pdf22页
ADXL345_Stop(); //发送停止信号
}
/********************************************************************
函数功能:从ADXL345读取一字节数据
入口参数:REG_Address读取的地址
返 回:
备 注:
********************************************************************/
uchar8 Single_Read_ADXL345(uchar8 REG_Address)
{ uchar8 REG_data;
ADXL345_Start(); //起始信号
ADXL345_SendByte(WRITE_ADXL345); //发送写信号
ADXL345_SendByte(REG_Address); //发送存储单元地址,从0开始
ADXL345_Start(); //起始信号
ADXL345_SendByte(READ_ADXL345); //发送读信号
REG_data=ADXL345_ReceiveByte(); //读出寄存器数据
ADXL345_SendACK(1);//主机发送NAK使从机结束数据发送
ADXL345_Stop(); //停止信号
return REG_data;
}
/********************************************************************
函数功能:初始化ADXL345,根据需要请参考pdf进行修改
入口参数:
返 回:
备 注:
********************************************************************/
void Init_ADXL345(void)
{
Single_Write_ADXL345(0x31,0x0B); //测量范围,正负16g,13位模式
Single_Write_ADXL345(0x2C,0x08); //速率设定为12.5 参考pdf13页
Single_Write_ADXL345(0x2D,0x08); //选择电源模式 参考pdf24页
Single_Write_ADXL345(0x2E,0x80); //使能 DATA_READY 中断
Single_Write_ADXL345(0x1E,0x00); //X 偏移量 根据测试传感器的状态写入pdf29页
Single_Write_ADXL345(0x1F,0x00); //Y 偏移量 根据测试传感器的状态写入pdf29页
Single_Write_ADXL345(0x20,0x05); //Z 偏移量 根据测试传感器的状态写入pdf29页
}
/********************************************************************
函数功能:连续读出ADXL345内部加速度数据,地址范围0x32~0x37
入口参数:
返 回:
备 注:
********************************************************************/
void Multiple_read_ADXL345(void)
{ uchar8 i;
ADXL345_Start(); //起始信号
ADXL345_SendByte(WRITE_ADXL345); //发送设备地址+写信号
ADXL345_SendByte(0x32); //发送存储单元地址,从0x32开始
ADXL345_Start(); //起始信号
ADXL345_SendByte(READ_ADXL345); //发送设备地址+读信号
for (i=0; i<6; i++) //连续读取6个地址数据,存储中BUF
{
BUF = ADXL345_ReceiveByte(); //BUF[0]存储0x32地址中的数据
if (i == 5)
{
ADXL345_SendACK(1); //最后一个数据需要回NOACK
}
else
{
ADXL345_SendACK(0); //回应ACK
}
}
ADXL345_Stop(); //停止信号
Delay5ms();
}
/********************************************************************
函数功能:显示x轴
入口参数:
返 回:
备 注:
********************************************************************/
void Display_X(void)
{ signed float temp;
dis_data=(BUF[1]<<8)+BUF[0]; //合成数据
temp=(float)dis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页
Prints("X轴的数据是:");
PrintShortInt(temp);
Prints("\r\n");
}
/********************************************************************
函数功能:显示y轴
入口参数:
返 回:
备 注:
********************************************************************/
void Display_Y()
{ signed float temp;
dis_data=(BUF[3]<<8)+BUF[2]; //合成数据
temp=(float)dis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页
Prints("Y轴的数据是:");
PrintShortInt(temp);
Prints("\r\n");
}
/********************************************************************
函数功能:显示z轴
入口参数:
返 回:
备 注:
********************************************************************/
void Display_Z()
{
signed float temp;
dis_data=(BUF[5]<<8)+BUF[4]; //合成数据
temp=(float)dis_data*3.9; //计算数据和显示,查考ADXL345快速入门第4页
Prints("Z轴的数据是:");
PrintShortInt(temp);
Prints("\r\n");
}
adxl345.h
#ifndef __ADXL345_H__
#define __ADXL345_H__
#include "MyType.h"
#include <REG51.H>
sbit SCL=P0^4; //IIC时钟引脚定义
sbit SDA=P0^3; //IIC数据引脚定义
//#define ADDRESS_ADXl345 0x53 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
//ALT ADDRESS引脚接地时地址为0x53,接电源时地址为0x1D
#define WRITE_ADXL345 0xA6
#define READ_ADXL345 0xA7
void Init_ADXL345(void); //初始化ADXL345
void Single_Write_ADXL345(uchar8 REG_Address,uchar8 REG_data); //单个写入数据
uchar8 Single_Read_ADXL345(uchar8 REG_Address); //单个读取内部寄存器数据
void ADXL345_SendByte(uchar8 dat);
uchar8 ADXL345_ReceiveByte(void);
void ADXL345_Start(void);
void ADXL345_Stop(void);
void ADXL345_SendACK(bit ack);
bit ADXL345_ReceiveACK(void);
void Multiple_Read_ADXL345(void); //连续的读取内部寄存器数据
void Display_X(void);//---------显示X轴
void Display_Y(void);//---------显示X轴
void Display_Z(void);//---------显示X轴
void Delay(uint16 k);
void Delay5us(void);
void Delay5ms(void);
#endif
uarc.c
#include <REG51.H>
#include "UART.h"
#include "MyType.h"
#include "config.h"
volatile uchar8 Sending;
/********************************************************************
函数功能:串口初始化。
入口参数:无。
返 回:无。
备 注:无。
********************************************************************/
void Init_UART(void)
{
EA=0; //暂时关闭中断
TMOD&=0x0F; //定时器1模式控制在高4位
TMOD|=0x20; //定时器1工作在模式2,自动重装模式
SCON=0x50; //串口工作在模式1
TH1=256-Fclk/(BitRate*12*16); //计算定时器重装值
TL1=256-Fclk/(BitRate*12*16);
PCON|=0x80; //串口波特率加倍
ES=1; //串行中断允许
TR1=1; //启动定时器1
REN=1; //允许接收
EA=1; //允许中断
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函数功能:串口中断处理。
入口参数:无。
返 回:无。
备 注:无。
********************************************************************/
void UartISR(void) interrupt 4
{
if(RI) //收到数据
{
RI=0; //清中断请求
}
else //发送完一字节数据
{
TI=0;
Sending=0; //清正在发送标志
}
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函数功能:往串口发送一字节数据。
入口参数:d: 要发送的字节数据。
返 回:无。
备 注:无。
********************************************************************/
void UartPutChar(uchar8 d)
{
SBUF=d; //将数据写入到串口缓冲
Sending=1; //设置发送标志
while(Sending); //等待发送完毕
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函数功能:发送一个字符串。
入口参数:pd:要发送的字符串指针。
返 回:无。
备 注:无。
********************************************************************/
void Prints(uchar8 * pd)
{
while((*pd)!='\0') //发送字符串,直到遇到0才结束
{
UartPutChar(*pd); //发送一个字符
pd++; //移动到下一个字符
}
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函数功能:将整数转按十进制字符串发送。
入口参数:x:待显示的整数。
返 回:无。
备 注:无。
********************************************************************/
void PrintShortInt(int16 x)
{
uchar8 i;
uchar8 display_buffer[5];
if(x<0)
{
Printc('-');
x=-x;
}
else Printc(' ');
for(i=4;i>=0;i--)
{
display_buffer='0'+x%10;//取x的个位赋值在display_buffer[9]
x/=10;
}
for(i=0;i<4;i++)//从x的高位检测非0位开始显示
{
if(display_buffer!='0')break;//检测到非0位跳出循环
}
for(;i<5;i++)UartPutChar(display_buffer);
}
////////////////////////End of function//////////////////////////////
code uchar8 HexTable[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
/********************************************************************
函数功能:发送一个byte的数据。
入口参数:待发送的数据。
返 回:无。
备 注:无。
********************************************************************/
void Printc(uchar8 x)
{
Sending=1;
SBUF=x;
while(Sending);
}
////////////////////////End of function//////////////////////////////
/********************************************************************
函数功能:以HEX格式发送一个byte的数据。
入口参数:待发送的数据
返 回:无。
备 注:无。
********************************************************************/
void PrintHex(uchar8 x)
{
Printc('0');
Printc('x');
Printc(HexTable[x>>4]);//16进制先显示高4位
Printc(HexTable[x&0xf]);//显示低4位高4位清0
Printc(' ');
}
////////////////////////End of function//////////////////////////////
|