標題: 問一個C51單片機的語法問題,編譯器提示TMOD, TH1,TL1,ET0重復定義 [打印本頁]

作者: 董董    時間: 2019-6-16 23:18
標題: 問一個C51單片機的語法問題,編譯器提示TMOD, TH1,TL1,ET0重復定義
/******問題描述**********/
   我只包含了一次reg52.h,但是編譯器提示TMOD, TH1,TL1,ET0等都重復定義了,我也不是很明白為什么會這樣。
lesson15_1.c(49): error C141: syntax error near '{'
lesson15_1.c(50): error C231: 'TMOD': redefinition
lesson15_1.c(50): error C231: 'TMOD': redefinition
lesson15_1.c(51): error C231: 'TH0': redefinition
lesson15_1.c(51): error C231: 'TH0': redefinition
lesson15_1.c(52): error C231: 'TL0': redefinition
lesson15_1.c(52): error C231: 'TL0': redefinition
lesson15_1.c(53): error C231: 'ET0': redefinition
lesson15_1.c(53): error C231: 'ET0': redefinition
lesson15_1.c(54): error C231: 'TR0': redefinition
lesson15_1.c(54): error C231: 'TR0': redefinition
lesson15_1.c(55): error C141: syntax error near '}'


/********************************源程序*********************************/
  1. #include <reg52.h>


  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define DataPort P0 //定義數(shù)據(jù)端口 程序中遇到DataPort 則用P0 替換

  5. uchar code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  6. sbit Bit_Latch = P2^3;
  7. sbit Seg_Latch = P2^2;

  8. sbit infrared_receiver = P3^2;//P3^2是外部中斷0的引腳
  9. uchar irtime;//紅外全局變量

  10. bit irpro_ok, irok;//紅外數(shù)據(jù)處理標志位,紅外接收標志位
  11. uchar ircord[4], irdata[33];


  12. void IR_work();
  13. void IRcordpro();
  14. void Init_Timer0();
  15. void EX0_Init();


  16. void main()
  17. {
  18.         Init_Timer0();//定時器0初始化
  19.         EX0_Init();//外部中斷初始化
  20.         
  21.         DataPort = 0xfe;
  22.         Bit_Latch = 1;
  23.         Bit_Latch = 0;
  24.         
  25.         while(1)
  26.         {
  27.                 if(irok)
  28.                 {
  29.                         IRcordpro();
  30.                         irok = 0;
  31.                 }
  32.                 if(irpro_ok)//如果處理好后進行工作處理,如按對應的按鍵后顯示對應的數(shù)字等
  33.                 {
  34.                         IR_work();
  35.                 }
  36.         }
  37. }

  38. void Init_Timer0();
  39. {
  40.         TMOD = 0x02;
  41.         TH0 = 0x00;
  42.         TL0 = 0x00;
  43.         ET0 = 1;
  44.         TR0 = 0;
  45. }

  46. void EX0_Init()
  47. {
  48.         IT0 = 0;//外部中斷0下降沿觸發(fā)
  49.         EX0 = 1;
  50.         EA = 1;//開總中斷
  51. }

  52. void IRcordpro()
  53. {
  54.         uchar i, j, k;
  55.         uchar cord, value;
  56.         
  57.         k = 1;
  58.         for(i=0;i<4;i++)
  59.         {
  60.                 for(j=0;j<8;j++)
  61.                 {
  62.                         cord = irdata[k];
  63.                         if(cord > 7)
  64.                         {
  65.                                 value |= 0x80;
  66.                         }
  67.                         if(j<7)
  68.                         {
  69.                                 value >>= 1;
  70.                         }
  71.                         k++;
  72.                 }
  73.                 ircord[i] = value;
  74.                 value = 0;
  75.         }
  76.         irpro_ok = 1;
  77. }

  78. void IR_work()
  79. {
  80.         switch(ircord[2])
  81.         {
  82.                 case 0x0c: DataPort = DuanMa[1];break;
  83.                 case 0x18: DataPort = DuanMa[2];break;
  84.                 case 0x5e: DataPort = DuanMa[3];break;
  85.                 case 0x08: DataPort = DuanMa[4];break;
  86.                 case 0x1c: DataPort = DuanMa[5];break;
  87.                 case 0x5a: DataPort = DuanMa[6];break;
  88.                 case 0x42: DataPort = DuanMa[7];break;
  89.                 case 0x52: DataPort = DuanMa[8];break;
  90.                 case 0x4a: DataPort = DuanMa[9];break;
  91.                 default: break;
  92.         }
  93.         irpro_ok = 1;
  94. }


  95. void Timer0() interrupt 1 using 1//定時器0中斷
  96. {
  97.         irtime++;
  98. }

  99. void EX0_IR()  interrupt 0   //外部中斷0
  100. {
  101.         static uchar i;
  102.         static bit startflag;
  103.         
  104.         if(startflag)
  105.         {
  106.                 if(irtime < 63 && irtime > 33)
  107.                 {
  108.                         i = 0;
  109.                 }
  110.                 irdata[i] = irtime;
  111.                 irtime = 0;
  112.                 i++;
  113.                 if(i == 33)
  114.                 {
  115.                         irok = 1;
  116.                         i = 0;
  117.                 }
  118.                
  119.         }
  120.         else
  121.         {
  122.                 irtime = 0;
  123.                 startflag = 1;
  124.         }
  125. }
復制代碼

各位大佬走過路過進來幫我看看呀。

作者: cjm82    時間: 2019-6-17 03:30
48行,把
void Init_Timer0();

后面的分號去掉就好了.
作者: lwh999995    時間: 2019-6-17 05:33
void Init_Timer0();
多了個分號(;)而已
作者: 董董    時間: 2019-6-17 06:24
不好意思,我找錯誤原因了,定義函數(shù)后面不能有分號。
作者: 董董    時間: 2019-6-17 08:02
cjm82 發(fā)表于 2019-6-17 03:30
48行,把
void Init_Timer0();

您說的對,是我自己疏忽了,多謝提醒。
作者: 董董    時間: 2019-6-17 08:02
lwh999995 發(fā)表于 2019-6-17 05:33
void Init_Timer0();
多了個分號(;)而已

您說的對,是我自己疏忽了,多謝提醒。
作者: 7631001    時間: 2019-6-17 08:06
函數(shù)的后面多了個分號(;),函數(shù)是不能有的親
作者: 董董    時間: 2019-6-17 08:10
/*********************************************新的問題*******************************************/
我現(xiàn)在有個新問題,是這樣的,我在主函數(shù)里令P0為0xfe,并打開了位選芯片,只選擇第一個數(shù)碼管,但是我全程沒有打開段選信號,為什么我后面使用紅外接收器改變數(shù)碼管數(shù)字的時候會正確顯示,不是應該DataPort = 0xff(DataPort賦值一個數(shù));Seg_Latch = 1; Seg_Latch = 0;這樣才會打開段選,然后才會顯示數(shù)字嗎?我上面的程序里除了定義sbit Seg_Latch = P2^2, 后面都沒有打開,但是居然也有用,我想請問下為啥啊?
作者: lele5211314    時間: 2019-6-17 08:32
應該加了兩個51的頭文件導致的
作者: lwh999995    時間: 2019-6-17 10:05
你的段選本來就開了,共陰數(shù)碼管兩位? 沒電路圖,別人都是瞎猜,說不定共陰都連一塊了。
作者: 董董    時間: 2019-6-17 21:29
董董 發(fā)表于 2019-6-17 08:10
/*********************************************新的問題*******************************************/
...

我知道了,單片機默認電平為高電平,所以段選默認是打開的。
作者: suncat0504    時間: 2019-6-17 22:26
學程序之前,一定要把用到的芯片的基本資料搞清楚。51系列單片機默認初始化后,P1,P2,P3端口的輸出都是高電平的。繼續(xù)深入的話,你還需要了解內(nèi)部寄存器、內(nèi)存區(qū)的初始化狀態(tài)是什么樣子,否則,程序看起來沒問題,實際一運行,可能還會出問題的。想要深入學習開發(fā),基本知識一定要扎實。
作者: 董董    時間: 2019-6-18 11:06
suncat0504 發(fā)表于 2019-6-17 22:26
學程序之前,一定要把用到的芯片的基本資料搞清楚。51系列單片機默認初始化后,P1,P2,P3端口的輸出都是高電 ...

說的很有道理,我也是初學所以很多東西搞不清楚或者當時記得后面忘記了,以后要好好練基本功。
作者: yzwzfyz    時間: 2019-6-18 13:41
芯片手冊上都有,仔細讀一遍芯片手冊,你的收獲何止一點點。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1