找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3351|回复: 13
收起左侧

问一个C51单片机的语法问题,编译器提示TMOD, TH1,TL1,ET0重复定义

[复制链接]
ID:523537 发表于 2019-6-16 23:18 | 显示全部楼层 |阅读模式
/******问题描述**********/
   我只包含了一次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 //定义数据端口 程序中遇到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;//红外数据处理标志位,红外接收标志位
  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)//如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
  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下降沿触发
  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. }
复制代码

各位大佬走过路过进来帮我看看呀。
回复

使用道具 举报

ID:388197 发表于 2019-6-17 03:30 | 显示全部楼层
48行,把
void Init_Timer0();

后面的分号去掉就好了.
回复

使用道具 举报

ID:523537 发表于 2019-6-17 21:29 | 显示全部楼层
董董 发表于 2019-6-17 08:10
/*********************************************新的问题*******************************************/
...

我知道了,单片机默认电平为高电平,所以段选默认是打开的。
回复

使用道具 举报

ID:207421 发表于 2019-6-17 05:33 | 显示全部楼层
void Init_Timer0();
多了个分号(;)而已
回复

使用道具 举报

ID:523537 发表于 2019-6-17 06:24 | 显示全部楼层
不好意思,我找错误原因了,定义函数后面不能有分号。
回复

使用道具 举报

ID:523537 发表于 2019-6-17 08:02 | 显示全部楼层
cjm82 发表于 2019-6-17 03:30
48行,把
void Init_Timer0();

您说的对,是我自己疏忽了,多谢提醒。
回复

使用道具 举报

ID:523537 发表于 2019-6-17 08:02 | 显示全部楼层
lwh999995 发表于 2019-6-17 05:33
void Init_Timer0();
多了个分号(;)而已

您说的对,是我自己疏忽了,多谢提醒。
回复

使用道具 举报

ID:164385 发表于 2019-6-17 08:06 | 显示全部楼层
函数的后面多了个分号(;),函数是不能有的亲
回复

使用道具 举报

ID:523537 发表于 2019-6-17 08:10 | 显示全部楼层
/*********************************************新的问题*******************************************/
我现在有个新问题,是这样的,我在主函数里令P0为0xfe,并打开了位选芯片,只选择第一个数码管,但是我全程没有打开段选信号,为什么我后面使用红外接收器改变数码管数字的时候会正确显示,不是应该DataPort = 0xff(DataPort赋值一个数);Seg_Latch = 1; Seg_Latch = 0;这样才会打开段选,然后才会显示数字吗?我上面的程序里除了定义sbit Seg_Latch = P2^2, 后面都没有打开,但是居然也有用,我想请问下为啥啊?
回复

使用道具 举报

ID:93224 发表于 2019-6-17 08:32 | 显示全部楼层
应该加了两个51的头文件导致的
回复

使用道具 举报

ID:207421 发表于 2019-6-17 10:05 | 显示全部楼层
你的段选本来就开了,共阴数码管两位? 没电路图,别人都是瞎猜,说不定共阴都连一块了。
回复

使用道具 举报

ID:517466 发表于 2019-6-17 22:26 | 显示全部楼层
学程序之前,一定要把用到的芯片的基本资料搞清楚。51系列单片机默认初始化后,P1,P2,P3端口的输出都是高电平的。继续深入的话,你还需要了解内部寄存器、内存区的初始化状态是什么样子,否则,程序看起来没问题,实际一运行,可能还会出问题的。想要深入学习开发,基本知识一定要扎实。
回复

使用道具 举报

ID:523537 发表于 2019-6-18 11:06 | 显示全部楼层
suncat0504 发表于 2019-6-17 22:26
学程序之前,一定要把用到的芯片的基本资料搞清楚。51系列单片机默认初始化后,P1,P2,P3端口的输出都是高电 ...

说的很有道理,我也是初学所以很多东西搞不清楚或者当时记得后面忘记了,以后要好好练基本功。
回复

使用道具 举报

ID:123289 发表于 2019-6-18 13:41 | 显示全部楼层
芯片手册上都有,仔细读一遍芯片手册,你的收获何止一点点。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表