关于单片机中断详解
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灯以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这个点永远检测不到,因此数码管闪烁失去了控制 */
(众人:这个中断跟我们前面学习的按键有什么区别么?)
当然有区别啦!虽然都是控制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的时候数码管也不能闪烁???
在调试代码当中发现delay(uint z)函数与中断是同时执行的。。。
单片机中断详 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)