怎么设置单片机中断执行的次数

怎么设置单片机中断执行的次数,第1张

定义一个全局变量(T0_count),用于记录中断次数,每中断一次加一,达到设定的次数(INT_times)后,关闭中断,以定时器T0为例,参考程序如下:

#include <REG51.H>

#define INT_times10 //中断次数(10次)

unsigned char T0_count//T0中断次数计数

void ini(void)//初始化程序

//主程序

main()

{

ini()

while(1)

}

//初始化程序

void ini(void)

{

TMOD=0x01

TH0=0xb1

TL0=0xe0

EA=1

ET0=1

TR0=1

}

//T0中断程序

void t0_int(void) interrupt 1

{

if(++T0_count>INT_times) ET0=0//中断次数达到要求的次数后,关闭T0中断

TMOD=0x01

TH0=0xb1

TL0=0xe0

}

中断:响应消息——每一个消息到来,就会给某一个变量的相应位置1,将新增的消息记录下来(ID |= 0x1//将bit0置1 );

主程序:解析记录,然后分别处理每一位对应的消息,处理后将该位清零(ID &= (~0x1)//将bit0清0 )。

上述的 *** 作方法中,使用了逻辑运算符,转换为汇编语言时,只有1句的C语言代码变成了不止一句,这就给了中断影响主程序 *** 作同一变量的可乘之机。

下面给出一种解决方案,一种可以在主程序和中断 *** 作同一变量的方案(妈耶,终于点题了)!

使用数组的方法,让中断和主程序中对该变量的 *** 作,浓缩为只要一个指令周期就可以搞定的 *** 作。话不多说,上代码

全局变量:unsigned short bit[16] = {0}

中断: if(消息1 == 消息){ bit[0] = 1}

主程序:if(bit[0] == 1) { //处理消息1; bit[0] = 0}

上述的 *** 作方法中,只使用了赋值运算符,转换为汇编语言时,1句C语言代码也只变成了一句汇编代码,只需要一个指令周期的时间去执行,避免了中断影响主程序 *** 作同一变量的可乘之机。

总中断IE

外部中断等 都没有设置

IT1=1; //下降沿触发

EX1=1;

EX0=1;

EA=1;

总中断就好比是 你爸妈

定时器中断 就是你

你要出去玩 你爸妈不让 你还能出去玩吗

你要产生中断 但是总中断没开 就没法产生中断

外部中断0 有两种中断 一种是低电平触发 第二种是下降沿触发

低电平是给P3.2口一个低电平 就是0伏

下降沿就是P3.2是高电平的时候给他拉低 产生一个下降沿

你可以去看看郭天祥的单片机视频 讲的很详细 跟你的这个问题也类似 你看了就懂了

全局变量可以通过中断服务程序改 只要函数中没有相同的局部变量就行


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

原文地址: http://outofmemory.cn/tougao/11507576.html

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

发表评论

登录后才能评论

评论列表(0条)

保存