微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 关于单片机中断详解

关于单片机中断详解

时间:12-01 来源:互联网 点击:

pid->

pid->

pid->

pid->

pid->

pid->

pid->

pid->

pid->

pid->

pid->last_error = (pid->sp)-(pid->

err = (pid->sp) - (pid->

if (abs(err) > pid->

pterm = pid->

if (pterm >

pid->

pid->integral += pid->

if (pid->integral >

pid->

else if (pid->

pid->

dterm = ((float)(err - pid->last_error)) * pid->

result = pterm + pid->

result = pid->

pid->

for(count=7;count>

x_address=x>>

按下按键,CPU会跑去中断处理函数执行,执行完中断处理后返回原处继续执行

(众人:这个中断跟我们前面学习的按键有什么区别么?)

当然有区别啦!虽然都是控制LED,但是按键是当CPU执行到按键检测如 if(key==0) 语句后,才去改变LED的状态,如果没有执行到,那么即使你按下按键单片机也不会响应的,也就是CPU主动去问按键有没有被按下。而中断呢,就是无论CPU在干嘛,只要触发中断后,CPU就会放下手中的活,第一时间赶回来处理,也就是按键被按下后主动告诉CPU。。。就像windows系统的ctrl+alt+del组合键,你一按下这个组合键,无论系统在做什么,都会弹出任务管理器。

另外中断的处理函数是这样声明的

void abc() interrupt X using n
{
处理语句;
}

我们看到,只是普通的函数 加上了 interrupt X using Y 了而已,X 的取值是有规定的:

如果是外部中断0的中断处理函数,则X为0 即void abc() interrupt 0 using n

若是定时器0的中断处理函数,则 X 为1

若是外部中断1的中断处理函数,则 X 为2

若是定时器1的中断处理函数,则 X 为3

若是串口中断的中断处理函数,则 X 为4

n 是中断号,取值范围为 0 - 31

关于中断的学习,也到此告一段落了,当然还有一些问题没解决.......

Q1:为什么count==40的时候数码管也不能闪烁???

/*

实现目的:

让LED灯以1000ms(即1s)产生流水灯效果,并用定时器0让数码管以500ms从0~F闪烁

*/

#include

#include

#define uint unsigned int

#define uchar unsigned char

sbit d1=P2^1;

uchar weixuan=0x00;//位选全开

uchar code table[]={

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

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

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

0x39,0x5e,0x79,0x71};//段选

uchar temp,count,num;

void delay(uint z)

{

uint x,y;

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

{

for(y=0;y<113;y++)

{

}

}

}

void main()

{

count=0;

num=0;

P1=weixuan;

P0=table[num];

temp=0xfe;

P2=temp;

TMOD=0x01;

TH0=(65535-50000)/256;

TL0=(65535-50000)%256;

EA=1;

ET0=1;

TR0=1;

while(1)

{

delay(1000);

temp=_crol_(temp,1);

P2=temp;

/*

if(count==10)

{

count=0;

num++;

if(num==16)

{

num=0;

}

P0=table[num];

} */

}

}

void time0() interrupt 1

{

TH0=(65535-50000)/256;

TL0=(65535-50000)%256;

count++;

if(count==10)

{

count=0;

num++;

if(num==16)

{

num=0;

}

P0=table[num];

}

}

/*

PS:我们不能把数码管500ms闪烁时间是否到达的语句写在主程序中,

若写在主程序中,有可能发生如下错误情况:当主程序在LED灯显示语句当中时,

此时恰好定时器0进入中断并且count刚好加到了10,当定时器0中断再次进入时,

主程序仍未退出LED流水灯的显示程序,那么此时count的值便变成了11,

这样的话,count==10这个点永远检测不到,因此数码管闪烁失去了控制

在调试代码当中发现delay(uint z)函数与中断是同时执行的。。。

*/


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top