找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

問一個(gè)C51單片機(jī)的語法問題,編譯器提示TMOD, TH1,TL1,ET0重復(fù)定義

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:523537 發(fā)表于 2019-6-16 23:18 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
/******問題描述**********/
   我只包含了一次reg52.h,但是編譯器提示TMOD, TH1,TL1,ET0等都重復(fù)定義了,我也不是很明白為什么會這樣。
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ù)處理標(biāo)志位,紅外接收標(biāo)志位
  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();//定時(shí)器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)//如果處理好后進(jìn)行工作處理,如按對應(yīng)的按鍵后顯示對應(yīng)的數(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//定時(shí)器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. }
復(fù)制代碼

各位大佬走過路過進(jìn)來幫我看看呀。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

來自 2#
ID:388197 發(fā)表于 2019-6-17 03:30 | 只看該作者
48行,把
void Init_Timer0();

后面的分號去掉就好了.
回復(fù)

使用道具 舉報(bào)

來自 11#
ID:523537 發(fā)表于 2019-6-17 21:29 | 只看該作者
董董 發(fā)表于 2019-6-17 08:10
/*********************************************新的問題*******************************************/
...

我知道了,單片機(jī)默認(rèn)電平為高電平,所以段選默認(rèn)是打開的。
回復(fù)

使用道具 舉報(bào)

板凳
ID:207421 發(fā)表于 2019-6-17 05:33 | 只看該作者
void Init_Timer0();
多了個(gè)分號(;)而已
回復(fù)

使用道具 舉報(bào)

地板
ID:523537 發(fā)表于 2019-6-17 06:24 | 只看該作者
不好意思,我找錯誤原因了,定義函數(shù)后面不能有分號。
回復(fù)

使用道具 舉報(bào)

5#
ID:523537 發(fā)表于 2019-6-17 08:02 | 只看該作者
cjm82 發(fā)表于 2019-6-17 03:30
48行,把
void Init_Timer0();

您說的對,是我自己疏忽了,多謝提醒。
回復(fù)

使用道具 舉報(bào)

6#
ID:523537 發(fā)表于 2019-6-17 08:02 | 只看該作者
lwh999995 發(fā)表于 2019-6-17 05:33
void Init_Timer0();
多了個(gè)分號(;)而已

您說的對,是我自己疏忽了,多謝提醒。
回復(fù)

使用道具 舉報(bào)

7#
ID:164385 發(fā)表于 2019-6-17 08:06 | 只看該作者
函數(shù)的后面多了個(gè)分號(;),函數(shù)是不能有的親
回復(fù)

使用道具 舉報(bào)

8#
ID:523537 發(fā)表于 2019-6-17 08:10 | 只看該作者
/*********************************************新的問題*******************************************/
我現(xiàn)在有個(gè)新問題,是這樣的,我在主函數(shù)里令P0為0xfe,并打開了位選芯片,只選擇第一個(gè)數(shù)碼管,但是我全程沒有打開段選信號,為什么我后面使用紅外接收器改變數(shù)碼管數(shù)字的時(shí)候會正確顯示,不是應(yīng)該DataPort = 0xff(DataPort賦值一個(gè)數(shù));Seg_Latch = 1; Seg_Latch = 0;這樣才會打開段選,然后才會顯示數(shù)字嗎?我上面的程序里除了定義sbit Seg_Latch = P2^2, 后面都沒有打開,但是居然也有用,我想請問下為啥��?
回復(fù)

使用道具 舉報(bào)

9#
ID:93224 發(fā)表于 2019-6-17 08:32 | 只看該作者
應(yīng)該加了兩個(gè)51的頭文件導(dǎo)致的
回復(fù)

使用道具 舉報(bào)

10#
ID:207421 發(fā)表于 2019-6-17 10:05 | 只看該作者
你的段選本來就開了,共陰數(shù)碼管兩位? 沒電路圖,別人都是瞎猜,說不定共陰都連一塊了。
回復(fù)

使用道具 舉報(bào)

12#
ID:517466 發(fā)表于 2019-6-17 22:26 | 只看該作者
學(xué)程序之前,一定要把用到的芯片的基本資料搞清楚。51系列單片機(jī)默認(rèn)初始化后,P1,P2,P3端口的輸出都是高電平的。繼續(xù)深入的話,你還需要了解內(nèi)部寄存器、內(nèi)存區(qū)的初始化狀態(tài)是什么樣子,否則,程序看起來沒問題,實(shí)際一運(yùn)行,可能還會出問題的。想要深入學(xué)習(xí)開發(fā),基本知識一定要扎實(shí)。
回復(fù)

使用道具 舉報(bào)

13#
ID:523537 發(fā)表于 2019-6-18 11:06 | 只看該作者
suncat0504 發(fā)表于 2019-6-17 22:26
學(xué)程序之前,一定要把用到的芯片的基本資料搞清楚。51系列單片機(jī)默認(rèn)初始化后,P1,P2,P3端口的輸出都是高電 ...

說的很有道理,我也是初學(xué)所以很多東西搞不清楚或者當(dāng)時(shí)記得后面忘記了,以后要好好練基本功。
回復(fù)

使用道具 舉報(bào)

14#
ID:123289 發(fā)表于 2019-6-18 13:41 | 只看該作者
芯片手冊上都有,仔細(xì)讀一遍芯片手冊,你的收獲何止一點(diǎn)點(diǎn)。
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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