历史上的今天
返回首页

历史上的今天

今天是:2024年12月19日(星期四)

正在发生

2018年12月19日 | C51单片机学习(二):中断系统和定时器

2018-12-19 来源:eefocus

中断系统:

中断概念

CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生); 

CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务); 

待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断 。


中断的结构图

 这里写图片描述 

其中一些说明: 

1、(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降 

沿有效。当CPU检测到P3.2引脚上出现有效的中断信号时, 

中断标志IE0(TCON.1)置1,向CPU申请中断。 

2、(P3.3)可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上出现有效的中断信号时,中断标志IE1(TCON.3)置1,向CPU申请中断。 

3、TF0(TCON.5),片内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时,置位TF0,并向CPU申请中断。 

4、TF1(TCON.7),片内定时/计数器T1溢出中断请求标志。当定时/计数器T1发生溢出时,置位TF1,并向CPU申请中断。 

5、RI(SCON.0)或TI(SCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位RI或当串行口发送完一帧串行数据时置位TI,向CPU申请中断。


TCON的中断标志

 这里写图片描述 

说明: 

T0(TCON.0),外部中断0触发方式控制位。 

当IT0=0时,为电平触发方式。 

当IT0=1时,为边沿触发方式(下降沿有效)。 

IE0(TCON.1),外部中断0中断请求标志位。 

IT1(TCON.2),外部中断1触发方式控制位。 

IE1(TCON.3),外部中断1中断请求标志位。 

TF0(TCON.5),定时/计数器T0溢出中断请求标志位。 

TF1(TCON.7),定时/计数器T1溢出中断请求标志位。


SCON中断标志

 这里写图片描述 

RI(SCON.0),串行口接收中断标志位。当允许串行口接收数据时,每接收完一个串行帧,由硬件置位RI。注意,RI必须由软件清除。 

TI(SCON.1),串行口发送中断标志位。当CPU将一个发送数据写入串行口发送缓冲器时,就启动了发送过程。每发送完一个串行帧,由硬件置位TI。CPU响应中断时,不能自动清除TI,TI必须由软件清除。


关于优先级:

51单片机中断优先级: 

CPU同时接收到几个中断时,首先响应优先级别最高的中断请求。 

正在进行的中断过程不能被新的同级或低优先级的中断请求所中断。 

正在进行的低优先级中断服务,能被高优先级中断请求所中断。


为了实现上述后两条原则,中断系统内部设有两个用户不能寻址的优先级状态触发器。其中一个置1,表示正在响应高优先级的中断,它将阻断后来所有的中断请求;另一个置1,表示正在响应低优先级中断,它将阻断后来所有的低优先级中断请求。


同一优先级中的中断申请不止一个时,则有中断优先权排队问题。同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如所示:


这里写图片描述

中断响应条件:

中断源有中断请求; 

此中断源的中断允许位为1; 

CPU开中断(即EA=1)。


实例(外部中断0)

 /*以下设置的时候数码管开始从0到f循环,当触发中断(杜邦线将GND和P3^2口连接)

 此时因为IT0默认为0,所以是低电平触发,由此LED灯亮,松开时,灯灭。将IT0置为1是,即下降沿有效

 此时将P3^2引脚杜邦线接入瞬间LED灯亮,继续接入或者拔开灯灭*/

#include

#define uint unsigned int 

#define uchar unsigned char 

sbit dula=P2^6;

sbit wela=P2^7;

sbit d1=P1^0;

uchar num,flag = 0;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

void delay(uint z);

void init(){

    EA=1;//开总中断

    EX0=1;//开外部中断0

    //IT0=1;   //寄存器内默认全为0,IT0为1则是下降沿有效,否则是低电平有效,可以通过杜邦线和GND接口连接达到测试目的

    //TCON=0x01;  //和上面一句含义一样,具体看上面TCON的说明

    wela=1;//11111110   //位选第一个数码管

    P0=0xfe;

    wela=0;


}

void main(){

    init();

    while(1){

        for(num=0;num<16;num++){

                d1=1;

                dula=1;

                P0=table[num];

                dula=0;

                delay(1000);    

            }


    }

}


void delay(uint z){

    uint x,y;

    for(x=z;x>0;x--)

        for(y=110;y>0;y--); 

}


void exter0() interrupt 0{ //中断控制的函数

    d1=0;

}


定时/计数器

51单片的定时器可以使用1.软件中断(就是上面的delay函数),2.可编程芯片定时,3.时基电路定时(定时值和范围不能由软件控制)


这里主要阐述第二种:


定时/计数器的工作原理

加1计数器输入的计数脉冲有两个来源,一个是由系统的时钟振荡器输出脉冲经12分频后送来;一个是T0或T1引脚输入的外部脉冲源。每来一个脉冲计数器加1,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使TCON中TF0或TF1置1,向CPU发出中断请求(定时/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。 

可见,由溢出时计数器的值减去计数初值才是加1计数器的计数值。


设置为定时器模式时,加1计数器是对内部机器周期计数(1个机器周期等于12个振荡周期,即计数频率为晶振频率的1/12)。计数值N乘以机器周期Tcy就是定时时间t 。 

设置为计数器模式时,外部事件计数脉冲由T0或T1引脚输入到计数器。在每个机器周期的S5P2期间采样T0、T1引脚电平。当某周期采样到一高电平输入,而下一周期又采样到一低电平时,则计数器加1,更新的计数值在下一个机器周期的S3P1期间装入计数器。由于检测一个从1到0的下降沿需要2个机器周期,因此要求被采样的电平至少要维持一个机器周期。当晶振频率为12MHz时,最高计数频率不超过1/2MHz,即计数脉冲的周期要大于2 s。 (了解下就好)


50c51主要由两个寄存器TMOD,TCON控制


TMOD

 这里写图片描述 

GATE:门控位。GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚或也为高电平时,才能启动定时/计数器工作。即此时定时器的启动多了一条件。(一般置为0) 

:定时/计数模式选择位。 =0为定时模式; =1为计数模式。 

M1M0:工作方式设置位。定时/计数器有四种工作方式,由M1M0进行设置。


定时器4种工作方式

这里写图片描述

TCON

 这里写图片描述 

TF1(TCON.7):T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。T1工作时,CPU可随时查询TF1的状态。所以,TF1可用作查询测试的标志。TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。 

TR1(TCON.6):T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。 

TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。 

TR0(TCON.4):T0运行控制位,其功能与TR1类同。


关于定时器的初始化

推荐:定时器的初始化


定时器实例(定时器工作方式1)


//关键:init函数和中断的time0函数

//通过定时器控制数码管从0到f循环显示

#include

#define uint unsigned int 

#define uchar unsigned char 

sbit dula=P2^6;

sbit wela=P2^7;

sbit d1=P1^0;

uchar num,num1;tt;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

void delay(uint z);

void init(){    

    TMOD=0x1;//设置定时器0为工作方式1

    TH0=(65536-10000)/256;

    TL0=(65536-10000)%256;

    EA=1;//开总中断

    ET0=1;//开定时器0中断

    TR0=1;//启动定时器0

    wela=1;//11101010

    P0=0xea;

    wela=0;

    dula=1;

    P0=0x3f;

    dula=0;

}

void main()

{

    num=0;

    tt=0;

    init();

    while(1){

        if(tt==100)

           {

                tt=0;

                num++;

                if(num==16)

                num=0;

                dula=1;

                P0=table[num];

                dula=0; 

            }

    }

}


void delay(uint z)

{

    uint x,y;

    for(x=z;x>0;x--)

        for(y=110;y>0;y--); 

}


void time0() interrupt 1

{

    TH0=(65536-10000)/256;

    TL0=(65536-10000)%256;

    tt++;

}


声明

大多数代码实例借鉴郭天祥的视频,我只是添加了部分注释,看起来更清晰。^-^



推荐阅读

史海拾趣

Franz Binder GmbH & Co公司的发展小趣事

Franz Binder GmbH & Co公司的发展故事

故事一:初创与奠基

Franz Binder GmbH & Co公司,简称宾德集团,成立于1960年,由Franz Binder在德国创立。起初,公司仅是一个机械加工车间,专注于加工车削件。然而,随着技术的不断积累和市场需求的增长,宾德开始专注于圆形连接器的生产。1967年,公司成功生产出第一只连接器,这标志着宾德正式进入连接器制造领域。此后,宾德不断投入研发,提升产品质量,逐渐在行业内崭露头角。

故事二:全球化布局

随着业务的不断扩展,宾德集团开始寻求全球化发展。1979年,宾德在瑞士成立了分公司Binder Electronic Components,标志着公司正式走向世界。此后,宾德在全球范围内迅速扩张,相继在美国、中国、法国、瑞典、英国、新加坡、荷兰和韩国等国家成立了子公司,并与全球45个经销商建立了合作关系。这一全球化布局不仅提升了宾德的品牌影响力,还为公司带来了更多的市场机会。

故事三:技术创新与产品多样化

宾德集团始终将技术创新视为企业发展的核心动力。公司不断投入研发资源,推出了一系列具有创新性的连接器产品。从微型连接器到电源连接器,再到医疗设备连接器和自动化技术连接器,宾德的产品线日益丰富,满足了不同行业的需求。特别是在工业自动化领域,宾德连接器以其高可靠性、高传输率和易于安装的特点,赢得了众多客户的青睐。

故事四:品质与认证

品质是宾德集团赖以生存和发展的基石。公司始终坚持高标准、严要求,确保每一件产品都符合国际质量标准。为此,宾德不仅通过了ISO 9001和ISO 14001等国际质量管理体系认证,还获得了UL、VDE和ESTI+等多项国际认证。这些认证不仅证明了宾德产品的卓越品质,也为客户提供了更多的信心和保障。

故事五:中国市场的发展

中国作为全球最大的电子市场之一,对宾德集团的发展具有重要意义。2001年,宾德在中国成立了全资子公司——南京宾德电气有限公司(宾德中国),负责中国地区的销售和客户服务。自成立以来,宾德中国凭借优质的产品和服务,迅速赢得了中国市场的认可。特别是在智能制造、自动化技术和医疗等领域,宾德连接器的应用越来越广泛,为中国电子行业的发展做出了积极贡献。

Daniel Woodhead公司的发展小趣事

Daniel Woodhead公司在电子行业的起点可以追溯到创始人Daniel Woodhead对先进半导体技术的热情。在当时,半导体技术正逐渐崭露头角,Daniel看到了其中的巨大潜力。他带领团队日夜研发,成功开发出了一款性能卓越的微处理器,这款处理器凭借其高效能和低功耗在市场上脱颖而出,为公司赢得了第一桶金。

Crocus Technology公司的发展小趣事

随着技术的不断成熟和市场需求的变化,Crocus Technology开始拓展其产品线。2015年,公司成功推出了首款磁开关产品,这标志着公司在磁传感器领域迈出了重要的一步。随后,公司又陆续推出了位置传感和2D传感器产品,进一步巩固了其在磁传感器市场的地位。

Cardinal Components公司的发展小趣事

2016年,Taitien收购了Cardinal Components,这一收购为公司带来了新的发展机遇和资源支持。随后,在2021年,Cardinal加入了Pletronics,进一步扩大了其在电子行业的影响力。这些收购与合作不仅为公司带来了更多的业务机会,也促进了其在技术研发和市场拓展方面的进步。

这五个故事只是Cardinal Components在电子行业发展中的一部分缩影。作为一家具有深厚历史底蕴和强大技术实力的公司,Cardinal将继续在电子行业中发挥重要作用,为行业的进步和发展做出更多贡献。

Diodes公司的发展小趣事

在竞争激烈的电子行业中,合作共赢是企业发展的重要途径。Diodes公司始终坚持合作共赢的理念,与众多上下游企业建立了紧密的合作关系。例如,在供应链方面,Diodes与多家原材料供应商建立了长期稳定的合作关系,确保原材料的稳定供应和质量保障;在销售方面,Diodes与多家分销商建立了战略合作伙伴关系,共同开拓市场、推广产品。这些合作关系不仅为Diodes带来了更多的商业机会和市场份额,也促进了整个产业链的健康发展。

Datakey Electronics公司的发展小趣事

在电子产品行业,产品质量是企业生存和发展的基石。Datakey Electronics始终坚守品质至上的原则,从原材料采购到生产流程控制,再到产品检验和售后服务,每一个环节都严格把关。正是这种对品质的执着追求,使Datakey Electronics的产品在市场上树立了良好的口碑,赢得了客户的信赖。

问答坊 | AI 解惑

海洋投影灯在家中体验水族馆的浪漫氛围

无论你在浴室,起居室,卧室,都可以安享美丽动人的水光波漾~ 同时更有音频插孔连接 iPod 等各类设备,作为外接音箱使用,让您在潺潺的水声中,舒缓的乐曲中,彻底放轻松…

查看全部问答>

请教一个异步的问题

时钟CLKA与CLKB,可否这样操作一个信号(en):     时钟CLKA下检测到某条件(A)时,将en置为“1”;     然后时钟CLKB检测到en为高后,输出一个时钟宽度的脉冲,并将en拉低,置为“0”? 烦请各位高手告之,这样做可不可 ...…

查看全部问答>

vxworks dm9000驱动 中断的问题

我在2410下面加DM9000驱动,以下是初始化信息 bank 3  ; 外部中断14 , 希望前辈看下 , 现在ID能够读出,但是不能ping通... ilevel = 14 这是外部中断号 ivec = 5  这代表ENIT_5_23 以上这2个设置的正确么??? 0x3 ...…

查看全部问答>

2440SPI驱动问题请教。

大家好:     这两天搞SPI驱动,2440的SPI寄存器里面有一个发送数据寄存器和一个读数据寄存器。小弟想请问一下,这两个寄存器都是8位的。 问题:     (1)现在如果我写了一个byte的数据到发送的寄存器,我什么时候才能继续 ...…

查看全部问答>

如何给80C51芯片加载时钟电路?要哪些东西?

各位大侠,我刚学了点51单片机的知识,现在想通过自己购买一些实验器材,进行巩固。但是在用的时候,80C51芯片的CLK怎么给啊?在电子市场买了几个6M晶振,那么其它的电容要多大?书上还有个反相器,也要接吗?清各位指点。谢谢了…

查看全部问答>

EVC:: 为什么SD卡拔出时,消息没有及时收到呢?

为什么SD卡拔出时,消息没有及时收到呢?而会延迟三四秒…

查看全部问答>

DDK+VC6.0 如何设置

小弟我初学驱动, 请问下我怎么把VC和DDK联系起来啊。 不用DriveerWork 哈。 …

查看全部问答>

STM8L

                                 有哪位大虾做过STM8L系列的触摸案例? 相关配置方法及库在哪里下载?…

查看全部问答>

讨论---STM32处理音频压缩,编码和解码的能力

用ST带的audiospeaker例程能播放.WAV格式的音频文件.于是想到:STM32能否处理类如.mp3格式或者其他音频格式的文件.这其中包括:1.  播放.mp3的音频文件.2. 对由mirophone(ADC)输入进来的人体声音进行编码压缩(比如压缩为.mp3格式 ...…

查看全部问答>

CC2500程序代码

This routine sets up  SPI transfer void SetupSPI(void){  SSPSTAT=0x40;   SSPCON=0x21;}void SetupSPI_CC1000(void){  SSPSTAT=0x40;   SSPCON=0x31;}//======================== ...…

查看全部问答>