单片机实验 按钮触发外部中断 以下程序中为什么IT0和IT1为1?即为什么是负跳变而不是低电平触发?

单片机实验 按钮触发外部中断 以下程序中为什么IT0和IT1为1?即为什么是负跳变而不是低电平触发?,第1张

CNTA EQU 30H ;8x8 LED阵列行选通顺序计数器,有效值范围0~7

COUNT EQU 31H ;8x8 LED阵列顺序显示计数器,有效值范围0~2

ORG 00H

LJMP START ;跳转到30H开始的主程序主体,避开中断入口地址

ORG 0BH

LJMP T0X ;跳转到定时中断0中断服务程序

ORG 30H

START: MOV CNTA,#00H ;主程序开始

MOV COUNT,#00H ;3个8X8 LED点阵送显示计数

MOV TMOD,#01H ;定时器0设定为定时方式,方式1,16位模式

MOV TH0,#(65536-1000) / 256 ;1ms定时中断预装值高8位

MOV TL0,#(65536-1000) MOD 256 ;1ms定时中断预装值高8位

SETB TR0 ;启动定时器0

SETB ET0 ;允许定时器0中断

SETB EA ;开启总中断允许

WT: JB P20,WT ;读P20端口状态,高电平则原地循环等待其变为低电平

MOV R6,#5 ;P20为低电平,则开始延时滤波循环

MOV R7,#248

D1: DJNZ R7,$

DJNZ R6,D1

JB P20,WT ;再次确认P20是否低电平,不是则认为端口干扰,回到WT继续等待

INC COUNT ;LED阵列计数+1,显示下一个LED阵列

MOV A,COUNT

CJNE A,#03H,NEXT ;LED阵列计数未到3,跳转到NEXT

MOV COUNT,#00H ;LED阵列计数则清零,跳回WT从第一个开始扫描

NEXT: JNB P20,$ ;原地循环,等待P20恢复高电平

SJMP WT ;P20恢复高电平,返回WT,等待下一次动作

T0X: NOP

MOV TH0,#(65536-1000) / 256 ;重装定时计数寄存器

MOV TL0,#(65536-1000) MOD 256

MOV DPTR,#TAB ;设定选通端口查表起始地址

MOV A,CNTA ;得到LED显示行计数值,该计数为1-8,到8时清零重新开始

MOVC A,@A+DPTR ;查表得到行选通端口状态字符

MOV P3,A ;将选通信号送到P3口,低电平的端口指向的LED阵列被选通

MOV DPTR,#GRAPH ;设定显示信息查表起始地址

MOV A,COUNT ;根据计数器,确定当前显示的是1、2、3中的哪个阵列

MOV B,#8

MUL AB ;8X8阵列,所以一个阵列显示信息需要8个字节,

ADD A,CNTA ;指向待显示行的点阵信息

MOVC A,@A+DPTR ;读取

MOV P1,A ;该行8列的显示信息送P1口

INC CNTA ;计数器+1指向下一行

MOV A,CNTA

CJNE A,#8,NEX ;判断是否已到第8行,未到则直接退出中断

MOV CNTA,#00H ;已到,计数清零,下次从第一行开始扫描

NEX: RETI

TAB: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH ;LED阵列行选通端口控制状态值

GRAPH: DB 12H,14H,3CH,48H,3CH,14H,12H,00H ;第1个LED阵列的点阵信息

DB 00H,00H,38H,44H,44H,44H,38H,00H ;第2个LED阵列的点阵信息

DB 30H,48H,44H,22H,44H,48H,30H,00H ;第3个LED阵列的点阵信息

END

当然不一样了

1电平触发是在高或低电平保持的时间内触发,

2而边沿触发是由高到低或由低到高这一瞬间触发

3 边沿触发一般时间短,边沿触发一般时间都是us级的,响应要快的,而电平触发只须是高和低就可以了,没时间要求,比如10s 时间内总是低电平,那么它也是触发的,

比如中断计时或计数,最好用边沿触发,用电平触发误差会很大,电平触发一般用于简单报警,开关一类(时间要求不高的)

INT0/1为1下降沿触发 为0电平触发 ,而下降沿触发IE0和IE1可以自动清零,而电平触发得人为把IE0和IE1清零,要不然会一直启动中断。IE0/1可以自动清零,所以一般用下降沿触发

89C51/52的中断系统有5个中断源 ,2个优先级,可实现二级中断嵌套 。

1、(P32)可由IT0(TCON0)选择其为低电平有效还是下降沿有效。当CPU检测到P32引脚上出现有效的中断信号时,中断标志IE0(TCON1)置1,向CPU申请中断。

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

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

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

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

IE寄存器:

中断允许控制寄存器分为两层结构,第一级结构为中断允许总控制EA,只有当EA处于中断允许状态,中断源中断请求才能够得到允许;当EA处于不允许状态时,无论IE寄存器中其他位处于什么状态,中断源中断请求都不会得到允许。第二级结构为5个中断允许控制位,分别对应5个中断源的中断请求,当对应中断允许控制位为1时,中断源中断请求得到允许。

EX0:外部中断0允许位。EX0=1,允许外部中断0中断;EX0=0,禁止外部中断0中断。当EX0=1( SETB EX0 )时,同时单片机P32引脚上出现中断信号时,单片机中断主程序的执行而“飞”往中断服务子程序,执行完后通过中断返回指令RET 动返回主程序。当EX0=0( CLR EX0)时,即使单片机P32引脚上出现中断信程序也不会从主程序“飞” 出去执行,因为此时单片机的CPU相当于被“堵上了耳朵”,根本接收不到P32引脚上的中断信号,但是这并不表示这个信号不存在。如果单片机的CPU有空查一下TCON中的IE0位,若为1就说明有中断信号出现过。

ET0:T0溢出中断允许位。ET0=1,允许T0中断;ET0=0,禁止T0中断。

EX1:外部中断1允许位。EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断。当EX1=1( SETB EX1)时,并且外部P33引脚上出现中断信号时,单片机CPU会中断主程序而去执行相应的中断服务子程序;当EX1=0( CLR EX1)时使外部P33引脚上即使出现中断信号,单片机的CPU也不能中断主程序转而去行中断服务子程序。 [3] 因此,可以这样认为,EX0和EX1是决定CPU能否感觉到外部引脚P32P33上的中断信号的控制位。

ET1:T1溢出中断允许位。ET1=1,允许T1中断;ET1=0,禁止T1中断。

ES:串行中断允许位。ES=1,允许串行口中断;ES=0,禁止串行口中断。

EA:中断总允许位。EA=1,CPU开放中断;EA=0,CPU禁止所有的中断请求。总允许EA好比一个总开关。EA就相当于每家水管的总闸,如果总闸不开,各个龙头即使开了也不会有水;反过来,如果总闸开了而各个分闸没开也不会有水,所当我们想让P32和P33引脚上的信号能够中断主程序则必须将EA位设置为0(CLR EA)。

TCON寄存器:

各位的标识如下:

TF1:定时器1溢出标志位。当定时器1计满溢出时,由硬件使TF1置1,并且申请中断,进入中断服务程序,有硬件自动清0 ,在查询方式下用软件清0

TR1:定时器运行控制位,TR1置1是开启定时器1,TR1置0时关闭定时器1

TF0:定时器0溢出标志位。当定时器0计满溢出时,由硬件使TF0置1,并且申请中断,进入中断服务程序,有硬件自动清0 ,在查询方式下用软件清0

TR0:定时器运行控制位,TR0置1是开启定时器0,TR0置0时关闭定时器0

IE1:外部中断1请求标志位。

IT1:外部中断1触发方式选择位。当IT1置0时,为低电平触发;当IT1置1时,为下降沿触发。

IE0:外部中断0请求标志位。

IT0:外部中断0触发方式选择位。当IT0置0时,为低电平触发;当IT0置1时,为下降沿触发。

51单片机外部中断响应条件:

1、中断源有中断请求;

2、中断源的中断允许位为1(设置IE寄存器相关位);

3、CPU开中断(设置IE寄存器开中断,即EA=1)

CPU时序的有关知识:

振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期)

状态周期:2个振荡周期为1个状态周期,用S表示。

机器周期:1个机器周期含6个状态周期,12个振荡周期。

指令周期:完成1条指令所占用的全部时间,它以机器周期为单位。

定时器的其他知识点:

1、51单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之为定时器/计数器。

2、定时器/计数器和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU的参与。

3、51单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信号对寄存器中的数据加1。

4、有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加1的工作可以交给定时器/计数器处理。CPU转而处理一些复杂的事情。同时可以实现精确定时作用。

与定时器/计数器有关的寄存器:

1、TMOD寄存器

2、TCON寄存器

3、IE寄存器

4、THx/TL寄存器

工作方式寄存器TMOD:

工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。其格式如下:

M1M0:工作方式设置位。定时/计数器有四种工作方式。一般我们厅方式1和方式2:

控制寄存器TCON:

TCON的低4位用于控制外部中断,已在前面介绍。TCON的高4位用于控制定时/计数器的启动和中断申请。其格式如下:

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

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

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

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

IE中断开关寄存器:

用于开启cpu中断和对应的中断位。

THx和TL定时/计数存储寄存器:

THx存储高8位数据,TLx存储低8位数据。

定时器/计算器初值计数公式:

计数个数与计数初值的关系为:X=2^n-N

N是需要计数的值;n与设置定时器/计数器的工作方式有关(可能为8、13、16);X是需要设置在THx和TLx的初值。

使用定时器/计算器的初始化流程:

1、对TMOD赋值,以确定T0和T1的工作方式。

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

3、中断方式选择,则对EA赋值,开放定时器中断。

4、使TR0或TR1置位,启动定时/计数器定时或计数。

(1)外部中断请求源:即外中断0和1,经由外部管脚引入的,在单片机上有两个管脚,名称为INT0、INT1,也就是P32、P33这两个管脚。在内部的TCON中有四位是与外中断有关的。IT0:INT0触发方式控制位,可由软件进和置位和复位,IT0=0,INT0为低电平触发方式,IT0=1,INT0为负跳变触发方式。这两种方式的差异将在以后再谈。IE0:INT0中断请求标志位。当有外部的中断请求时,这位就会置1(这由硬件来完成),在CPU响应中断后,由硬件将IE0清0。IT1、IE1的用途和IT0、IE0相同。(2)内部中断请求源TF0:定时器T0的溢出中断标记,当T0计数产生溢出时,由硬件置位TF0。当CPU响应中断后,再由硬件将TF0清0。TF1:与TF0类似。TI、RI:串行口发送、接收中断,在串行口中再讲解。2、中断允许寄存器IE在MCS-51中断系统中,中断的允许或禁止是由片内可进行位寻址的8位中断允许寄存器IE来控制的。

其中EA是总开关,如果它等于0,则所有中断都不允许。ES-串行口中断允许ET1-定时器1中断允许EX1-外中断1中断允许。ET0-定时器0中断允许EX0-外中断0中断允许。如果我们要设置允许外中断1,定时器1中断允许,其它不允许,则IE能是EAX

即8CH,当然,我们也能用位 *** 作指令

SETB EA

SETB ET1SETB EX1

来实现它。

3、五个中断源的自然优先级与中断服务入口地址外中断0:0003H定时器0:000BH外中断1:0013H定时器1:001BH串行口:0023H它们的自然优先级由高到低排列。写到这里,大家应当明白,为什么前面有一些程序一始我们这样写:

ORG 0000HLJMP START

ORG 0030H

START:。

这样写的目的,就是为了让出中断源所占用的向量地址。当然,在程序中没用中断时,直接从0000H开始写程序,在原理上并没有错,但在实际工作中最好不这样做。优先级:单片机采用了自然优先级和人工设置高、低优先级的策略,即能由程序员设定那些中断是高优先级、哪些中断是低优先级,由于只有两级,必有一些中断处于同一级别,处于同一级别的,就由自然优先级确定。

开机时,每个中断都处于低优先级,我们能用指令对优先级进行设置。看表2中断优先级中由中断优先级寄存器IP来高置的,IP中某位设为1,对应的中断就是高优先级,不然就是低优先级。

XX

X

PS

PT1

PX1

PT0

PX0

例:设有如下要求,将T0、外中断1设为高优先级,其它为低优先级,求IP的值。IP的首3位没用,可任意取值,设为000,后面根据要求写就能了XX

因此,最终,IP的值就是06H。例:在上例中,如果5个中断请求同时发生,求中断响应的次序。响应次序为:定时器0->外中断1->外中断0->实时器1->串行中断。

我那时候用的是吴鉴鹰单片机开发板,各方面还是不错的。

从刚开始接触单片机,到现在已经有4年的时间了,在这期间学习和使用了51单片机、飞思卡尔单片机,LPC2138,PIC16F887等系列的单片机,每接触一款单片机,都会经历熟悉其基本开发,然后将其用于项目中的过程,对于如何学习一款单片机,自己做了如下的总结。

大家都知道,51单片机是最容易入门的,不仅因为其编程简单,更重要的是网上的资料非常丰富。所以一般学习单片机开发的都将51单片机作为入门开发的首选。我学习51单片机的时候是采用这样的一个步骤进行学习的:

第一步(熟悉的过程):买了一款51单片机开发板,然后就开始了我的学习之旅,刚开始的时候没有去看视频教程,而是对着一本实验教材进行学习,那本实验教材的名字记不清楚了,但是其内容就是围绕单片机的LED灯进行控制,将51单片机内部的各个功能部件全部都使用到了,这样就能使我在很短的时间内,通过控制LED灯的亮、灭熟悉了51单片机的内部的各种资源,这时对51单片机也就没有感到陌生了。所以,个人觉得,学习单片机,要从实验入手,先熟悉单片机再说,开发语言开始使用的是C语言。

第二步(进阶的过程):有了第一步的基础之后,接下来的便是进阶的过程,当时,我看的是郭天祥十天学会单片机的视频教程,因为这个教程从基础到复杂的编程慢慢深入,讲的比较的全面,而且也生动,所以那一阶段,也是我学习单片机进步最快的阶段,每次听课的时候,按照上面的实验,以及课堂上面调试程序时出现的一些问题,自己认真的在电脑上进行调试,并分析产生故障的原因,让我有了一定的开发基础。在看完了视频教程之后,后面又对基础的知识进行了下补习,主要是看单片机原理性的教材,因为有些细节性的东西还是要从教材上面获得。

第三步(项目实战的阶段):学习单片机的时候,虽然也编写了一些程序,但是那些都是一些很小的模块程序,并没有起到综合应用的目的,所以在这之后,我和另外一个学习硬件的同学一起组成了一个小的团队,进行项目实践开发,那时候,实验室的条件比价好,有很多的器件可以自己使用。所以,我们就设计了我们的第一个作品,基于单片机的液体点滴监控系统。做这个系统时,就将以前单片机所学的知识,做了一个综合的应用,包括有LCD1602控制,串口的控制等。

经过以上三个步骤的学习之后,对于51单片机的开发基本上就算入门了。而对于其他类型的单片机,如飞思卡尔单片机,LPC2148 ARM7单片机,PIC16F887等,虽然每个系列的功能不一样,但是最基本的编程思想还是一样的,不同的可能就是编译器,程序下载的软件等差别,所以有了51单片机的开发基础之后,学习其他单片机所采用的方法就是一个差异化的学习,学习各种单片机不同的地方,这样,就能很快的熟悉一款新的型号的单片机。

如在学习PIC16F887这个系列的单片机时,我首先做的工作不是去阅读数据手册,而是先拿着DEMO代码,在编译软件中编译、链接、生成HEX文件,然后将其下载到开发板中跑起来,这个过程主要就是学习其软件的基本 *** 作,有了这个基础之后,就能自己进行编程、测试。之后就是熟悉其编程的模式,所谓其编程模式,就是寄存器的控制,中断程序的编写,熟悉了这个 *** 作,也就能控制其他的功能模块了,如串口的控制、I2C硬件控制器的控制。这些基本的开发熟悉了之后,接下来便是学习差异的部分,例如PIC单片机C语言中,其堆栈深度不能超过8级,超过了之后,将会使得程序出现跑飞的现象。而且内存的分配完全要靠自己来控制,分成了4个BANK的数据,BANK0,BANK1,BANK2,BANK3 等。这些就是每个系列单片机所独有的一些东西,这些东西需要详细的了解,因为它们可能为你的编程带来很大的便利。

以上就是我学习单片机的总结,如果大家有更好的学习方法,希望大家能够提出来,一起讨论,共同进步。

以上就是关于单片机程序解释全部的内容,包括:单片机程序解释、单片机中IT0=1与IT0=0有什么区别、单片机实验 按钮触发外部中断 以下程序中为什么IT0和IT1为1即为什么是负跳变而不是低电平触发等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/8827469.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-22
下一篇 2023-04-22

发表评论

登录后才能评论

评论列表(0条)

保存