N76E003使用定时器进行1ms定时操作
新唐单片机N76E003具有定时器中断,下面开始进行定时
#define TH0_INIT 32768 //初始化1ms延时 #define TL0_INIT 32768 // 预定时间(s) * (系统时钟/预分频) //*********定时器0初始化*********// TMOD = 0XFF; TIMER0_MODE1_ENABLE; //定时器0模式1使能 clr_T0M; set_T0M; //定时器0的时钟选择为系统时钟 u8TH0_Tmp = (65536-TH0_INIT)/256; //计算高低八位初值 u8TL0_Tmp = (65536-TL0_INIT)%256; TH0 = u8TH0_Tmp; //定时器初始化初值 TL0 = u8TL0_Tmp; set_ET0; //定时器0使能 set_EA; //总中断使能 set_TR0; //开启定时器0中断
是这样进行配置的,系统时钟设置为内部16MHz, 所以周期等于1/16us,0000H—FFFFH=65536 溢出一次*1/16us约等于4.096ms。设定时器初始值为一半,也就是大约2ms。
但是要注意,如果不设定时器时钟为系统时钟:set_T0M; ,那么系统时钟默认为1/12系统时钟,也就是进行时钟分频。
当系统时钟默认为1/12系统时钟时,配置为
//*********定时器0初始化*********// TMOD = 0XFF; TIMER0_MODE1_ENABLE; //定时器0模式1使能 clr_T0M; u8TH0_Tmp = TIMER_DIV12_VALUE_1ms/256; //计算高低八位初值 u8TL0_Tmp = TIMER_DIV12_VALUE_1ms%256; TH0 = u8TH0_Tmp; //定时器初始化初值 TL0 = u8TL0_Tmp; set_ET0; //定时器0使能 set_EA; //总中断使能 set_TR0; //开启定时器0中断
而 TIMER_DIV12_VALUE_1ms 来自于新唐自带的工程里。相关宏定义在 Function_define.h 里。
#ifdef FOSC_110592 // if Fsys = 11.0592MHz #define TIMER_DIV12_VALUE_10us 65536-9 //9*12/11.0592 = 10 uS, // Timer divider = 12 for TM0/TM1 #define TIMER_DIV12_VALUE_1ms 65536-923 //923*12/11.0592 = 1 mS // Timer divider = 12 #define TIMER_DIV12_VALUE_10ms 65536-9216 //18432*12/22118400 = 10 ms // Timer divider = 12 #define TIMER_DIV4_VALUE_10us 65536-28 //28*4/11.0592 = 10 uS // Timer divider = 4 for TM2/TM3 #define TIMER_DIV4_VALUE_1ms 65536-2765 //2765*4/11.0592 = 1 mS // Timer divider = 4 #define TIMER_DIV4_VALUE_100us 65536-277 //553*4/22118400 = 100 us // Timer divider = 4 #define TIMER_DIV4_VALUE_200us 65536-553 //1106*4/22118400 = 200 us // Timer divider = 4 #define TIMER_DIV4_VALUE_500us 65536-1383 //2765*4/22118400 = 500 us // Timer divider = 4 #define TIMER_DIV16_VALUE_10ms 65536-6912 //1500*16/22118400 = 10 ms // Timer divider = 16 #define TIMER_DIV64_VALUE_30ms 65536-5184 //10368*64/22118400 = 30 ms // Timer divider = 64 #define TIMER_DIV128_VALUE_100ms 65536-8640 //17280*128/22118400 = 100 ms // Timer divider = 128 #define TIMER_DIV128_VALUE_200ms 65536-17280 //34560*128/22118400 = 200 ms // Timer divider = 128 #define TIMER_DIV256_VALUE_500ms 65536-21600 //43200*256/22118400 = 500 ms // Timer divider = 256 #define TIMER_DIV512_VALUE_1s 65536-21600 //43200*512/22118400 = 1 s // Timer divider = 512 #endif
分类:
单片机
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)