51单片机,用中断发脉冲,执行完以后停不下来了,兄弟们帮帮忙
{
P1_0=!P1_0;
counter0++;
}
void main()
{
P1_0=1;
TMOD=0x02;
TH0=(256-18);
TL0=(256-18)
EA=1;
ET0=1;
TR0=1;
for(;flag0;)
{
if(counter0>=1988)
{
ET0=TR0=0;
counter0=0;
P1_0=1;
flag0=0;
}
}
}
这一套运行完,跳出for循环以后,以我的要求来说,P1_0口应该是不发送脉冲了,但是实际上他还是不断的在发脉冲, stc89c52, 11.0592 晶振 12分频 有没有兄弟看看是怎么回事啊。
因为中断是在取反呀!所以跳出for还是要输出高低变化的电平
发完后应该关中断
你的for没有执行
在if里面加个关闭定时器,在for后面加个while(1);
我把ET 和TR 都关了 应该来说 定时器也关了 怎么还是取反在。
for ET 和 TR都关了 应该定时器也关了;后面加while(1)他倒是不反复脉冲了,就是我后面还有程序,没法接了。
先初始化flag0=1,然后用while(flag0){}包裹你的if语句,最好把总中断关闭EA=0
flag0 初始化是1 for换成while 也没用 EA=0 也没用,我发现只有在 for 循环外面加一个 while(1)才会停下。
#include <reg52.h>
#include <intrins.h>
#include<delay52.h>
#define uchar unsigned char;
sbit P1_0=P1^0;
sbit P1_1=P1^1;
uchar counter0;
uchar counter1;
bit flag0=1,flag1=1;
void time0()interrupt 1 using 1
{
P1_0=!P1_0;
counter0++;
}
void time1()interrupt 3 using 2
{
P1_1=!P1_1;
counter1++;
}
void main()
{
P1_0=1;
P1_1=1;
TMOD=0x22;
TH0=TH1=(256-18);
TL0=TL1=(256-18);
EA=1;
ET0=1;
TR0=1;
for(;flag0;)
{
if(counter0>=1988)
{
ET0=TR0=0;
counter0=0;
P1_0=1;
flag0=0;
}
}
ET1=1;
TR1=1;
do
{
while(flag1)
{
EA=1;
if(counter1>=498)
{
EA=0;
ET1=TR1=0;
counter1=0;
P1_1=1;
flag1=0;
flag0=1;
ET0=TR0=1;
}
}
while(flag0)
{
EA=1;
if(counter0>=498)
{
EA=0;
ET0=TR0=0;
counter0=0;
P1_0=1;
flag0=0;
flag1=1;
ET1=TR1=1;
}
}
}while(1);
}
整个程序是这样的,现在又有问题了,while(flag1)循环第三次进入的时候,要花18s 才能进入, 为什么会这样;我是调试模式设置断点,设置单步的时候,语句在while(flag1)和if (counter>=498)之间循环。
程序写的比较乱,你发我邮箱吧389505276@qq.com,待会有空帮你看看
counter类型不对