标题1:定时器的使用
标题2:定时器中断服务函数
标题3:实例说明
标题4:实验总结
定时器的使用分为两部分-定时器的初始化、定时器中断服务函数。如下图:
定时器的初始化如下图,详细请看自己的开发板原理图:
中断服务函数的开启:
一般使用Timer0我们只需要EA=1、ET0=1,即可在初始化Timer0的基础上开启中断服务函数的使用,以下展示1ms定时下的Timer0定时器代码:
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初值
TH0 = 0xD4; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;// ET0 EA 为中断服务函数开启引脚 在STC那里复制过来的没有带这个,需注意
EA = 1;
一般情况下初始化定时器是不需要我们自己写的在仿真模拟器STC-ISP中有应用,但需要注意的是其中没有开启中断服务函数,这点需要我们自己加上。
实例说明(实现0-255数字在数码管的动态变化):
#include <STC15F2K60S2.H>
code unsigned char tab[] = { 0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xFF}; //常用数字的段 0 1 2...9 空
unsigned char D_Nixie[8]={10,10,10,10,10,10,10,10} ; //显示段选 默认10->0xff
unsigned char W_Nixie; //显示位选
unsigned char ms,count;
void display();
void cls_buzz() //关闭蜂鸣器
{
P2=(P2&0x1f)|0xa0;
P0=0x00;
P2&=0x1f;
}
void cls_led() //关闭LED
{
P2=(P2&0x1f)|0x80;
P0=0xff;
P2&=0x1f;
}
void Timer0Init(void) //Timer0定时器的初始化,1毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初值
TH0 = 0xD4; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;// ET0 EA 为中断服务函数开启引脚 在STC那里复制过来的没有带这个,需注意
EA = 1;
}
void Timer0Proc() interrupt 1 //中断服务函数,每1ms执行一次
{
if(++ms==200)
{
ms=0;
count++;
}
display();
}
void main()
{
Timer0Init();
cls_buzz();
cls_led();
while(1)
{
if(count>=100)
{
D_Nixie[0]=count/100; //"百位"
}
else
{
D_Nixie[0]=10;
}
if(count>=10)
{
D_Nixie[1]=count%100/10; //"十位"
}
else
{
D_Nixie[1]=10;
}
D_Nixie[2]=count%10; //"个位"
}
}
void display()
{
// 消影
P2=(P2&0x1f)|0xe0;
P0=0xff;
P2&=0x1f;
//位选
P2=(P2&0x1f)|0xc0;
P0=(1<<W_Nixie);
P2&=0x1f;
//段选
P2=(P2&0x1f)|0xe0;
P0=tab[D_Nixie[W_Nixie]];
P2&=0x1f;
//刷新
if(++W_Nixie==8)
{
W_Nixie=0;
}
}
中断服务函数说明:
unsigned char ms,count;
void Timer0_Proc() interrupt 1 //中断服务函数 不需要在main函数中引出,每1ms执行一次(初始化)
{
if(++ms==200) //200ms count+1
{
ms=0;
count++;
}
display(); //每1ms执行一次display(),这时我们只需在display()函数内写出我们的动态数码管
}
实验总结:定时器的使用分为初始化以及中断服务函数,在配置中需要注意。