中断大概是这样的。。。如果有点错误不要怪我。。。我以前作过鼠标中断的东西。。现在有些想不起来了。。。所以。。。呵呵呵。。。
创新互联是一家以网络技术公司,为中小企业提供网站维护、网站制作、成都做网站、网站备案、服务器租用、域名注册、软件开发、小程序开发等企业互联网相关业务,是一家有着丰富的互联网运营推广经验的科技公司,有着多年的网站建站经验,致力于帮助中小企业在互联网让打出自已的品牌和口碑,让企业在互联网上打开一个面向全国乃至全球的业务窗口:建站欢迎联系:028-86922220
当程序运行到中断条件的时候,会向CPU发信号改变优先级(原先运行的东西会放进哪个特定的地方的,作保存),以发出中断的那段程序作为最高优先,执行完成后再由执行另外的。。。建议你去看看汇编。。。哈哈哈。。。我没学过的。。。
C中实现中断是用了一个函数:geninterrupt(...)
这个“...”是个16进制的数字,是中断号,像鼠标中断号就是0x33
还要用到类似汇编里寄存器模样的变量:如_AX,_BX,_CX,_DX...不同的值功能不同。。。哎呀,我都忘完了。。。建议去查下geninterrupt()的用法就OK了。。。
首先你要写中断函数
然后在主程序中像调用子函数一样调用就可以了
举个例子吧
#define uchar unsigned char
#define uchar unsigned char
sbit D1=P1^0;
uchar aa;
void init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void main()
{
init();
while(1)
{
if(aa==20)
{
D1=~D1;
aa=0;
}
}
}
void T0time()interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}
外部中断的常用功能
外部中断经常用来记录外部脉冲的个数,也就是当我们使用外部中断1时,如果想记录自身单片机的某个引脚的下降沿个数,只需用杜邦线把这个引脚和P3.3连接即可。
比如P2.3引脚产生这样的电平无规律跳转,则下降沿的个数为5
所以我们就用外部中断1来实现记录K4按键从按下到松手的抖动过程中经历了多少个下降沿,把下降沿的个数显示在数码管上。
2.程序思路
我们定义一个16位的全局变量pulse用来记录P2.3下降沿的个数,在中断函数中的任务就是简单的pulse自加,因为引脚遇到下降沿就会进入中断函数。
在主函数里就是负责数码管显示即可。
3.代码#include
#include //详见第六章第8讲
u16 pulse=0;
void main()
{
u16 x,PULSE_buf;
IT1 = 1; //下降沿触发模式
EX1 = 1;
EA = 1;
LED_Init();//初始化LED硬件模块
KEY_Init();//初始化按键功能模块
ShowNumber(pulse);
while(1)
{
SEG_Scan();
if(PULSE_buf!=pulse)ShowNumber(pulse);//pulse不再是前一次的值,也就是pulse数值更新了,所以数码管缓存区也要更新pulse的数值以便显示出来
x++;
if(x=50)//隔一段时间过来记录此时的pulse数值
{
x=0;
PULSE_buf=pulse;
}
}
}
//请把P3.3和P2.3用杜邦线连接起来
void EXTI1_IRQHandler() interrupt 2
{
pulse++;
}
大家多按几次K4,发现按下后松手的一个动作里有时pulse就自加了几次,显示在数码管上的数加了好几下。
中断函数是不需要额外通过代码调用的
当中断条件满足,单片机会打断当前执行的语句,跳转到中断函数,然后执行完中断函数后,再次返回之前被打断的语句继续执行
中断函数中,每次都会对定时器重新初始化,即头两句对TH1和TL1的赋值,这样每50ms会再次进入一次中断函数.每20次进入中断,即经过了1秒,然后对全局变量miao自增1
而main函数则是不断对变量miao进行输出