欢迎光临~啄木鸟电子科技

技术交流

软件:51单片机 定时器 中断程序 (C语言)

////////////////////////////////////////////////////////////////////////////

EA     是 中断总开, 不管是定时器,串口还是外部中断,都需要打开 EA 才能触发中断;

ET0   是 定时器0 的专用中断开关, 也就是说: 打开了EA.而不打开ET0,定时器0是无法触发中断的;

TR0   是 启动定时器 开始定时计数 的开关, 如果打开 EA 和 ET0, 就代表允许定时器 0 触发中断, 但是定时器0 何时开始触发,由 TR0 来启动和停止.

////////////////////////////////////////////////////////////////////////////

51 单片机 12 分频,
一个 机器周期 = 12/nHz   //(n指 晶振频率)
如要定时的时间为 M

初值  = M / 机器周期;
TH0 = (65536 - 初值) % 256; // 高 8 位;
TL0 = (65536 - 初值) / 256;   // 低 8 位;

案例:
12M 晶振 做 1ms 定时计算
1. 机器周期: = 12 /(12*10^6)=1us(微秒)
2. 定时初值:(1*10^-3)/(1*10^-6) = 1ms/1us = 1000; (倍率)

将 高 位 与 低位 进行分离;转化成 16进制 数据;
3. TH0 = (65536 - 1000) % 256 = 64536 % 256 (10 进制数) --> 0xFC
3. TL0 = (65536 - 1000) / 256 = 64536 / 256 (10 进制数) --> 0x18

每次内部 自加 1bit 时,耗费 1us; 所以,要累加 1000 次,形成 1ms 中断溢出;

////////////////////////////////////////////////////////////////////////////

//定时器 初始化函数
void Init_Timer()
{
     count = 0;                                // 用于 中断后 计数,判断; 
     TMOD = 0x01;                            //T0 工作方式 1;16位 计数器;
 
     TH0=(65536-50000)/256;          // 初值高 8 位 走 1000 次,每次 1us :晶振 12MHz; 
     TL0=(65536-50000)%256;         // 初值低 8 位 走 1000 次,每次 1us :晶振 12MHz; 
  
     TR0  = 1;                                  // 开启 T0 定时器;
     ET0  = 1;                                  // 允许 T0 定时器中断;
     EA   = 1;                                 // 开启 总中断 允许;
}

////////////////////////////////////////////////////////////////////////////

// 中断函数;
void Timer0(void) interrupt 1 using 1
{
     TH0 = (65536-50000)/256;    // 中断后,赋初值;
     TL0 = (65536-50000)%256;
     count++;       // 每次中断,计数 累加 1;
 
     if(count >=某个值时)
     {  

        count = 0; // 计数值 清0 ;
           // 控制体;
     }
}

 

////////////////////////////////////////////////////////////////////////////

联系我们

联系人:客服在线

手机:全工:13903011251

电话:李R:13530006400

邮箱:729986191@qq.com

地址: GUANGDONG PROVINCE

用手机扫描二维码关闭
二维码