找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 913|回复: 16
收起左侧

STC8G1K08单片机main无法调用封装函数

[复制链接]
ID:1107733 发表于 2024-1-3 11:38 | 显示全部楼层 |阅读模式
各位大佬好,我正在学习单片机,使用单片机型号为STC8G1K08。在学习过程中遇到一些困难,希望各位大佬指点迷津。在程序中,我将代码封装在函数中,然后在main函数中调用,程序可以正常编译,也能下载到单片机中,但是无法执行函数功能。
这只是个简单的IO功能测试,不但定时器功能无法启动,甚至普通的IO也无法使用。

  1. #include <STC8G.H>
  2. #include <Delay.h>

  3. void Time0()
  4. {
  5.        
  6.     TMOD = 0x00;
  7.     TL0 = 0x00;                                
  8.     TH0 = 0x00;
  9.     TR0 = 1;                                    //启动定时器
  10.     ET0 = 1;  

  11. }

  12. void TM0_Isr() interrupt 1
  13. {
  14.   P33=!P33;
  15. }
  16. void main()
  17. {
  18.           
  19.     P3M0 &= 0x0C;
  20.     P3M1 &= 0x00;
  21.     P5M0 &= 0x00;
  22.     P5M1 &= 0x10;               

  23.        
  24. //    TMOD = 0x00;
  25. //    TL0 = 0x00;                                
  26. //    TH0 = 0x00;
  27. //    TR0 = 1;                                    //启动定时器
  28. //    ET0 = 1;  


  29.                 Timer0();                                                
  30.     EA = 1;                                                                                                                                                         //使能定时器中断

  31.     while (1)
  32.                 {
  33.                         P55=1;
  34.                         P30=0;
  35.                         P31=0;
  36.                         P32=0;
  37.                         DelayMs(500);
  38.                         P55=0;
  39.                         P30=1;
  40.                         P31=1;
  41.                         P32=1;
  42.                         DelayMs(500);
  43.                 }

  44. }
复制代码
但我将代码直接写在main函数中,程序功能可以正常执行。
  1. #include <STC8G.H>
  2. #include <Delay.h>
  3.   

  4. void Time0()
  5. {
  6.        
  7.     TMOD = 0x00;
  8.     TL0 = 0x00;                                
  9.     TH0 = 0x00;
  10.     TR0 = 1;                                    //启动定时器
  11.     ET0 = 1;  

  12. }

  13. void TM0_Isr() interrupt 1
  14. {
  15.   P33=!P33;
  16. }
  17. void main()
  18. {
  19.           
  20.     P3M0 &= 0x0C;
  21.     P3M1 &= 0x00;
  22.     P5M0 &= 0x00;
  23.     P5M1 &= 0x10;               

  24.        
  25.     TMOD = 0x00;
  26.     TL0 = 0x00;                                
  27.     TH0 = 0x00;
  28.     TR0 = 1;                                    //启动定时器
  29.     ET0 = 1;  


  30. //                Timer0();                                                
  31.     EA = 1;                                                                                                                                                         //使能定时器中断

  32.     while (1)
  33.                 {
  34.                         P55=1;
  35.                         P30=0;
  36.                         P31=0;
  37.                         P32=0;
  38.                         DelayMs(500);
  39.                         P55=0;
  40.                         P30=1;
  41.                         P31=1;
  42.                         P32=1;
  43.                         DelayMs(500);
  44.                 }

  45. }
复制代码
我的知识储备对这种情况百思不得其解,希望得到各位的帮助。




回复

使用道具 举报

ID:1057978 发表于 2024-1-3 16:51 | 显示全部楼层
TL0 = 0x00;                                
TH0 = 0x00;
这是定时几秒进中断呢,还是不停的进中断呢
回复

使用道具 举报

ID:1107733 发表于 2024-1-3 17:37 | 显示全部楼层
wangxiangtan 发表于 2024-1-3 16:51
TL0 = 0x00;                                
TH0 = 0x00;
这是定时几秒进中断呢,还是不停的进中断呢

是不停进中断翻转电平
回复

使用道具 举报

ID:1107733 发表于 2024-1-3 17:41 | 显示全部楼层
我使用的单片机是STC8G1K08-8Pin的,但只有这一个型号,不知道这个问题是只针对这个型号,还是其他型号的也会遇到这种问题。
回复

使用道具 举报

ID:1006638 发表于 2024-1-3 19:57 | 显示全部楼层
请问你是怎么检测定时器启动没?假如你设定主频12M定时器就5MS进一次。看?万用表?示波器?
回复

使用道具 举报

ID:1010435 发表于 2024-1-3 20:21 | 显示全部楼层
123.JPG
Timer没有拼写对
回复

使用道具 举报

ID:471636 发表于 2024-1-3 22:02 | 显示全部楼层
//                Timer0();

这个函数已经被你用“//”注释掉了!
回复

使用道具 举报

ID:213173 发表于 2024-1-3 22:17 | 显示全部楼层
你封装的函数名称与调用的函数名称不一致当然无效。void Time0()   Timer0();  难道编译时没有警告???
回复

使用道具 举报

ID:1006638 发表于 2024-1-4 07:56 | 显示全部楼层
还是6楼心细 啊,看几遍 我都没发现
回复

使用道具 举报

ID:1107733 发表于 2024-1-4 09:04 | 显示全部楼层
感谢大佬,确实是我自己粗心导致的,编译报了警告没报错所以给忽略掉了
回复

使用道具 举报

ID:883242 发表于 2024-1-4 09:06 | 显示全部楼层
wulin 发表于 2024-1-3 22:17
你封装的函数名称与调用的函数名称不一致当然无效。void Time0()   Timer0();  难道编译时没有警告???

楼主同时说“程序可以正常编译”怎么解释?
回复

使用道具 举报

ID:1107733 发表于 2024-1-4 09:18 | 显示全部楼层
Hephaestus 发表于 2024-1-4 09:06
楼主同时说“程序可以正常编译”怎么解释?

编译报警告,但是没报错,我给忽略了
回复

使用道具 举报

ID:1107733 发表于 2024-1-4 09:23 | 显示全部楼层
这也是之前学习过程中没有注意到的问题,从来不注意警告信息,只要程序没报错就认为没问题,感谢各位的帮助
回复

使用道具 举报

ID:883242 发表于 2024-1-4 09:41 | 显示全部楼层
dnxbdnxb01 发表于 2024-1-4 09:18
编译报警告,但是没报错,我给忽略了

不会这么简单,你肯定有更多的隐瞒之处。
回复

使用道具 举报

ID:1107733 发表于 2024-1-4 09:59 | 显示全部楼层
Hephaestus 发表于 2024-1-4 09:41
不会这么简单,你肯定有更多的隐瞒之处。

它的警告信息如下:
  1. Rebuild target 'Target 1'
  2. assembling STARTUP.A51...
  3. compiling stc01.c...
  4. stc01.c(34): warning C206: 'Timer0': missing function-prototype
  5. linking...
  6. *** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
  7.     SEGMENT: ?PR?TIME0?STC01
  8. *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
  9.     SYMBOL:  TIMER0
  10.     MODULE:  stc01.obj (STC01)
  11. *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
  12.     SYMBOL:  TIMER0
  13.     MODULE:  stc01.obj (STC01)
  14.     ADDRESS: 001BH
  15. Program Size: data=9.0 xdata=0 code=68
  16. creating hex file from "stc801"...
  17. "stc801" - 0 Error(s), 4 Warning(s).
复制代码

我只注意到错误数为零,就没有关注警告信息。
回复

使用道具 举报

ID:1107733 发表于 2024-1-4 10:02 | 显示全部楼层
Hephaestus 发表于 2024-1-4 09:41
不会这么简单,你肯定有更多的隐瞒之处。

在我印象中,也觉得如果调用了没有定义的函数会报错,因此没有注意到函数名错误
回复

使用道具 举报

ID:1107733 发表于 2024-1-4 10:02 | 显示全部楼层
大IGBT 发表于 2024-1-3 19:57
请问你是怎么检测定时器启动没?假如你设定主频12M定时器就5MS进一次。看?万用表?示波器?

我使用的led灯
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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