15单片机定时器0配置
学会偷懒,直接在STC-ISP里计算好,复制粘贴即可
定时长度最大应该是5.925ms,就按最大定时时间是5ms来算
配置如下:
如果选择16位自动重载模式,就可以不在中断里重新赋值 (重新赋值应该也没关系)
1秒精准定时程序
1s精准定时,用数码管显示不同数字来提现
定时器0初始化
新建一个Timer0.c和Timer0.h文件,将下面这段代码粘过去即可
1. void Timer0_Init(void) 2. { 3. //5ms 定时器0 16位自动重载 1T 4. AUXR |= 0x80; //定时器时钟1T模式 5. TMOD &= 0xF0; //设置定时器模式 6. TL0 = 0x00; //设置定时初始值 7. TH0 = 0x28; //设置定时初始值 8. TF0 = 0; //清除TF0标志 9. TR0 = 1; //定时器0开始计 10. ET0 = 1; 11. EA = 1; 12. } 13. 14. /*定时器0中断服务函数模板 15. void Timer0_Rountine(void) interrupt 1 16. { 17. static unsigned int Count0; 18. 19. //自动重载模式就不需要加这两句 20. // TL0 = 0x00; //设置定时初始值 21. // TH0 = 0x28; //设置定时初始值 22. 23. Count0++; 24. if(Count0 >= 200) 25. { 26. //执行操作 27. Count0 = 0; //软件复位 28. } 29. } 30. */
与51单片机不同的是 15单片机要配置 AUXR|= 0x80; //定时器时钟1T模式
15的运行速率就比51单片机提升12倍,但是51单片机最大定时时间比15长
定时器0中断服务子函数
1. void Timer0_Rountine(void) interrupt 1 2. { 3. static unsigned int Count0; 4. static unsigned char i = 0; 5. 6. // 自动重载,不用加这两句了 7. // TL0 = 0x00; //设置定时初始值 8. // TH0 = 0x28; //设置定时初始值 9. 10. Count0++; 11. if(Count0 >= 200) //200*5ms = 1s 12. { 13. P0 = tab[i]; 14. i++; 15. if(i>=18) i = 0; //越界复位 16. Count0 = 0; //软件复位 17. } 18. }
在中断里进行控制,中断定时时间是5毫秒,想要定时1秒,就需要200个5ms
在中断服务函数里定义一个静态局部变量Count0,每5ms进一次中断,Count0就++
用if判断,直到Count0加到200,控制函数就写将数码管从0...9~A...F依次显示出来
主函数
1. #include <STC15F2K60S2.H> 2. #include "Timer0.h" 3. 4. /*共阳极码表 ABCDEF都是大写*/ 5. unsigned char tab[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x80, 0xC6, 0xC0, 0x86, 0x8E, 0xBF, 0xFF}; 6. //0 1 2 3 4 5 6 7 8 9 A B C D E F - 灭 7. 8. 9. void main() 10. { 11. P2 = 0xA0; P0 = 0x00; P2 = 0xC0; P0 = 0xFF; P2 = 0xFF; //初始化,P0控制数码管 12. Timer0_Init(); 13. while(1) 14. { } 15. }