嘿嘿 俺来帮你解决
1 选择计数脉冲的上升沿 触发中断 即设外部中断0为边沿触发方式
2 进入外部中断0的中断服务程序后,首先要让外部中断0关中断,避免计一个脉冲时产生多次中断。
3 计数加1后,要延时一段时间,让计数脉冲稳定后,再让外部中断0重新开中断。
呵呵 赶快试试吧 如果对的话 就给俺加分吧
外部中断0设置为低电平触发,去掉while循环后一直按下按键实际代码为
delay();
p1=0xfe;
delay();
ex0=0;
p1=_crol_(p1,1);
delay();
ex0=1;
p1=0x00;
一直重复
之前的代码进入中断后会一直循环,并不会退出中断。正确做法中断应该改为:
void
tx0()
interrupt
0
using
0
{
unsigned
char
i;
delay();
p1=0xfe;
delay();
ex0=0;
while(1)
{
p1=_crol_(p1,1);
delay();
if(p3&0x04)
//判断是否松开中断0的按键
{
break;
}
}
ex0=1;
p1=0x00;
}
中断分为4个步骤:中断请求→中断相应→中断处理→中断返回(先做更重要的事)
1、数据的输入/输出传送方式
外部中断要看对应引脚外部的电平状态。
例如:外部中断0(INT0)对应的引脚是P32,
当出现 低电平 ,即P32引脚连接的地方是 低电平 ,进入相应的中断函数;
当出现 下降沿 ,即P32引脚连接的地方 由高电平变为低电平 ,进入相应的中断函数
内部中断源要看单片机内部的定时器/计数器
中断允许寄存器IE
定时器/计数器0/1控制寄存器TCON
对同时发生多个中断申请时:
不同优先级的中断同时申请:先高后低
相同优先级的中断同时申请:按序执行
正处理低优先级中断又接到高级别中断:高打断低
正处理高优先级中断又接到低级别中断:高不理低
初始化的意思如图所示
实现思路
查看上方 P3第二功能各引脚功能定义 ,P33是外部中断1 (INT1)的外部输入引脚
编写一个程序,使得 S2按键按下 时,某个IO口(下面程序选择了P37这个IO口) 产生跳变沿 (由1变0)。P33与P37用跳线连接,使P33口与P37口同时产生跳变沿。
如果在没有更改过优先级的情况下,外部中断1被触发,定时器1和定时器0哪个还能工作?
不知道楼主所说的“工作”,是什么意思。
外部中断0、定时器0、外部中断1、定时器1和串行口,它们是同时工作的。
只是当满足一定的条件,它们会向CPU申请中断,而CPU只有一个,只能执行一个外设的中断程序。
如果外部中断1被触发,CPU执行X1的中断程序,这时,定时器1和定时器0仍然在做自己的工作,并没有停止工作。
楼主的问题,可能是问CPU的,当CPU在执行外部中断1的程序期间,还能不能接受T1、T0的中断申请。
答案是:不能。
只有高级的,可以中断低级的。
楼主已经说它们是同一级别的中断源,那么它们就是不能互相中断的。
只有当这个中断程序结束了,返回主程序后,CPU才会响应刚才早已来到的中断申请。
按键一头接在外部中断口,一头接地。按一次触发一次。
void main()
{
EA=1; //开总中断开关
EX0=1; //打开外部中断0开关
IT0=1; //触发方式设置
while(1)
{
省略
}
}
void int0 () interrupt 0//外部中断函数
{
led0=0;
delay_ms(1000);//延时1s
led0=1;
}
解释2个if
num2++;//定时器中断一次加一
if(num2==20)//如果num2加了20次了那么
{num2=0;num++;//把num2加的数清0,num进这个if一次加一次
if(num==60)num=0; 如果num2加了20次了那么,把num加的数清0
shi=num/10;//求模
ge=num%10;//求余
}
呵呵,前面几位网友,回答都是错的。
网友说:
外部中断0优先级高于外部中断1
同优先级情况下,外部中断0还是会比的外部中断1更优先;
都是不对的。
。
你没有设置中断短优先级,那么,它们,就都是低级的。
要想嵌套,必须有高、低两个级别。
同样的优先级,是不能出现中断嵌套的。
只有高级的,才能中断低级的。
ORG 0003H ;INT 0 中断入口地址"
INT0是外部中断0,就是接单片机P32口,按一个按键连到地就行,P32口有低电平就能触发中断
但是你的程序是不完整的,还在主程序和延时子程序都用省了,
比如主程序里要写 SETB EA;打开总中断
SETB IT0;低电平触发
SETB EX0;开中断0
延时程序到书上抄个就行
试试看:
ORG 0000H
JMP MAIN
ORG 0013H
AJMP INT
JMP MAIN
TAB:
DB 0X01, 0X02, 0X04, 0X08
DB 0X10, 0X20, 0X40, 0X80
MAIN:
SETB EA
SETB EX1
MOV DPTR, #TAB
LOOP:
MOV R1, #8
MOV B, #0
AGAIN:
MOV A, B
MOVC A, @A+DPTR
MOV P1, A
INC B ;下一个状态
CALL DELAY
DJNZ R1, AGAIN
JMP LOOP
DELAY:
MOV R6, #2
LOOP3: MOV R5, #255 ;延迟0。5秒
LOOP2: MOV R4, #255
LOOP1: NOP
NOP
DJNZ R4, LOOP1
DJNZ R5, LOOP2
DJNZ R6, LOOP3
RET
INT:
MOV P2, #0XAA
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
CALL DELAY
MOV P2, #0XFF
MOV A, B ;显示下一个状态
MOVC A, @A+DPTR
MOV P1, A
INC B
RETI
END
以上就是关于用51单片机外部中断0计数时候,一次记得数不是加1,而是跳了几个,在中断程序里延时还是不行全部的内容,包括:用51单片机外部中断0计数时候,一次记得数不是加1,而是跳了几个,在中断程序里延时还是不行、C51单片机外部中断扩展程序设计、51单片机之中断系统,外部中断等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)