50Ms初值50000*11.0592/12=46080你算错了 |
可能程序自身有延迟 |
你这个同时用代码延时和中断延时肯定会有误差的,因为当中断到来时,delay语句必定会因为中断停止自加的。每来一次中断delay语句那里就会停止一次,久而久之,蜂鸣器响的时间会越来越长。 |
delay(250);这句完全多余,if(num==1200)本身就是延迟的意思。 |
Y_G_G 发表于 2021-9-7 23:12 谢谢!稍后我修改代码再试。 |
我下载了原本没有的“STC89C5xRC.H”,之后试过你改写的代码,精度更高了,谢谢。 |
定时器可以这么用,但你的代码本身就是错误的 if(num==1200); num是全局变量,而且是在中断中增加的,随时会变的 如果是在比较if(num==1200)的过程中num的值刚好增加 而且,你之后有代码又有延时,不知道延时不多长,但定时器可是自动加载工作的,num的值是一直在变化的 错过了if(num==1200),比如大于,那就是会一直加到65535然后,归零之后再加.... 你可以改成if(num>=1200)试一下 下面的延时改动一下,它会影响闪灯的时间 |
|
尽量少用循环语句实现的软件延时,时间会被中断打乱。 |
xianfajushi 发表于 2021-9-7 19:05 感谢你的指导。 |
wulin 发表于 2021-9-7 18:47 试过你改写的代码了,发光管隔1秒一亮,响声始终是短暂的,符合预期。时间精度也高多了,估计是不使用时钟模块所能达到的最高精度。 谢谢。稍后我去理解你写的代码。 |
提几个小建议, 1, STC89C52RC 是有 T2 定时器, 并且支持自动重载功能的。STCMCU点COM 上面有手册可以下载。用那个会准的多。 2,STC89C52RC 的T2L, T2H 支持 SFR16 的定义, 可以直接接收 双字节的赋值 3,不知道你用的什么编译器,在51单片机很多编译器中,unsigned int 是 单字节的 等同于 unsigned char, 如果你要确保是双字节的 最好用 unsigned short num; 来声明 num变量。 最后说一下,不要把C++的很多习惯带到单片机里来, 最好用最保险的 CHAR SHORT LONG 来定义 单,双,四字节,绝对不会有歧义。INT这种 可单可双还可四的最好不要用。 |
受中断响应速度影响,合理的程序可能影响小些也是有影响的,因此才有时钟芯片。 |
定时器中断周期越短越容易调整精度
|