找回密码
 立即注册
查看: 1756|回复: 42

用ISP中的定时器设置工具,设置50ms,实际差不多10ms | 已解决

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 2024-8-26 10:48:29 | 显示全部楼层 |阅读模式
芯片是12C5616AD-PDIP28。
用ISP中的定时器设置T0为50ms中断,中断程序中用变量fc进行累加,
然后在主程序中实现每秒打印一条信息。
001.jpg
主要代码如下:
  1. void Timer0_Isr(void) interrupt 1
  2. {
  3.     fc++;
  4. }
  5. void Timer0_Init(void)                //50毫秒@11.0592MHz
  6. {
  7.         AUXR &= 0x7F;                        //定时器时钟12T模式
  8.         TMOD &= 0xF0;                        //设置定时器模式
  9.         TL0 = 0x00;                                //设置定时初始值
  10.         TH0 = 0x4C;                                //设置定时初始值
  11.         TF0 = 0;                                //清除TF0标志
  12.         TR0 = 1;                                //定时器0开始计时
  13.         ET0 = 1;                                //使能定时器0中断
  14. }
  15. void main()
  16. {
  17.     IO_INIT();        
  18.     Timer0_Init();                //50毫秒@11.0592MHz
  19.     Uart1_Init();        //115200bps@11.0592MHz
  20.     EA=1;               
  21.     while(1)
  22.     {
  23.         if(fc>20)
  24.         {
  25.             printf("\r\ntime----");  
  26.             fc=0;
  27.             LED=~LED;
  28.         }
  29.     }
  30. }
复制代码
串口打印结果:
003.jpg

串口打印的信息反映串口打印的间隔时间并不是1s,这是为什么?
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

积分
15613
发表于 2024-8-28 08:14:51 | 显示全部楼层
12C5616AD时代,还【定时器没有16位自动重载功能】的年代,
===换管脚兼容的,12H1K16-36I-TSSOP20/SOP20/SOP28/LQFP32
深圳国芯人工智能有限公司-产品_STC12H系列 (stcai.com)   
【定时器有16位自动重载功能】

15的年代才开始
【定时器有16位自动重载功能】
还是回到那句话,一切的正确起点是 原始的一手规格书 开始

不看标准教科书级别的规格书,各种疑问的出现就很正常
===还有各种合理化建议也是已采纳的过时建议

截图202408280818179906.jpg

截图202408280818578850.jpg

点评

完全清楚了,谢谢大师指点。  发表于 2024-8-28 08:28
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2024-8-26 11:10:08 | 显示全部楼层
给 这个fc变量加上个volatile 试一试,,,
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 2024-8-26 17:59:46 | 显示全部楼层
本帖最后由 xxkj2010 于 2024-8-26 18:01 编辑
_奶*** 发表于 2024-8-26 11:10
给 这个fc变量加上个volatile 试一试,,,

没有作用。 我觉得是这个小工具生成的代码问题。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-8-26 22:05:14 | 显示全部楼层
本帖最后由 晓飛飛 于 2024-8-26 22:06 编辑

应该不是小工具的问题,这个是充分测试过了的,你的代码不完整,也许其它地方改变了定时器的配置,或者代码结构的问题,UART1的初始化用了哪个定时器做波特率发生器,有没有改写1T/12T寄存器,
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:213
  • 最近打卡:2025-04-23 20:59:03
已绑定手机

36

主题

560

回帖

1885

积分

荣誉版主

积分
1885
发表于 2024-8-27 01:03:43 | 显示全部楼层
可以确定的是小工具没有问题,生成的代码也没有问题,问题在于你。
首先,上结果:
用定时器0来实现1ms定时,串口1用定时器2做波特率发生器115200,然后每500ms实现LED取反闪烁并用串口输出信息。
回答1.JPG

从结果上看,如果没有异议,就继续往下看。
主程序很简单:
回答2.JPG

那么,到这里,先说LED的初始化:
回答3.JPG

然后是定时器0的初始化:
回答4.JPG

然后是串口1的初始化:
回答5.JPG

因为串口1初始化使用了定时器2,所以接着看定时器2的初始化:
回答6.JPG

ok,到这里while之前的都看了,
主循环里就干了3件事,一个是看定时500ms到没到,另两个是到了以后分别让led取反并完成串口打印。
500ms标志位怎么来的,看定时器0的中断:
回答7.JPG

至于led取反和串口打印,暂时假设你没有问题。
那么我们接着看你的问题:
从你的截图里,没看到你选择内部IRC,那猜测你是用的外部11.0592晶振。
那么一点点看下去,就剩下串口了,看看是不是也是12T模式,和你的定时器0一致?
你可以参照我贴的图看看你的问题。
至于你的fc计数,我没那么写过,但看着没问题。但是还可以更准确:≥20。

另再备注一下:
很公立的说一句,STC这个小工具,经过这么多年的发展和成熟,现在能被新手发现的关于计算的问题几乎没有,
出了问题,建议还是先找自己的问题或者哪怕不会就问,先把自己可能存在的问题都排除掉,那你就已经成熟一大截了。
加油!



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2024-8-27 02:59:46 | 显示全部楼层
xxkj*** 发表于 2024-8-26 17:59
没有作用。 我觉得是这个小工具生成的代码问题。

那就直接上个出问题的最简工程呗,,
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 2024-8-27 08:29:09 | 显示全部楼层
Yim_*** 发表于 2024-8-27 01:03
可以确定的是小工具没有问题,生成的代码也没有问题,问题在于你。
首先,上结果:
用定时器0来实现1ms定时 ...

你的芯片型号是STC12C5616AD吗?

点评

今天没看手册之前,昨天我以为你这个单片机是支持16位自动重载,那么如果支持16位自动重载,用哪一款测试都可以,看完手册搞半天都不支持16位自动,那选项就有问题。  详情 回复 发表于 2024-8-27 10:40
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:422
  • 最近打卡:2025-05-01 09:54:52
已绑定手机

19

主题

3190

回帖

4866

积分

论坛元老

积分
4866
发表于 2024-8-27 08:29:26 来自手机 | 显示全部楼层
定时器还不至于出问题吧
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 2024-8-27 08:31:13 | 显示全部楼层
本帖最后由 xxkj2010 于 2024-8-27 08:35 编辑
Yim_*** 发表于 2024-8-27 01:03
可以确定的是小工具没有问题,生成的代码也没有问题,问题在于你。
首先,上结果:
用定时器0来实现1ms定时 ...

我把TMOD &= 0xF0;        改成TMOD = 0x01;把AUXR &= 0x7F;        去掉,OK!

即初始化改为:
  1. void Timer0_Init(void)                //50毫秒@11.0592MHz
  2. {
  3.     TMOD = 0x01;
  4.     TH0 = 0x4C;
  5.     TL0 = 0x00;
  6.     ET0 = 1;
  7.     TR0 = 1;
  8. }
复制代码
反正问题就出现在这一句: TMOD &= 0xF0;

点评

看你这一条,问题是出在TMOD &= 0xF0;但是关联的问题在于使用这一句的问题上。 而且即便你下面这么写现在是OK, void Timer0_Init(void) //50毫秒@11.0592MHz { TMOD = 0x01; TH0 = 0x4C;  详情 回复 发表于 2024-8-27 10:45
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

积分
5204
发表于 2024-8-27 08:31:59 | 显示全部楼层
so*** 发表于 2024-8-27 08:29
定时器还不至于出问题吧

初始化语句的问题,定时器硬件方面绝对没有问题
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 04:13 , Processed in 0.174896 second(s), 119 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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