1 定时器/计数器0 000BH 2 外部中断1 0013H 3 定时器/计数器1 001BH 4 串行口中断 0023H
各中断服务程序入口地址仅间隔8个字节,编译器在这些地址放入无条件转移指令跳转到服务程序的实际地址. 六,中断服务程序的语法规则 中断服务程序的语法规则如下:
函数的返回值 函数名([参数]) interrupt n [using m] { 函数体; }
对中断程序而言,函数的返回值和参数一般为void.
interrupt n 中n的取值为0~31的常数,不允许用表达式,表示中断向量的编号. using m 中m的取值为0~3的常数,不允许用表达式,表示内部RAM中的工作寄存器. 七,中断说明
中断不允许用于外部函数,它对函数目标代码影响如下z
·当调用函数时,SFR中的ACC,B,DPH,DPL和PSW(当需要时)入钱; .如果不使用寄存器组切换,甚至中断函数所需的所有工作寄存器都入钱; .函数退出前,所有的寄存器内容出钱; ·函数由8051的指令\终止.
中断服务程序使用的任何程序也使用同一寄存器组. 八,中断例子
#include 〈reg51.h〉 unsigned char status; bit flag;
void service_int() interrupt 2 using 2 { flag=1; status=P1; }
void main(void) {
IP=0x04; IE=0x84; for(;;){ if(flag){ switch(status){ case 0: break;
case 1: break; case 2: break; case 3: break; default: ;} flag=0; } } }
图见书中P148 习题
试设计满足下列要求的电路图:
1 单片机采用89C51,时钟11.0592MHz; 2 有4个指示灯表示状态; 3 外接12位A/D芯片AD574; 4 有4 * 4的键盘;
5 有字符型LCD(画成插座形式,12Pin插座,管脚接法见书P253); 6 有串行接口与计算机连接;
7 设置8位二进制的地址,地址范围可表示为0~255; 8 外接EEPROM. 定时器/计数器(T/C)
8051系列单片机至少有两个16位内部定时器/计数器,8052有三个定时器/计数器,其中有两个是基本定时器/计数器是定时器/计数器.它们既可以编 程为定时器使用,也可以编程为计数器使用.
若是计数内部晶振驱动时钟,它是定时器;若是计数,8051的输入管脚的脉冲信号,它是计数器. 当T/C工作在定时器时,对振荡源12分频的脉冲计数,即每个机器周期计数值加1,计数率=1/12f osc.例当晶振为12MHz时,计数率=1000kHz,即每1μs计数值加1.
当T/C工作在计数器时,计数脉冲来自外部脉冲输入管脚T0(P3.4)或T1(P3.5), 当T0或T1脚上负跳变时计数值加1.识别管脚上的负跳变需两个机器周期,即24个振荡周期.所以T0或T1脚输入的可计数外部脉冲的最高频率为 1/24fosc,当晶振为12MHZ时,最高计数率为500kHz,高于此频率将计数出错. 一,与T/C有关的SFR 1,计数寄存器Th和TL
T/C是16位的,计数寄存器由TH高8位和TL低8位构成. 在特殊功能寄存器(SFR) 中, 对应T/C0为TH0和TL0; 对应T/C1为TH1和TL1.
定时器/计数器的初始值通过TH1/TH0和TL1/TL0设置. 2,定时器/计数器控制寄存器TCON
前面已介绍.
二,与T/C有关的SFR
3,T/C 的方式控制寄存器TMOD . C/T:计数器或定时器选择位; 1→为计数器;0→为定时器. . GATE :门控信号;
1 → T/C的启动受到双重控制,即要求TR0/TR1和INT0/INT1同时为高; 0 → T/C的启动仅受TR0或TR1控制. GATE C/T M1 M0 GATE C/T M1 M0 D7 D6 D5 D4 D3 D2 D1 D0 T/C1 T/C0
三,四种工作方式 M1 M0 方式 功 能
0 0 0 13位定时器/计数器,TL是低5位,TH是高8位 0 1 1 16位定时器/计数器
1 0 2 常数自动重装的8位定时器/计数器 1 1 3 仅用于T/C0,是两个8位定时器/计数器 利用定时器编写时钟程序. 四,T/C工作方式的说明 1. 方式0:
当TMOD中MlM0=00时,T/C工作在方式0;
方式0为13位 的T/C,由TH的高8位,TL的低5位的计数值,满计数值213,但启动前可以预置计数初值.
若T/C开中断(ET=1)且CPU开中断(EA=1)时,则定时器/计数器溢出时,CPU转向中断服务程序时,且TF白动清0. 2. 方式1:
当TMOD中MlM0=01时,T/C工作在方式1;
方式1与方式0基本相同.唯一区别在于计数寄存器的位数是16位的,由TH和TL寄存器各提供8位,满计数值为216.
四,T/C工作方式的说明 3. 方式2:
当TMOD中MlM0=10时,T/C工作在方式2; 方式2是8位的可自动重载的T/C,满计数值为28;
在方式0和方式1中,当计数满后,若要进行下一次定时/计数,须用软件向TH和TL重装预置计数初值;
方式2中TH和TL被当作两个8位计数器,计数过程中,TH寄存8位初值并保持不变,由TL
进行8位计数.计数溢出时,除产生溢出中断请求外,还自动将 TH中初值重装到TL,即重装载. 4. 方式3:
方式3只 适合于T/C0.当T/CO工作在方式3时,TH0和 TL0成为两个独立的8位计数器. 五,定时器/计数器的初始化
在使用8051的定时器/计数器前,应对它进行编程初始化,主要是对TCON和TMOD编程;计算和装载T/C的计数初值.一般完成以下几个步骤: (1)确定T/C的工作方式——编程TMOD寄存器; (2)计算T/C中的计数初值,并装载到TH和TL;
(3)T/C 在中断方式工作时,须开CPU中断和源中断——编程IE寄存器; (4)启动定时器/计数器——编程TCON中TR1或TR0位.
六,定时器/计数器的初值计算
在定时器方式下,T/C是对机器周期脉冲计数的,若fosc=12MHz,一个机器周期为12/fosc=1μs,则:
方式0 13位 定时器最大定时间隔=213 × 1μs=8.192ms; 方式1 16位定时器最大定时间隔=216 × 1μs=65.536ms; 方式2 8位定时器最大定时间隔=28×1μs=256μs.
若使T/C工作在定时器方式1,要求定时1ms,求计数初值.设计数初值为x,则有: (216-x)×1μs=1000μs 或x=216一1000 因此,TH,TL可置-1000;
即:TH= -1000/256;TL= -1000%6.
对一般fosc有下列公式(设定时时间为timeμs): (216-x)×12/fosc= time μs
例1,设单片机的fosc=12MHz,要求在P1.0脚上输出周期为2ms的方波 采用查询方式. #include 〈reg51.h〉 sbit P1_0=P1^0; void main(void〉 { TMOD=0x01; TR0=1; for(;;)
{TH0= -1000/256; TL0= -1000%6; do {} while(!TF0); P1_0=!P1_0; TF0=0; } }