新闻中心

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

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

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

#include

#define uint unsigned int

#define uchar unsigned char

sbit p1_0=P1^0;

sbit p1_1=P1^1;

sbit p1_2=P1^2;

sbit p1_3=P1^3;

sbit p1_4=P1^4;

sbit p1_5=P1^5;

uchar PWM_T1 = 0;

uchar PWM_T2 = 0;

uint i,m;

void delay(uint z)

{

for(i=z;i>0;i--)

for(m=0;m110;m++);

}

void PWM_value_left(int pwm_set)

{

PWM_T1=pwm_set;

}

void PWM_value_right(int pwm_set)

{

PWM_T2=pwm_set;

}

void main(void)

{

bit flag = 1;

uint n;

TMOD=0x22;

TH0=241;

TH1=241;

TL0=241;

TL1=241;

TR0=1;

TR1=1;

ET0=1;

ET1=1;

EA=1;

P1=0xf0;

delay(20);

PWM_value_left(7);

PWM_value_right(10);

delay(100);

PWM_value_left(8);

PWM_value_right(9);

delay(100);

PWM_value_left(9);

PWM_value_right(8);

delay(100);

PWM_value_left(10);

PWM_value_right(7);

}

timer0() interrupt 1 using 2

{

static uint t ;

t++;

if(t==10)

{

t=0;

p1_0=1;

p1_1=0;

}

if(PWM_T1==t)

P1=P10xfc;

}

timer1() interrupt 3

{

static uint t1 ;

t1++;

if(t1==10)

{

t1=0;

p1_2=1;

p1_3=0;

}

if(PWM_T2==t1)

P1=P10xf3;

}

答:没有主循环,

没有等到中断3

程序运行一次就跑飞了!!!

void main(void)

{

//...你的程序

//在这里加 死循环,等待中断

while(1)

{

;

}

}

而且,中断响应函数里必须要清中断标志位(你的没有)!

3、各位大侠帮我看一下我写的51C程序中断有没有问题,执行中断后不能继续执行主程序,注:P3.2口一直接

注:P3.2口一直接地,程序如下:

#include

sbit dula=P2^6;

sbit wela=P2^7;

sbit d0=P1^0;

sbit d1=P1^1;

sbit d2=P1^2;

sbit d3=P1^3;

sbit d4=P1^4;

sbit d5=P1^5;

sbit d6=P1^6;

sbit d7=P1^7;

#define uchar unsigned char

#define uint unsigned int

uchar num;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

void delay(uint z);

void main()

{

EA=1;

EX0=1;

IT0=0;

wela=1;

P0=0xc0;

wela=0;

while(1)

{

for(num=0;num16;num++)

{

dula=1;

P0=table[num];

dula=0;

delay(1000);

}

}

}

void delay(uint z)

{

uint a,b;

for(a=z;a>0;a--)

for(b=110;b>0;b--);

}

void exter0() interrupt 0

{

uint c;

for(c=0;c25000;c++);

d0=0;

for(c=0;c25000;c++);

d0=1;

for(c=0;c25000;c++);

d1=0;

for(c=0;c25000;c++);

d1=1;

for(c=0;c25000;c++);

d2=0;

for(c=0;c25000;c++);

d2=1;

for(c=0;c25000;c++);

d3=0;

for(c=0;c25000;c++);

d3=1;

for(c=0;c25000;c++);

d4=0;

for(c=0;c25000;c++);

d4=1;

for(c=0;c25000;c++);

d5=0;

for(c=0;c25000;c++);

d5=1;

for(c=0;c25000;c++);

d6=0;

for(c=0;c25000;c++);

d6=1;

for(c=0;c25000;c++);

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中仿真成功。

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


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


晶振相关文章:晶振原理


评论


相关推荐

技术专区

关闭