本帖最后由 zhange 于 2024-6-1 20:47 编辑
02-Timer0-Timer1-Timer2-Timer3-Timer4 原代码解读
- void Timer1_init(void)
- {
- TR1 = 0; //停止计数
-
- #if (Timer1_Reload < 64) // 如果用户设置值不合适, 则不启动定时器
- #error "Timer1设置的中断过快!"
-
- #elif ((Timer1_Reload/12) < 65536UL) // 如果用户设置值不合适, 则不启动定时器
- ET1 = 1; //允许中断
- // PT1 = 1; //高优先级中断
- TMOD &= ~0x30;
- TMOD |= (0 << 4); //工作模式, 0: 16位自动重装, 1: 16位定时/计数, 2: 8位自动重装
- // T1_CT = 1; //计数
- T1_CT = 0; //定时
- // T1CLKO = 1; //输出时钟
- T1CLKO = 0; //不输出时钟
-
- #if (Timer1_Reload < 65536UL)
- T1x12 = 1; //1T mode
- TH1 = (u8)((65536UL - Timer1_Reload) / 256);
- TL1 = (u8)((65536UL - Timer1_Reload) % 256);
- #else
- T1x12 = 0; //12T mode
- TH1 = (u8)((65536UL - Timer1_Reload/12) / 256);
- TL1 = (u8)((65536UL - Timer1_Reload/12) % 256);
- #endif
-
- TR1 = 1; //开始运行
-
- #else
- #error "Timer1设置的中断过慢!"
- #endif
- }
复制代码
主要是红色部分:
#if (Timer1_Reload < 65536UL)
T1x12 = 1; //1T mode
TH1 = (u8)((65536UL - Timer1_Reload) / 256);
TL1 = (u8)((65536UL - Timer1_Reload) % 256);
结合下边代码带进去计算
#define Timer1_Reload (MAIN_Fosc / 2000) //Timer 1 中断频率, 2000次/秒
Timer1_Reload = 24000000/2000 = 12000
TH1 = (u8)((65536UL - Timer1_Reload) / 256);
带进去就为 209.1 换为 十六进制 为0x D1
其实直接在isp设置多简单。。。。。。。。。。。。
|