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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
STC单片机定时器延时用官方程序快约5倍是什么原因?$ i& @% Y' r' Y7 [" d3 |
运行是正常的,就是延时快约5倍,定时器是1ms,中断1000次就应该是1秒了,但LED灯闪烁很快,我将中断修改到5000次,闪烁才象是1秒闪1次的样子,是那里出错了?3 W' l! j1 Z7 v7 v' \
  J: M1 o* Y, ~5 Z
  • 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++;
  • }
  • 1 H! I* j) e! [1 Z4 ]
' i2 K5 H1 o" Y+ c7 ]2 G* E
  S/ ]3 z! h& M! ]  g

  V/ O" T2 V* G4 ~" E

该用户从未签到

2#
发表于 2021-11-11 13:18 | 只看该作者
$ G$ S3 W/ |8 p
如果你了解汇编语句,会对你的理解有帮助。所以不懂汇编是不能称为精通单片机的。
& b0 ?5 W) M# o* a# Z* ^C语言t=1000中的t,在CPU中必须用两个字节来表示,不妨起个名子叫NH和NL。t=NH,NL
" d% s4 H  I: |' c你的主程序一直在等t=1000,也就等(NH,NL,16进制)=03E8H,但是CPU指令只能一个一个的判断,假设先判断NH=03,而后再判断NL=E8,逻辑上是没有毛病的。" F% t' w, ]& f8 I+ b, [- j7 H
你的中断是每1ms一次,中断发生时,你的程序运行到什么地方了呢?不太好确定吧,你的程序一直在等t=1000,估计多半会在此处中断。
; w: q1 K! U9 T( \# V注意,有个关键的特殊事件发生了,而且发生的概率还不了(程序不长)。
2 X( B: R8 b' F6 J8 t$ u- a中断发生在CPU已判断了NH,还未判定NL。而中断服务程序会做t++,也即(NH,NL)+1,这就修改NL的值,问题来了。
. ?' f4 ^# j$ K$ @0 r+ J0 s1 k例如:原先(NH,NL)=1000 = 03E8H,程序已确定NH=03,如果NL=E8,就反转LED灯。/ e3 m1 c* x% S, j9 K+ h$ C2 M
但是中断发生在NH=03判断之后,而NL还未判定,中断时你将t++,也即(NH,NL)++,变成了 03E9H,中断返回后,再判断NL却不是E8,而是E9了。
& j0 |8 Y- O7 z; V/ h如此,程序不会再做LED反转了。t将=1001,此后被加到65535,再回0,下次再加到1000。3 ?5 y4 y/ S1 k: g5 j
也即,只要t=1000时发生中断,如果中断发生在主程序判断:NH=03与NL=E8之间。则本次LED的显示,就会超出你的预期!而且t会走向65535,再回0。

该用户从未签到

3#
发表于 2021-11-11 13:38 | 只看该作者
4 B/ j8 W( c& A8 ^
晶振选对了吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-9 20:03 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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