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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
STC单片机定时器延时用官方程序快约5倍是什么原因?
- L1 q( O8 C2 k; q( c9 n运行是正常的,就是延时快约5倍,定时器是1ms,中断1000次就应该是1秒了,但LED灯闪烁很快,我将中断修改到5000次,闪烁才象是1秒闪1次的样子,是那里出错了?4 a/ w, n) x4 |  G' e

( V0 C! g0 Y3 @4 e" ~
  • 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++;
  • }
  • 8 h4 X* d* d  t- n3 X2 W# N7 P
1 g* k1 G* u1 f
! x; }# a- I' t
, K% k6 c: {/ ]6 {- |

该用户从未签到

2#
发表于 2021-11-11 13:18 | 只看该作者

8 Y: {; d% d5 r如果你了解汇编语句,会对你的理解有帮助。所以不懂汇编是不能称为精通单片机的。/ W  W+ R) `+ E
C语言t=1000中的t,在CPU中必须用两个字节来表示,不妨起个名子叫NH和NL。t=NH,NL
0 Q% H2 U( {* l3 U) u你的主程序一直在等t=1000,也就等(NH,NL,16进制)=03E8H,但是CPU指令只能一个一个的判断,假设先判断NH=03,而后再判断NL=E8,逻辑上是没有毛病的。
- h0 w* d) h5 f! i" g3 H) b' v你的中断是每1ms一次,中断发生时,你的程序运行到什么地方了呢?不太好确定吧,你的程序一直在等t=1000,估计多半会在此处中断。
2 Q$ V9 q: V0 u/ E  h$ v/ n! Y+ X注意,有个关键的特殊事件发生了,而且发生的概率还不了(程序不长)。
5 E( z1 X; n) A: T! b' c- T1 `中断发生在CPU已判断了NH,还未判定NL。而中断服务程序会做t++,也即(NH,NL)+1,这就修改NL的值,问题来了。
( i0 n1 D1 _7 v- s. ]例如:原先(NH,NL)=1000 = 03E8H,程序已确定NH=03,如果NL=E8,就反转LED灯。
2 T/ S& W8 @/ H+ G  p7 d但是中断发生在NH=03判断之后,而NL还未判定,中断时你将t++,也即(NH,NL)++,变成了 03E9H,中断返回后,再判断NL却不是E8,而是E9了。
: x) L$ ~2 f- k$ x( W. F如此,程序不会再做LED反转了。t将=1001,此后被加到65535,再回0,下次再加到1000。6 U6 P" h) g7 K' D4 ^  u  f" G
也即,只要t=1000时发生中断,如果中断发生在主程序判断:NH=03与NL=E8之间。则本次LED的显示,就会超出你的预期!而且t会走向65535,再回0。

该用户从未签到

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

( s* R" h  m7 X晶振选对了吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-21 19:31 , Processed in 0.062500 second(s), 23 queries , Gzip On.

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

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

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