找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2150|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

Error [1250]could not find space (2 bytes) for variable _SEC pic單片機編譯問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:769545 發(fā)表于 2022-6-30 23:43 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
我是新手,提問的帖不夠全面,現(xiàn)在完整發(fā)出來,請問一下高手

出錯提示如下:
Error   [1250] E:\thermometer\PIC\thermometer.c; 72. could not find space (2 bytes) for variable _SEC

unsigned int SEC;這樣定義編譯會通過,這樣的話比較的數(shù)是不是少于255;理論上是不會的。是不是我哪兒設(shè)置不對?

單片機源程序如下:
#include <pic.h>
//#include "thermometer.h"
unsigned char volatile ADCY_COUNT @ 0X25;
unsigned char volatile DIP0 @ 0X26;
unsigned char volatile DIP1 @ 0X27;
unsigned char volatile WEI @ 0X30;
unsigned char sbstatus @ 0x23;
bit volatile ADCY@((unsigned)&sbstatus*8+0;

unsigned char LED @ 0x21;
bit volatile LEDdp@((unsigned)&LED*8+0;
bit volatile LEDg@((unsigned)&LED*8+1;
bit volatile LEDf@((unsigned)&LED*8+2;
bit volatile LEDe@((unsigned)&LED*8+3;
bit volatile LEDd@((unsigned)&LED*8+4;
bit volatile LEDc@((unsigned)&LED*8+5;
bit volatile LEDb@((unsigned)&LED*8+6;
bit volatile LEDa@((unsigned)&LED*8+7;

#define XLEDa  RC0
#define XLEDb  RC1
#define XLEDc  RC5
#define XLEDd  RC4
#define XLEDe  RC3
#define XLEDf  RC2
#define XLEDg  RA5

//unsigned char volatile SEC; //雙字節(jié)
unsigned int SEC;
unsigned char  i;

void DisbytLED(void)
  {
                XLEDa=LEDa;
                XLEDb=LEDb;
             XLEDc=LEDc;
        XLEDd=LEDd;
        XLEDe=LEDe;
        XLEDf=LEDf;
        XLEDg=LEDg;
                //LEDdp=;
  }
void interrupt ISR(void)
{
  if(T0IE&&T0IF==1)
    {   T0IF=0;
     TMR0=TMR0+0X03;
     OPTION_REG=0X01;
     LED=0X00;
      DisbytLED();      
      if(WEI==0X00)
      {
         RA0=1;
         RA1=0;
         LED=DIP0;
         WEI=0X01;
      }
      else
      {
         RA1=1;
         RA0=0;
         LED=DIP1;
         WEI=0X00;
      }  

    DisbytLED();
    SEC=SEC+1;
    if(SEC==500)   
        ADCY=1;
    SEC=0;   
    }
  }


void cydelay()   //采樣時間延時程序
{
  for (i=255;i>0;i--)
    {
     asm("nop");
     asm("nop");
     asm("nop");
     asm("nop");
    }

}

void initial()    //初始化程序
{
  INTCON=0X00;
  TRISA=0X0C;
  ANSEL=0X04;
  //TRISB=0X00;
  TRISC=0X00;
//TRISD=0X00;
OPTION_REG=0X01;
  ADCON1=0X04;
  ADCON0=0X00;
  CMCON=0x07;
  INTCON=0XA0;
}
/*主程序*/
main()
{
WEI=0X00;
ADCY=0;
initial();//調(diào)用初始化端口程序


for(;;)
{
   asm("clrwdt");//清除看門狗
  // DIP0=0X11;
   //DIP1=0XFF;
    SEC=SEC+1;
   if(SEC>=500)
    ADCY=1;
}
}
// LLED=0XFF;
// LLED1=0;
  //LOLED=0XFF;


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:887371 發(fā)表于 2022-7-1 09:36 | 只看該作者
這代碼太多問題了。
1.不要大量使用volatile 絕對定位變量。
2.能用自動變量就不要用全局變量。
3.中斷服務(wù)中使用函數(shù)。
4.多處代碼邏輯混亂。
5.picc的特有語法使用錯誤。你這代碼功能我猜測是2位數(shù)碼管顯示,只需要標(biāo)準(zhǔn)C語言就能完成,完全不需要用到picc的特有語法。雖然你沒定義幾個變量,因語法出錯,編譯提示定義的變量超出了極限。

樓主應(yīng)要花幾天學(xué)習(xí)下C語言基礎(chǔ)。
回復(fù)

使用道具 舉報

板凳
ID:769545 發(fā)表于 2022-7-1 18:45 | 只看該作者
datouyuan 發(fā)表于 2022-7-1 09:36
這代碼太多問題了。
1.不要大量使用volatile 絕對定位變量。
2.能用自動變量就不要用全局變量。

中斷里面的程序是1ms刷新一次,顯示需要刷新,2位數(shù)碼管的程序是一樣的,不過可以調(diào)整;我奇怪的是:判別秒SEC大于500秒,意味著需要用2個字節(jié),理論上需要定義int,但是編譯會出錯,如果定義一個字節(jié)char就能正常編譯通過。我的意思是PICC的編譯器是不是不能直接比較大的數(shù)據(jù),如2個字節(jié)的數(shù)據(jù)。
回復(fù)

使用道具 舉報

地板
ID:329625 發(fā)表于 2022-7-1 19:26 | 只看該作者
先找到錯誤什么意思,然后去對應(yīng)的地方修改
回復(fù)

使用道具 舉報

5#
ID:887371 發(fā)表于 2022-7-2 09:25 | 只看該作者
hym8085hym 發(fā)表于 2022-7-1 18:45
中斷里面的程序是1ms刷新一次,顯示需要刷新,2位數(shù)碼管的程序是一樣的,不過可以調(diào)整;我奇怪的是:判別 ...

假設(shè)你的mcu共有40byte RAM。由于你代碼這么多問題,使得還沒定義SEC,RAM就用掉了39byte。
所以定義一個字節(jié)(char)就能正常編譯通過,定義l兩個字節(jié)(short)就不能編譯通過。
你按我提到的幾點要求稍微改下,就不會出現(xiàn)你奇怪的現(xiàn)象。

再強調(diào)下,編譯器一般不會有問題,該懷疑的是自己的代碼,自己解決相關(guān)問題的思路。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表