微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机,用中断发脉冲,执行完以后停不下来了,兄弟们帮帮忙

51单片机,用中断发脉冲,执行完以后停不下来了,兄弟们帮帮忙

时间:10-02 整理:3721RD 点击:
void time0()interrupt 1 using 1
{
          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类型不对

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top