找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1779|回复: 21
收起左侧

请教朋友们,STC单片机计数器能每0.5秒计数一次吗?

  [复制链接]
ID:899981 发表于 2022-6-13 08:25 | 显示全部楼层 |阅读模式
如题,谢谢热心的朋友。
回复

使用道具 举报

ID:230742 发表于 2022-6-13 21:22 | 显示全部楼层
具体要做什么用呢?也可以计个0.05秒然后记10次啊。
回复

使用道具 举报

ID:958776 发表于 2022-6-14 07:55 | 显示全部楼层
如果是指定时器本身的设置的话好像最大是5ms,但是可以用条件指令,比如运行了100次才执行某个命令,这样子就是0.5s了
回复

使用道具 举报

ID:887371 发表于 2022-6-14 11:02 | 显示全部楼层
STC是51系列,定时器是16bit,时钟在1MHz时最长计时是65.536mS。
想要500ms,需要定时器时钟小于100kHz。查了下stc15手册,只有wkt能产生大于500ms定时,但误差较大。

我们一般采用2楼的方法产生需要的定时。
回复

使用道具 举报

ID:899981 发表于 2022-6-14 11:10 | 显示全部楼层
啤酒瓶子老大 发表于 2022-6-13 21:22
具体要做什么用呢?也可以计个0.05秒然后记10次啊。

您好,0.05秒一次,中断中+1都要几微秒,咋保证精度?
回复

使用道具 举报

ID:514317 发表于 2022-6-14 14:47 | 显示全部楼层
ZHAOBAO511 发表于 2022-6-14 11:10
您好,0.05秒一次,中断中+1都要几微秒,咋保证精度?

使用定时器0,优先级别设最高,中断只加1,周期就很准了,要求再高的可以用外部时间模块
回复

使用道具 举报

ID:230742 发表于 2022-6-14 19:30 | 显示全部楼层
看具体做什么用了。有些情况,要求不用太高,可以用示波器精确调整。也要看程序的逻辑。
要求太高的用汇编。
回复

使用道具 举报

ID:496636 发表于 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软件中模拟,调节定时器的初值,从而使定时更精确。
你也可以让它走个几天几夜,然后算一下走快了多少秒,再补上就是了,修正后的初值大于理论初值的。
回复

使用道具 举报

ID:899981 发表于 2022-6-15 10:21 | 显示全部楼层
lzzasd 发表于 2022-6-14 14:47
使用定时器0,优先级别设最高,中断只加1,周期就很准了,要求再高的可以用外部时间模块

谢谢,我试试看。
回复

使用道具 举报

ID:899981 发表于 2022-6-15 10:22 | 显示全部楼层
啤酒瓶子老大 发表于 2022-6-14 19:30
看具体做什么用了。有些情况,要求不用太高,可以用示波器精确调整。也要看程序的逻辑。
要求太高的用汇编 ...

谢谢,目前只能用C。
回复

使用道具 举报

ID:899981 发表于 2022-6-15 10:23 | 显示全部楼层
新昌小徐 发表于 2022-6-14 21:44
晶振频率是12M,定时器计时频率为1M,就是10^6HZ,1秒等于10^6微秒,所以定时器计时一次就是1微秒,把定时器 ...

谢谢,很详细,后面试试看。
回复

使用道具 举报

ID:45879 发表于 2022-6-15 10:47 | 显示全部楼层
也就500us嘛,简单的一比;再者准不准看你系统的晶振嘛。
回复

使用道具 举报

ID:899981 发表于 2022-6-16 17:28 | 显示全部楼层
yueguang3048 发表于 2022-6-15 10:47
也就500us嘛,简单的一比;再者准不准看你系统的晶振嘛。

应该是写错了,0,5微秒
回复

使用道具 举报

ID:213173 发表于 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++;
        }
}
回复

使用道具 举报

ID:1035268 发表于 2022-6-16 22:03 | 显示全部楼层
需要看具体的用途。有些情况,要求不需要太高。
回复

使用道具 举报

ID:718880 发表于 2022-6-16 22:33 | 显示全部楼层
定时器小精灵控制呀
回复

使用道具 举报

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

谢谢,还真是这样。
回复

使用道具 举报

ID:899981 发表于 2022-6-17 08:41 | 显示全部楼层
枫叶残林 发表于 2022-6-16 22:03
需要看具体的用途。有些情况,要求不需要太高。

有些地方必须这样做,谢谢
回复

使用道具 举报

ID:514901 发表于 2022-6-17 09:18 | 显示全部楼层
直接0.5秒计数一次是不行的,一般是定时器定时0.05秒,累计十次0.5秒
回复

使用道具 举报

ID:899981 发表于 2022-6-17 09:39 | 显示全部楼层
郑汉松 发表于 2022-6-17 09:18
直接0.5秒计数一次是不行的,一般是定时器定时0.05秒,累计十次0.5秒

好的,谢谢。
回复

使用道具 举报

ID:61140 发表于 2022-6-17 18:06 | 显示全部楼层
可以的,实现的方法很多,可以0.1秒计5次,也可以0.01秒计50次,还可以0.05秒计10次,看你怎么搞了.
回复

使用道具 举报

ID:899981 发表于 2022-6-18 08:05 | 显示全部楼层
xiaoyuxinke 发表于 2022-6-17 18:06
可以的,实现的方法很多,可以0.1秒计5次,也可以0.01秒计50次,还可以0.05秒计10次,看你怎么搞了.

好的,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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