初始化timer0
void InitTimer0(void)
{
TMOD &= 0xF0;
TMOD |= 0x01;
ET0 = 1;
TR0 = 1;
}
函数功能:定时器0中断处理
入口参数:无
返回:无
备注:22.1184MHz 晶振 约5ms 中断一次
void Timer0Isr(void) interrupt 1
{
//定时器0重装,定时器间隔为5ms,加15是为了修正重装所花费的时间
TH0 = (65536-Fclk/1000/12*5)/256;
TH1 = (65536-Fclk/1000/12*5)%256;
if(! KeyCanChange) return;//如果正确处理按键,不在扫描按键
//开始扫描键盘,保存按键状态到当前按键情况
//keycurrent 共有8bit,当莫个开关按下,对应的位为1.
keycurrent = GetKeyValue();
if(keycurrent != keyold)
{
keynoChangedTime = 0;
keyold = keycurrent;
return;
} esle {
keynoChangedTime++;
if( keynoChangedTime >= 1)
{
keynoChangedTime = 1;
KeyPress = keyold;
KeyDown |= (~KeyLast)&(KeyPress);
keyUp |= KeyLast&(~KeyPress);
}
}
}
extern volatile uint8 idata keycurrent,keyold,keynoChangedTime;
extern volatile uint8 idata KeyPress;
extern volatile uint8 idata KeyDown,KeyUp,KeyLast;
extern volatile uint8 KeyCanChange;
void InitKeyboard(void);
#define Fclk 2218400UL // 22.1184Mhz
#define BitRate 9600UL
#define KeyIO P1;
#define GetKeyVale() (~KeyIO)
#define KEY1 0x01
#define KEY2 0x02
#define KEY3 0x04
#define KEY4 0x08
#define KEY5 0x10
#define KEY6 0x20
#define KEY7 0x40
#define KEY8 0x80
AT89s52 定时/计数器的结构:
定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器组成。TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志[8]。定时/计数器结构如图:
定时/计数器的控制
AT89S52单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD用于设置其工作方式;TCON用于控制其启动和中断申请
- 工作方式寄存器TMOD
工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。其格式如下:
GATE:门控位。
GATE=0时,以运行控制位TRX(X=0,1)来启动定时/计数器运行;
GATE=1时, 要用软件使TR0或TR1为1,同时外部中断引脚或也为高电平时,才能启动定时/计数器工作
C/T 计数器模式和定时器模式选择
C/T = 1 时,选择计数器模式,计数器对外部输入引脚T0(P3.4) 或 T1(P3.5) 的外部脉冲计数
C/T = 0 时,选择定时器模式
M1M0:工作方式设置,定时/计数器 有四种工作方式,由M1M0进行设置。
2. 定时器/计数器控制寄存器TCON
TCON主要用于寄存外部中断请求标志、定时器溢出标志、和外部中断触发方式的选择。该寄存器的字节地址是88H,可以位寻址;位地址是88H~8FH。其格式如下
其中与中断有关的控制位共6位:
IE0和IE1:
外部中断请求标志。当CPU采样到(或)端出现有效中断请求(低电平或脉冲下降沿)时,IE0(或IE1)位由片内硬件自动置1;当中断响应完成转向中断服务程序时,由片内硬件自动清0。
IT0和ITl:
外部中断请求信号触发方式控制标志。
IT0(或IT1)=1,(或)信号为脉冲触发方式,脉冲负跳沿有效;
IT0(或IT1)=0,(或)信号电平触发方式,低电平有效。
IT0(或IT1)位可由用户软件置1或清0
TF0和TFl:
定时器/计数器溢出中断请求标志。当定时器0(或定时器1)产生计数溢出时,TF0(或TF1)由片内硬件自动置1;当中断响应完成转向中断服务程序时,由片内硬件自动清0。
TR0和TR1:
TR0(或TR1)=1,表示启动定时器0(或定时器1);
该标志位也可用于查询方式,即用户程序查询该位状态,判断是否应转向对应的处理程序段。待转如处理程序后,必须由软件清0。
中断允许控制寄存器IE
CPU对中断源的开放和屏蔽,以及每个中断源是否被允许中断,都受中断允许寄存器IE控制。
中断允许控制寄存器IE对中断的开放和关闭实行两级控制。即有一个总中断位EA。5个中断源还有各自的控制位进行控制。
IE寄存器的字节地址是A8H,可以位寻址;位地址是A8H~AFH。其格式如下:
其中与中断有关的控制位共7位:
EA: 中断允许总控制位
- EA=0时,中断总禁止,禁止一切中断;
- EA=1时,中断总允许,而每个中断源允许与禁止,分别由各自的允许位确定。
EX0和EX1:外部中断允许控制位。
- EX0(或EX1)=0,禁止外部中断(或);
- EX0(或EX1)=1,允许外部中断(或)。
ET0和ET1:定时器中断允许控制位。
- ET0(ET1)=0,禁止定时器0(或定时器1)中断;
- ET0(ET1)=1,允许定时器0(或定时器1)中断。
ES: 串行中断允许控制位。
-
ES=0,禁止串行(TI或RI)中断;
-
ES=1,允许串行(TI或RI)中断。
ET2: 定时器2中断允许控制位。
- ET2=0,禁止定时器2(TF2或EXF2)中断;
- ET2=1,允许定时器2(TF2或EXF2)中断;
在单片机复位后,IE各位被复位成“0”状态,CPU处于关闭所有中断的状态。所以,在单片机复位以后,用户必须通过程序中的指令来开放所需中断。
中断处理函数
解释 void timer0() interrupt 1 using 2
1、返回值 函数名 interrupt n
其中n 对应中断源的编号,其值从0 开始,以80C51 单片机为例,编号从0~4,分别对应外中断0、定时器0 中断、外中断1、定时器1 中断和串行口中断。
2、在C51 中,寄存器组选择取决于特定的编译器指令,即使用using n 指定,其中n 的值是0~3,对应使用四组工作寄存器。
例如可以这样来写:
void timer0() interrupt 1 using 2
{…}
即表示在该中断程序中使用第2 组工作寄存器。
interrupt**是中断源.具体编号如下:
INT0 INTERRUPT 0
T0 1
INT1 2
T1 3
UART 4
T2 5
UART1 6
外部中断2 7
外部中断3 8
外部中断4 9
外部中断5 10
看门狗定时器 11