标题: 请教朋友们,STC单片机计数器能每0.5秒计数一次吗? [打印本页]

作者: ZHAOBAO511    时间: 2022-6-13 08:25
标题: 请教朋友们,STC单片机计数器能每0.5秒计数一次吗?
如题,谢谢热心的朋友。

作者: 啤酒瓶子老大    时间: 2022-6-13 21:22
具体要做什么用呢?也可以计个0.05秒然后记10次啊。
作者: 逍遥111111    时间: 2022-6-14 07:55
如果是指定时器本身的设置的话好像最大是5ms,但是可以用条件指令,比如运行了100次才执行某个命令,这样子就是0.5s了

作者: datouyuan    时间: 2022-6-14 11:02
STC是51系列,定时器是16bit,时钟在1MHz时最长计时是65.536mS。
想要500ms,需要定时器时钟小于100kHz。查了下stc15手册,只有wkt能产生大于500ms定时,但误差较大。

我们一般采用2楼的方法产生需要的定时。
作者: ZHAOBAO511    时间: 2022-6-14 11:10
啤酒瓶子老大 发表于 2022-6-13 21:22
具体要做什么用呢?也可以计个0.05秒然后记10次啊。

您好,0.05秒一次,中断中+1都要几微秒,咋保证精度?
作者: lzzasd    时间: 2022-6-14 14:47
ZHAOBAO511 发表于 2022-6-14 11:10
您好,0.05秒一次,中断中+1都要几微秒,咋保证精度?

使用定时器0,优先级别设最高,中断只加1,周期就很准了,要求再高的可以用外部时间模块
作者: 啤酒瓶子老大    时间: 2022-6-14 19:30
看具体做什么用了。有些情况,要求不用太高,可以用示波器精确调整。也要看程序的逻辑。
要求太高的用汇编。
作者: 新昌小徐    时间: 2022-6-14 21:44
晶振频率是12M,定时器计时频率为1M,就是10^6HZ,1秒等于10^6微秒,所以定时器计时一次就是1微秒,把定时器设成模式1,16位定时器,计时50000次就是50毫秒,那么定时器的初值是65536-50000=15536,转成十六进制数就是3CB0,开定时器,开总中断,开定时器中断,在中断处理程序中定义一个静态变量,每产生一次中断,加1,判断是否是10,变成0,同时使0.5定时器加1,因为在定时中断中要重新赋值,又要保存中断前的数据,等等,所以间隔是大于50毫秒的,可以在keil软件中模拟,调节定时器的初值,从而使定时更精确。
你也可以让它走个几天几夜,然后算一下走快了多少秒,再补上就是了,修正后的初值大于理论初值的。
作者: ZHAOBAO511    时间: 2022-6-15 10:21
lzzasd 发表于 2022-6-14 14:47
使用定时器0,优先级别设最高,中断只加1,周期就很准了,要求再高的可以用外部时间模块

谢谢,我试试看。
作者: ZHAOBAO511    时间: 2022-6-15 10:22
啤酒瓶子老大 发表于 2022-6-14 19:30
看具体做什么用了。有些情况,要求不用太高,可以用示波器精确调整。也要看程序的逻辑。
要求太高的用汇编 ...

谢谢,目前只能用C。
作者: ZHAOBAO511    时间: 2022-6-15 10:23
新昌小徐 发表于 2022-6-14 21:44
晶振频率是12M,定时器计时频率为1M,就是10^6HZ,1秒等于10^6微秒,所以定时器计时一次就是1微秒,把定时器 ...

谢谢,很详细,后面试试看。
作者: yueguang3048    时间: 2022-6-15 10:47
也就500us嘛,简单的一比;再者准不准看你系统的晶振嘛。
作者: ZHAOBAO511    时间: 2022-6-16 17:28
yueguang3048 发表于 2022-6-15 10:47
也就500us嘛,简单的一比;再者准不准看你系统的晶振嘛。

应该是写错了,0,5微秒
作者: wulin    时间: 2022-6-16 21:10
ZHAOBAO511 发表于 2022-6-14 11:10
您好,0.05秒一次,中断中+1都要几微秒,咋保证精度?

用自动重装模式,不影响计时周期。如果对时间精度要求高再加、减修正值
void Timer0Init(void)//100微秒@12.000MHz
{
        AUXR |= 0x80;        //定时器时钟1T16位自动重装模式
        TMOD &= 0xF0;        //设置定时器模式
        TL0 = 0x50;                //设置定时初始值
        TH0 = 0xFB;                //设置定时初始值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
        EA  = 1;
        ET0 = 1;
}
void Timer0Interrupt(void) interrupt 1
{
        static int count=0;
        if(++count>=(5000+x))//0.5s x=修正值
        {
                count=0;
                num++;
        }
}
作者: 枫叶残林    时间: 2022-6-16 22:03
需要看具体的用途。有些情况,要求不需要太高。
作者: 151版本    时间: 2022-6-16 22:33
定时器小精灵控制呀

作者: ZHAOBAO511    时间: 2022-6-17 08:41
wulin 发表于 2022-6-16 21:10
用自动重装模式,不影响计时周期。如果对时间精度要求高再加、减修正值
void Timer0Init(void)//100微秒 ...

谢谢,还真是这样。
作者: ZHAOBAO511    时间: 2022-6-17 08:41
枫叶残林 发表于 2022-6-16 22:03
需要看具体的用途。有些情况,要求不需要太高。

有些地方必须这样做,谢谢
作者: 郑汉松    时间: 2022-6-17 09:18
直接0.5秒计数一次是不行的,一般是定时器定时0.05秒,累计十次0.5秒
作者: ZHAOBAO511    时间: 2022-6-17 09:39
郑汉松 发表于 2022-6-17 09:18
直接0.5秒计数一次是不行的,一般是定时器定时0.05秒,累计十次0.5秒

好的,谢谢。
作者: xiaoyuxinke    时间: 2022-6-17 18:06
可以的,实现的方法很多,可以0.1秒计5次,也可以0.01秒计50次,还可以0.05秒计10次,看你怎么搞了.
作者: ZHAOBAO511    时间: 2022-6-18 08:05
xiaoyuxinke 发表于 2022-6-17 18:06
可以的,实现的方法很多,可以0.1秒计5次,也可以0.01秒计50次,还可以0.05秒计10次,看你怎么搞了.

好的,谢谢




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1