新闻中心

EEPW首页>嵌入式系统>设计应用> 单片机常见延时与中断问题及解决方法

单片机常见延时与中断问题及解决方法

作者: 时间:2013-06-06 来源:网络 收藏

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 // 包含51寄存器定义的头文件

#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位重新赋初值

if(key1==0)

keybreak();

}

这个程序上电后P0口显示0x32;按下key2显示0x3f;key1用于中断,每20ms检测是否有按下key1键,有的话,P0口显示0xf1。

答 :

ORG 0000H AJMP MAIN ORG 0001H LJMP INT_0 ORG 30H MAIN:MOV SP,#8FH MOV P0,#0FFH MOV P3,#0FFH SETB IT0 SETB EA SETB EX0 LJMP START START: MOV A,#10000000B LOOP: MOV P0,A RLC A LCALL DELAY LCALL DELAY LJMP LOOP LJMP START;

这句是多余的 根本不会执行 INT_0: PUSH ACC ;

由于p中1断中1A被设为10所以5中7断返回后对A移位没有意义,o A一e直为10 ,并不d是只能中断一1次 .

还有,不清楚key1是什么中断,貌似是键盘扫描吧,

while(1)

{

key();

P0=0x32;

}

都进入死循环了,所以跳不出来,就一次中断了。

7、新手学习avrATmage 128 遇到问题,中断程序被忽略问题,找不到原因。

avr studio 4 软件仿真时,编译通过了,单在编译信息栏却看到中断程序被忽略。在软件仿真时也发现中断程序没有执行。不知道问题出在哪里,我用的是avr studio 4 ATmage 128 单片机.

程序如下

#include

#include

void main() //用的是TC0 溢出中断,来控制八位LED 一秒闪烁

{

PORTE = 0xFF; //LED 关 端口高电平位关

DDRE = 0xFF;

MCUCR |=(1

sei(); //开启全局中断

51单片机相关文章:51单片机教程


c语言相关文章:c语言教程


晶振相关文章:晶振原理

上一页 1 2 3 4 5 下一页

评论


相关推荐

技术专区

关闭