单片机:AT89s52 定时器 time0

初始化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用于控制其启动和中断申请

  1. 工作方式寄存器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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值