打印

求助keil警告,看不懂,弄了1下午了

[复制链接]
1535|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hceng|  楼主 | 2013-12-14 17:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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//////////////////////////////





相关帖子

沙发
hceng|  楼主 | 2013-12-14 18:06 | 只看该作者
问题解决了

使用特权

评论回复
板凳
dirtwillfly| | 2013-12-14 19:27 | 只看该作者
解决了就好,

使用特权

评论回复
地板
hceng|  楼主 | 2013-12-14 20:49 | 只看该作者
嗯,写程序真马虎不得,一点错误就玩完

使用特权

评论回复
5
dirtwillfly| | 2013-12-14 22:19 | 只看该作者
hceng 发表于 2013-12-14 20:49
嗯,写程序真马虎不得,一点错误就玩完

:lol是的

使用特权

评论回复
6
651927693| | 2013-12-15 01:02 | 只看该作者
其实我想说, 我没有看出什么问题呀。。。。

使用特权

评论回复
7
hdp7891000| | 2013-12-15 13:25 | 只看该作者
未声明以及未调用

使用特权

评论回复
8
651927693| | 2013-12-15 13:35 | 只看该作者
hdp7891000 发表于 2013-12-15 13:25
未声明以及未调用

*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?_PRINTSHORTINT?UART
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
    SYMBOL:  DISPLAY_X
    MODULE:  Main.obj (MAIN)
这个比较明显, 第一个没有调用还可以理解。但是确实有声明呀,下面不是有*.h文件吗?

使用特权

评论回复
9
通宵敲代码| | 2013-12-15 13:52 | 只看该作者
你这问题提的也忒长了吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

48

帖子

0

粉丝