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

QQ登錄

只需一步,快速開始

帖子
查看: 4707|回復(fù): 5
收起左側(cè)

單片機(jī)C語言定義全局變量count為什么編譯就過不了?怎么解決呢

[復(fù)制鏈接]
ID:294657 發(fā)表于 2018-10-6 16:01 | 顯示全部樓層 |閱讀模式
定義全局變量count為什么編譯就過不了了?怎么解決呢
錯(cuò)誤提示
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寫入和讀取時(shí)分秒的地址命令---//
  13. //---秒分時(shí)日月周年 最低位讀寫位;-------//
  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時(shí)鐘初始化2013年1月1日星期二12點(diǎn)00分00秒。---//
  17. //---存儲(chǔ)順序是秒分時(shí)日月周年,存儲(chǔ)格式是用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;//數(shù)據(jù)從低位開始傳送
  36.   addr >>= 1;
  37.   SCLK = 1;//數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
  38.   _nop_();
  39.   SCLK = 0;
  40.   _nop_();
  41. }
  42. for (n=0; n<8; n++)//寫入8位數(shù)據(jù)
  43. {
  44.   DSIO = dat & 0x01;
  45.   dat >>= 1;
  46.   SCLK = 1;//數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
  47.   _nop_();
  48.   SCLK = 0;
  49.   _nop_();
  50. }
  51.    
  52. RST = 0;//傳送數(shù)據(jù)結(jié)束
  53. _nop_();
  54. }
  55. uchar Ds1302Read(uchar addr)  //讀取一個(gè)地址的數(shù)據(jù)
  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;//數(shù)據(jù)從低位開始傳送
  67.   addr >>= 1;
  68.   SCLK = 1;//數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
  69.   _nop_();
  70.   SCLK = 0;//DS1302下降沿時(shí),放置數(shù)據(jù)
  71.   _nop_();
  72. }
  73. _nop_();
  74. for(n=0; n<8; n++)//讀取8位數(shù)據(jù)
  75. {
  76.   dat1 = DSIO;//從最低位開始接收
  77.   dat = (dat>>1) | (dat1<<7);
  78.   SCLK = 1;
  79.   _nop_();
  80.   SCLK = 0;//DS1302下降沿時(shí),放置數(shù)據(jù)
  81.   _nop_();
  82. }
  83. RST = 0;
  84. _nop_();
  85. return dat;
  86. }
  87. void Ds1302Init()
  88. {
  89. uchar n;
  90. Ds1302Write(0x8E,0X00);   //禁止寫保護(hù),就是關(guān)閉寫保護(hù)功能
  91. for (n=0; n<7; n++)//寫入7個(gè)字節(jié)的時(shí)鐘信號(hào):分秒時(shí)日月周年
  92. {
  93.   Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);
  94. }
  95. Ds1302Write(0x8E,0x80);   //打開寫保護(hù)功能
  96. }
  97. void Ds1302ReadTime()   //讀取時(shí)鐘信息
  98. {
  99. uchar n;
  100. for (n=0; n<7; n++)//讀取7個(gè)字節(jié)的時(shí)鐘信號(hào):分秒時(shí)日月周年
  101. {
  102.   TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
  103. }
  104. }
  105. void delay(uint xms) //延遲函數(shù)
  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寫數(shù)據(jù)
  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設(shè)置
  134. delay(5);
  135. com(0x01);        //清屏
  136. com(0x06);        //寫入新數(shù)據(jù)后光標(biāo)后移一位,整屏不移動(dòng)
  137. com(0x0c);        //顯示光標(biāo),光標(biāo)不顯示
  138. }
  139. void LcdDisplay()
  140. {
  141. com(0x80+0X40);
  142. dat('0'+TIME[2]/16);    //時(shí)
  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. }
復(fù)制代碼



回復(fù)

使用道具 舉報(bào)

ID:387733 發(fā)表于 2018-10-6 22:04 | 顯示全部樓層
兩個(gè)問題,
    1、數(shù)組TIME[] 與定時(shí)器中斷函數(shù)名 time() 重復(fù)定義報(bào)錯(cuò),按理說C語言允許字母大小寫區(qū)別,但是這里確實(shí)是報(bào)錯(cuò)了,把函數(shù)名改成 timer()后,錯(cuò)誤消失。
    2、全局變量 count 前面加了 extern,成了外部變量,在別的模塊定義,現(xiàn)在這個(gè)是單模塊, count 編譯程序無法定位,所以報(bào)錯(cuò),去掉前面的 extern,  錯(cuò)誤消失,編譯通過了。
回復(fù)

使用道具 舉報(bào)

ID:164602 發(fā)表于 2018-10-7 08:16 | 顯示全部樓層
還有一個(gè)小問題: Init_time()沒有使用。
回復(fù)

使用道具 舉報(bào)

ID:294657 發(fā)表于 2018-10-8 13:47 | 顯示全部樓層
sxhwdz 發(fā)表于 2018-10-6 22:04
兩個(gè)問題,
    1、數(shù)組TIME[] 與定時(shí)器中斷函數(shù)名 time() 重復(fù)定義報(bào)錯(cuò),按理說C語言允許字母大小寫區(qū)別 ...

好的,謝謝,問題解決了,可是為什么你說的兩種方法隨意改變其中一個(gè)就可以了呢
按理說兩種方法不相干啊
回復(fù)

使用道具 舉報(bào)

ID:387733 發(fā)表于 2018-10-8 18:04 | 顯示全部樓層
我是最新版的keil,C51V5.59版,改變其中一個(gè)還是不行的

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
回復(fù)

使用道具 舉報(bào)

ID:294657 發(fā)表于 2018-10-10 12:13 | 顯示全部樓層
sxhwdz 發(fā)表于 2018-10-8 18:04
我是最新版的keil,C51V5.59版,改變其中一個(gè)還是不行的

compiling test.c...

好的
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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