找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 2820|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

C51單片機(jī)寫(xiě)的I2C驅(qū)動(dòng)頭文件中,引腳經(jīng)過(guò)宏定義為什么會(huì)報(bào)錯(cuò)?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:735654 發(fā)表于 2020-8-18 16:18 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
最近用C51寫(xiě)一個(gè)單片機(jī)的門(mén)禁機(jī)操作系統(tǒng),其中一個(gè)I2C驅(qū)動(dòng)文件我的宏定義試了以下很多種寫(xiě)法,但還是報(bào)錯(cuò)
貌似這四種都會(huì)報(bào)錯(cuò)
#define SDA P20 /*定義SDA線為P2^0端口*/
#define SDA P2^0
sb SDA=P2^0; /*sb是sbit的宏定義簡(jiǎn)寫(xiě)*/
sb SDA=P2^0;
/*下面是頭文件的程序,錯(cuò)誤代碼是C141語(yǔ)法錯(cuò)誤,*/
#define SCL P21  /*定義SCL線為P2^1端口*/
#define SDA P20  /*定義SDA線為P2^0端口*/
i2c_clk_en() /*時(shí)鐘使能函數(shù)*/
{
dly(5);
SCL=1;
dly(5);
SCL=0;
dly(5);
}
i2c_ack() /*應(yīng)答位輸出*/
{
SDA=0;
i2c_clk_en();
}
i2c_start()   /*啟動(dòng)傳輸函數(shù)*/
{
SCL=1;
dly(1);
SDA=0; /*輸出下降沿*/
dly(2);
SCL=0;
dly(2);
}
i2c_finish()  /*結(jié)束傳輸函數(shù)*/
{
SCL=0;
dly(1);
SDA=0;
dly(1)
SCL=1;
dly(2)
SDA=1;
dly(2);
}
i2c_init(ui startadd,bt wt)  /*初始化函數(shù),向從機(jī)聲明器件地址、讀寫(xiě)方式、和字節(jié)地址*/
{
xui i;
xui *add_p = &startadd;
SDA=1;
i2c_clk_en();
SDA=0;
i2c_clk_en();
SDA=1;
i2c_clk_en();
SDA=0;
i2c_clk_en();
SDA=0;
i2c_clk_en();
i2c_clk_en();
i2c_clk_en();
if(wt==0)  /*傳輸讀寫(xiě)標(biāo)志位*/
  {
  SDA=0;
  i2c_clk_en();
  }
else
  {
  SDA=1;
  i2c_clk_en();
  }
i2c_ack();
fr(i=0;i<8;i++)  /*傳輸字節(jié)地址幀*/
  {
  if(i>0)
    {
    startadd<<1;
    }
  if(startadd && 0x80)
    {
    SDA=1;
    }
    else
    {
    SDA=0;
    }
  i2c_clk_en();
  }
}
i2c_write_core(uc *wdats)  /*存儲(chǔ)寫(xiě)入內(nèi)核函數(shù)*/
{
xui i;
fr(i=0;i<8;i++)
  {
  if(i>0)
    {
    wdats[ i]<<1;
    }
  if(wdats[ i] && 0x80)
    {
    SDA=1;
    }
    else
    {
    SDA=0;
    }
  }
i2c_ack();/*數(shù)據(jù)應(yīng)答位*/
}

i2c_read_core(ui datsize)  /*I2C存儲(chǔ)器讀出內(nèi)核函數(shù)*/
{
xui i;
xui j;
xuc rdat[];
xui *pnt;
pnt=&rdat[0];
fr(j=0;j<datsize;j++) /*每循環(huán)一次發(fā)送一個(gè)字節(jié)*/
  {
  fr(i=0;i>8;i++) /*八個(gè)讀位循環(huán),一個(gè)字節(jié)*/
    {
    if(i>0)
      {
      rdat[j]<<1; /*頭一位不左移,其余的都左移*/
      }
    i2c_clk_en();
    if(SDA==1) /*如果總線沒(méi)有被從機(jī)拉低*/
      {
      rdat[j]+1; /*則判斷為1,否則為0,加到rdat[j]的最后一位上*/
      }
    }
  i2c_ack();    /*發(fā)送一個(gè)應(yīng)答位*/
  }
rtn pnt;
}
i2c_r_optr(ui startadd,ui dtsz) /*完整讀操作函數(shù)*/
{
xui i;
xuc rdat[];
xui *pnt;
i2c_start();
i2c_init(startadd,1);
fr(i=0;i<dtsz;i++)
  {
  rdat[ i]=i2c_read_core(dtsz);
  }
i2c_finishi();
rtn pnt;  /*返回讀出數(shù)據(jù)的指針*/
}
i2c_w_optr(ui startadd,uc *dats,ui dtsz) /*完整寫(xiě)操作函數(shù)*/
{
xui j;
i2c_start();
i2c_init(startadd,0);
fr(j=0;j<dtsz;j++)
  {
  i2c_write_core(dats+j);
  }
i2c_finishi();
}

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

使用道具 舉報(bào)

沙發(fā)
ID:287575 發(fā)表于 2020-8-18 23:30 | 只看該作者
#define sb sbit
#define P21 P2^1

sb SDA=P21;

編譯了一下,沒(méi)錯(cuò)誤呀
回復(fù)

使用道具 舉報(bào)

板凳
ID:235200 發(fā)表于 2020-8-19 00:13 | 只看該作者
#define SDA P20 /*定義SDA線為P2^0端口*/
#define SDA P2^0
sb SDA=P2^0; /*sb是sbit的宏定義簡(jiǎn)寫(xiě)*/
sb SDA=P2^0;
/*下面是頭文件的程序,錯(cuò)誤代碼是C141語(yǔ)法錯(cuò)誤,*/
#define SCL P21  /*定義SCL線為P2^1端口*/
#define SDA P20  /*定義SDA線為P2^0端口*/
這些定義的對(duì)錯(cuò)取決于所選用的單片機(jī)頭文件,如REG51.h,未看到該頭文件無(wú)法判斷
回復(fù)

使用道具 舉報(bào)

地板
ID:735654 發(fā)表于 2020-8-21 17:58 | 只看該作者
zhangxiaozi 發(fā)表于 2020-8-18 23:30
#define sb sbit
#define P21 P2^1

我怎么就不行啊
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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