单片机中断问题30例
d7=0;
for(c=0;c25000;c++);
d7=1;
}
答:
IT0=0;//低电平触发,只要单片机监测到是低电平,就触发中断
你P3.2一直接地,一直是低电平,那中断就不断的执行,当然回不到主程序中了。
改成IT0=1;//下降沿触发,单片机监测到高电平到电平跳变,就触发中断
就算P3.2一直接地,也只触发一次,中断执行完了,就回到主程序中了。
4、我的单片机这个程序为什么不能完全执行整个程序谁能告诉我!就是没法执行3次亮暗的!
2010-10-20 21:40 提问者:3865203bin3 | 悬赏分:10
ORG 0000H
AG:MOV A,#11111110B
AG1:RL A
MOV P0,A
ACALL DELAY
DJNZ R0,AG1
ACALL DELAY
MOV A,#11111111B
MOV P1,A
ACALL DELAY
MOV P0,#00000000B
ACALL DELAY
MOV P0,#11111111B
ACALL DELAY
MOV P0,#00000000B
ACALL DELAY
MOV P0,#11111111B
ACALL DELAY
SJMP AG
DELAY:MOV R3,#10
D3:MOV R2,#200
D1:MOV R1,#250
D2JNZ R1,D2
DJNZ R2,D1
DJNZ R3,D3
RET
END
我是想执行完流水灯亮.就然后执行全亮全暗3次 !可是就是不会跳到全亮全暗3次~~
答:
R0没有赋初值!另外建议不要使用前2B个地址,因为51中断矢量就在这个空间里。建议从0030H开始。以下程序在keil4中仿真成功。
ORG 0000H
AJMP AG
ORG 0030H
AG:MOV A,#11111110B
MOV R0,#8
AG1:RL A
MOV P0,A
ACALL DELAY
DJNZ R0,AG1
ACALL DELAY
MOV A,#11111111B
MOV P1,A
ACALL DELAY
MOV P0,#00000000B
ACALL DELAY
MOV P0,#11111111B
ACALL DELAY
MOV P0,#00000000B
ACALL DELAY
MOV P0,#11111111B
ACALL DELAY
SJMP AG
DELAY:MOV R3,#10
D3:MOV R2,#200
D1:MOV R1,#250
D2JNZ R1,D2
DJNZ R2,D1
DJNZ R3,D3
RET
END
5、STC89C52通过两个外部中断P3.2和P3.3,来控制P1.0和P1.1的数码管亮和灭,一定keil C
说明:通过外部中断0【P3.2】,P1.0的数码管亮,中断结束后,数码管灭;再由外部中断1【P3.3】,P1.1的数码管亮,次中断结束后,数码管灭;简言之就是一个中断只控制一个数码管,中断之间在功能上没有必然的联系,编程环境keil C51。P1.0和P1.1口上接的都是普通LED小灯,数码管=LED小灯。
以下是我编的程序,就是一个中断控制一个数码管,但是当有两个中断时,我就抓瞎了
#include
sbit D1=P1^0;
void main()
{
D1=1;
EA=1;
EX0=1;
}
void exter() interrupt 0
{
D1=0;
}
求高手帮我改改程序,改成两个中断的那种,功能要求都写在上面了~【希望能有程序注释】3Q,我会去keil里面模拟的~~o()^))o
答:
/*模块低电平有效、外部中断0、1为低电平出发*/
#include "reg52.h"
void delay( char i)
{
unsigned char t;
while(i--)
{
for(t=0;t108;t++);
}
}
void INT0_ROUTING() interrupt 0//外部中断0子程序
{
P0=0xfe;//LED0点亮
while((P3|0xfb)==0xff);//等待外部中断0口(P3^2松开)
delay(10);//延时去抖动
P0=0xff;//LED0熄灭
}
void INT0_ROUTING() interrupt 2
{
P0=0xfd;//LED1点亮
while((P3|0xf7)==0xff);//等待外部中断1口(P3^3松开)
delay(10);//延时去抖动
P0=0xff;//LED1熄灭
}
void main()
{
EA=1;//中断总开关
EX0=1;//外部中断0开
EX1=1;//外部中断1开
/*默认低电平触发*/
while(1);//死循环 防止跑飞
}
6、单片机中断问题,下面这段程序不知道为什么只进一次中断,就没有反应了呢?
#include
#define uint unsigned int
sbit key1=P1^4;
sbit key2=P1^5;
void delay1ms(uint i)
{
uchar j;
while(i--)
{
for(j=0;j125;j++) //1ms基准延时程序
{
;
}
}
}
void init()
{
EA=1; //开总中断
ES=1; //开串口中断
TMOD= 0x21; //定时器1定时方式2,定时器1工作于8位自动重载模式, 用于产生波特率
SCON = 0x50; // 设定串行口工作方式1 允许接收
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1= 0xfd; //11.0592M 波特率9600
TL1= 0xfd;
PCON =0x00; // 波特率不倍增
TR1= 1; //启动定时器T1
TR0=1; //启动定时器T0
ET0=1; //打开T0中断
}
void key()
{
if(key2==0)
P0=0x3f;
delay1ms(5000);
P0=0xf3;
}
void mainxh()
{
while(1)
{
key();
P0=0x32;
}
}
void keybreak()
{
P0=0xf1;
delay1ms(5000);
P0=0x1f;
mainxh();
}
void main(void)
{
init();
mainxh();
}
void Time0(void) interrupt 1
{
TH0=(65536-50000)/256; //定时器T0的高8位重新赋初值
TL0=(65536-50000)%256; //定时器T0的高8位重新赋初值
评论