C51单片机时钟中断及主要问题

合集下载

单片机一些常用的延时与中断问题及解决方法

单片机一些常用的延时与中断问题及解决方法

单片机一些常用的延时与中断问题及解决方法(总4页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--单片机一些常用的延时与中断问题及解决方法延时与中断出错,是单片机新手在单片机开发应用过程中,经常会遇到的问题,本文汇总整理了包含了MCS-51系列单片机、MSP430单片机、C51单片机、8051F的单片机、avr单片机、STC89C52、PIC单片机…..在内的各种单片机常见的延时与中断问题及解决方法,希望对单片机新手们,有所帮助!一、单片机延时问题20问1、单片机延时程序的延时时间怎么算的答:如果用循环语句实现的循环,没法计算,但是可以通过软件仿真看到具体时间,但是一般精精确延时是没法用循环语句实现的。

如果想精确延时,一般需要用到定时器,延时时间与晶振有关系,单片机系统一般常选用 2 MHz、12 MHz或6 MHz晶振。

第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。

本程序中假设使用频率为12 MHz的晶振。

最长的延时时间可达216=65 536 μs。

若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。

2、求个单片机89S51 12M晶振用定时器延时10分钟,控制1个灯就可以答:可以设50ms中断一次,定时初值,TH0=0x3c、TL0=0xb0。

中断20次为1S,10分钟的话,需中断12000次。

计12000次后,给一IO口一个低电平(如功率不够,可再加扩展),就可控制灯了。

而且还要看你用什么语言计算了,汇编延时准确,知道单片机工作周期和循环次数即可算出,但不具有可移植性,在不同种类单片机中,汇编不通用。

用c 的话,由于各种软件执行效率不一样,不会太准,通常用定时器做延时或做一个不准确的延时,延时短的话,在c中使用汇编的nop做延时3、51单片机C语言for循环延时程序时间计算,设晶振12MHz,即一个机器周期是1us。

C51单片机的几种常用延时程序设计2024

C51单片机的几种常用延时程序设计2024

引言概述:C51单片机是一种广泛应用于嵌入式系统中的微控制器,它具有高度集成化、易于编程和灵活性强等特点。

在C51单片机的软件开发过程中,延时程序设计是非常重要的一部分。

本文将介绍C51单片机中几种常用的延时程序设计方法,包括循环延时、定时器延时、外部中断延时等。

这些方法不仅可以满足在实际应用中对延时的需求,而且可以提高程序的稳定性和可靠性。

正文内容:一、循环延时1. 使用循环控制语句实现延时功能,例如使用for循环、while循环等。

2. 根据需要设置延时的时间,通过循环次数来控制延时的时长。

3. 循环延时的精度受到指令执行时间的影响,可能存在一定的误差。

4. 循环延时的优点是简单易用,适用于较短的延时时间。

5. 注意在循环延时时要考虑其他任务的处理,避免长时间的等待造成程序卡死或响应延迟。

二、定时器延时1. 使用C51单片机内置的定时器模块来实现延时。

2. 配置定时器的工作模式,如工作方式、定时器精度等。

3. 设置定时器的初值和重装值,控制定时器中断的触发时间。

4. 在定时器中断服务函数中进行延时计数和延时结束标志的设置。

5. 定时器延时的优点是精确可控,适用于需要较高精度的延时要求。

三、外部中断延时1. 在C51单片机上配置一个外部中断引脚。

2. 设置外部中断中断触发条件,如上升沿触发、下降沿触发等。

3. 在外部中断中断服务函数中进行延时计数和延时结束标志的设置。

4. 外部中断延时的优点是能够快速响应外部信号,适用于实时性要求较高的场景。

5. 注意在外部中断延时时要处理好外部中断的抖动问题,确保延时的准确性。

四、内部计时器延时1. 使用C51单片机内部的计时器模块来实现延时。

2. 配置计时器的工作模式,如工作方式、计时器精度等。

3. 设置计时器的初值和重装值,使计时器按照一定的频率进行计数。

4. 根据计时器的计数值进行延时的判断和计数。

5. 内部计时器延时的优点是能够利用单片机内部的硬件资源,提高延时的准确性和稳定性。

单片机技术的使用中常见问题及解决方案集锦

单片机技术的使用中常见问题及解决方案集锦

单片机技术的使用中常见问题及解决方案集锦引言:单片机技术作为嵌入式系统开发的核心,广泛应用于各个领域。

然而,在实际使用过程中,我们常常会遇到各种问题,这不仅会影响项目的进展,还可能导致系统的稳定性和可靠性下降。

本文将针对单片机技术的使用中常见问题进行分析,并提供一些解决方案,帮助读者更好地应对这些问题。

一、电路设计问题及解决方案在单片机技术的应用中,电路设计是至关重要的,一个合理的电路设计能够提高系统的稳定性和可靠性。

以下是一些常见的电路设计问题及解决方案:1. 电源干扰问题电源干扰是导致单片机系统不稳定的常见问题之一。

解决方案是在电源输入端添加电源滤波电路,如电容滤波器和磁珠滤波器,以减小电源线上的噪声。

2. 时钟电路问题时钟电路是单片机系统中的关键部分,它提供了系统的时钟信号。

如果时钟电路设计不合理,可能会导致系统时钟不准确或者不稳定。

解决方案是使用稳定的时钟源,并在时钟信号线上添加适当的阻抗匹配电路,以降低时钟信号的反射和干扰。

3. 脉冲干扰问题脉冲干扰是由于电路中的开关动作引起的,它会导致单片机系统的工作不正常。

解决方案是在输入端添加合适的滤波电路,如RC滤波器或者磁珠滤波器,以减小脉冲干扰的影响。

二、软件编程问题及解决方案单片机技术的应用离不开软件编程,一个高效、可靠的程序是保证系统正常运行的关键。

以下是一些常见的软件编程问题及解决方案:1. 内存管理问题单片机的内存资源有限,合理地管理内存是提高程序效率的关键。

解决方案是合理地分配内存空间,避免内存碎片的产生,并使用适当的数据结构和算法来优化程序。

2. 中断处理问题中断是单片机系统中常用的一种处理方式,但不正确的中断处理可能导致系统死机或者数据丢失。

解决方案是在中断处理程序中尽量减少对全局变量的访问,避免死锁和资源竞争的问题。

3. 时序控制问题时序控制是单片机系统中的重要部分,它决定了系统各个模块的工作顺序和时序关系。

解决方案是合理地设计时序控制逻辑,并使用定时器和计数器等硬件资源来辅助实现。

单片机的延时与中断问题及解决方法

单片机的延时与中断问题及解决方法

单片机的延时与中断问题及解决方法概述在单片机的应用开发中,延时和中断是两个非常重要的概念。

延时是指在程序中暂停一段时间,而中断是指在程序执行过程中突然打断当前的执行流程去处理其他事务。

延时和中断的使用对于单片机的应用开发非常重要,合理的使用可以提高程序的效率和可靠性。

在实际开发中,延时和中断也经常会遇到一些问题。

本文将针对单片机的延时和中断问题进行分析,并提出相应的解决方法。

延时问题及解决方法延时是指在程序执行过程中暂停一段时间。

单片机中常用的延时方法有软件延时和硬件延时两种。

软件延时是通过在程序中执行循环来实现延时的。

例如:void delay(unsigned int time){while(time--);}硬件延时是通过单片机内部的定时器来实现延时的。

在51单片机中可以通过配置定时器的初值和工作模式来实现延时。

在实际开发中,延时经常会遇到一些问题。

延时时间不准确,延时过长或过短等。

造成这些问题的原因有很多,常见的原因包括系统时钟频率不准确、程序执行过程中被中断打断、延时中使用了未初始化的变量等。

为了解决这些问题,可以采取一些措施。

要确保系统时钟频率的准确性。

一般来说,单片机的延时是通过系统时钟来实现的,如果系统时钟频率不准确,那么延时时间也会不准确。

要确保系统时钟频率的准确性。

一种简单的方法是通过外部晶振来提供时钟信号,另一种方法是通过软件校准系统时钟频率。

要避免在延时中使用未初始化的变量。

在C语言中,未初始化的变量的值是不确定的,因此在延时中使用未初始化的变量可能会导致延时时间不准确。

在延时前要确保所使用的变量已经正确初始化。

要避免在延时中被中断打断。

在单片机的程序执行过程中,可能会发生各种中断事件,如果在延时中被中断打断,那么延时时间也会不准确。

为了避免这种情况,可以在延时前禁止所有中断,延时结束后再使能中断。

中断问题的解决方法主要包括中断优先级的设置、中断屏蔽和中断标志的清除。

中断优先级的设置是非常重要的。

c51单片机中断详解

c51单片机中断详解
一、中断请求标志位 A、TCON中的中断标志位 TCON为定时器/计数器的控 制寄存器,字节地址为88H。
包含: (1)T0和T1的溢出中断请求标志位TF1和TF0。 (2)外部中断请求标志位IE1与IE0。 各标志位的功能:
IE1——外部中断请求1的中断请求标志位。 IE1=0,无中断请求。 IE1=1,外部中断1有中断请求。当CPU响应该中 断,转向中断服务程序,由硬件清“0”IE0。
● IT1外部中断1的中断触发方式控制位
IT1——选择外部中断请求1为负跳变触发方式 还是电平触发方式:
IT1 =0,为电平触发方式,IE1状态完全 由IT1决定。
IT1=1,为负跳变触发方式。 IT1可由软件置“1”或清“0”。
● IT0—外部中断请求0为负跳变触 发方式还是电平触发方式,意义与 IT1类似。 ● IE0—外部中断请求0的中断请求 标志位,意义与IE1类似。
二、中断允许控制
中断允许控制寄存器IE
CPU对中断源的开放或屏蔽,由片内 的中断允许寄存器IE控制(两级控制)。 字节地址为A8H,可位寻址。格式如下:
IE中各位的功能如下:
(1)中断允许总控制位EA(IE.7位):
EA=0,所有中断请求被屏蔽。
EA=1,CPU开放中断,但五个中断源 的中断请求是否允许,还要由IE中 的5个中断请求允许控制位决定。
CPU暂时中止当前的工作,转到中断 服务处理程序处理所发生的事件。
处理完该事件后,再回到原来被中止的 地方,继续原来的工作,这称为中断。
中断方式优点:大大地提高了CPU的 工作效率。
●能够实现中断处理功能的部件称为 中断系统。 ●产生中断的请求源称为中断请求源。 ●中断源向CPU提出的处理请求,称为 中断请求(或中断申请)。 ● CPU暂时终止自身的事务,转去处 理中断事件的过程,称为CPU的中断响 应过程。

c51定时中断实验报告

c51定时中断实验报告

c51定时中断实验报告本文介绍的是C51定时中断实验,利用这个实验可以更好地理解C51的定时器与中断模块,进一步熟悉C语言的使用。

一、实验目的1.掌握C51单片机的定时器模块和中断模块。

2.熟悉定时器与中断的工作原理。

3.掌握利用中断实现定时功能的方法。

4.掌握如何调试程序,发现和解决程序问题。

二、实验装置硬件:STC89C52微控制器、电源、电路板、电路元件等。

软件:Keil C51集成开发环境。

三、实验原理1.定时器模块C51单片机中的定时器模块包含了3种不同的工作方式:工作模式0、模式1和模式2。

这些工作模式拥有不同的计数器范围和计数方式。

在本实验中,将使用工作模式1,因为它适用于大多数定时需求,并且易于编写程序。

工作模式1基本特点如下:(1)Timer1用两个8位计数器(TH1和TL1)组成,当一个计数器溢出时(从FFH计数到00H),计数值自动重装,同时中断请求位TF1被设置。

(2)计数器TH1可以初始值,TL1需要重新初始计数。

(3)Timer1的计数时钟来源可以是外部时钟源或内部时钟源,一般选择内部时钟源。

(4)TH开头的寄存器和TL开头的寄存器合起来组成16位的Timer1计数器,这个计数器的数值大小为TH1-TH1。

(5)x表示H或L。

用C语言对Timer1进行编程,首先需要完成以下配置:TMOD |= 0x10; // 定时器模式选择,使用模式1,TH0和TL0为一组计数器TH1 = (65536 - 50000) / 256; // 定时器初值设置ET1 = 1; // 打开定时器中断其中,TMOD是用来选择定时器工作模式,可以用对应的数值进行配置;TH1和TL1需要根据需要设置计数器初始值,该初值的计算公式为:计数初值 = (65536 - 计数时间/12)。

ET1为定时器1允许中断的位,EA为总中断允许位,TR1为定时器1工作使能位。

2.中断模块中断是一种实时响应外部事件处理的技术手段,当特定的硬件事件发生时,CPU自动调出相应的中断处理程序来响应事件,处理程序完成任务后返回继续程序运行,从而提高了CPU的效率。

c51单片机的定时器和中断

c51单片机的定时器和中断

二、方式1 方式
方式1结构 图6-5 T0 (或T1) 方式 结构 或
三、方式2 方式
TMOD 申请 TCON 中断 D7 TF1 TR1 TF0 TR0 T1引脚 溢出 TL1 重装初值控制 TH1 8位 &
≥1
0 1
M0 M1 C/T
D4
1
1 0
机器周期
GATE D7
1 INT1引脚
D0
方式2结构 图6-6 T0 (或T1) 方式 结构 或
图6-3 方波硬件设计和仿真波形
(2)源程序 ) //中断方式 中断方式 #include "reg51.h" #include "stdio.h" Uart_Init(); sbit P1_1=P1^1; void main() { TMOD=0X01; // T0工作在方式 工作在方式1 工作在方式 TL0=0xB0; //给TL0置初值 给 置初值 TH0=0x3c; //给TH0置初值 给 置初值 ET0=1; //开串行口中断 开串行口中断 EA=1; TF0=0; TR0=1; //启动 启动T0 启动 while(1) ; //设置断点处 设置断点处 } void Int_T0() interrupt 1 using 2 { TL0=0xB0; TH0=0x3c; //重赋初值 重赋初值 P1_1=!P1_1; //定时时间到 定时时间到P1_1取反 定时时间到 取反 printf("Timer1 overflow in Mode 1\n");/* 定时 溢出后, 器0溢出后,输出提示信息 */ 溢出后 }
计数器控制寄存器TCON 三、定时/计数器控制寄存器 定时 计数器控制寄存器
定时器控制字TCON的格式如下。 位地址 位符号 8FH TF1 8EH TR1 8DH TF0 8CH TR0 8BH IE1 8AH IT1 89H IE0 88H IT0

单片机的延时与中断问题及解决方法

单片机的延时与中断问题及解决方法

单片机的延时与中断问题及解决方法单片机的延时是指单片机在执行程序时,暂停一段时间,等待某个事件的发生或完成。

通常,延时常常是用于实现各种功能的操作,例如指示灯闪烁、发声器发出声音、读取传感器数据等等。

单片机的延时通常会由于外部因素产生不同的影响,因此需要根据实际需求选择合适的延时控制方式。

单片机的中断是指单片机由于外部因素或内部因素而暂停当前任务去响应其他事件的过程。

中断机制在单片机中发挥着重要的作用,它可以提高单片机的效率和准确性,同时提供实现多任务系统、异步事件处理等功能的能力。

因此,对于单片机开发人员来说,掌握中断机制的原理和应用是非常重要的。

在单片机的设计和开发过程中,延时和中断机制是必不可少的技术手段。

下面我们将详细介绍单片机的延时和中断机制,并提供一些解决方法供读者借鉴。

1、软件延时单片机的软件延时是通过控制程序执行的步骤和时间来实现的。

常用的方法有循环延时、定时器延时和误差修正延时。

(1)循环延时循环延时是利用循环语句进行延时的方法。

通常使用for循环语句,循环次数由延时的时间和单片机的主频决定。

例如,下面的代码可以实现一个大约1s的延时:for(int i=0;i<30000;i++){for(int j=0;j<100;j++);}这段代码主要是通过两个for循环语句来实现的。

外层的循环让程序执行30000次,内层的循环则是让其每循环一次暂停100微秒。

根据微秒数的定义以及单片机时钟周期的计算,可以计算出程序运行了大约1s的时间。

虽然循环延时是一种简单有效的方法,但存在延时不准确、占用CPU时间长等问题,所以只建议在简单应用场景中使用。

(2)定时器延时void timer_delay(void){T0CTL = 0x80; //打开定时器0T0CLK = 2; //选择定时器时钟源T0CNTL = 0; //定时器计数器清零while(T0CNTL<245); //循环等待计数器溢出T0CTL = 0; //关闭定时器0}在这段代码中,定时器0的中断服务程序是利用T0中断的机制实现的。

c51单片机考试题目及答案

c51单片机考试题目及答案

c51单片机考试题目及答案一、单项选择题(每题2分,共20分)1. 8051单片机的内部数据存储器的容量是()。

A. 128BB. 256BC. 512BD. 1024B答案:B2. 8051单片机中,哪个寄存器用于存储程序计数器PC的值?()A. SPB. PCC. DPTRD. ACC3. 8051单片机的定时器/计数器的计数器模式下,计数器的值来自于()。

A. 外部事件B. 内部时钟C. 外部中断D. 定时器溢出答案:A4. 8051单片机中,哪个寄存器用于存储外部中断的优先级?()IPB. TCONC. IED. P15. 8051单片机的串行通信中,波特率的设置是通过()寄存器实现的。

A. TMODB. TCONC. SCOND. PCON答案:D6. 8051单片机中,哪个指令用于将累加器ACC的内容传送到外部数据存储器?()A. MOVX @DPTR, AB. MOVX A, @DPTRC. MOV @DPTR, AD. MOV A, @DPTR答案:A7. 8051单片机的中断系统中,哪个中断具有最高的优先级?()A. 外部中断0B. 定时器0中断C. 外部中断1D. 串行中断答案:C8. 8051单片机中,哪个指令用于将立即数传送到累加器ACC?()A. MOV A, #dataB. MOV A, @dataC. MOV A, dataD. MOV #data, A答案:A9. 8051单片机的定时器/计数器在方式1下,定时器/计数器的工作模式是()。

A. 16位定时器B. 8位自动重装载定时器C. 13位定时器D. 16位计数器答案:C10. 8051单片机中,哪个指令用于将累加器ACC的内容与寄存器R0的内容进行逻辑或操作?()A. ORL A, R0B. ORL R0, AC. ORL A, #R0D. ORL #R0, A答案:A二、填空题(每题2分,共20分)1. 8051单片机的外部中断0的中断向量地址是______。

51单片机的时钟电路原理

51单片机的时钟电路原理

51单片机的时钟电路原理
51单片机的时钟电路原理如下:
1. 外部晶振电路:51单片机的时钟电路主要由一个晶体振荡电路组成,晶体振荡电路由一个晶体谐振器和两个电容组成。

晶体振荡电路产生的正弦信号被送入单片机内部,用于驱动时钟周期。

2. 时钟源选择:51单片机的时钟源可以选择外部晶振电路提供的晶振信号或者内部RC振荡电路提供的振荡信号。

3. 预分频器:51单片机内部有一个12位的预分频器,用于将时钟信号进行分频。

预分频器的分频比可以通过程序设置,可以将时钟信号分频为1、2、4、8、12等倍数,可根据需要选择合适的分频比。

4. 定时器:51单片机内部有一个定时器/计数器,用于实现定时和计数功能。

定时器可以根据程序设置的计数值产生中断信号,以实现定时中断和计数中断功能。

5. 中断控制:51单片机的时钟电路中包含一个中断控制模块,用于实现对定时器中断信号的处理。

中断控制模块可以根据程序的设置,决定是否接受定时器中断信号,以及如何响应中断。

总之,51单片机的时钟电路利用外部晶振电路提供的晶振信号作为时钟源,通过预分频器进行分频,再经过定时器和中断控制模块的处理,最终实现定时和计数功能。

51单片机时钟程序设计

51单片机时钟程序设计

51单片机时钟程序设计51单片机时钟程序设计是基于51单片机的一种程序,用于控制和显示时间的各个参数,如小时、分钟、秒等。

在计时、计数、算术运算、控制输出、中断处理等领域都起到重要的作用。

本文将简单介绍51单片机时钟程序设计的基本框架和其实现方法。

1. 硬件准备在进行51单片机时钟程序设计之前,需要先准备好相关的硬件,包括51单片机芯片、晶振、LCD液晶显示屏等。

其中晶振是时钟源,用来产生稳定的时钟信号,LCD液晶显示屏则用于显示时钟相关信息。

2. 时钟程序的设计框架(1)初始化程序:此步骤的主要作用是设置相关的寄存器和标志位,为后续程序的正常运行做好准备。

(2)计时程序:此步骤的主要作用是对秒、分、时等时间参数进行计数,并将结果存储到相应的寄存器里。

(3)中断程序:此步骤的主要作用是设置中断触发条件和相应的处理程序,用来处理一些紧急事件。

(4)显示程序:此步骤的主要作用是将计时程序的结果以数字形式显示到LCD液晶显示屏上,同时可以进行一些特殊字符的显示。

(5)调试程序:此步骤的主要作用是用于调试程序代码,检测是否存在问题,比如程序写错了等等。

3. 时钟程序的实现方法(1)初始化程序初始化程序是开发52单片机时钟程序的第一步,可以根据实际需求进行相应的设置。

在本程序中,初始化程序需要进行以下设置:a. 定义输入输出端口;b. 配置定时器;c. 设置中断源;d. 初始化LCD液晶显示屏等相关参数;(2)计时程序计时程序是时钟程序的核心,其主要作用是计算并更新当前的时间参数。

在本程序中,计时程序需要进行以下操作:a. 设置定时器的时钟源和计数频率;b. 定义中断触发条件;c. 设置中断处理程序并对时间参数进行计数,并存储到相应的寄存器里;d. 根据时间参数更新液晶显示屏的显示内容。

(3)中断程序中断程序主要用于响应一些紧急事件,比如硬件异常、按键输入等。

在52单片机时钟程序中,中断程序需要以下操作:a. 定义中断触发条件;b. 检测中断源;c. 判断中断类型,并调用相应的处理程序;d. 清除中断标志位。

单片机的延时与中断问题及解决方法

单片机的延时与中断问题及解决方法

单片机的延时与中断问题及解决方法单片机是一种广泛应用于嵌入式系统中的微处理器,它能够实现各种各样的功能。

在单片机的程序设计中,延时与中断问题是非常重要的,对程序的性能和稳定性有着重要影响。

本文将对单片机的延时与中断问题进行深入探讨,并提出解决方法。

一、延时问题在单片机的程序设计中,经常需要进行延时操作,比如控制LED灯的闪烁、蜂鸣器的鸣叫、舵机的转动等。

延时的实现方式有多种,比如使用系统时钟、定时器、软件延时等。

但不同的实现方式都存在一定的问题。

1.使用系统时钟进行延时使用系统时钟进行延时的方式简单直接,但是存在精度不高、受系统频率影响大等问题。

系统时钟的频率一般是固定的,当CPU频率发生变化时,延时时间也会受到影响。

使用系统时钟进行延时,对CPU的占用率也较高,不利于系统的其他操作。

使用定时器进行延时是一种常用的方式,可以较好地解决上述问题。

通过定时器的计数功能,可以实现精确的延时,并且不受系统频率的影响。

定时器的数量有限,有时候难以满足多个延时任务的需要。

在某些单片机中,定时器和部分IO口共用,使用不当可能会引起IO口的冲突。

3.使用软件延时使用软件延时是一种常见的方式,可以通过循环计数实现延时。

但是软件延时对CPU的占用率较高,不能充分利用CPU的处理能力。

在一些对延时精度要求较高的应用中,软件延时不能够满足需求。

针对上述问题,可以采取一些解决方法。

比如在使用系统时钟进行延时时,可以通过调整系统时钟频率的方式来改变延时时间。

在使用定时器进行延时时,可以采用多个定时器共享的方式,应对多个延时任务的需求。

在使用软件延时时,可以结合定时器的方式来提高延时的精度。

二、中断问题在单片机的程序设计中,中断是一种很重要的机制,它能够及时响应外部事件,并且可以保证程序的及时执行。

但是中断也存在一些问题,比如中断嵌套、中断优先级、中断响应时间等。

1.中断嵌套中断嵌套是指当一个中断正在执行时,又有其他更高优先级的中断发生,导致当前的中断被打断。

单片机的延时与中断问题及解决方法

单片机的延时与中断问题及解决方法

单片机的延时与中断问题及解决方法一、延时问题在单片机编程中, 经常需要生成一定延时时间, 延时一般实现方式有两种, 一种是软件延时, 另一种是硬件延时。

1. 软件延时软件延时是逐个扫描处理器的时钟脉冲, 每一个时钟周期执行一次循环程序, 每次循环的时间固定。

通过循环次数的控制, 达到延时的目的。

在软件延时期间,程序是被占用的,故需要考虑延时时间尽量短,同时不影响程序的执行。

实现代码:void delay(unsigned int x) //延时函数,x表示延时时间{unsigned int i,j;for(i=0;i<x;i++)for(j=0;j<1000;j++); //短跑}下面的例子是让板载LED在开启1秒、关闭1秒间缓慢闪烁,延时采用软件延时的方式:硬件延迟又称为定时器延迟, 定时器是一个独立的片内设备, 可以独立于CPU运行,定时器的时间不受程序的执行速度和被调用函数的影响, 它运行在一个专用的时钟上面,它具有高可靠性和高精度的特点。

单片机的周期性和准确性都是要靠定时器来完成的。

同时这种方法不影响CPU的其他操作,具有很好的实时性。

二、中断问题中断是单片机的一种重要功能,它可以让CPU在执行某个任务的同时立即执行另一个任务,这种即时响应的能力是单片机的一个最大优点,常常用来响应实时性较高的任务。

微控制器具有中断请求和响应功能的芯片,中断处理器独立于当前CPU的执行,即产生中断时CPU停止执行当前指令,转而执行中断程序处的指令,用完后从停止的地方继续执行当前程序。

根据取决于它们发生的原因,中断可以分为两类:内部中断和外部中断。

中断的优点:相对于软件循环,中断方式的优势主要体现在:实现简单,处理时间短,对CPU的干扰小,实现实时性强。

中断的缺点:1. 中断需要单片机芯片本身支持,若不支持,需通过其他芯片辅助实现。

2. 硬件结构较为复杂,且比较占用IO口。

3. 中断只有在硬件支持的情况下才能使用,所以其可移植性不强。

c51单片机试题及答案

c51单片机试题及答案

c51单片机试题及答案一、选择题1. C51单片机的内部RAM中,用户可用的RAM空间大小为()。

A. 128BB. 256BC. 512BD. 1KB答案:B2. 下列关于C51单片机中断系统的描述,错误的是()。

A. C51单片机具有5个中断源B. C51单片机的中断向量地址是固定的C. C51单片机的中断优先级是可编程的D. C51单片机的中断服务程序必须放在内部RAM中答案:D3. 在C51单片机中,下列哪个寄存器是用来设置定时器模式的?()A. TCONB. TMODC. IED. IP答案:B二、填空题1. C51单片机的________位地址空间中,包含有程序存储器。

答案:64KB2. 在C51单片机中,使用________指令可以清除定时器的溢出标志。

答案:CLR TF03. C51单片机的外部中断0的中断向量地址是________。

答案:0003H三、简答题1. 简述C51单片机的定时器/计数器的工作原理。

答案:C51单片机的定时器/计数器是一种可编程的定时/计数设备。

它能够根据内部或外部事件来计数,或者在固定的时间间隔内产生中断。

定时器/计数器可以工作在定时模式或计数模式。

在定时模式下,定时器根据内部时钟脉冲的计数来计时;在计数模式下,定时器则根据外部事件的个数来计数。

2. 描述C51单片机的串行通信过程。

答案:C51单片机的串行通信是通过串行接口(SCI)实现的。

通信过程包括设置波特率、配置串行通信模式(如8位数据位、1位起始位、1位停止位等)、发送和接收数据。

发送数据时,数据首先被写入到串行数据寄存器(SBUF),然后通过串行接口发送出去。

接收数据时,数据通过串行接口接收并存储在SBUF中,之后可以通过软件读取。

四、编程题1. 编写一个C51单片机的程序,实现定时器0的初始化,并使其每隔1秒产生一个中断。

答案:```c#include <reg51.h>void Timer0_Init() {TMOD = 0x01; // 设置定时器0为模式1TH0 = (65536 - 50000) / 256; // 设置定时器初值TL0 = (65536 - 50000) % 256;ET0 = 1; // 使能定时器0中断EA = 1; // 开启全局中断TR0 = 1; // 启动定时器0}void Timer0_ISR() interrupt 1 {TH0 = (65536 - 50000) / 256; // 重新加载定时器初值TL0 = (65536 - 50000) % 256;// 此处添加中断服务程序代码}void main() {Timer0_Init();while(1);}```注意:以上程序中50000的值需要根据实际的晶振频率进行计算,以实现1秒的定时。

单片机的延时与中断问题及解决方法

单片机的延时与中断问题及解决方法

单片机的延时与中断问题及解决方法单片机作为嵌入式系统的核心部件,具有很强的实时性和稳定性要求。

在单片机的编程过程中,延时和中断是两个非常重要的概念。

延时是指在程序执行过程中,需要等待一定的时间才能继续执行下一条指令。

延时的作用在于控制程序的执行顺序,实现各种功能的时间控制和同步。

中断是指在程序执行过程中,当发生某些特定的事件时,硬件或者软件可以临时中断当前的执行流程,转而执行另一个特定的程序段,待中断处理完成后再返回到原来的程序流程中。

中断的作用在于及时响应各种外部事件,提高程序的实时性和效率。

延时和中断在单片机编程中经常会遇到各种问题,下面将针对延时和中断问题进行分析,并提出解决方法。

1. 延时时间不准确延时时间不准确的原因可能有多种,例如单片机的工作频率不稳定、指令执行时间不固定、编译器优化等。

为了解决延时时间不准确的问题,可以采用以下几种方法:(1)使用定时器定时器是单片机中非常重要的一个外设,可以产生精确的延时。

通过配置定时器的初值和工作模式,可以实现精确的延时功能。

(2)使用外部时钟源单片机的内部时钟源可能存在波动和不稳定的情况,可以通过外部时钟源来提供稳定的工作频率,从而提高延时的准确性。

(3)校准延时时间通过实际测试和校准,可以得到准确的延时时间,并在程序中使用这个准确的延时时间。

2. 延时过长导致程序响应慢在一些需要实时响应的程序中,如果延时过长会导致程序响应慢,对系统性能造成影响。

为了解决延时过长导致程序响应慢的问题,可以采用以下几种方法:通过定时器中断来实现延时,可以避免长时间的忙等待,提高程序的实时响应性。

(2)使用多任务机制采用多任务机制,将需要长时间延时的任务放到后台运行,以提高系统的响应能力。

(3)优化算法对需要延时的任务进行算法上的优化,尽量减少延时的时间,提高系统的实时性。

1. 中断响应不及时中断响应不及时的原因可能是中断服务程序执行时间过长,导致无法及时响应其他的中断请求。

【单片机】c51数字时钟(带年月日显示)

【单片机】c51数字时钟(带年月日显示)

【单片机】c51数字时钟(带年月日显示)集团文件发布号:(9816-UATWW-MWUB-WUNN-INNUL-DQQTY-【单片机】c51数字时钟(带年月日显示)显示当前时间:9点58分34秒(第一个零表示闹钟未开启)当前日期:10年4月六日摘要:本设计以单片机为核心,LED数码管动态扫描显示。

采用矩阵式键盘输入能任意修改当前时间日期和设定闹钟时间。

具有显示年月日(区分闰年和二月),闹钟报警和整点报时功能说明系统的功能选择由7个按键完成。

其中,分别对应调整当前时间的时和分,为外部中断0,控制闹钟功能的开启/关闭(开启时数码管第一位显示字母’c’)用作外部中断1,当前时间的显示与闹铃时间显示切换,闹钟显示时按,可进行闹钟时分的设定,此时,led1灯灭。

闹铃时间到切闹钟开关开启时,闹铃响一分钟。

\\对年月日进行调整(第一次按,就进入了年月日的显示,现在就可对日期进行调整)。

按回到当前时间的显示状态。

整点到时:报警对应小时的次数。

程序如下:#include<>#include<>#include<>#define uchar unsigned char#define uint unsigned intuchar data keyvalue; //查到的键值uchar data keys; //转换出的数字uchar dis[8];uchar codeseg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x40,0x00,0x39,0xf7}; // 0 1 2 3 4 5 6 7 8 9 - 灭灯 cnsbit led_duan=P2^6;//段选通sbit led_wei=P2^7;//位选通sbit speaker=P2^3;//蜂鸣器sbit minitek=P3^0;//分校正按键sbit hourk=P3^1;//小时校正按键sbit p3_4=P3^4;//sbit yeark=P3^5;//年sbit monthk=P3^6;//月sbit dayk=P3^7;//日uchar data wei,i;bit leap_year;//闰年标志位bit dis_nyr;bit cal_year=1;bit calculate=1;//显示年月日与当前时间切换标志uchar data c_min;//闹钟‘分寄存单元uchar data c_hou;//闹钟、小时寄存单元uchar data second;//秒uchar data minite;//分变量uchar data hour;//小时变量uchar data year,month,day;//定义年月日变量uchar data CNTA;uchar data speaker_num; //蜂鸣次数bit beep; //整点报时标志bit run; //运行标志bit flash; //灭灯标志bit clarm_switch; //闹钟开关标志bit baoshi; //报时开关标志sbit led1=P1^6; // 按键标识指示灯sbit led2=P1^7; // 运行标志指示灯sbit P3_2=P3^2;sbit P3_3=P3^3;uint n,k;/*10微秒级延时*/void delay_10us(uchar n)?{ do{ _nop_();_nop_();_nop_();_nop_();_nop_();}while(--n);}/***毫秒级延时 ***/void delay_ms(uint n)?{ do delay_10us(131);while(--n);}/****** 当前时间转换******/clk_to_dis(){dis[0]=second%10;dis[1]=second/10;if(flash)dis[2]=10;else dis[2]=11;dis[3]=minite%10;dis[4]=minite/10;dis[5]=hour%10;dis[6]=hour/10;}/*****定时闹钟显示译码(用于七段码显示)*****/ clarm_to_dis(){dis[0]=c_min%10;dis[1]=c_min/10;if(flash)dis[2]=10;//亮灯else dis[2]=11; //灭灯dis[3]=c_hou%10;dis[4]=c_hou/10;dis[5]=10;dis[6]=13;}/***********年月日显示译码************/ nyr_to_dis(){dis[0]=day%10;dis[1]=day/10;dis[2]=10;//显示'-'dis[3]=month%10;dis[4]=month/10;dis[5]=10; // '-'dis[6]=year%10;dis[7]=year/10;}/*主函数*/void main(){P2=0xff;P1=0XFF;p3_4=0;run=1;led2=0;//运行指示灯亮led1=1;flash=0x00;dis[2]=10; //第三位显示“-”wei=0x7f;//选通低位 i=0;?second=21;minite=58;hour=9;CNTA=0x00;year=10;month=4;day=5;clk_to_dis(); TMOD=0x11;TH0=15560/256;TL0=15560%256;TH1=0xfc;TL1=0x18;EA=1;PT0=1;EX0=1; //开中断;EX1=1;?ET0=1;ET1=1;TR0=1;TR1=1;while(1){while(run==1){clk_to_dis();if(calculate){if(month==1|month==3|month==5|month==7|month==8|month==10|month==12){day++;?if(day>31){day=0x01;month++; if(month==13){month=1;year++;cal_year=1;}}led1=0; //指示灯亮}if(month==4|month==6|month==9|month==11){day++;if(day>30){day=0x01;month++;}led1=0; //指示灯亮}if(month==2) {if(leap_year==1){day++;if(day==30)day=1;}else {day++;if(day==29)day=1;}}while(cal_year){if((year+2000)%400==0) leap_year=1; // 被400整除为闰年else if((year+2000)%100==0) leap_year=0; //不能被400整除能被100整除不是闰年 else if((year+2000)%4==0) leap_year=1; //不能被400、100整除能被4整除是闰年 else leap_year=0;cal_year=0;}calculate=0;led1=1;}while(!minitek){for(n=0;n<1000;n++);if(!minitek==0)break; //延时防抖minite++;second=0x00;led1=0;for(n=0;n<20;n++){speaker=!speaker;delay_10us(50); //蜂鸣器响 }if(minite==60)minite=0x00; while(!minitek); //等待键松开led1=1;//显示灯}while(!hourk){for(n=0;n<1000;n++);if(!hourk==0)break;hour++;second=0x00;led1=0;。

c51单片机中断详解

c51单片机中断详解
• 中断技术的特点
分时操作
——CPU可以同多个外设“同时” 工作
实时处理
——CPU及时处理随机事件
故障处理
——电源掉电、存储出错、运算 溢出
MCS-51中断系统资料仅的供参考 结构及中断源
中断源有以下几种情况:
(1)I/O设备(2)硬件故障(3) 实时时钟(4)为调试而设置的 中断。
MCS-51有5个中断请求源,两个中 断优先级,可两级嵌套。

资料仅供参考
例6-1 若允许片内2个定时器/计数器中
断,禁止其它中断源的中断请求。编写
设置IE的相应程序段。
(1)用位操作指令来编写如下程序段:
CLR ES
;禁止串行口中断
CLR EX1
;禁止外部中断1中断
CLR EX0
;禁止外部中断0中断
SETB ET0
;允许T0中断
SETB ET1
;允许中断
串行口中断
0023H
使用时,通常在这些入口地址处存放一条
跳转指令,使程序跳转到用户安排的中断服务
程序起始地址上去!
注意:中断服务子程序入口地址又称为中断
矢量或中断向量。单片机中5个中断源的矢量
地址是固定的,不能改动。

资料仅供参考
三、中断处理 编写中断中断服务程序即可
资料仅供参考
四、中断返回
▪中断返回由专门的中断返回指令 RETI来实现。

中断源
中断级别

外部中断0
最高

T0溢出中断

外部中断1 T1溢出中断 串行口中断
置 原 则?
最低
资料仅供参考
可归纳为下面三条基本规则: (1)低优先级可被高优先级中断,反之

单片机的延时与中断问题及解决方法

单片机的延时与中断问题及解决方法

单片机的延时与中断问题及解决方法单片机(Microcontroller)是一种在单个芯片上集成了CPU、存储器和输入输出设备等外围设备的计算机系统。

在嵌入式系统中,延时和中断(Interrupt)是常用的两种技术。

延时是一种在程序中等待一定时间的技术,而中断是一种在程序执行的任意时刻打断程序执行的技术。

本文将着重介绍单片机的延时和中断问题及解决方法。

在嵌入式系统中,延时是一种非常常见的操作。

当我们需要在程序中等待一段时间时,我们通常使用延时功能实现。

1.1 延时方式单片机的延时主要有“循环延时”和“计时器延时”两种方式:1)循环延时:单片机的工作频率通常是固定的,我们可以通过循环来实现延时操作。

循环延时的原理是用空语句填充时间,实现等待计时的效果。

示例如下://循环5次延时一秒钟void delay(){int i, j;for (i = 0; i < 5; i++)for (j = 0; j < 10000; j++);}2)计时器延时:单片机内部集成了计时器,我们可以利用它的定时功能来实现延时。

计时器定时的原理是利用定时器预定的时间周期,到达预定时间周期后,计时器会自动重置,并向中断向量发送中断请求。

这种延时方式精度高,不受循环次数和代码优化的影响。

示例如下://定时器延时一秒钟void delay(){TMOD = 0x01; //模式1:16位定时器模式TH0 = (65536-50000)/256; //赋上载值TL0 = (65536-50000)%256;TR0 = 1; //启动定时器while(TF0==0); //等待中断TR0 = 0; //停止定时器TF0 = 0;}1.2 延时精度问题延时精度是指出现误差的几率,因此延时的精度较高的情况下,误差几率会降低。

在单片机中,延时的精度受多种因素影响,如微处理器主频、指令执行的时间、数据访问等等。

循环延时精度较低,由于循环延迟的时间是由程序中指令的执行时间来决定的,程序指令执行时间与CPU主频相等,因此循环延时的精度会受到CPU主频的影响。

单片机时钟中断解析

单片机时钟中断解析

单片机时钟中断解析本文根据<新概念51单片机C语言教程>整理一. 中断一般概念51单片机一共设有5个中断源. 引起CPU中断根源, 成为中断源. 中断嵌套, 也即单片机在处理一个中断时又发生了一个中断, 单片机中断当前中断程序, 转而去处理新的中断程序. 中断优先级, 通过中断优先级寄存器设置.1. 中断源及其默认优先级其中, T2是52单片机独有的.2. 中断控制中的特殊功能寄存器SFR(1). 中断允许寄存器IE(Interrupt Enable)(2). 中断优先级寄存器IP(Interrupt Priority)二. 单片机的定时器中断定时器/计数器实质是一个16位的加1计数器, 由高8位(THx)和低8位(TLx)两个寄存器组成. TMOD是定时器/计数器的工作方式寄存器, 确定工作方式和功能; TCON是控制寄存器, 控制T0, T1的启动和停止及设置溢出标志.1. 定时器/计数器工作方式寄存器TMOD定时器/计数器工作方式寄存器在特殊功能寄存器中, 字节地址为0x89, 不能位寻址, TMOD 用来确定定时器的工作方式及功能选择. 单片机复位时TMOD全部被清0. 各位的含义如下:2. 定时器/计数器控制寄存器TCON3. 中断服务程序的C语言写法C51的中断函数格式如下:void func_name() interrupt 中断号[using 工作组]{//中断服务程序内容}●中断号: 指单片机中几个中断源的序号. 是编译器识别不同中断的唯一符号.●工作组: 可选部分. 指这个中断函数使用单片机内存中4组工作寄存器中的哪一组, C51编译器在编译时会自动分配工作组, 故通常省略.C语言中断程序示例如下:void T1_time() interrupt 3{TH1 = (65536-10000)/256;TL1 = (65536-10000)%256;}三. 补充1. 普通51系列单片机存储空间资源分配情况。

c51单片机期末考试题目及答案详解

c51单片机期末考试题目及答案详解

c51单片机期末考试题目及答案详解一、选择题(每题2分,共20分)1. 下列哪个不是51单片机的寄存器?A. ACCB. BC. PSWD. SP答案:D2. 51单片机的外部中断0的中断向量地址是:A. 0003HB. 000BHC. 0013HD. 001BH答案:C3. 51单片机的定时器0和定时器1的时钟频率分别是多少?A. 12MHz, 12MHzB. 6MHz, 12MHzC. 12MHz, 6MHzD. 6MHz, 6MHz答案:B4. 51单片机的串行通信可以工作在几种模式下?A. 1种C. 3种D. 4种答案:C5. 51单片机的外部数据存储器最大容量是多少?A. 64KBB. 128KBC. 256KBD. 512KB答案:A6. 51单片机的定时器/计数器在方式1下,定时器的溢出时间是:A. 12个机器周期B. 16个机器周期C. 24个机器周期D. 32个机器周期答案:C7. 51单片机的P0口作为I/O口使用时,需要外接什么?A. 电源B. 地线C. 上拉电阻D. 下拉电阻答案:C8. 51单片机的中断优先级由哪个寄存器决定?B. IPC. TCOND. SP答案:B9. 51单片机的定时器/计数器在方式2下,定时器的溢出时间是:A. 12个机器周期B. 16个机器周期C. 24个机器周期D. 32个机器周期答案:B10. 51单片机的堆栈最大深度是多少?A. 8层B. 16层C. 32层D. 64层答案:B二、简答题(每题10分,共30分)1. 简述51单片机的中断系统的基本工作原理。

答案:51单片机的中断系统由中断请求、中断响应、中断服务程序和中断返回四个基本环节组成。

当外部或内部事件触发中断请求时,单片机会在当前指令执行完毕后响应中断请求,保存当前状态并跳转到相应的中断服务程序地址执行中断服务。

中断服务完成后,通过中断返回指令恢复之前的状态并继续执行被中断的程序。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C51单片机时钟中断及主要问题一. 中断一般概念51单片机一共设有5个中断源. 引起CPU中断根源, 成为中断源. 中断嵌套, 也即单片机在处理一个中断时又发生了一个中断, 单片机中断当前中断程序, 转而去处理新的中断程序. 中断优先级, 通过中断优先级寄存器设置.1. 中断源及其默认优先级52单片机共有6个中断源, 如下:符号名称产生条件INT0 外部中断0 由P3.2端口线引入, 低电平或下降沿引起INT1 外部中断1 由P3.3端口线引入, 低电平或下降沿引起T0 定时器/计数器0 由T0计数器计满回零引起T1 定时器/计数器1 由T1计数器计满回零引起T2 定时器/计数器2 由T2计数器计满回零引起TI/RI 串行口中断串行端口完成一帧字符发送/接受后引起其中, T2是52单片机独有的.其默认中断优先级别如下:中断源默认优先级别序号(C语言用) 入口地址(汇编)INT0 最高0 0003HT0 第2 1 000BHINT1 第3 2 0013HT1 第4 3 001BHTI/RI 第5 4 0023HT2 最低 5 002BH2.中断控制中的特殊功能寄存器SFR(1). 中断允许寄存器IE(Interrupt Enable)位序号位符号位地址说明D7(高位) EA 0xAF 全局中断允许位D6 -- -- 无效位D5 ET2 0xAD Timer2中断允许位D4 ES 0xAC 串行口中断允许位D3 ET1 0xAB Timer1中断允许位D2 EX1 0xAA 外部中断1中断允许位D1 ET0 0xA9 Timer0中断允许位D0(低位) EX0 0xA8 外部中断0中断允许位备注对于上述所有中断允许位:1: 打开该中断0: 关闭该中断(2). 中断优先级寄存器IP(Interrupt Priority)位序号位符号位地址说明D7(高位) -- -- 无效位D6 -- -- 无效位D5 -- -- 无效位D4 PS 0xBC 串行口中断优先级控制位D3 PT1 0xBB Timer1中断优先级控制位D2 PX1 0xBA 外部中断1中断优先级控制位D1 PT0 0xB9 Timer0中断优先级控制位D0(低位) PX0 0xB8 外部中断0中断优先级控制位备注对于上述所有中断优先级控制位:1: 设置对应的中断为高优先级0: 设置对应的中断为低优先级二. 单片机的定时器中断定时器/计数器实质是一个16位的加1计数器, 由高8位(THx)和低8位(TLx)两个寄存器组成. TMOD是定时器/计数器的工作方式寄存器, 确定工作方式和功能; TCON是控制寄存器, 控制T0, T1的启动和停止及设置溢出标志.1. 定时器/计数器工作方式寄存器TMOD定时器/计数器工作方式寄存器在特殊功能寄存器中, 字节地址为0x89, 不能位寻址, TMOD 用来确定定时器的工作方式及功能选择. 单片机复位时TMOD全部被清0. 各位的含义如下:位序号控制位符号说明D7(高位) Timer1 GA TE 门控制位. 0表示Timer启动与停止仅受TCON寄存器TRx(x=0, 1)控制1表示Timer启动与停止由TCON寄存器中TRx(x=0,1)和外部中断引脚(INT0或INT1)上的电平状态共同控制D6 C/T___定时器和计数器模式选择位, 0:定时器, 1:计数器D5 M1 工作方式选择位. 见下表.D4 M0D3 Timer0 GA TED2 C/T___D1 M1D0(低位) M0备注M1 M0 工作方式0 0 方式0, 为13位定时器/计数器0 1 方式1, 为16位定时器/计数器1 0 方式2, 8位初值自动重装的8位定时器/计数器1 1 方式3, 仅适用于T0, 分成两个8位计数器, T1停止计数2. 定时器/计数器控制寄存器TCON位序号位符号位地址说明D7(高位) TF1 0x8F Timer1溢出标志位. 计满溢出后, 由硬件使TF1置1,并且申请中断. 进入中断处理程序后, 由硬件自动清0. 注意: 使用定时器中断, 该位不需要人为操作, 但如果使用软件查询方式的话, 必须使用软件清0.D6 TR1 0x8E Timer1运行控制位. 由软件清0关闭定时器 1. 当GA TE=1, 且INT1为高电平是, TR1置1启动定时器1; 当GA TE=0时, TR1置1启动定时器1.D5 TF0 0x8D Timer0溢出标志位. 其它同TF1.D4 TR0 0x8C Timer0运行控制位. 其它同TR1.D3 IE1 0x8B 外部中断1请求标志D2 IT1 0x8A 外部中断1触发方式选择位D1 IE0 0x89 外部中断0请求标志D0(低位) IT0 0x88 外部中断0触发方式选择位备注三、中断服务程序的C语言写法1、中断响应条件●中断源有中断请求;●此中断源的中断允许位为1;●CPU 开中断(即EA=1)。

以上三条同时满足时,CPU 才有可能响应中断2、2、C51的中断函数格式如下:void func_name() interrupt 中断号[using 工作组]{//中断服务程序内容}●中断号: 指单片机中几个中断源的序号. 是编译器识别不同中断的唯一符号.5个中断源排序:0代表外部中断0中断;1代表定时器/计数器0中断;2代表外部中断1中断;3代表定时器/计数器1中断;4代表串口中断。

●工作组: 可选部分. 指这个中断函数使用单片机内存中4组工作寄存器中的哪一组, C51编译器在编译时会自动分配工作组, 故通常省略.3、3、P3.2 口的外部中断EA=1; //开总中断EX0=1; //开外部中断0//IT0=1; 当IT=1 时位跳变沿外部中断触发方式//当IT=0 时为电平的外部中断触发方式TCON=0x01; 这是对寄存器将IT 置1,和IT0=1 的效果是一样的。

因为TCON 的地址是可以被8 整除,所以可以对其进行位操作4、4、定时/计数器应用举例初始化程序应完成如下工作:●对TMOD 赋值,以确定T0 和T1 的工作方式。

●计算初值,并将其写入TH0、TL0 或TH1、TL1。

●中断方式时,则对IE 赋值,开放中断。

●使TR0 或TR1 置位,启动定时计数器定时或计数。

定时器T0 中断的初始化TMOD=0x01; \\设定工作方式为16 位定时器TH0=(65536-50000)/256; \\赋定时器T0 高四的值为50MS(对256 求模)TL0=(65536-50000)%256; \\赋定时器T0 低四的值为50MS(对256 求余)EA=1; \\开总中断ET0=1; \\开定时器T0 中断TR0=1; \\启动定时器T0当定时器时间到产生中断就自动跳到以下中断函数,中断函数不需要做任何声明;void timer0( ) interrupt 1{TH0=(65536-50000)/256; \\重装初值TL0=(65536-50000)%256; \\重装初值\\往下写CPU 要处理的事情就OK 了}四. 补充1. 普通51系列单片机存储空间资源分配情况空间名称地址范围说明DA TA D:00H~7FH 片内RAM直接寻址区BDA TA D:20H~2FH 片内RAM位寻址区IDA TA I:00H~FFH 片内RAM间接寻址区XDA TA X:0000H~FFFFH 64K片外RAM数据区CODE C:0000H~FFFFH 64K片内外ROM代码区BANK0~BANK31 B0:0000H~FFFFH::B31:0000H~FFFFH分组代码区,最大可扩展32X64KB ROM五、C51应注意的问题C51的中断函数的格式为:void FuncIr(void) interrupt x [using y]以下是一些分析:一、中断函数是一个特殊的函数,没有参数,也没有返回值;但是程序中允不允许使用return呢?答案是允许的,不过只能用"return;",不能用"return(z);";用在一些需要快速返回的地方,对应的汇编会有多个ret语句,相对效率会高一些。

二、using的用法,using可以修饰任何函数,不过建议只用来修饰中断函数;简单的说,“using”会指定工作寄存器组,由于中断函数一般都是比较紧急的事情,有时一条语句都会斤斤计较,所以使用using切换寄存器组可以省去一些压栈的动作,由于51只有两级中断,同级中断不能被打断,因此,我们可以同级中断设成同样的寄存器组,从某种意义上来说,有一组寄存器是多余的。

同时建议中断函数应该使用using这个关键字。

三、中断中调用函数,首先要讨论中断函数中调用函数的必要性,有些情况中断中调用函数还是必要的,这个时候是不是该调用函数,其实和普通函数差不多,首先是这个函数如果调用多次,或者要带一些参数什么的就更加必要的;假如只调用一次且无参数无返回的函数要直接写,因为如果用函数,至少会增加CALL 和RET两条语句,实际调试发现:当你程序比较复杂时,你将那部分单独拉出来做成函数,可能代码和时间都会更好(/bbs/moredata.asp?id=19732&syid=654577#aa)。

四、中断中调用的函数最好不要被中断外的其它函数调用,因为会出现“重复调用”的警告,有时这种调用是很致命的,有人说这个函数可以用reentrant 来修饰,是的,的确可以这样解决,不过不建议这么做,也许这样会跟你减少很多堆栈空间,并且整个程序的优化要差很多,建议出现这种情况就把这个函数写两遍,分成两个函数分别调用。

五,中断调用了函数,会出现一些莫名其妙的问题,一些数据不对。

其实一般是因为汇编中使用了绝对寄存器引起的(/bbs/moredata.asp?id=19732&syid=654114),有人说中断函数使用那个寄存器组,被中断调用的函数就使用哪个寄存器组,我认为这样不好:这样会增加额外的消耗,使用using会增加一下语句:PUSH PSWMOV PSW, #XX....POP PSW更重要的是,使用using的函数不能有返回值,这是致命伤推荐的方法有两种:1、使用“#pragma NOAREGS”禁止使用绝对寄存器2、使用“#pragme RB(x)”来指定本文件的工作寄存器组六、一般说来,要求中断函数尽可能的短,但也有特殊情况,有些前/后台的系统中,就会把很多相对重要的事情放到定时中断(这个定时中断类似实时操作系统中的时钟节拍)去做,而且程序很长。

中断函数也是一个函数而已,只要系统有必要,可以做一些看似不合理的事情,该出手时就出手,就像goto语句一样。

相关文档
最新文档