前置知识学习
计时器溢出会进入对应的中断系统
一、定时器是什么?
定时器是设置一个中断条件,当达成时,跳出主程序,优先处理中断程序。
即利用了中断系统,中断系统可以保护计算机
二、使用步骤
//主函数
#include <REGX52.H>
#include "Timer0.h"
#include "key.h"
#include <INTRINS.H>
unsigned char KeyNum , LEDMOD;
void main()
{
P2 = 0xFE;//1111 1110
Timer0_Init();
while(1)
{
KeyNum = Key();
if(KeyNum)
{
// if(KeyNum == 1) P2_0 = ~P2_0;
// if(KeyNum == 2) P2_1 = ~P2_1;
// if(KeyNum == 3) P2_2 = ~P2_2;
// if(KeyNum == 4) P2_3 = ~P2_3;
//按下k1,左移;按下k2~4;右移。
if(KeyNum == 1)
LEDMOD = 1;
if(KeyNum >= 2)
LEDMOD = 0;
}
}
}
static unsigned int T0Count; //若不是静态变量,执行一次函数后,被销毁
void Timer0_Routine () interrupt 1 //发生中断,则进入该子块
{
static unsigned int T0Count; //若不是静态变量,执行一次函数后,被销毁
/*
给定时器重新赋初值
结果是,每 1ms 进入一次中断系统
否则,溢出后值清零,从 0 计到 65535
TH0 = 64535 / 256;
TL0 = 64535 % 256;
*/
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
T0Count++;
if(T0Count >= 500) //此处千万不能在判断语句外点亮LED,否则LED一直亮
{
T0Count = 0;
//如下实现流水灯 //a =_crol_ (a,1) a左移一位 0x01->0x04->0x08;而且,0x80(1000 0000)->0x01(0000 0001).同理,_cror_为右移
if(LEDMOD == 1)
{P2 =_crol_(P2,1);}
if(LEDMOD == 0)
{P2 =_cror_(P2,1);}
}
}
#include <REGX52.H>
/* *
* @brief 定时器0初始化 1毫秒@12.000MHz
* @param 无
* @retval 无
*/
void Timer0_Init(void)
{
//AUXR &= 0x7F; //定时器时钟12T模式 这个得去掉
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
//如下得自己补充
ET0 = 1; //允许中断
EA = 1; //允许总中断
PT0 = 0; //中断优先级为0
}
/*定时器中断函数模板
void Timer0_Routine () interrupt 1
{
static unsigned int T0Count;
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
T0Count++;
if(T0Count >= 1000)
{
T0Count = 0;
}
}
*/
总结
单片机的学习一定要看懂电路图与单片机手册中各个系统的使用。
定时器:通过设置时间溢出条件,使程序进入中断系统,当然了,中断程序应为较为短小精干的程序,大块程序不适合放入其中。