您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 统计图表 > 51单片机定时器中断程序(C语言)
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进制为:0xFC18TH0=0xFC;TL0=0X18;定好初值后要延迟一秒就定一个延时参数,这里使用1000就行了(定时为1ms)中断程序为:timer0()interrupt1//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)*******************************************************************************************#includereg51.hsbitP0_0=P0^0;//个位数字sbitP0_1=P0^1;//十位数字voiddelay(intk);//Tab为数码管显示值,存入一个数组内unsignedcharge,shi,num,count;unsignedcharcodeTab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};voidmain(){TMOD=0x1;//T0,工作方式1TH0=0xb1;//20ms定时TL0=0xe0;TR0=1;//开启T0定时器ET0=1;//允许T0定时器中断EA=1;//开启总中断允许P2=Tab[0];P0_0=0;P0_1=0;//显示00num=0;//被显示的数置0while(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;//关闭个位显示}}voidtime0(void)interrupt1{TH0=0xb1;TL0=0xe0;count++;//计数值+1if(count==50)//加到50次即1秒{count=0;num++;//显示数据+1if(num==60){num=0;}}}voiddelay(intk){while(k--);}#includereg51.hvoidinit(void)//声明中断初始化{EA=1;//中断总开关EX0=1;//开中断0开关。中断1为,EX1=1;IT1=1;//采用边沿触发,下降沿有效。IT1=0为低电平触发中断。}main(){init();调用中断初始化函数=====主程序;}voidin_0(void)interrupt0//中断服务函数{====要服务的程序}
本文标题:51单片机定时器中断程序(C语言)
链接地址:https://www.777doc.com/doc-4293475 .html