找回密码
 注册
关于网站域名变更的通知
查看: 222|回复: 2
打印 上一主题 下一主题

STC单片机定时器延时用官方程序快约5倍是什么原因?

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-11-11 11:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
STC单片机定时器延时用官方程序快约5倍是什么原因?
- k/ E& E7 b& I* [1 O运行是正常的,就是延时快约5倍,定时器是1ms,中断1000次就应该是1秒了,但LED灯闪烁很快,我将中断修改到5000次,闪烁才象是1秒闪1次的样子,是那里出错了?) r' @/ T. D" T; b, }

: S8 a8 k$ \4 T' k
  • unsigned int t;
  • sbit led=P2^0;
  • void Timer0Init(void)                //1毫秒@18.432MHz
  • {
  •         AUXR |= 0x80;                //定时器时钟1T模式
  •         TMOD &= 0xF0;                //设置定时器模式
  •         TL0 = 0x00;                //设置定时初始值
  •         TH0 = 0xB8;                //设置定时初始值
  •         TF0 = 0;                //清除TF0标志
  •         TR0 = 1;                //定时器0开始计时
  •   ET0=1;//打开定时器1中断允许
  •   EA=1;//打开总中断
  • }
  • void main()
  • {
  •         Timer0Init();//定时器0初始化
  •         while(1)
  •         {
  •                 if(t == 1000)    //中断1000*1ms=1s
  •                 {
  •                         t=0;
  •                         led=~led;
  •                 }
  •         }
  • }
  • void Timer0() interrupt 1
  • {
  •         TL0 = 0x00;                //设置定时初始值
  •         TH0 = 0xB8;                //设置定时初始值
  •         t++;
  • }

  • % y) z/ a5 A' R
7 W- t0 Q2 _( \/ P
1 g# {) J0 w; R/ n0 X! }4 i
& {7 u2 Q7 p' i( X! a

该用户从未签到

2#
发表于 2021-11-11 13:18 | 只看该作者
+ `" ?, V2 w( G0 d7 a6 r+ E
如果你了解汇编语句,会对你的理解有帮助。所以不懂汇编是不能称为精通单片机的。% b& }7 n: I, W- L
C语言t=1000中的t,在CPU中必须用两个字节来表示,不妨起个名子叫NH和NL。t=NH,NL
+ z+ P+ P# I/ p' D$ y8 y9 L你的主程序一直在等t=1000,也就等(NH,NL,16进制)=03E8H,但是CPU指令只能一个一个的判断,假设先判断NH=03,而后再判断NL=E8,逻辑上是没有毛病的。
) p6 q# |( v# F! t你的中断是每1ms一次,中断发生时,你的程序运行到什么地方了呢?不太好确定吧,你的程序一直在等t=1000,估计多半会在此处中断。
8 n# c& R0 s& h+ ?3 G. g注意,有个关键的特殊事件发生了,而且发生的概率还不了(程序不长)。
% `# h: p* O2 U5 y中断发生在CPU已判断了NH,还未判定NL。而中断服务程序会做t++,也即(NH,NL)+1,这就修改NL的值,问题来了。% e( p6 u) b) G. B; b8 C: C
例如:原先(NH,NL)=1000 = 03E8H,程序已确定NH=03,如果NL=E8,就反转LED灯。
1 B$ G& H! Z8 l/ B但是中断发生在NH=03判断之后,而NL还未判定,中断时你将t++,也即(NH,NL)++,变成了 03E9H,中断返回后,再判断NL却不是E8,而是E9了。
( ]) g% k6 U, v如此,程序不会再做LED反转了。t将=1001,此后被加到65535,再回0,下次再加到1000。
) K- A5 H# t$ d1 C0 Z, ^7 f. g也即,只要t=1000时发生中断,如果中断发生在主程序判断:NH=03与NL=E8之间。则本次LED的显示,就会超出你的预期!而且t会走向65535,再回0。

该用户从未签到

3#
发表于 2021-11-11 13:38 | 只看该作者

9 ^; P. w- e3 e7 C晶振选对了吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-14 04:46 , Processed in 0.109375 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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