51单片机定时器中断程序(c语言) )。
程序:延迟1s
方法:1.汇编的实现影响程序的运行速度2 .中断比较快
要用c语言实现,必须首先定义计时器的初始值
无论使用多大的石英晶体振动,使用51单片机,通常可以分频12分钟,产生机器的周期
设机械周期=12/n(n是指石英振动频率)、施加计时器的时间为m
那么,定时的初始值如下
M/机器周期=初始值
th0=(65536-初始值) %6;
TL0=(65536-初始值)/256;
将(65536-初始值)得到的值进行十六进制化后,其上位比特为TH0的值,下位比特为TL0的值
例如,如果使用12M石英振动计算1ms的时序,则如下。
机器循环=12/12*10^6=1us (微秒)
定时初始值=(1*10^-3 )/)/(1*10^-6 )=1000;
因此,th0=(65536-1000 ) %6;
TL0=(65536-1000 )/256;
将65536-1000=64536设置为十六进制表示0xFC18
TH0=0xFC;
TL0=0X18;
决定初始值后,要延迟1秒,请决定延迟参数。 在这里用1000就可以了。 (定时为1ms )中断程序如下。
timer0 ) )中断1//1ms的延迟(12.0MHz ) ) ) ) ) )。
{
TR0=0;
ET0=0;
TH0=0xfc;
TL0=0x18;
延迟时间S1!=0)延迟时间S1--;
TR0=1;
ET0=1;
}
调用程序大致如下
if(delay_flag==0) ) ) )。
{
delay_flag=1;
延迟时间S1=1000;
}
if (延迟时间S1==0) ) ) ) ) )。
{
delay_flag=0;
在这里写上到定时的操作就可以了;
}
(主程序中为delay_ms ) )这样的程序会影响程序的执行速度。 使用中断时不能。
定时器初始值计算小工具http://doc.xuehai.net/soft/Cun/2009/2009032018855.html
计时器计数00-59(p0连接8的是数码管的位选择端子ds1-ds8,P2连接8位数码管的段代码A-H ) )。
* * * * * * * * * * * * * * * * *
#包含
sbit P0_0=P0^0; //一位数字
sbit P0_1=P0^1; //10位数字
Void延迟(Intk ); //Tab是数码管的显示值,存储在一个数组中
unsigned char ge,shi,num,count;
unsigned char code Tab[]={0x3F,0x 06,0x5b,0x4F,0x 66,0x6d,0x 07 f,0x 77,0x7c,0x 39,0x5e,0x7D
Void主() )
{
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;//取出10位
ge=num; //取出一位
P0_0=1; P0_1=1; //关闭显示
P2=Tab[shi]; //P2端口发送10位数据显示代码
P0_0=0; 打开//10位显示
延迟(1000; //延迟
P0_0=1; //关闭显示
P2=Tab[ge]; //P2端口发送位数据显示代码
P0_1=0;