找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3618|回复: 5
打印 上一主题 下一主题
收起左侧

单片机C语言定义全局变量count为什么编译就过不了?怎么解决呢

[复制链接]
跳转到指定楼层
楼主
ID:294657 发表于 2018-10-6 16:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
定义全局变量count为什么编译就过不了了?怎么解决呢
错误提示
Build target 'Target 1'
linking...
*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
    SYMBOL:  TIME
    MODULE:  .\Objects\main.obj (MAIN)
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?INIT_TIME?MAIN
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
    SYMBOL:  COUNT
    MODULE:  .\Objects\main.obj (MAIN)
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:  COUNT
    MODULE:  .\Objects\main.obj (MAIN)
    ADDRESS: 01D7H
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:  COUNT
    MODULE:  .\Objects\main.obj (MAIN)
    ADDRESS: 01DFH
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
    SYMBOL:  COUNT
    MODULE:  .\Objects\main.obj (MAIN)
    ADDRESS: 0257H
Program Size: data=16.0 xdata=0 code=601
Target not created.
Build Time Elapsed:  00:00:02



源代码
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. #define Date P0
  6. sbit DSIO=P2^0;
  7. sbit RST=P2^4;
  8. sbit SCLK=P2^1;
  9. sbit RS = P1^0;
  10. sbit RW = P1^1;
  11. sbit EN = P2^5;
  12. //---DS1302写入和读取时分秒的地址命令---//
  13. //---秒分时日月周年 最低位读写位;-------//
  14. uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
  15. uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
  16. //---DS1302时钟初始化2013年1月1日星期二12点00分00秒。---//
  17. //---存储顺序是秒分时日月周年,存储格式是用BCD码---//
  18. uchar TIME[7] = {0, 0, 0x12, 0x01, 0x01, 0x02, 0x13};

  19. void Ds1302Write(uchar addr, uchar dat);
  20. uchar Ds1302Read(uchar addr);
  21. void Ds1302Init();
  22. void Ds1302ReadTime();
  23. extern uchar count;
  24. void Ds1302Write(uchar addr, uchar dat)   //向DS1302命令
  25. {
  26. uchar n;
  27. RST = 0;
  28. _nop_();
  29. SCLK = 0;//先将SCLK置低电平。
  30. _nop_();
  31. RST = 1; //然后将RST(CE)置高电平。
  32. _nop_();
  33. for (n=0; n<8; n++)//开始传送八位地址命令
  34. {
  35.   DSIO = addr & 0x01;//数据从低位开始传送
  36.   addr >>= 1;
  37.   SCLK = 1;//数据在上升沿时,DS1302读取数据
  38.   _nop_();
  39.   SCLK = 0;
  40.   _nop_();
  41. }
  42. for (n=0; n<8; n++)//写入8位数据
  43. {
  44.   DSIO = dat & 0x01;
  45.   dat >>= 1;
  46.   SCLK = 1;//数据在上升沿时,DS1302读取数据
  47.   _nop_();
  48.   SCLK = 0;
  49.   _nop_();
  50. }
  51.    
  52. RST = 0;//传送数据结束
  53. _nop_();
  54. }
  55. uchar Ds1302Read(uchar addr)  //读取一个地址的数据
  56. {
  57. uchar n,dat,dat1;
  58. RST = 0;
  59. _nop_();
  60. SCLK = 0;//先将SCLK置低电平。
  61. _nop_();
  62. RST = 1;//然后将RST(CE)置高电平。
  63. _nop_();
  64. for(n=0; n<8; n++)//开始传送八位地址命令
  65. {
  66.   DSIO = addr & 0x01;//数据从低位开始传送
  67.   addr >>= 1;
  68.   SCLK = 1;//数据在上升沿时,DS1302读取数据
  69.   _nop_();
  70.   SCLK = 0;//DS1302下降沿时,放置数据
  71.   _nop_();
  72. }
  73. _nop_();
  74. for(n=0; n<8; n++)//读取8位数据
  75. {
  76.   dat1 = DSIO;//从最低位开始接收
  77.   dat = (dat>>1) | (dat1<<7);
  78.   SCLK = 1;
  79.   _nop_();
  80.   SCLK = 0;//DS1302下降沿时,放置数据
  81.   _nop_();
  82. }
  83. RST = 0;
  84. _nop_();
  85. return dat;
  86. }
  87. void Ds1302Init()
  88. {
  89. uchar n;
  90. Ds1302Write(0x8E,0X00);   //禁止写保护,就是关闭写保护功能
  91. for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年
  92. {
  93.   Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);
  94. }
  95. Ds1302Write(0x8E,0x80);   //打开写保护功能
  96. }
  97. void Ds1302ReadTime()   //读取时钟信息
  98. {
  99. uchar n;
  100. for (n=0; n<7; n++)//读取7个字节的时钟信号:分秒时日月周年
  101. {
  102.   TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
  103. }
  104. }
  105. void delay(uint xms) //延迟函数
  106. {
  107. uint i,j;
  108. for(i=xms;i>0;i--)
  109. for(j=112;j>0;j--);
  110. }
  111. void com(uchar command) //1602写命令
  112. {
  113. RS=0;
  114. RW=0;
  115. Date=command;
  116. delay(5);
  117. EN=1;
  118. delay(5);
  119. EN=0;
  120. }
  121. void dat(uchar date)  //1602写数据
  122. {
  123. RS=1;
  124. RW=0;
  125. Date=date;
  126. delay(5);
  127. EN=1;
  128. delay(5);
  129. EN=0;
  130. }
  131. void LCD_Init()       //1602初始化
  132. {
  133. com(0x38);        //LCD设置
  134. delay(5);
  135. com(0x01);        //清屏
  136. com(0x06);        //写入新数据后光标后移一位,整屏不移动
  137. com(0x0c);        //显示光标,光标不显示
  138. }
  139. void LcdDisplay()
  140. {
  141. com(0x80+0X40);
  142. dat('0'+TIME[2]/16);    //时
  143. dat('0'+(TIME[2]&0x0f));     
  144. dat('-');
  145. dat('0'+TIME[1]/16);    //分
  146. dat('0'+(TIME[1]&0x0f));
  147. dat('-');
  148. dat('0'+TIME[0]/16);    //秒
  149. dat('0'+(TIME[0]&0x0f));
  150. com(0x80);
  151. dat('2');
  152. dat('0');
  153. dat('0'+TIME[6]/16);   //年
  154. dat('0'+(TIME[6]&0x0f));
  155. dat('-');
  156. dat('0'+TIME[4]/16);   //月
  157. dat('0'+(TIME[4]&0x0f));
  158. dat('-');
  159. dat('0'+TIME[3]/16);   //日
  160. dat('0'+(TIME[3]&0x0f));
  161. com(0x8D);
  162. dat('0'+(TIME[5]&0x07)); //星期   
  163. }
  164. void Init_time()
  165. {
  166. TMOD = 0x01;
  167. TH0 = (65536-50000)/256;
  168. TL0 = (65536-50000)%256;
  169. EA = 1;
  170. ET0 = 1;
  171. TR0 = 1;
  172. }
  173. void main()
  174. {
  175. count = 0;
  176. LCD_Init();
  177. Ds1302Init();
  178. while(1)
  179. {
  180.   if(count>=20)
  181.   {
  182.    Ds1302ReadTime();
  183.    LcdDisplay();
  184.   }
  185. }
  186. }
  187. void time()interrupt 1
  188. {
  189. TH0 = (65536-50000)/256;
  190. TL0 = (65536-50000)%256;
  191. count++;
  192. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:387733 发表于 2018-10-6 22:04 | 只看该作者
两个问题,
    1、数组TIME[] 与定时器中断函数名 time() 重复定义报错,按理说C语言允许字母大小写区别,但是这里确实是报错了,把函数名改成 timer()后,错误消失。
    2、全局变量 count 前面加了 extern,成了外部变量,在别的模块定义,现在这个是单模块, count 编译程序无法定位,所以报错,去掉前面的 extern,  错误消失,编译通过了。
回复

使用道具 举报

板凳
ID:164602 发表于 2018-10-7 08:16 | 只看该作者
还有一个小问题: Init_time()没有使用。
回复

使用道具 举报

地板
ID:294657 发表于 2018-10-8 13:47 | 只看该作者
sxhwdz 发表于 2018-10-6 22:04
两个问题,
    1、数组TIME[] 与定时器中断函数名 time() 重复定义报错,按理说C语言允许字母大小写区别 ...

好的,谢谢,问题解决了,可是为什么你说的两种方法随意改变其中一个就可以了呢
按理说两种方法不相干啊
回复

使用道具 举报

5#
ID:387733 发表于 2018-10-8 18:04 | 只看该作者
我是最新版的keil,C51V5.59版,改变其中一个还是不行的

compiling test.c...
linking...
*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
    SYMBOL:  TIME
    MODULE:  .\Objects\test.obj (TEST)
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
    SEGMENT: ?PR?INIT_TIME?TEST
Program Size: data=17.0 xdata=0 code=659
Target not created.
Build Time Elapsed:  00:00:01
回复

使用道具 举报

6#
ID:294657 发表于 2018-10-10 12:13 | 只看该作者
sxhwdz 发表于 2018-10-8 18:04
我是最新版的keil,C51V5.59版,改变其中一个还是不行的

compiling test.c...

好的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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