找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13562|回复: 2
收起左侧

第3章 单片机定时器/计数器、中断系统

[复制链接]
ID:111078 发表于 2016-3-28 01:24 | 显示全部楼层 |阅读模式
51单片机轻松入门—基于STC15W4K系列(C语言版)
李友全
编著:http://www.51hei.com/bbs/dpj-37954-1.html



(1) 定时器/计数器

1 单片机定时器/计数器工作原理概述
2 定时器/计数器的相关寄存器
3 初值计算
4 编程举例
(2) 中断系统
%E7%AC%AC3%E7%AB%A0--%E5%AE%9A%E6%97%B6%E5%99%A8_%E8%AE%A1%E6%95%B0%E5%99%A8_%E4%B8%AD%E6%96%AD%E7%B3%BB%E7%BB%9F-4.jpg

1 中断系统结构图
2 操作电路图中的开关(相关寄存器介绍)
3 编写中断函数
4 中断程序举例
5 外中断代码调试(按键的防抖技术)
(1) 定时器/计数器

IAP15W4K58S4单片机内部包含了下面与定时中断功能有关的模块:

① 5个16位的定时器/计数器(T0、T1、T2、T3、T4),不仅可方便 的用于定时控制,而且还可以用于对外部脉冲信号进行计数。

② 6个引脚同时输出时钟功能(5路定时器时钟 + 1路主时钟),可给外部 器件提供时钟脉冲信号(最高频率可达13.5MHz)。
③ 2个引脚连接内部PCA模块, 通过功能选择可将PCA模块用作外部中

断(2通道)、定时器、时钟输出和脉宽调制PWM输出。

④ 5个外中断输入口(INT0、INT1、/INT2、/INT3、/INT4),INT0与 INT1既可上升沿触发也可下降沿触发,/INT2、/INT3和/INT4只能 下降沿触发。

1 单片机定时器/计数器工作原理概述
IAP15W4K58S4单片机定时器/计数器结构示意图如图3-1所示,同一个模块当用 于内部系统时钟计数时称为定时器,当用于外部输入脉冲计数时称为计数器。

%E7%AC%AC3%E7%AB%A0--%E5%AE%9A%E6%97%B6%E5%99%A8_%E8%AE%A1%E6%95%B0%E5%99%A8_%E4%B8%AD%E6%96%AD%E7%B3%BB%E7%BB%9F-1.jpg

图3-1 定时器/计数器原理示意图( x = 0、1、2、3、4)

定时器/计数器的核心是一个加1计数器,加1计数器的脉冲有两个来源,一个是 单片机引脚输入的外部脉冲信号源,另一个是CPU实际运行的系统时钟SYSclk,当 程序中没有对CPU的时钟分频器进行额外设置时,系统时钟SYSclk就等于外部晶体 振荡器或内部R/C时钟频率,计数器对这两个脉冲源之一进行输入计数,每输入一 个脉冲,计数值加1,当计数到计数器为全1时,再输入一个脉冲就使计数值回零, 同时从最高位溢出一个脉冲使特殊功能寄存器TCON的TFx位置1,作为计数器的溢 出中断标志,当脉冲源选择内部系统时钟SYSclk时,在每个时钟周期计数器加1或

12个时钟周期计数器加1(默认值是12个时钟周期加1 ),由于计数脉冲的周期是 固定的,所以脉冲数乘以脉冲周期就是定时时间,此为定时器功能。

允许外部最高输入信号频率:当脉冲源选择外部引脚输入的脉冲时,就是对外部

事件计数的计数器,当外部引脚上有一个从1到0的负跳变时计数值加1,由于系 统每个时钟对外部计数器引脚采样1次,当前一次采样到外部引脚为高电平而后 一次采样到低电平则形成一个负跳变,因此确认外部输入信号的一次负跳变至少 需要2个系统时钟周期,实际上,引脚输入通道中还有一个同步采样与边沿检测 电路,致使外部输入信号的最高允许频率不能大于系统时钟频率SYSclk的1/4, 比如CPU运行的系统时钟为22.1184MHz,允许外部最高输入信号频率为

22.1184MHz/4 = 5.5926 MHz,如果频率高于这个值,输入信号的部分脉冲在检 测过程中会被丢失,若用着频率计,表现结果是测量得到的频率比真实频率低。

特殊功能寄存器:从这个示意图我们可以看到2个开关符号,后面将会介绍的 详细结构图中有更多的开关符号,我们使用单片机内部功能模块就是要把这些 电路开关合上或断开,这些开关的合上或断开是直接由特殊功能寄存器控制 的,因此我们要控制开关实际是控特殊功能寄存器,为了方便,后面把特殊功 能寄存器简称为寄存器

%E7%AC%AC3%E7%AB%A0--%E5%AE%9A%E6%97%B6%E5%99%A8_%E8%AE%A1%E6%95%B0%E5%99%A8_%E4%B8%AD%E6%96%AD%E7%B3%BB%E7%BB%9F-5.jpg
表3-1 定时器/计数器方式寄存器TMOD(地址89H,复位值为0000 0000B)

D7

D6

D5

D4

D3

D2

D1

D0

位名 称

GATE

C/T

M1

M0

GATE

C/T

M1

M0

T1 T0
GATE:门控位,用于外部引脚控制定时器启动与停止。
0:每当TR0/TR1置位时,就启动定时器工作。
1:外部引脚INT0/INT1为高电平且TR0/TR1置位时,启动定时器工作。
GATE门控位实际中一般都不会使用,不管用于定时还是计数,都直接设为0
即可,在定时计数器T2、T3、T4干脆直接去掉了GATE门控位。

C/T : 设为0用于内部定时,设为1用于外部计数。

M1M0 :

00 : 16位自动重装定时计数,当溢出时将RL_TH和RL_TL的值自动装入 TH和TL
中,推荐使用首选(重点学习) 。
01 : 16位定时计数,传统单片机使用得较普遍,在一些特殊运用场合比如后面章 节将会介绍的断电存储定时器,只能采用这种非自动重装方式。
10 : 8位自动重装定时计数,当溢出时将TH的值自动装入TL中。
11 : 对于T1,停止计数,等同于将TR1设置为0。 对于T0,在运行过程中,中断一旦开启就无法关闭,称为不可屏蔽中断的16
位自动重装定时器,可用于操作系统的节拍定时器。
D7
D6
D5
D4
D3
D2
D1
D0
位名称
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
定时.计数 中断
TF1:T1溢出标志位,计数器溢出时此位自动置1,进入相应中断函数后则由硬 件清零,若没编写中断函数则必须由软件清零。
TF0: T0溢出标志位,功能与TF1类似。
TR1:T1运行控制位,置1启动定时器,置0关闭定时器。
TR0:T0运行控制位,置1启动定时器,置0关闭定时器。
表3-3 辅助寄存器AUXR(地址8EH,复位值为0000 0001B)
D7
D6
D5
D4
D3
D2
D1
D0
位名称
T0x12
T1x12
UART_M0x6
T2R
T2_C/T
T2x12
EXTRAM
S1ST2
T0x12:定时器0速度控制位。 0:12分频 ,1:不分频 。

T1x12:定时器1速度控制位。 0:12分频 ,1:不分频 。

nUART_M0x6:串口1模式0的通信速度设置位。 0:12分频 ,1:6分频 。
注:串口1模式0是移位寄存器方式,无实际用途,不用学
nT2R:定时器2运行控制位。置1启动,置0关闭。
nT2_C/T :选择定时器2作定时器或计数器。
0:用作定时器(计数脉冲从内部系统时钟输入)。
1:用作计数器(计数脉冲从P3.1/T2引脚输入)。
nT2x12:定时器2速度控制位。 0:12分频 ,1:不分频 。
0:12分频,定时器T2 每12个时钟周期计数一次。
1:不分频,定时器T2 每1个时钟周期计数一次。 如果串口(UART1~UART4)用T2作为波特率发生器,T2x12位决定串口
是12T 还是1T(高速通信需要1T ,后面章节会讲)。
nEXTRAM:用于设置是否允许使用内部3840字节的扩展RAM。
0:允许,1:禁止。
nS1ST2:串口1(UART1)选择定时器2作为波特率发生器的控制位。
0:选择定时器T1作为串口1(UART1)的波特率发生器
1:选择定时器T2作为串口1(UART1)的波特率发生器,此时定时器T1
得到释放,可作为独立定时器使用。

%E7%AC%AC3%E7%AB%A0--%E5%AE%9A%E6%97%B6%E5%99%A8_%E8%AE%A1%E6%95%B0%E5%99%A8_%E4%B8%AD%E6%96%AD%E7%B3%BB%E7%BB%9F-6.jpg 定时器/计数器T3固定为16位自动重装方式,电路原理如图3-6所示,T3除可以 当作定时器/计数器使用外,还可以作串口3的波特率发生器或可编程时钟输出。

图3-6 定时器/计数器3的工作模式固定为16位自动重装方式
表3-4 定时器T4和T3控制寄存器T4T3M(地址D1H,复位值为0000 0000B)
D7
D6
D5
D4
D3
D2
D1
D0
位名称
T4R
T4_C/T
T4xl2
T4CLKO
T3R
T3_C/T
T3xl2
T3CLKO
定时器/计数器T4 定时器/计数器T3
n T4R:定时器4运行控制位, 置1启动定时器,置0关闭定时器。
n T4_C/T:选择定时器4用作定时器或计数器。设为0用于内部定时,设为1用 于外部计数(引脚T4/P0.7)。

n T4x12:定时器4速度控制位。 0:12分频 (默认值),1:不分频 。

n T4CLKO:是否允许将P0.6脚配置为定时器T4的时钟输出T4CLKO。1:允许 时钟输出,0:禁止时钟输出。

n T3R:定时器3运行控制位。置1启动定时器,置0关闭定时器。

n T3_C/T:选择定时器3用作定时器或计数器。设为0用于内部定时,设为1用于 外部计数(引脚T3/P0.5)。

n T3x12:定时器3速度控制位。 0:12分频 (默认值),1:不分频 。

n T3CLKO:是否允许将P0.4脚配置为定时器T3的时钟输出T3CLKO。1:允许 时钟输出,0:禁止时钟输出。
3 初值计算
l 计数器初值计算:
M1M0=00 初值 = 65536 – 待计数值
M1M0=01 初值 = 65536 – 待计数值
M1M0=10 初值 = 256 – 待计数值

l 定时器初值计算: 单个定时脉冲周期Tin = 1/Fin

待计数值 = 定时时间/单个定时脉冲周期 = T/Tin = Fin*T M1M0=00 初值 = 65536 – 待计数值 = 65536 –Fin*T M1M0=01初值 = 65536 – 待计数值 = 65536 –Fin*T M1M0=10 初值 = 256 – 待计数值 = 256 - Fin*T

再把CPU工作的系统时钟SYSclk(注意:SYSclk不等于内部R/C时钟 或外部晶振频率Fosc)是否12分频考虑进去,得出计算初值的表格,见 表3-5。

表3-5 定时器初值计算公式表


12分频(即12T,默认值)

1分频(即1T)

16位定时器

预置初值 = 65536 – SYSclk/12*T

预置初值 = 65536 – SYSclk*T

8位定时器

预置初值 = 256 – SYSclk/12*T

预置初值 = 256 – SYSclk*T

公式中的T表示定时时间,单位是uS,系统时钟SYSclk单位是MHz,如果T的单
位用Hz,则SYSclk单位用S,通过上面的计算公式我们可以精确计算出定时器预 置初值,为了快速简便,我们也可以直接使用STC下载软件中的辅助工具“定时器
计算器”直接生成定时器初始化函数。
4 编程举例
例3.1 用定时器T0实现P0.0引脚LED亮30ms灭30ms方式闪烁(使用查询方
式),使用单片机内部R/C时钟,频率22.1184MHz。

#include "STC15W4K.H" sbit P0_0=P0^0;

void main()

{
P0=0xff; // 关闭P0口接的所有灯
TMOD=0x00; // 定时器0的16位自动重装方式
TH0=0x28; // 定时器初值2800H

TL0=0; TR0=1; for(;;)

{
if(TF0) // 如果TF0等于1
{
TF0=0; // 清TF0
P0_0=!P0_0; // 执行灯亮或灭的动作

}

}

}

例3.2 用定时器T0实现P0.0引脚LED亮1秒灭1秒方式闪烁(使用查询方式),R/C时钟
22.1184MHz。

#include "STC15W4K.H" sbit LED=P0^0;

unsigned char counter; // 软件计数器

void main()

{
TMOD=0x01; // 定时器0_16位计数
TH0=0x70; // 经计算定时20ms初值是0x7000

TL0=0x00;

TR0=1; // 定时器开始运行

while(1)

{

if(TF0==1)

{

}

TF0=0; // 没使用中断的情况下必定会用软件查询清零

TH0=0x70; TL0=0x00; counter++;

if(50==counter) // 20ms×50=1000ms即1S(中断时重装定时常数占用时间忽略不计)
{

counter=0; LED=~LED;

}

}

}

例3.3 使用T0作计数器对外部信号计数,计数值用P0口的LED显示出来。本例使用第一章介绍的 二极管闪烁发光的实例在1号单片机P5.4输出的低频脉冲信号作为2号单片机T0(P3.4)引脚计 数脉冲输入,有脉冲信号输入后从P0口就可以看到LED按二进制递增规律亮灭变化。

#include "STC15W4K.H" // include称为文件包含命令,后面引号中内容称为头文件

void port_mode() // 端口模式
{ // 同第一章流水灯程序
}
void main()
{
unsigned char DispBuf;
port_mode(); // 所有IO口设为准双向弱上拉方式。 P0=0xff; // 关闭P0口接的所有灯
TMOD=0x05; // 确定计数工作模式为T0_16位计数,不需要重装。 TR0=1; // 计数器T0开始运行
for(;;)
{
DispBuf=TL0; P0=~DispBuf;
}
}
例3.5 使用T2作计数器对外部信号计数,计数值用P0口的LED显示出来。若使

用配套实验板,需要用杜邦线将1号单片机P54连接到2号单片机P3.1/T2引脚

(22脚)上。

void main()

{

unsigned char DispBuf;

port_mode(); // 所有IO口设为准双向弱上拉方式。 P0=0xff; // 关闭P0口接的所有灯

AUXR|=0x18; // 定时器T2工作于计数方式并开始运行

for(;;)

{

DispBuf=T2L;

P0=~DispBuf;

}

}

2 中断系统

当单片机正在处理当前一段程序时,突然出现了另一个更重 要的事件需要处理,单片机可以暂停当前的程序段去执行 更重要的事件对应的程序代码,当重要程序代码执行完毕 后返回到原暂停程序处继续执行原来的代码,单片机暂停 当前程序去执行其它程序的过程就称为中断,当正在执行 重要程序代码的过程中出现了更为重要的事件时,单片机 还可以暂停当前事件去执行更重要的事件的代码,称为中 断嵌套。

IAP15W4K58S4单片机有21个中断源,如图3-11左边部分所 示,包括5个外部中断、5个片内定时器/计数器溢出中断、
4个片内串行口(UART)中断、1个ADC中断、1个SPI中断、
1个低电压检测中断、1个PCA中断、1个PWM中断、1个PWM 异常中断、1个比较器中断。
2 中断系统

当单片机正在处理当前一段程序时,突然出现了另一个更重要的事件需要处理,单片机 可以暂停当前的程序段去执行更重要的事件对应的程序代码,当重要程序代码执行完毕后 返回到原暂停程序处继续执行原来的代码,单片机暂停当前程序去执行其它程序的过程就 称为中断 ,简单的说,中断就是中途打断。

当正在执行重要程序代码的过程中出现了更为重要的事件时,单片机还可以暂停当前事

件去执行更重要事件的代码,称为中断嵌套,IAP15W4K58S4单片机有21个中断源,最常 用的是外部引脚中断、定时器中断、串行口(UART)中断。

主程序
执行主 程序
中断请求 执行
中断
断点
继续执行 主程序

处理 函数
中断返回
%E7%AC%AC3%E7%AB%A0--%E5%AE%9A%E6%97%B6%E5%99%A8_%E8%AE%A1%E6%95%B0%E5%99%A8_%E4%B8%AD%E6%96%AD%E7%B3%BB%E7%BB%9F-7.jpg
1

中断系统结构图(各开关处于默认状态)

2 操作电路图中的开关(相关寄存器介绍)
表3-2 定时器/计数器控制寄存器TCON (地址:88H,复位值:0000 0000B)
D7
D6
D5
D4
D3
D2
D1
D0
位名称
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
定时.计数 中断

① IT0:INT0引脚触发方式控制位,可由软件置1或清“0”。

0:上升沿和下降沿都可以触发中断并置位IE0标志。
1:下降沿触发中断并置位IE0标志。
② IE0:INT0中断请求标志位,当INT0引脚产生中断信号后由硬件将IE0置1(程序调
试过程中也可以使用软件置1),CPU响应中断并进入中断程序入口地址后立即由硬件将
IE0清0。注意:在汇编语言中刚进入中断入口地址或C语言中刚进入中断函数,IE0即
被清零,所以无论汇编还是C语言在中断程序调试过程中根本看不到IE0=1的情况,因
此,IE0和IE1只在查询编程的方式上用得上。
③ IT1:INT1引脚触发方式控制位,与IT0类似。
④ IE1:INT1中断请求标志位,与IE0类似。
⑤ TF0:定时器T0溢出中断标志,T0溢出时由硬件将TF0置1, CPU响应中断并进入中
断程序入口地址后立即由硬件将TF0清0。注意:在汇编语言中刚进入中断入口地址或C
语言中刚进入中断函数,TF0即被清零,所以无论汇编还是C语言在中断程序序调试过
程中根本看不到TF0=1的情况,因此,TF0和TF1只在查询编程的方式上用得上。
⑥ TF1,定时器T1溢出中断标志,与TF0类似。
中断允许寄存器IE、IE2、INT_CLKO共同完成中断信号通路的接通与断开控制。
表3-13 中断允许寄存器IE(地址A8H,复位值是:0000 0000B)

D7

D6

D5

D4

D3

D2

D1

D0

位名称

EA

ELVD

EADC

ES

ET1

EX1

ET0

EX0

EA:总开关。EA=1,开总中断,EA=0,关总中断。
ELVD:低电压检测中断允许控制位。ELVD =1,允许低电压检测中断,ELVD
=0,禁止低电压检测中断。
EADC:ADC中断允许控制位。EADC = 1,允许ADC中断,EADC = 0,禁止
ADC中断。
ES:串口1中断开关。ES=1,允许串口1中断,ES=0,禁止串口1中断。
ET1:定时器T1中断开关。ET1=1,允许T1中断,ET1=0,禁止T1中断。
EX1:外部中断INT1开关。EX1=1,开外部中断INT1,EX1=0,关外部中断INT1。
ET0和EX0与ET1和EX1功能类似。
优先级控制。

单片机对中断优先级的处理原则是低优先级中断可被高优先级中断所中断,反 之不能。任何一种中断(不管是高优先级还是低优先级),一旦得到响应,不 会再被与它同级的中断所中断,同一优先级的中断源同时申请中断时,按照事 先约定的硬件查询顺序响应中断,也就是说在每个优先级内,还同时存在一个 自然优先级,自然优先级顺序见图3-16右边部分所示。

表3-16 中断优先级控制寄存器IP (地址为D8H,复位值是:0000 0000B)

D7

D6

D5

D4

D3

D2

D1

D0

位名称

PPCA

PLVD

PADC

PS

PT1

PX1

PT0

PX0

PPCA:PCA优先 (设为1 = 高级中断,设为0 = 低级中断)
PLVD: 低压检测优先 (设为1 = 高级中断,设为0 = 低级中断)
PADC:ADC优先 (设为1 = 高级中断,设为0 = 低级中断)
PS:串口1优先 (设为1 = 高级中断,设为0 = 低级中断)
PT1:定时器T1优先 (设为1 = 高级中断,设为0 = 低级中断)
PX1:外中断INT1优先 (设为1 = 高级中断,设为0 = 低级中断)
PT0:定时器T0优先 (设为1 = 高级中断,设为0 = 低级中断)
PX0 :外中断INT0优先 (设为1 = 高级中断,设为0 = 低级中断)

3 编写中断函数

• 1、中断函数格式:void 函数名() interrupt m [using n]

• void : 返回值类型。由于中断函数是CPU响应中断时通过硬件自动调 用的,因此中断函数的返回值和参数都只能是void(不能返回函数值, 也不能给中断函数传递参数)。

• 函数名:可以随便写,只要方便自己识别此函数对应哪个中断源即可。
• interrupt:指明此函数为中断专用函数。

• m :中断源编号(0~13、16~23)确定此函数对应哪一个硬件 中断。

• using n:确定此中断函数使用第几组R0~R7寄存器组(n = 0~3), 通常不必去做工作寄存器组设定,而由编译器自动选择,避免产生不 必要的错误。

• 使用中断函数时应注意:

• ① 只要程序中开启了中断,就必须编写对应的中断函数,哪怕是空函 数也必须有(空函数自动执行RETI中断返回指令),否则中断产生时 却找不到可执行的中断函数,这样必然引起程序功能错乱或死机。

• ② 任何函数都不能直接调用中断函数,另外中断函数可放在程序中任 何位置而不需要声明,只要产生中断,程序就能自动跳入中断函数执 行。

中断函数名称典型书写格式如下。
• void INT0(void) interrupt 0{} // 外部中断0中断函数
• void Timer0(void) interrupt 1{} // 定时器T0 中断函数
• void INT1(void) interrupt 2{} // 外部中断1中断函数
• void Timer1(void) interrupt 3{} // 定时器T1中断函数
• void UART1(void) interrupt 4{} // 串行口1中断函数
• void ADC(void) interrupt 5{} // ADC中断函数
• void LVD(void) interrupt 6{} // 低电压检测LVD中断函数
• void PCA(void) interrupt 7{} // PCA中断函数
• void UART2(void) interrupt 8{} // 串行口2中断函数
• void SPI(void) interrupt 9{} // SPI通信中断函数
• void INT2(void) interrupt 10{} // 外部中断2中断函数
• void INT3(void) interrupt 11{} // 外部中断3中断函数
• void Timer2(void) interrupt 12{} // 定时器T2中断函数
• void INT4(void) interrupt 16{} // 外部中断4中断函数
• void UART3(void) interrupt 17{} // 串行口3中断函数
• void UART4(void) interrupt 18{} // 串行口4中断函数
• void Timer3(void) interrupt 19{} // 定时器3中断函数
• void Timer4(void) interrupt 20{} // 定时器4中断函数
• void Comparator(void) interrupt 21{} // 比较器中断函数
• void PWM(void) interrupt 22{} // PWM中断函数
• void PWMFD(void) interrupt 23{} // PWM异常中断函数
4 中断程序举例

例3.10 用定时器T0实现P0.0引脚LED亮30ms灭30ms方式闪烁(使用中断方式),R/C 时钟22.1184MHz。

// 预置初值 = 65536 – Fosc/12*T=65536-22.1184/12×30000 = 2800H
#include "STC15W4K.H" sbit P0_0=P0^0;


// 包含 "STC15W4K.H"寄存器定义头文件
void main()



{



P0=0xff;
//
关闭P1口接的所有灯
TMOD=0x00;
//
定时器0的16位自动重装方式
TH0=0x28;
//
定时器初值2800H
TL0=0;



TR0=1;



ET0=1;
//
开定时器0中断开关
EA=1;
while(1);
//
开总中断开关
}
void Timer0() interrupt 1
{
P0_0=!P0_0; // 执行灯亮或灭的动作
}

例3.13 用定时器T2实现P0.0引脚LED亮30ms灭30ms方式闪烁(使用中断方式), R/C时钟22.1184MHz。

#include "STC15W4K.H" // 包含 "STC15W4K.H"寄存器定义头文件

sbit P0_0=P0^0;
void main()
{
P0=0xff; // 关闭P1口接的所有灯 AUXR = 0x00; // 定时器2为12T模式
T2L = 0; // 初始化计时值,
T2H = 0x28;
AUXR |= 0x10; // 定时器2开始计时 IE2 |= 0x04; // 开定时器2中断
EA = 1;
while(1);
}
void Timer2() interrupt 12
{
P0_0=!P0_0; // 执行灯亮或灭的动作
}

例3.14 用定时器T3实现P0.0引脚LED亮30ms灭30ms方式闪烁(使用中断 方式),R/C时钟22.1184MHz。

#include "STC15W4K.H" // 包含 "STC15W4K.H"寄存器定义头文件

sbit P0_0=P0^0;
void main()
{
P0=0xff; // 关闭P0口接的所有灯 T4T3M &= 0xFD; // 定时器3为12T模式 T3L = 0; // 初始化计时值,
T3H = 0x28;
T4T3M |= 0x08; // 定时器3开始计时 IE2 |= 0x20; // 开定时器3中断
EA = 1;
while(1);
}

5 外中断代码调试技巧(按键的防抖技术)

%E7%AC%AC3%E7%AB%A0--%E5%AE%9A%E6%97%B6%E5%99%A8_%E8%AE%A1%E6%95%B0%E5%99%A8_%E4%B8%AD%E6%96%AD%E7%B3%BB%E7%BB%9F-2.jpg




单片机外中断输入引脚:





%E7%AC%AC3%E7%AB%A0--%E5%AE%9A%E6%97%B6%E5%99%A8_%E8%AE%A1%E6%95%B0%E5%99%A8_%E4%B8%AD%E6%96%AD%E7%B3%BB%E7%BB%9F-8.jpg
74LS00引脚图
0.png
回复

使用道具 举报

ID:425919 发表于 2019-10-31 11:00 | 显示全部楼层
不努力学习都不懂呀
回复

使用道具 举报

ID:424788 发表于 2023-7-3 11:00 | 显示全部楼层
还要更加努力才能看的懂  目前似懂非懂.....
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表