定时器的实现(1)

package test;
/**
 * code by miaoXiaoQiang
 */
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;




public class TimingTest {
    public static void main (String [] args){
        // Java接口 java.util.concurrent.ScheduledExecutorService
        ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
        //以固定的频率执行多线程(FixedRate固定的频率)
        //这样线程会以每1000毫秒为单位一直执行下去
        executorService.scheduleAtFixedRate(new Runnable() {
            
            @Override
            public void run() {
                System.out.println("run : " + System.currentTimeMillis());
            }
        }, 0, 1000, TimeUnit.MILLISECONDS);
    }
}
实现1us的定时器需要考虑到计时器的精度、分频系数、以及计时器的时钟源等多个因素。对于大部分的通用单片机,其内部的计时器/计数器模块一般都是由时钟源经过一定的分频器之后再进行计数的。因此,要实现1us的定时器,需要根据具体的单片机芯片手册,计算出计时器所需的分频系数和时钟源的频率。 以STC89C52单片机为例,其内部定时器的时钟源为晶振的1/12倍,即12MHz晶振下计时器时钟为1MHz,而单片机的指令周期为12个时钟周期,即每个指令需要12us才能执行完毕。因此,要实现1us的定时器,需要使用定时器的最小计数单位——1us,以及设置计时器的重载值。具体实现过程可以参考以下代码: ```c #include <reg52.h> sbit LED = P1^0; void Timer0_Init() // 定时器0初始化 { TMOD &= 0xF0; // 清零计时器0模式位 TMOD |= 0x01; // 设置计时器0为模式1,16位定时器 TH0 = 0xFC; // 设置定时器0重载值,计时器初值为65536-500=0xFDFC TL0 = 0x67; ET0 = 1; // 开启定时器0中断 TR0 = 1; // 启动定时器0 EA = 1; // 开启总中断 } void main() { LED = 0; // 初始状态为LED灭 Timer0_Init(); // 定时器初始化 while(1); // 程序进入死循环 } void Timer0_ISR() interrupt 1 // 定时器0中断服务函数 { static uint16_t i = 0; TH0 = 0xFC; // 重新设置定时器0重载值 TL0 = 0x67; i++; if (i >= 500) // 每500us反转一次LED状态 { LED = ~LED; i = 0; } } ``` 上述代码中,定时器0的重载值为0xFDFC,即65536-500=0xFDFC,每次计时器计数到0xFDFC时会自动溢出并触发定时器0中断,中断服务函数中重新设置计时器的重载值,以实现定时器的精确计时。同时,我们在中断服务函数中使用一个计数变量i,每计数到500就反转一次LED的状态,从而实现每500us反转一次LED的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值