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

QQ登錄

只需一步,快速開始

搜索
查看: 3561|回復(fù): 15
收起左側(cè)

程序編譯有一些問(wèn)題大神能幫忙看看么error C301: identifier expected

[復(fù)制鏈接]
ID:1080551 發(fā)表于 2023-5-30 18:04 | 顯示全部樓層 |閱讀模式
compiling 溫度.c...
溫度.c(80): warning C317: attempt to redefine macro 'ADC_CONTR'
溫度.c(81): error C301: identifier expected
溫度.c(81): error C304: bad macro parameter list
溫度.c - 2 Error(s), 1 Warning(s).  有出現(xiàn)這個(gè)問(wèn)題了

單片機(jī)源程序如下:
  1. #include <REG51.H>




  2. #define TXD_Pin P3_1       //定義TXD引腳為P3.1
  3. #define BAUDRATE 9600      //定義波特率
  4. #define FREQ_OSC 11059200  //定義外部晶振頻率
  5. #define TH 40              //定義溫度閾值


  6. void send_data(unsigned char dat);
  7. void send_string(unsigned char *s);
  8. void init_uart();
  9. void init_adc();
  10. int get_adc_value();
  11. void delay(int time);
  12. void display_temp(int temp);


  13. void main()
  14. {
  15.     unsigned int adc_val = 0;
  16.     int temp = 0;


  17.     init_uart();   //初始化串口
  18.     init_adc();    //初始化ADC


  19.     while(1)
  20.     {
  21.         adc_val = get_adc_value();   //讀取ADC值
  22.         temp = (int)(adc_val / 2);   //將ADC值轉(zhuǎn)換為溫度(假設(shè)為50mV/℃)


  23.         if(temp >= TH)   //如果溫度超過(guò)閾值,則LED閃爍
  24.         {
  25.             display_temp(temp);
  26.             delay(500);
  27.         }
  28.         else   //否則,LED顯示當(dāng)前溫度
  29.         {
  30.             display_temp(temp);
  31.         }
  32.     }
  33. }


  34. void init_uart()
  35. {
  36.     //計(jì)算波特率預(yù)分頻器的值
  37.     unsigned char SCON_value = 0x50;       //定義串口控制寄存器的初始值
  38.     unsigned int Baud_value = 0x10000 - (FREQ_OSC / (16 * BAUDRATE));


  39.     //配置串口
  40.     SCON = SCON_value;
  41.     TMOD &= 0x0F;
  42.     TMOD |= 0x20;                     //使用timer1作為波特率發(fā)生器,允許8位自動(dòng)重載
  43.     TH1 = (unsigned char)(Baud_value / 256);  //設(shè)置波特率預(yù)分頻器的高8位
  44.     TL1 = (unsigned char)Baud_value;         //設(shè)置波特率預(yù)分頻器的低8位
  45.     TR1 = 1;                        //啟動(dòng)timer1
  46. }


  47. void send_data(unsigned char dat)
  48. {
  49.     SBUF = dat;
  50.     while(!TI);
  51.     TI = 0;
  52. }


  53. void send_string(unsigned char *s)
  54. {
  55.     while(*s)
  56.     {
  57.         send_data(*s++);
  58.     }
  59. }


  60. void init_adc()
  61. {
  62.     EA = 1;                       //使能全局中斷
  63. #define ADC_CONTR = 0x80;             //設(shè)置ADC時(shí)鐘源為系統(tǒng)時(shí)鐘、ADC啟動(dòng)、ADC自動(dòng)重載模式
  64. }


  65. int get_adc_value()
  66. {
  67. #define ADC_CONTR |= 0x08;            //啟動(dòng)ADC轉(zhuǎn)換
  68. #define while(!(ADC_CONTR & 0x10));   //等待ADC轉(zhuǎn)換完成
  69. #define return ADC_RES * 256 + ADC_RESL;  //返回ADC轉(zhuǎn)換結(jié)果
  70. }


  71. void delay(int time)
  72. {
  73.     int i, j;
  74.     for (i = time; i > 0; i--)
  75.     {
  76.         for (j = 10; j > 0; j--);
  77.     }
  78. }


  79. void display_temp(int temp)
  80. {
  81.     static unsigned char code digit_table[] = { //數(shù)碼管顯示表(0~9,A~F)
  82.           0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90,
  83.           0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};


  84.     int i;
  85.     unsigned char dat[4] = {0, 0, 0, 0};   //定義一個(gè)數(shù)組,用于存放各個(gè)位的顯示值


  86.     dat[0] = digit_table[temp % 10];       //個(gè)位
  87.     dat[1] = digit_table[(temp / 10) % 10];//十位
  88.     dat[2] = digit_table[(temp / 100) % 10];//百位
  89.     dat[3] = digit_table[temp / 1000];     //千位


  90.     //依次點(diǎn)亮每個(gè)數(shù)碼管,顯示溫度數(shù)值
  91.     for(i = 0; i < 4; i++)
  92.     {
  93.         P2 = 1 << i;
  94.         P0 = dat[ i];        delay(1);    }}
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:1080551 發(fā)表于 2023-5-30 18:04 | 顯示全部樓層
compiling 溫度.c...
溫度.c(80): warning C317: attempt to redefine macro 'ADC_CONTR'
溫度.c(81): error C301: identifier expected
溫度.c(81): error C304: bad macro parameter list
溫度.c - 2 Error(s), 1 Warning(s).  有出現(xiàn)這個(gè)問(wèn)題了
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2023-5-30 20:53 | 顯示全部樓層
1538256872 發(fā)表于 2023-5-30 18:04
compiling 溫度.c...
溫度.c(80): warning C317: attempt to redefine macro 'ADC_CONTR'
溫度.c(81): er ...

STC有官方例程,適用12、15系列
  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ------------------------------------------------*/
  3. /* --- STC15F4K60S4 系列 AD轉(zhuǎn)換查詢方式舉例----------------------------*/

  4. /* 如果要在程序中使用此代碼,請(qǐng)?jiān)诔绦蛑凶⒚魇褂昧薙TC的資料及程序        */
  5. /* 如果要在文章中應(yīng)用此代碼,請(qǐng)?jiān)谖恼轮凶⒚魇褂昧薙TC的資料及程序        */
  6. /*---------------------------------------------------------------------*/

  7. //本示例在Keil開發(fā)環(huán)境下請(qǐng)選擇Intel的8058芯片型號(hào)進(jìn)行編譯
  8. //若無(wú)特別說(shuō)明,工作頻率一般為11.0592MHz


  9. #include "reg51.h"
  10. #include "intrins.h"

  11. #define FOSC    11059200L
  12. #define BAUD    115200

  13. typedef unsigned char BYTE;
  14. typedef unsigned int WORD;

  15. #define     URMD    0           //0:使用定時(shí)器2作為波特率發(fā)生器
  16.                                 //1:使用定時(shí)器1的模式0(16位自動(dòng)重載模式)作為波特率發(fā)生器
  17.                                 //2:使用定時(shí)器1的模式2(8位自動(dòng)重載模式)作為波特率發(fā)生器

  18. sfr T2H   = 0xd6;               //定時(shí)器2高8位
  19. sfr T2L   = 0xd7;               //定時(shí)器2低8位

  20. sfr P1M1 = 0x91;    //PxM1.n,PxM0.n     =00--->Standard,    01--->push-pull
  21. sfr P1M0 = 0x92;    //                  =10--->pure input,  11--->open drain
  22. sfr P0M1 = 0x93;
  23. sfr P0M0 = 0x94;
  24. sfr P2M1 = 0x95;
  25. sfr P2M0 = 0x96;
  26. sfr P3M1 = 0xB1;
  27. sfr P3M0 = 0xB2;
  28. sfr P4M1 = 0xB3;
  29. sfr P4M0 = 0xB4;
  30. sfr P5M1 = 0xC9;
  31. sfr P5M0 = 0xCA;
  32. sfr P6M1 = 0xCB;
  33. sfr P6M0 = 0xCC;
  34. sfr P7M1 = 0xE1;
  35. sfr P7M0 = 0xE2;

  36. sfr  AUXR       =   0x8e;       //輔助寄存器                              

  37. sfr ADC_CONTR   =   0xBC;           //ADC控制寄存器
  38. sfr ADC_RES     =   0xBD;           //ADC高8位結(jié)果
  39. sfr ADC_LOW2    =   0xBE;           //ADC低2位結(jié)果
  40. sfr P1ASF       =   0x9D;           //P1口第2功能控制寄存器

  41. #define ADC_POWER   0x80            //ADC電源控制位
  42. #define ADC_FLAG    0x10            //ADC完成標(biāo)志
  43. #define ADC_START   0x08            //ADC起始控制位
  44. #define ADC_SPEEDLL 0x00            //540個(gè)時(shí)鐘
  45. #define ADC_SPEEDL  0x20            //360個(gè)時(shí)鐘
  46. #define ADC_SPEEDH  0x40            //180個(gè)時(shí)鐘
  47. #define ADC_SPEEDHH 0x60            //90個(gè)時(shí)鐘

  48. void InitUart();
  49. void InitADC();
  50. void SendData(BYTE dat);
  51. BYTE GetADCResult(BYTE ch);
  52. void Delay(WORD n);
  53. void ShowResult(BYTE ch);

  54. void main()
  55. {
  56.     P0M0 = 0x00;
  57.     P0M1 = 0x00;
  58.     P1M0 = 0x00;
  59.     P1M1 = 0xff;                  //P1口高阻模式
  60.     P2M0 = 0x00;
  61.     P2M1 = 0x00;
  62.     P3M0 = 0x00;
  63.     P3M1 = 0x00;
  64.     P4M0 = 0x00;
  65.     P4M1 = 0x00;
  66.     P5M0 = 0x00;
  67.     P5M1 = 0x00;
  68.     P6M0 = 0x00;
  69.     P6M1 = 0x00;
  70.     P7M0 = 0x00;
  71.     P7M1 = 0x00;

  72.     InitUart();                     //初始化串口
  73.     InitADC();                      //初始化ADC
  74.     while (1)
  75.     {
  76.         ShowResult(0);              //顯示通道0
  77.         ShowResult(1);              //顯示通道1
  78.         ShowResult(2);              //顯示通道2
  79.         ShowResult(3);              //顯示通道3
  80.         ShowResult(4);              //顯示通道4
  81.         ShowResult(5);              //顯示通道5
  82.         ShowResult(6);              //顯示通道6
  83.         ShowResult(7);              //顯示通道7
  84.     }
  85. }

  86. /*----------------------------
  87. 發(fā)送ADC結(jié)果到PC
  88. ----------------------------*/
  89. void ShowResult(BYTE ch)
  90. {
  91.     SendData(ch);                   //顯示通道號(hào)
  92.     SendData(GetADCResult(ch));     //顯示ADC高8位結(jié)果

  93. //    SendData(ADC_LOW2);           //顯示低2位結(jié)果
  94. }

  95. /*----------------------------
  96. 讀取ADC結(jié)果
  97. ----------------------------*/
  98. BYTE GetADCResult(BYTE ch)
  99. {
  100.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ch | ADC_START;
  101.     _nop_();                        //等待4個(gè)NOP
  102.     _nop_();
  103.     _nop_();
  104.     _nop_();
  105.     while (!(ADC_CONTR & ADC_FLAG));//等待ADC轉(zhuǎn)換完成
  106.     ADC_CONTR &= ~ADC_FLAG;         //Close ADC

  107.     return ADC_RES;                 //返回ADC結(jié)果
  108. }

  109. /*----------------------------
  110. 初始化串口
  111. ----------------------------*/
  112. void InitUart()
  113. {
  114.     SCON = 0x5a;                //設(shè)置串口為8位可變波特率
  115. #if URMD == 0
  116.     T2L = (65536 - (FOSC/4/BAUD));
  117.     T2H = (65536 - (FOSC/4/BAUD)) >> 8;
  118.     AUXR = 0x14;                //T2為1T模式, 并啟動(dòng)定時(shí)器2
  119.     AUXR |= 0x01;               //選擇定時(shí)器2為串口1的波特率發(fā)生器
  120. #elif URMD == 1
  121.     AUXR = 0x40;                //定時(shí)器1為1T模式
  122.     TMOD = 0x00;                //定時(shí)器1為模式0(16位自動(dòng)重載)
  123.     TL1 = (65536 - (FOSC/4/BAUD));
  124.     TH1 = (65536 - (FOSC/4/BAUD)) >> 8;
  125.     TR1 = 1;                    //定時(shí)器1開始啟動(dòng)
  126. #else
  127.     TMOD = 0x20;                //設(shè)置定時(shí)器1為8位自動(dòng)重裝載模式
  128.     AUXR = 0x40;                //定時(shí)器1為1T模式
  129.     TH1 = TL1 = (256 - (FOSC/32/BAUD));
  130.     TR1 = 1;
  131. #endif
  132. }

  133. /*----------------------------
  134. 初始化ADC
  135. ----------------------------*/
  136. void InitADC()
  137. {
  138.     P1ASF = 0xff;                   //設(shè)置P1口為AD口
  139.     ADC_RES = 0;                    //清除結(jié)果寄存器
  140.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
  141.     Delay(2);                       //ADC上電并延時(shí)
  142. }

  143. /*----------------------------
  144. 發(fā)送串口數(shù)據(jù)
  145. ----------------------------*/
  146. void SendData(BYTE dat)
  147. {
  148.     while (!TI);                    //等待前一個(gè)數(shù)據(jù)發(fā)送完成
  149.     TI = 0;                         //清除發(fā)送標(biāo)志
  150.     SBUF = dat;                     //發(fā)送當(dāng)前數(shù)據(jù)
  151. }

  152. /*----------------------------
  153. 軟件延時(shí)
  154. ----------------------------*/
  155. void Delay(WORD n)
  156. {
  157.     WORD x;

  158.     while (n--)
  159.     {
  160.         x = 5000;
  161.         while (x--);
  162.     }
  163. }

復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:883242 發(fā)表于 2023-5-30 21:04 | 顯示全部樓層
亂用#define

出錯(cuò)那幾行#define刪掉

誰(shuí)教你這么寫的?
回復(fù)

使用道具 舉報(bào)

ID:1078511 發(fā)表于 2023-5-30 21:36 | 顯示全部樓層
兄弟,我用單片機(jī)的時(shí)候 基本上在定義 引腳的時(shí)候 都是直接輸入
回復(fù)

使用道具 舉報(bào)

ID:1078511 發(fā)表于 2023-5-30 21:37 | 顯示全部樓層
sbit TXD_Pin=P3.1  這是對(duì)位進(jìn)行聲明  
回復(fù)

使用道具 舉報(bào)

ID:1078511 發(fā)表于 2023-5-30 21:38 | 顯示全部樓層
我們可以嘗試翻譯一下 錯(cuò)誤的地方 第一句錯(cuò)誤就是嘗試 再次定義'‘ADC_CONTR’這錯(cuò)誤不出意外就是之前定義過(guò)了
回復(fù)

使用道具 舉報(bào)

ID:1078511 發(fā)表于 2023-5-30 21:38 | 顯示全部樓層
之后你在重新定義了 導(dǎo)致機(jī)器無(wú)法識(shí)別最正常的引腳
回復(fù)

使用道具 舉報(bào)

ID:1078511 發(fā)表于 2023-5-30 21:39 | 顯示全部樓層
對(duì)于第二句出現(xiàn)的問(wèn)題就是  缺少標(biāo)識(shí)符了 估計(jì)是 英文狀態(tài)下的分號(hào) ;結(jié)束語(yǔ)句的  
回復(fù)

使用道具 舉報(bào)

ID:1078511 發(fā)表于 2023-5-30 21:39 | 顯示全部樓層
第三個(gè)錯(cuò)誤應(yīng)該是參數(shù)有問(wèn)題
回復(fù)

使用道具 舉報(bào)

ID:1080551 發(fā)表于 2023-5-30 22:04 | 顯示全部樓層
Hephaestus 發(fā)表于 2023-5-30 21:04
亂用#define

出錯(cuò)那幾行#define刪掉

刪掉還是有問(wèn)題溫度.C(80): error C141: syntax error near '='
溫度.C(80): error C141: syntax error near '|'
溫度.C(81): error C141: syntax error near '='
溫度.C(81): error C141: syntax error near ')'
溫度.C(82): error C202: 'ADC_RES': undefined identifier
回復(fù)

使用道具 舉報(bào)

ID:883242 發(fā)表于 2023-5-30 22:38 | 顯示全部樓層
1538256872 發(fā)表于 2023-5-30 22:04
刪掉還是有問(wèn)題溫度.C(80): error C141: syntax error near '='
溫度.C(80): error C141: syntax error  ...

你把出錯(cuò)幾行現(xiàn)在長(zhǎng)什么樣子貼出來(lái)。
回復(fù)

使用道具 舉報(bào)

ID:1012735 發(fā)表于 2023-5-30 23:46 | 顯示全部樓層



sfr ADC_CONTR   =   0xBC;           //ADC控制寄存器
sfr ADC_RES     =   0xBD;           //ADC高8位結(jié)果
sfr ADC_RESL    =   0xBE;           //ADC低2位結(jié)果
//(最初錯(cuò)誤就是差以上三行定義)

void init_adc()
{
        EA = 1;                       //使能全局中斷
        ADC_CONTR = 0x80;             //設(shè)置ADC時(shí)鐘源為系統(tǒng)時(shí)鐘、ADC啟動(dòng)、ADC自動(dòng)重載模式

}


int get_adc_value()
{
        ADC_CONTR |= 0x08;            //啟動(dòng)ADC轉(zhuǎn)換
        while(!(ADC_CONTR & 0x10));   //等待ADC轉(zhuǎn)換完成
        return ADC_RES * 256 + ADC_RESL;  //返回ADC轉(zhuǎn)換結(jié)果
}



回復(fù)

使用道具 舉報(bào)

ID:883242 發(fā)表于 2023-5-31 01:34 | 顯示全部樓層
不貼完整真看不出哪里有問(wèn)題。
回復(fù)

使用道具 舉報(bào)

ID:291668 發(fā)表于 2023-5-31 08:35 | 顯示全部樓層
一看就是定義出錯(cuò)了。又有機(jī)會(huì)學(xué)習(xí)英語(yǔ)了
回復(fù)

使用道具 舉報(bào)

ID:1080935 發(fā)表于 2023-5-31 08:51 | 顯示全部樓層
void init_adc()
{
    EA = 1;                       //使能全局中斷
#define ADC_CONTR = 0x80;             //設(shè)置ADC時(shí)鐘源為系統(tǒng)時(shí)鐘、ADC啟動(dòng)、ADC自動(dòng)重載模式
}


int get_adc_value()
{
#define ADC_CONTR |= 0x08;            //啟動(dòng)ADC轉(zhuǎn)換
#define while(!(ADC_CONTR & 0x10));   //等待ADC轉(zhuǎn)換完成
#define return ADC_RES * 256 + ADC_RESL;  //返回ADC轉(zhuǎn)換結(jié)果
}
這些寫的有問(wèn)題,為什么要加#define?把#define直接去掉。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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