51单片机定时器中断程序(C语言)
用C语言实现的,先要定义好定时器的初值
不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期
机器周期=12/n(n指晶振频率),假设你要定时的时间为M
那么定时的初值为:
M/机器周期=初值;
TH0=(65536-初值)%256;
TL0=(65536-初值)/256;
将(65536-初值)所得的值化成16进制,其高位就是TH0的值,低位为TL0的值
例如用12M晶振做1ms定时计算如下:
机器周期=12/12*10^6=1us(微秒)
定时初值=(1*10^-3)/(1*10^-6)=1000;
所以:TH0=(65536-1000)%256;
TL0=(65536-1000)/256;
将65536-1000=64536化为16进制为:0xFC18
TH0=0xFC;
TL0=0X18;
定好初值后要延迟一秒就定一个延时参数,这里使用1000就行了(定时为1ms)中断程序为:
timer0() interrupt 1 // 1ms延时(12.0MHz)
{
TR0=0;
ET0=0;
TH0=0xfc;
TL0=0x18;
if(delayTimes1!=0) delayTimes1--;
TR0=1;
ET0=1;
}
调用程序大致为:
if(delay_flag==0)
{
delay_flag=1;
delayTimes1=1000;
}
if(delayTimes1==0)
{
delay_flag=0;
这里写定时到的操作就行了;
}
(在主程序中使用delay_ms()这样的程序会影响程序运行速度的,使用中断就不会)
定时器计数00-59(P0接8为数码管位选端ds1-ds8,P2接8位数码管的段码A-H)
*******************************************************************************************
#include
sbit P0_0=P0^0; //个位数字
sbit P0_1=P0^1; //十位数字
void delay(int k); //Tab为数码管显示值,存入一个数组内
unsigned char ge,shi,num,count;
unsigned char code Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
void main()
{
TMOD=0x1; //T0,工作方式1
TH0=0xb1; //20ms定时
TL0=0xe0;
TR0=1; //开启T0定时器
ET0=1; //允许T0定时器中断
EA=1; //开启总中断允许
P2=Tab[0];P0_0=0;P0_1=0;//显示00
num=0; //被显示的数置0
while(1) //一直调用显示,等待T0中断修改显示数据
{
shi=num/10; //取出十位数
ge=num%10; //取出个位数
P0_0=1;P0_1=1; //关闭显示
P2=Tab[shi]; //P2口送出十位数据显示代码
P0_0=0; //打开十位显示
delay(1000); //延时
P0_0=1; //关闭显示
P2=Tab[ge]; //P2口送出个位数据显示代码
P0_1=0; //打开个位显示
delay(1000); //延时
P0_1=1; //关闭个位显示
}
}
void time0(void) interrupt 1
{
TH0=0xb1;
TL0=0xe0;
count++; //计数值+1
if(count==50) //加到50次即1秒
{ count=0;
num++; //显示数据+1
if(num==60)
{ num=0; }
}
}
void delay(int k)
{
while(k--);
}
#include
void init(void)//声明中断初始化
{ EA=1;//中断总开关
EX0=1;//开中断0开关。中断1为,EX1=1;
IT1=1;//采用边沿触发,下降沿有效。IT1=0为低电平触发中断。
}
main()
{ init();调用中断初始化函数
==
===主程序;
}
void in_0(void)interrupt 0//中断服务函数
{ ==
==要服务的程序
}