问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

PIC单片机汇编语言的中断程序 ,求人分析一下怎么运行的

发布网友 发布时间:2022-04-30 13:17

我来回答

2个回答

懂视网 时间:2022-05-04 19:59

欢迎进入IT技术社区论坛,与200万技术人员互动交流 >>进入 所有的中档系列PIC单片机,PORTB端口最高的4个引脚(RB7~RB4)在设为输入模式时,当输入电平由高到低或由低到高发生变化时,可以让单片机产生中断。这就是通常所说的引脚状态变化中断。 在设计引脚

欢迎进入IT技术社区论坛,与200万技术人员互动交流 >>进入

所有的中档系列PIC单片机,PORTB端口最高的4个引脚(RB7~RB4)在设为输入模式时,当输入电平由高到低或由低到高发生变化时,可以让单片机产生中断。这就是通常所说的引脚状态变化中断。

在设计引脚中断程序时,有三个需要特别注意的地方。一是,在清除P0RTB中断标志位RBIF之前,必须安排一条必不可少的,以PORTB端口数据寄存器PORTB为源寄存器的读操作指令。放置这一指令的目的有时并不只是为了读取有用的数据,而是为了取消状态变化的硬件信号,以便顺利清除RBIF标志位,为下一次中断做好准备。二是,由于端口PORTB是引脚电子变化中断,即无论引脚出现上升沿还是下降沿都会产生中断请求,所以必须处理好不需要的虚假中断。三是,一般都利用PIC单片机的引脚功能来检测按键,所以必须处理好按键消抖的问?.

引脚中断程序设计

在主程序里先设置有关的寄存器。

◇设置TRISB寄存器,使RB7~RB4相关的引脚处于输入状态;

◇如果需要弱上拉,通过OPTION_REG的第7位设置;

◇RBIF=O;

◇RBIE=1;

◇GIF=1.

响应状态变化后的中断服务程序。

◇检查RBIF是否为l,为l则是引脚变化引起的中断;

◇调用延时程序,延时20~30 ms,目的是为了按键去抖;

◇判断是引脚出现上升沿还是下降沿引起的中断;

◇调用按键处理程序;

◇读PORTB口的值,取消状态变化的硬件信号;

◇清除RBIF标志。

笔者认为上面程序设计最大的问题是在中断程序里调用延时程序。大家知道,中档PIC单片机只有8层深度的硬件堆栈,在中断里调用于程序出现极易堆栈溢出的情况。另外,PIC单片机中断程序人口只有一个,在响应中断的请求时,PIC单片机就会自动把全局中断的使能位(INTCON的第7位GIF)清除,这样其他中断就暂时不能被响应(此时,如果别的中断发出的中断请求,标志位将一直保留着),直到这个中断程序退出后才会得到响应。这就要求我们设计中断程序的时候必须尽量短,避免调用子程序,更不要在中断里进行复杂的运算。

下面给出笔者设计程序时的思路。

当引脚状态变化引起中断时,在中断子程序里首先判断引起中断的原因是不是我们需要的变化引起的中断。如果是,不要在这里延时,而是设置一个标志位,接着清除中断标志,退出中断。中断程序如下:

else if((RBIE&RBlF)==1){ //如果引脚变化引起中断

if(RB4==0){ //RB4上的按钮接地

key=1; //按键标志位置位

}

RBIF=0; //清除引脚中断标志位

}

其中,if(RB4==0)语句相当于读取了PORTB端口数据寄存器,取消了状态变化的硬件信号。

下面详细介绍怎么样进行按键去抖。

首先,在定时器中断里设置一个lms的时间基准标志位“SYSlms”,每到lms,“SYSlms”便置位。程序如下:

unsigned char count;

if((ToIE&TOIF)==1){ //定时器中断

TMRO+=0x09; //每250μs中断一次

if(count==4){

count=0;

SYSlms=l; //系统时间标志

couot++;

}

T0IF=0; //清除时钟中断标志位

}

有了这个时间基准,便可以在主程序里进行按键去抖处理了。为了更好地利用这个时间基准,定义一个消息标志SYSTime,笔者把它称作时间消息。为了让这个消息有自我发布和自我消失的功能。定义了如下一个宏:

bit SYSTime;

#defincTimeEnahle()SYSTime=0,if(SYSlms){SYSTime=l;SYSlms=0;)

可以把TimeEnable()放到主程序死循环的任何地方,每当程序执行这个宏,SYSTime就会清零,这就是标志位的自我消失。如果在定时器时间基准标志位SYSlms已经置位的话,SYSTime就会置1,这样别的程序就可以利用这个时间消息了,这就是消息的自我发布。下面就是利用这个时间消息来进行按键延时去抖的,首先看一下按键扫描子程序;

void seaakey(){

unsigned char KeyTime,KeyTask;//定义任务时间参数、

//任务参数

switch(KeyTask){

case0:if(key){

KeyTime=30; //准备延时30 ms

KeyTask++; //准备好下一个任务

kcy=0;

}

break;

case I:KeyTime――; //延时30 ms

if(KeyTime==0)Key+ask++;

break;

case2;if(RB4==o){

//调按键处理程序

KeyTask=0;

}

else KeyTask=0;//退出任务

break;

}

}

在主程序的死循环中这样用:

while(1){

TimeEnable();

If(SYSTime==1){scankey();)

//在此可以添加其他程序

只有有时问消息的时候才执行按键扫描程序。可以看到,进入扫描程序执行第一次的时候,程序首先判断按键标志位有没有置位,置位的话(也就是有按键按下的话),任务时间参数(KeyTime)赋值为30,这是延时30ms,去抖,当然你也可以设置为其他的时间值;同时任务参数 (KeyTask)加1.1ms后,再进入扫描程序,这个时候扫描程序执行casel的语句,这样30次后(延时了30ms),任务参数(KeyTask)加1,值为2.lms后,再进入扫描程序,将执行case 2的语句,首先在这里再次判断是不是按键还在按下,如果是就调按键的处理程序,如果不是。就退出按键扫描程序。在这里,还可以加入按键是否抬起的判断程序。

这样设计的引脚变化程序,CPU开销小,效率高,不会出现堆浅溢出的问题,提高了系统的实时性。

热心网友 时间:2022-05-04 17:07

很简单的。
在main主程序里面
LOOP GOTO LOOP
这条程序,会不停的执行,到了TMR0溢出的时候就会执行中断程序
ORG 0004H为中断程序的地址
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
热血江湖剑客怎么升级快些 三月份有哪些花开花 三月份有哪些花开花呢 三月什么花开的最旺盛呢 请问急性化脓性扁桃体炎期间可不可以食用巧克力? 扁桃体化脓吃什么消炎药 为什么扁桃体发炎或者化脓以后不能喝冷水或者吃辣的东西呢? 扁桃体化脓能吃冰淇淋吗 扁桃体化脓可以吃什么 炸酱面通常使用哪种面条? ...写一篇150词左右的英语短文。 Halloween(万圣节... 汇编语言怎么使用int9中断调用实现显示输出,能给个事例么 汇编语言单片机中断 汇编语言的中断服务程序是什么? 用汇编语言写一段 外部中断1下跳沿触发的中断触发程序 用汇编程序用定时器和中断,编写程序 汇编语言中的中断程序是如何执行的 当一个汇编语言中断程序,运行到什么时候,才能跳转到中断呢?例子如下 汇编中断程序 汇编语言 中断程序代码 汇编中断程序具体例子 电脑卡住了,酷狗音乐关不了,但是其他的东西都能正常使用,怎么办? 如何关闭酷狗音乐的链接? 三星note3酷狗音乐后台关闭不了 酷狗音乐播放器关不了是什么问题 酷狗音乐关不了 我关闭酷狗的时候就弹出来这个 酷狗音乐盒无法关闭 鸿蒙系统怎么关闭酷狗音乐 为什么我的酷狗音乐盒打开之后关不了,但它会一直播放,只能用任务管理器关? 酷狗关不上了怎么办 吴姓家谱先字辈后面是什么 单片机定时器中断实验 程序(汇编语言)不要c语言的 汇编语言中中断程序的中一个问题 汇编语言编程:定时器中断实验。求程序,附图 汇编语言int 21h中断 8086汇编语言中,两个中断怎么写呀?这是我写的一段代码,一中断就直接跳出程序了,回不到主程序中。 麻省理工大学的邮编是多少? 2022麻省理工,洛杉矶分校发邮件让关注申请邮箱,是入围了吗 需一个麻省理工学院(MIT)教授或学生邮箱地址 怎么进MIT(麻省理工) 怎样和麻省理工的学生联系? 如何才能上麻省理工大学? 麻省理工学院是什么学校? 麻省理工学院 麻省大学和麻省理工的区别是什么? 关于大学去MIT(麻省理工学院)的一些疑问 麻省理工学院是顶级的大学? 查看红包收发纪录时,显示红包数据记录过期,是数据记录过期,还可以怎么查看红包收发对象? 电脑音箱不通电是坏了吗 电脑音箱不通电了怎么修呀? GOLDBRIDGE音响不通电是什么原因