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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
STC单片机定时器延时用官方程序快约5倍是什么原因?
' `2 u' ~% C! _/ k运行是正常的,就是延时快约5倍,定时器是1ms,中断1000次就应该是1秒了,但LED灯闪烁很快,我将中断修改到5000次,闪烁才象是1秒闪1次的样子,是那里出错了?
. O2 O$ s1 c- f. `' i# A/ u. a. g  B! e2 R' T1 J6 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++;
  • }
  •   v3 r7 q8 N8 i% C4 r( j
& d; H3 I# C5 l6 j
( r) R1 W8 V+ m
2 m4 v+ T$ `/ a& Y) O0 ]3 a7 T

该用户从未签到

2#
发表于 2021-11-11 13:18 | 只看该作者
4 t5 T" @& N- H# p. o& K  g: L
如果你了解汇编语句,会对你的理解有帮助。所以不懂汇编是不能称为精通单片机的。3 h! q: ~1 D/ B7 T$ p
C语言t=1000中的t,在CPU中必须用两个字节来表示,不妨起个名子叫NH和NL。t=NH,NL
) M, n& {4 M1 ?. {你的主程序一直在等t=1000,也就等(NH,NL,16进制)=03E8H,但是CPU指令只能一个一个的判断,假设先判断NH=03,而后再判断NL=E8,逻辑上是没有毛病的。
" o# T: s0 @; B- {你的中断是每1ms一次,中断发生时,你的程序运行到什么地方了呢?不太好确定吧,你的程序一直在等t=1000,估计多半会在此处中断。; F# n. \& q% L$ r; i
注意,有个关键的特殊事件发生了,而且发生的概率还不了(程序不长)。
8 D5 V( L: d+ b  [3 N! i3 A6 c, T, I中断发生在CPU已判断了NH,还未判定NL。而中断服务程序会做t++,也即(NH,NL)+1,这就修改NL的值,问题来了。, p) ^; m7 J% S5 k
例如:原先(NH,NL)=1000 = 03E8H,程序已确定NH=03,如果NL=E8,就反转LED灯。
- B5 H! Z( Q( R  E但是中断发生在NH=03判断之后,而NL还未判定,中断时你将t++,也即(NH,NL)++,变成了 03E9H,中断返回后,再判断NL却不是E8,而是E9了。  R9 @2 Q' C  [+ p+ j1 y+ X
如此,程序不会再做LED反转了。t将=1001,此后被加到65535,再回0,下次再加到1000。9 o: o+ U. S$ B/ D
也即,只要t=1000时发生中断,如果中断发生在主程序判断:NH=03与NL=E8之间。则本次LED的显示,就会超出你的预期!而且t会走向65535,再回0。

该用户从未签到

3#
发表于 2021-11-11 13:38 | 只看该作者
* @/ c- _% W3 s+ {
晶振选对了吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-19 21:28 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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