TMOD负责确定T0和T1的工作模式,TCON控制T0和T1的启动或停止计数,同时包含定时器状态
TF1:定时器1溢出标志
TF0:定时器0溢出标志
0~65535 每隔1微秒计数器+1,总时间65535微秒,赋上初值64535,则只有1000微秒即1毫秒
第一步:编写Timer_Init()
首先配置TMOD
所以初始化TMOD = 0x01; //0000 0001
整体操作:TMOD = TMOD & 0xF0; //低四位清零,高四位不变
TMOD = TMOD | 0x01; //最低位置1,其他位不变
接下来配置TCON
TF0 = 0;
TR0 = 1;
还要配置TH0和TL0
用64535,存在这两个盒子里,盒子最大只能存八字节也就是256,所以
TH0 = 64535 / 256;
TL0 = 64535 % 256;
最后配置中断系统
要打开的开关置1
ET0 = 1;
EA = 1;
PT0 = 0;
来看看代码
#include <REGX52.H>
void Timer0_Init(void) //1毫秒@11.0592MHz
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x66; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
//中断系统
ET0 = 1;
EA = 1;
PT0 = 0;
}
void main()
{
Timer0_Init();
while(1)
{
}
}
unsigned int T0Count;
void Timer0_Routine() interrupt 1
{
TL0 = 0x66; //设置定时初值
TH0 = 0xFC; //设置定时初值
T0Count ++;
if(T0Count >= 1000)
{
T0Count = 0;
P2_0 = ~P2_0;
}
}
接下来把定时器模块化
创建Timer0头文件和.c文件存放Timer0_Init()
中断函数保留在主函数中,根据不同的需要进行修改
然后把T0Count 改为静态局部变量,使之生命周期与文件相同,否则执行完一次之后会被初始化
利用按键控制流水灯流动方向的主函数代码:
Key函数读取按键,按一次改变一次流水方向,每500毫秒中断一次,判断流水模式进行移位
crol 是循环左移函数 , _cror_是循环右移函数,需要INTRINS.H头文件
#include <REGX52.H>
#include <INTRINS.H>
#include "Timer0.h"
#include "Key.h"
unsigned char KeyNum, LEDMode;
void main()
{
P2 = 0xFE; // 1111 1110 点亮最后一位,然后利用循环移位函数_crol_ 和_cror_
Timer0_Init();
while(1)
{
KeyNum = Key();
if(KeyNum)
{
if(KeyNum == 1)
{
LEDMode ++;
if(LEDMode >= 2) LEDMode = 0;
}
}
}
}
void Timer0_Routine() interrupt 1
{
static unsigned int T0Count;
TL0 = 0x66; //设置定时初值
TH0 = 0xFC; //设置定时初值
T0Count ++;
if(T0Count >= 500) //每500毫秒移位一次,LEDMode决定方向
{
T0Count = 0;
if(LEDMode == 0) P2 = _crol_(P2, 1);
if(LEDMode == 1) P2 = _cror_(P2, 1);
}
}
而定时器时钟只需要在此基础上进行修改,利用之前模块化好的LCD1602模块和Timer0模块,下面给出主函数:
#include <REGX52.H>
#include "LCD1602.h"
#include "Timer0.h"
#include "Delay.h"
unsigned int Sec, Min, Hour;
void main()
{
LCD_Init();
Timer0_Init();
LCD_ShowString(1, 1, "Clock:");
LCD_ShowString(2, 1, " : :");
while(1)
{
LCD_ShowNum(2, 1, Hour, 2);
LCD_ShowNum(2, 4, Min, 2);
LCD_ShowNum(2, 7, Sec, 2);
}
}
void Timer0_Routine() interrupt 1
{
static unsigned int T0Count;
TL0 = 0x66; //设置定时初值
TH0 = 0xFC; //设置定时初值
T0Count ++;
if(T0Count >= 1000)
{
T0Count = 0;
Sec ++;
if(Sec >= 60) Sec = 0, Min ++;
if(Min >= 60) Min = 0, Hour ++;
if(Hour >= 24) Hour = 0;
}
}