////////////////////////////////////////////////////////////////////////////
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