功能强大的时钟中断
stm32f103c8t6的数据手册

《STM32F103C8T6的数据手册》一、概述STM32F103C8T6是ST公司生产的32位ARM Cortex-M3内核的微控制器,具有丰富的外设接口和强大的性能,广泛应用于工业控制、自动化设备、消费类电子产品等领域。
本文旨在对STM32F103C8T6的数据手册进行全面的介绍,帮助读者更好地理解和应用这款微控制器。
二、概览1. 器件简介STM32F103C8T6是一款高性能、低功耗的微控制器,拥有72MHz 工作频率,64KB Flash存储器和20KB RAM。
其丰富的外设接口包括多个通用定时器、串行通信接口、模拟-数字转换器等,适用于各种复杂的应用场景。
2. 功能特性STM32F103C8T6的主要功能特性包括:- ARM Cortex-M3内核- 64KB Flash存储器、20KB RAM- 丰富的外设接口:通用定时器、串行通信接口、模拟-数字转换器等- 低功耗模式:多种低功耗模式可选,满足不同需求3. 应用领域STM32F103C8T6广泛应用于工业控制、自动化设备、消费类电子产品等领域,如工业控制器、电源管理系统、医疗设备等。
三、详细规格1. 通用定时器STM32F103C8T6内置了多个通用定时器,可用于生成精准的定时脉冲,计数器和PWM输出等功能。
2. 串行通信接口该微控制器支持多种串行通信接口,包括SPI、I2C和USART,可用于与外部设备进行高速数据传输。
3. 模拟-数字转换器STM32F103C8T6配备了多个模拟-数字转换器,可实现精确的模拟信号采集和处理。
4. 中断控制器中断控制器可实现对各种外部事件的响应,提高系统的实时性和稳定性。
5. 时钟控制时钟控制模块支持多种时钟源和分频设置,可满足不同应用场景的时序要求。
6. 低功耗模式STM32F103C8T6支持多种低功耗模式,包括待机模式、休眠模式和停止模式,有效降低系统功耗,延长电池寿命。
7. 引脚定义STM32F103C8T6具有多种引脚,可供用户定义为输入/输出口,用于连接外部设备和传感器。
STM8-时钟中断TIM系统

说实话我能够使用的单片机不多,我总是以为无论什么单片机都能开发出好的产品。
前些年用51,总是向各位大大学习,无休止的索取,在网上狂览一通。
心里感激的同时也想奉献一些,可是我会什么?后来使用avr(公司要求)还是向大大们学习,我又想奉献,可是我会什么?我会的大大们都写了,我不会的大大们也写了。
一个星期前花项目经费买了阿莫的kit三合一板,最近几天闲了下来,便动手调试一下。
算是有点心得,我又想奉献,可是我会什么?我只是想和大大们交流一下,哪怕是对的或者是错的,大大们满足我的一点心愿吧。
唠叨了这么多,现在开始吧。
配置:stvd ,cosmic我学单片机开门三砖总是要砸的。
第一砖:电源系统,这没什么好说的,只是它是stm8工作的基础总是要提一下第二砖:时钟系统,这等下再说。
第三砖:复位系统,stm8只需要一只104电容从reset脚到地就可以了。
现在说说时钟系统,学习单片机无论8位的还是32位的,都要从时钟开始,下面是我一开始的时钟切换程序。
1 CLK_ECKR |=0X1; //开启外部时钟2 while(!(CLK_ECKR&0X2)); //等待外部时钟rdy3 CLK_CKDIVR &= 0XF8; //CPU无分频4 CLK_SWR = 0XB4; //选择外部时钟5 CLK_SWCR |=0X2; //使能外部时钟上面的代码看起来没什么问题,可在调试过程中出现了有时能切换,有时有不能的情况,后来发现只要在第5行设上断点就能切换,我就想是不是得让cpu等一下,我又仔细的翻看下rm0016的时钟部分,发现得等待CLK_SWCR的标志位置位才能切换。
就变成了下面的代码CLK_ECKR |=0X1; //开启外部时钟while(!(CLK_ECKR&0X2)); //等待外部时钟rdyCLK_CKDIVR &= 0XF8; //CPU无分频CLK_SWR = 0XB4; //选择外部时钟while(!(CLK_SWCR&0X8)); //这里要等CLK_SWCR |=0X2; //使能外部时钟现在一切ok,是不是觉得看东西要仔细一下~~。
cpu有什么功能

cpu有什么功能中央处理器(Central Processing Unit,简称CPU)是计算机系统的核心部件,负责执行指令以及控制计算机的运行。
CPU的功能十分丰富,下面将介绍CPU的五大主要功能。
1. 指令执行CPU负责执行计算机中的各种指令。
在计算机中,各种操作是以指令的形式存在的,包括数据的运算、传送、存储和控制等。
CPU通过解码指令,并按照指令的要求执行相应的操作,从而实现计算机的各种功能。
2. 算术逻辑运算CPU能够进行各种算术运算和逻辑运算,包括加法、减法、乘法、除法等数值运算,以及与、或、非、异或等逻辑运算。
这些运算是计算机进行各类计算和逻辑判断的基础,CPU通过执行这些运算,实现了计算机的计算能力和逻辑判断能力。
3. 存储管理CPU负责管理计算机的存储器,包括主存储器(RAM)和辅助存储器(硬盘、固态硬盘等)。
CPU向存储器发送读取和写入请求,从而实现数据的读取和存储。
同时,CPU还负责对存储器进行管理,包括对存储器进行分配、地址转换、数据传输等操作。
4. 控制系统CPU是计算机中的控制中心,负责控制计算机的整个运行过程。
CPU通过执行指令来控制各个硬件组件的工作,包括输入输出设备、存储器、中断系统等。
CPU接收来自外部的输入信号,根据指令的要求对各个硬件设备进行操作,从而实现计算机的正常运行。
5. 中断处理在计算机运行过程中,可能会出现各种中断情况,比如输入输出中断、时钟中断等。
CPU负责检测各种中断信号,并根据中断的优先级和程序要求进行相应的中断处理。
CPU会保存当前的运行状态,切换到中断处理程序,并在处理完中断后恢复到原来的运行状态,从而保证计算机能够及时响应各种中断请求。
总之,中央处理器是计算机系统中最重要的部件之一,具有执行指令、算术逻辑运算、存储管理、控制系统以及中断处理等多个功能。
正是由于CPU的功能的强大和高效,才能够实现计算机的各种复杂的运算和功能,提高计算机的工作效率和性能。
stm32f411定时开发实验原理

一、STM32F411芯片概述STM32F411是意法半导体公司推出的一款高性能的ARM Cortex-M4核心的微控制器芯片,具有丰富的外设接口和强大的计算能力,广泛应用于工业控制、智能家居、医疗设备等领域。
二、定时开发的意义定时开发是指在嵌入式系统中通过定时器实现定时触发某些任务或事件,例如定时采集传感器数据、定时控制某些执行单元等。
在实际应用中,定时开发可以提高系统的稳定性和实时性,优化系统资源的利用,提高系统的响应速度和性能。
三、定时器的工作原理定时器是嵌入式系统中常用的外设,用于产生精确的定时事件,并触发相应的中断或事件处理。
定时器通常由计数器和控制寄存器组成,计数器用于计数时钟脉冲,控制寄存器用于配置定时器的工作模式和触发条件。
四、STM32F411定时器的特点1. 多种定时器:STM32F411芯片内置了多个定时器,包括基本定时器(TIM6/TIM7)、通用定时器(TIM2/TIM3/TIM4/TIM5)、高级定时器(TIM1)。
不同的定时器具有不同的工作模式和功能,可以满足不同的应用需求。
2. 强大的时钟控制:STM32F411芯片具有丰富的时钟控制功能,可以为定时器提供精确的时钟源,并支持多种时钟分频和倍频配置,满足不同的定时精度要求。
3. 灵活的中断处理:定时器可以产生定时中断,并触发相应的中断处理程序,实现定时任务的实时响应和处理。
五、STM32F411定时开发实验原理在STM32F411芯片上实现定时开发,一般需要以下步骤:1. 初始化定时器:首先需要对所选择的定时器进行初始化配置,包括时钟源、工作模式、定时器周期等参数的设置。
2. 配置中断:根据实际需求,配置定时器的中断触发条件和相关中断优先级。
3. 编写中断处理程序:编写定时器中断的处理程序,用于响应定时触发的事件,并执行相应的任务或操作。
4. 启动定时器:将定时器启动,开始计时,等待定时中断的触发。
5. 完善其他相关功能:根据具体应用需求,可以进一步完善其他相关功能,如定时器的互联、定时器同步、定时器的PWM输出等。
hal库定时器中断函数

hal库定时器中断函数HAL库是ST公司推出的一款针对STM32系列微控制器的软件库,它提供了丰富的功能模块和接口,方便开发者进行快速的嵌入式开发。
其中,HAL库的定时器中断函数是一项非常重要的功能,它能够帮助开发者在指定的时间间隔内执行特定的代码,实现精准的定时操作。
定时器中断函数的核心思想是通过定时器和中断相结合的方式,实现精确的定时和响应功能。
通过HAL库提供的函数,我们可以轻松地配置定时器,设置中断处理函数,并实现我们所需要的定时任务。
下面,我们将详细介绍HAL库定时器中断函数的使用方法和注意事项。
首先,我们需要在代码中引入HAL库的头文件,并初始化我们需要使用的定时器。
HAL库提供了丰富的定时器选择,并支持不同的工作模式,例如基本定时器、通用定时器和高级定时器等。
可以根据项目需求选择合适的定时器类型,并通过HAL库提供的函数进行初始化。
接下来,我们需要设置定时器的定时周期和工作模式。
HAL库提供了丰富的配置函数,例如设置定时器时钟源、预分频系数和计数值等。
通过这些配置函数,我们可以灵活地设置定时器的工作参数,以达到我们所需的定时精度和周期。
在设置完定时器参数后,我们需要编写中断处理函数。
中断处理函数是在定时器溢出时被自动调用的函数,可以在其中执行我们所需要的任务。
在编写中断处理函数时,我们需要注意避免过长的执行时间,以确保中断响应的实时性。
可以使用HAL库提供的延迟函数和轻量级的任务处理方法,有效地控制中断处理的时间。
除了以上的基本配置,HAL库还提供了更多高级的定时器功能和操作方式。
例如,我们可以设置定时器的自动重载模式,实现连续的定时操作;还可以通过设置定时器的PWM输出模式,实现PWM信号的生成和输出。
这些高级功能可以帮助开发者更灵活地使用定时器,并满足各种复杂的需求。
在使用HAL库定时器中断函数时,我们需要注意一些常见的问题和注意事项。
首先,由于定时器中断函数是在中断上下文中执行的,我们需要注意避免使用不可重入的代码和函数。
微机原理第7章练习题及答案

第7章输入/输出与中断一、自测练习题㈠选择题1.一微机系统有10根地址线用于I/O端口寻址,因而具有I/O空间的范围是( )字节。
A) 1024 B) 10K C) 0.5M D) 1M2.8086CPU读/写一次存储器或I/O端口所需的时间称为一个( )。
A) 总线周期 B) 指令周期 C) 时钟周期 D) 基本指令执行时间3.微型计算机的输入/输出有三种不同的控制方法,其中以( )控制的输入/输出是微机进行I/O的一种最主要的控制方式。
A) 程序控制 B) 中断控制C) DMA控制D) 以上均可4.程序查询I/O方式的工作流程是按( )的次序完成一个字符的传输。
A) 写数据端口,读/写控制端口B) 读状态端口,读/写数据端口C) 写控制端口,读状态端口,写数据端口D) 随I/O接口的具体要求而定5.在CPU与外设的I/O传送控制方式中,效率高、实时性强的方式是( )。
A) 同步传送 B) 查询传送 C) 无条件传送 D) 中断传送6.在CPU与外设的I/O传送控制方式中,传送速度最快的方式是( )。
A) 无条件传送 B) 查询传送 C) 中断传送 D) DMA传递7.用具有两个状态(“0”和“1”态)的一组开关作简单输入设备时,应采用( )传送方式来输入信息。
A) 无条件B) 查询C) 中断D) DMA8.用一组发光二极管作为简单输出设备时,应采用( )传送方式来输出信息。
A) DMA B) 无条件C) 查询D) 中断9.在微机系统中引入中断技术,可以( )。
A) 提高外设速度B) 减轻主存负担C) 提高处理器的效率D) 增加信息交换的精度10.CPU响应中断请求的时刻是在( )。
A) 执行完成正在执行的程序以后 B) 执行完正在执行的指令以后C) 执行完本时钟周期以后D)执行完正在执行的机器周期以后11.8086/8088CPU向应两个硬中断INTR和NMI时,相同的必要条件是( )。
A) 允许中断B) 当前I/O操作执行结束C) 总线空闲D) 当前访问内存操作结束12.在微型计算机系统中,高速外设与内存储器进行批量数据传送时,应采用( )。
STM32F103学习笔记(五) 外部中断

STM32F103学习笔记(五)外部中断首先是外部中断基本的概念:STM32 的每个IO 都可以作为外部中断的中断输入口,这点也是STM32 的强大之处。
STM32F103 的中断控制器支持19 个外部中断/事件请求。
每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。
STM32F103 的19 个外部中断为:线0~15:对应外部IO 口的输入中断。
线16:连接到PVD 输出。
线17:连接到RTC 闹钟事件。
线18:连接到USB 唤醒事件。
线16~18还没有学到只看了线0~15。
每个中断线对应着7个GPIO口,形成映射关系,以线0 为例:它对应了GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。
而中断线每次只能连接到1 个IO 口上,这样就需要通过配置来决定对应的中断线配置到哪个GPIO 上了。
下面我们看看GPIO 跟中断线的映射关系图:根据映射关系,就开始配置按键对应GPIO口和中断的映射了:[csharp] view plain copy <pre name="code" class="csharp"><prename="code" class="html">void EXTIX_Init(void){ EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure; KEY_Init(); // 按键端口初始化RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,EN ABLE); //使能复用功能时钟//GPIOE.2 中断线以及中断初始化配置下降沿触发GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_Pi nSource2);EXTI_InitStructure.EXTI_Line=EXTI_Line2; //KEY2 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器//GPIOE.3 中断线以及中断初始化配置下降沿触发//KEY1GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_Pi nSource3);EXTI_InitStructure.EXTI_Line=EXTI_Line3;EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器//GPIOE.4 中断线以及中断初始化配置下降沿触发//KEY0GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_Pi nSource4);EXTI_InitStructure.EXTI_Line=EXTI_Line4;EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器//GPIOA.0 中断线以及中断初始化配置上升沿触发PA0 WK_UPGPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_Pi nSource0);EXTI_InitStructure.EXTI_Line=EXTI_Line0;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//使能按键WK_UP所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;//使能按键KEY2所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子优先级2NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;//使能按键KEY1所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;//使能按键KEY0所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子优先级0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器} //外部中断0服务程序voidEXTI0_IRQHandler(void) { delay_ms(10);//消抖if(KEY3==1) //WK_UP按键{ BEEP=!BEEP; } EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位} //外部中断2服务程序voidEXTI2_IRQHandler(void) { delay_ms(10);//消抖if(KEY2==0) //按键KEY2{ LED0=!LED0; }EXTI_ClearITPendingBit(EXTI_Line2); //清除LINE2上的中断标志位} //外部中断3服务程序voidEXTI3_IRQHandler(void) { delay_ms(10);//消抖if(KEY1==0) //按键KEY1{ LED1=!LED1; }EXTI_ClearITPendingBit(EXTI_Line3); //清除LINE3上的中断标志位} void EXTI4_IRQHandler(void){ delay_ms(10);//消抖if(KEY0==0) //按键KEY0 { LED0=!LED0;LED1=!LED1; }EXTI_ClearITPendingBit(EXTI_Line4); //清除LINE4上的中断标志位} [html] view plain copy。
基于STC89C52单片机时钟的设计与实现

基于STC89C52单片机时钟的设计与实现1. 本文概述本文主要介绍了基于STC89C52单片机和DS1302时钟芯片的电子时钟设计与实现。
该电子时钟系统具有年月日等基本时间显示功能,并集成了秒表计时处理、闹钟定时、蜂鸣器和温度显示等附加功能。
系统采用LCD1602作为液晶显示器件,通过单片机对时钟和温度等数据进行处理后传输至LCD进行显示。
用户可以通过按键对时间进行调节,同时,单片机还通过扩展外围接口实现了温度采集等功能。
本文的目标是提供一个功能丰富、易于操作的电子时钟系统,为学习和应用单片机技术提供一个实用的案例。
2. 系统设计要求在设计基于STC89C52单片机的时钟系统时,我们需要考虑以下几个关键的设计要求:时钟系统必须具备基本的时间显示功能,能够以小时、分钟和秒为单位准确显示当前时间。
系统还应支持设置闹钟功能,允许用户设定特定的时间点进行提醒。
系统需要保证长时间稳定运行,具备良好的抗干扰能力,确保在各种环境下都能准确计时。
还应具备一定的容错能力,即使在操作失误或外部干扰的情况下,也能保证系统的正常运行。
用户界面应简洁直观,便于用户快速理解和操作。
时钟的显示部分应清晰可见,即使在光线较暗的环境下也能保持良好的可视性。
同时,设置和调整时间的操作应简单易懂,方便用户进行日常使用。
在设计时钟系统时,应考虑到未来可能的功能扩展,如温度显示、日期显示等。
系统的设计应具有一定的灵活性和扩展性,以便在未来可以轻松添加新的功能模块。
鉴于时钟系统可能需要长时间运行,能耗是一个重要的考虑因素。
设计时应选择低功耗的元件,并优化电源管理策略,以延长电池寿命或减少能源消耗。
在满足上述所有要求的同时,还需要控制成本,确保产品的市场竞争力。
这可能涉及到对单片机的编程优化、选择性价比高的外围元件等措施。
通过满足上述设计要求,我们可以确保开发出一个功能完善、稳定可靠、用户友好、易于扩展、节能环保且成本效益高的STC89C52单片机时钟系统。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机编程技巧----功能强大的时钟中断
在单片机程序设计中,设置一个好的时钟中断,将能使一个CPU发挥两个CPU的功效,大大方便和简化程序的编制,提高系统的效率与可操作性。
我们可以把一些例行的及需要定时执行的程序放在时钟中断中,还可以利用时钟中断协助主程序完成定时、延时等操作。
下面以6MHz时钟的AT89C51系统为例,说明时钟中断的应用。
定时器初值与中断周期时钟中断无需过于频繁,一般取20mS(50Hz)即可。
如需要百分之一秒的时基信号,可取10mS(100Hz)。
这里取20mS,用定时器T0工作于16位定时器方式(方式1)。
T0的工作方式为:每过一个机器周期自动加1,当计满0FFFFh,要溢出时,便会产生中断,并由硬件设置相应的标志位供软件查询。
即中断时比启动时经过了N+1个机器周期。
所以,我们只要在T0中预先存入一个比满值0FFFFh小N的数,然后启动定时器,便会在N个机器周期后产生中断。
这个值便是所谓的“初值”。
下面计算我们需要的初值:时钟为6MHz,12个时钟周期为一
个机器周期,20mS中有10000个机器周期。
(10000)10=(2710)16,则0FFFFh-2710h+1=0D8F0h。
由于响应中断、保护现场及重装初值还需要
7~8个机器周期,把这个值再加上7,即T0应装入的初值是0D8F7h。
每次中断进入后,先把A及PSW的值压入堆栈,然后即把0D8F7h装入T0。
设置一个单元,每次中断加1我们可以取内部RAM中一个单元,取名为INCPI(Increase Per Interrupt),在中断中,装完T0初值后,用INC INCPI指令将其加一。
从这个单元中,无论中断程序还是主程序,都可以从中获得20mS的1~256之间任意整数倍的信号。
例如:有一段向数码管送显的程序,需要每0.5秒执行一次以便刷新显示器,便可以设一单元(称为等待单元)W_DISP,用
MOV A,INCPI
ADD A,#25
MOV W_DISP,A
语句让其比当前的INCPI值大25,然后在每次中断中检查是否于INCPI值相等。
若相等,说明已过了25个中断周期,便执行送显程序,并且让W_DISP再加上25,等待下个0.5秒。
我们可以设置多个等待单元,以便取出多个不同的时基信号。
让中断程序在每次中断时依次查询各个等待单元是否与INCPI相等,若相等,则执行相应的处理,并重新设置该等待单元的值,否则跳过。
例如:用0.5秒信号刷新或闪烁显示器,用1秒信号产生实时时钟,或输出一定频率的方波,以一定间隔查询输入设备等。
在中断中读键,通常,我们在主程序中读键盘,步骤为:扫描键盘,若有键按下,则延时几十毫秒去抖动,再次确认此键确实按下,然后处理该键对应的工作,完成后再次重上述步骤。
但这有两点不足:
1.处理相应工作时无法锁存按键的输入,即可能漏键。
2.延时去抖时CPU无法做其它事情,效率不高。
如果把读键放入时钟中断中,则可避免上述不足。
方法为:如果两次相邻的中断中都读到同一个键按下,则这个键是有效的(达到了去抖目的),并将其锁存到先入先出(队列)的键盘缓冲区,等主程序来处理。
这样,主程序处理按键的同时,仍可响应键盘的输入。
缓冲区深度通常可设为8级,若锁存的键数多于8个,则忽略新的按键,并报警提示用户新的按键将无效。
若键盘缓冲队列停滞的时间大大长于主程序处理按键所需要的最大时间,说明主程序已出错或跑飞,可以在中断用指令将系统复位,起到了看门狗的目的。
主程序中的延时,由于有常开的时钟中断,所以当主程序中有需要时间较短、精度较高的延时时,应暂时把时钟中断关闭。
而程序中需要时间较长、精度不高的延时时,便可仿照下需的写法,避免多层嵌套的循环延时。
例:在P1.1输出1秒的高电平脉冲
MOV A,INCPI
INC A
CJNE A,INCPI$ ;等待一次中断处理完成
SETB P1.1 ;设P1.1为H,脉冲开始
ADD A,#50 ;50个20mS为1秒
CJNE A,INCPI,$ ;等中断将INCPI加一50次
CLR P1.1 ;设P1.1为L,脉冲结束
结束语:从上看出,要灵活地应用时钟中断,将任务合理分配给中断和主程序,并且二者要分工明确,接口简单。
这其中的技巧还需要大家在实践中多多摸索与体会。
另外要注意:应尽量缩短中断处理程序的执行时间,更不要长于20mS。